TensorFlow加载GloVe预训练向量后embedding_lookup无输出求助
问题分析与解决方案
看起来你遇到的核心问题是tf.Print没有输出,同时代码里还存在预训练向量未正确加载的问题,我来一步步帮你解决:
为什么tf.Print没有输出?
首先要明确:tf.Print的输出是发送到标准错误流(stderr),而Jupyter Notebook默认情况下可能不会显示stderr的内容,这是你看不到输出的主要原因。另外,你的代码还漏掉了关键的预训练向量初始化步骤,即使tf.Print能输出,结果也会是全0的无效值。
修复步骤
1. 补全预训练向量的初始化操作
你定义了embedding_init来把GloVe向量赋值给变量W,但在会话中完全没有运行这个操作!这会导致W一直是初始的全0张量,完全没用到预训练的GloVe向量。
2. 替换弃用的初始化函数
tf.initialize_all_variables()已经被官方弃用,建议换成tf.global_variables_initializer(),避免潜在的兼容问题。
3. 改用更可靠的输出方式
放弃tf.Print,直接获取张量的数值并通过Python原生print()输出,这样能确保内容显示在Jupyter的标准输出里。
修正后的完整代码
# 假设你已经按照教程完成了GloVe向量的加载,得到了embedding_matrix(形状为[vocab_size, embedding_dim]) g = tf.Graph() with g.as_default(): W = tf.Variable(tf.constant(0.0, shape=[vocab_size, embedding_dim]), trainable=False, name="W") embedding_placeholder = tf.placeholder(tf.float32, [vocab_size, embedding_dim]) embedding_init = W.assign(embedding_placeholder) foo = tf.nn.embedding_lookup(W, x[0]) # 替换弃用的初始化函数 init_op = tf.global_variables_initializer() with tf.Session(graph=g) as sess: # 初始化所有变量 sess.run(init_op) # 关键步骤:将预训练的GloVe向量赋值给W sess.run(embedding_init, feed_dict={embedding_placeholder: embedding_matrix}) # 获取embedding lookup的结果并打印 embedding_result = sess.run(foo) print("Embedding lookup result for x[0]:") print(embedding_result)
额外验证点
- 确认
embedding_matrix的形状是[vocab_size, embedding_dim],和W的定义一致,否则会抛出维度不匹配的错误。 - 检查
x[0]中的词汇索引是否都在vocab_size的范围内,避免embedding_lookup出现越界问题。
内容的提问来源于stack exchange,提问作者johnsmith
相关产品推荐
相关产品推荐

