tob*_*obe 5 python embedding sparse-matrix tensorflow
我们尝试过使用tf.nn.embedding_lookup它并且有效.但它需要密集的输入数据,现在我们需要tf.nn.embedding_lookup_sparse稀疏输入.
我写了以下代码,但得到了一些错误.
import tensorflow as tf
import numpy as np
example1 = tf.SparseTensor(indices=[[4], [7]], values=[1, 1], shape=[10])
example2 = tf.SparseTensor(indices=[[3], [6], [9]], values=[1, 1, 1], shape=[10])
vocabulary_size = 10
embedding_size = 1
var = np.array([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0, 49.0, 64.0, 81.0])
#embeddings = tf.Variable(tf.ones([vocabulary_size, embedding_size]))
embeddings = tf.Variable(var)
embed = tf.nn.embedding_lookup_sparse(embeddings, example2, None)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run(embed))
Run Code Online (Sandbox Code Playgroud)
错误日志如下所示.
现在我不知道如何正确修复和使用此方法.任何评论都可以表示赞赏.
潜入后safe_embedding_lookup_sparse的单元测试,我更困惑,为什么我如果给稀疏的权重,尤其是为什么我们得到的东西像得到这个结果embedding_weights[0][3],其中3在代码中没有出现以上.
rvi*_*nas 12
tf.nn.embedding_lookup_sparse()使用Segmentation来组合嵌入,这需要SparseTensor的索引从0开始并增加1.这就是你得到这个错误的原因.
您的稀疏张量不需要布尔值,而只需要保存要从嵌入中检索的每一行的索引.这是你的调整代码:
import tensorflow as tf
import numpy as np
example = tf.SparseTensor(indices=[[0], [1], [2]], values=[3, 6, 9], dense_shape=[3])
vocabulary_size = 10
embedding_size = 1
var = np.array([0.0, 1.0, 4.0, 9.0, 16.0, 25.0, 36.0, 49.0, 64.0, 81.0])
embeddings = tf.Variable(var)
embed = tf.nn.embedding_lookup_sparse(embeddings, example, None)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run(embed)) # prints [ 9. 36. 81.]
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用索引tf.SparseTensor()来使用其中一个允许的tf.nn.embedding_lookup_sparse()组合器组合字嵌入:
- "sum"计算每行的嵌入结果的加权和.
- "均值"是加权和除以总重量.
- "sqrtn"是加权和除以权重平方和的平方根.
例如:
example = tf.SparseTensor(indices=[[0], [0]], values=[1, 2], dense_shape=[2])
...
embed = tf.nn.embedding_lookup_sparse(embeddings, example, None, combiner='sum')
...
print(sess.run(embed)) # prints [ 5.]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6636 次 |
| 最近记录: |