embedding_lookup_sparse的奇怪输出

时间:2016-11-10 09:26:57

标签: tensorflow

考虑这样的代码:

w = tf.Variable(tf.constant([[1., 2], [3, 4], [5, 6], [7, 8]]))
sess = tf.Session()
sess.run(tf.initialize_all_variables())

st = tf.SparseTensor([[0, 0, 0],
                      [0, 1, 1],
                      [1, 0, 0],
                      [1, 1, 0],
                      [2, 0, 0],
                      [2, 1, 0]], [0, 2, 0, 1, 1, 3], [3, 3, 2])

sess.run(tf.nn.embedding_lookup_sparse(w, st, None, combiner='sum'))

输出:

array([[  6.,   8.],
       [  4.,   6.],
       [ 10.,  12.]], dtype=float32)

根据documentation,输出的形状必须是[3,3,3],因为形状(sp_id)= [3,3,2]和形状(w)= [4,3],但它没有:(

有人能解释为什么它以这种方式运作吗?因为我期望行为简单的embedding_lookup,但在最后一个轴上聚合..

修改

对于每个对象,我有2个特征,每个特征用一个单词表示,因为我想要用两个concat嵌入表示每个对象,我可以通过以下方式完成:

sess.run(tf.reshape(tf.nn.embedding_lookup(w, [[0, 1], [2, 3]]), shape=(2, 4)))

输出

array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.]], dtype=float32)

所以,现在我仍然有2个功能,但每个功能可以用几个单词表示,我想聚合与一个功能相对应的单词的嵌入。看起来embedding_lookup_sparse应该以这种方式工作,但我不明白为什么我的代码不起作用。

谢谢!

1 个答案:

答案 0 :(得分:0)

使用查找时,您将获得一个在嵌入中具有向量大小的张量,因此输出最内层维度必须为2.例如,如果您使用: w = tf.Variable(tf.constant( [[1., 2, 0.1, 0.2], [3, 4, 0.3, 0.4], [5, 6, 0.5, 0.6], [7, 8, 0.7, 0.8]])) 那么你会得到一个带有4个内柱的输出。