You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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:0ArgMax: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_xpredictions这类关键节点,后面加:0就是对应的Tensor名称。

内容的提问来源于stack exchange,提问作者Cribbin

火山引擎 最新活动