Tensorflow:迭代Tensor以嵌入查找?

时间:2018-04-02 20:40:11

标签: tensorflow

假设我有一个N个用户的矩阵,每个用户都与一个单词向量相关联(转换为整数)。因此,例如对于N = 2,我有:

user 0 corresponds to words['20','56']

user 1 corresponds to words ['58','10','105']

所以我有一个清单

user_words = [['20','56'],['58','10','105']]

假设我进一步为这些单词创建了100列嵌入矩阵(word_emb)。我想查找每个用户向量的(平均)嵌入并创建一个新的Tensor,其形状我期望为[2,100]。我试过这样做:

word_vec = []
for word_sequence_i in tf.map_fn(lambda x: x, user_words):
    all_word_vecs = tf.nn.embedding_lookup(word_emb, word_sequence_i)
    word_vec.append( tf.reduce_mean(all_word_vecs, 1))

但这给了我一个错误:

TypeError: `Tensor` objects are not iterable when eager execution is not enabled. To iterate over this tensor use `tf.map_fn`.

我以为我上面已经在使用tf.map_fn了!那么Tensorflow抱怨什么呢?有没有办法做我想做的事情?

非常感谢!

1 个答案:

答案 0 :(得分:1)

tf.map_fn返回一个Tensor对象本身,它是对将在Session.run()时间计算的值的符号引用。您可以使用type(tf.map_fn(lambda x: x, user_words))查看此信息。因此,for word_sequence_i in tf.map_fn(...)中隐含的迭代产生了错误。

也许您正在寻找的是:

all_word_vecs = tf.map_fn(lambda x: tf.nn.embedding_lookup(word_emb, x), user_words)
word_vec = tf.reduce_mean(all_word_vecs, axis=1)

在相关的说明中,如果图形构造和执行之间的这种区别变得麻烦,您可能想要让TensorFlow的急切执行成为一种旋转。请参阅getting startedthe programmer's guide

希望有所帮助。