假设我有一个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抱怨什么呢?有没有办法做我想做的事情?
非常感谢!
答案 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 started和the programmer's guide。
希望有所帮助。