考虑这样的代码:
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应该以这种方式工作,但我不明白为什么我的代码不起作用。
谢谢!
答案 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个内柱的输出。