TensorFlow训练模型测试报错:feed_dict键无法识别为张量
解决TensorFlow模型加载后feed_dict报错的问题
我来帮你梳理清楚问题所在,你遇到的TypeError主要有两个原因:图上下文不匹配,还有代码里的语法小错误,咱们一步步解决:
错误核心原因
你当前的代码顺序是:先创建了自己的x_placeholder,再导入预训练的meta图。但TensorFlow的图是有上下文的——你创建的x_placeholder属于重置后的默认图,但导入的模型会把自身的图结构加载到当前图中,这时候你自己的placeholder和模型训练时用的输入节点根本不是同一个Tensor,feed_dict自然找不到对应的节点,就会报错。
另外,你代码里有两处括号不匹配:
meta.restore(sess, tf.train.latest_checkpoint('./chkpt/')缺少右括号sess.run(Y, feed_dict={x_placeholder: X))多了一个右括号(应该是}))
修正后的代码及步骤
正确的做法是:先加载模型的图结构,再从加载好的图中获取原本的输入、输出节点,而不是自己重新创建新的placeholder。
步骤1:确认训练时的节点命名
首先回忆你训练模型时,给输入placeholder和预测输出节点起的名字(如果训练时没显式命名,默认名字会是Placeholder:0、ArgMax:0这类)。比如训练时你可能写过:
# 训练时的代码示例 x = tf.placeholder(tf.float32, [None, 64, 64, 3], name='input_x') # 显式命名输入 # ... 模型结构(卷积、全连接等) ... logits = tf.layers.dense(last_layer, num_classes) predictions = tf.argmax(logits, axis=1, name='predictions') # 显式命名输出
步骤2:修正加载与预测代码
# 获取测试数据,X形状为(1,64,64,3),Y为真实标签 X, Y = get_data() # 重置默认图,清除之前的图残留 tf.reset_default_graph() # 1. 导入模型的meta图,将训练时的图结构加载到当前默认图中 meta_graph = tf.train.import_meta_graph('chkpt/my_tf_model.meta') with tf.Session() as sess: # 2. 恢复模型的权重参数 meta_graph.restore(sess, tf.train.latest_checkpoint('./chkpt/')) # 3. 从加载好的图中获取对应的输入、输出节点 # 注意:这里的节点名称要和训练时的完全一致! # 如果训练时没命名,就用默认名(比如'Placeholder:0') input_tensor = sess.graph.get_tensor_by_name('input_x:0') output_tensor = sess.graph.get_tensor_by_name('predictions:0') # 4. 运行预测,用模型原本的输入节点作为feed_dict的key pred_result = sess.run(output_tensor, feed_dict={input_tensor: X}) # 打印结果 print(f"预测类别:{pred_result[0]}") print(f"真实类别:{Y}")
额外提示
如果你忘了训练时的节点名称,可以在会话中打印所有节点来查找:
with tf.Session() as sess: meta_graph.restore(sess, tf.train.latest_checkpoint('./chkpt/')) # 打印所有节点名称 for op in sess.graph.get_operations(): print(op.name)
找到类似input_x、predictions这类关键节点,后面加:0就是对应的Tensor名称。
内容的提问来源于stack exchange,提问作者Cribbin




