替换TensorFlow冻结推理图后报image_tensor:0不存在错误如何解决
问题准确性判断
该判断完全准确。报错的核心原因是队友使用的Faster-RCNN预训练模型导出时指定了输入节点名为image_tensor,而你通过Keras训练导出的模型输入节点采用的是Keras默认生成的命名(通常为input_1这类格式),二者节点名不匹配,导致推理代码在feed_dict传入数据时找不到对应张量。
无需重训的解决方案
不需要重新训练模型,有两种可行的适配方案:
方案1:修改推理代码适配现有模型(操作最简单)
- 首先查询你导出的冻结图的输入输出节点名,运行以下代码即可打印所有节点名称:
import tensorflow as tf from tensorflow.python.platform import gfile with tf.Session() as sess: with gfile.FastGFile('你的冻结推理图文件路径.pb', 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) sess.graph.as_default() tf.import_graph_def(graph_def, name='') # 遍历打印所有节点名 for op in sess.graph.get_operations(): print(op.name)
- 找到对应的输入节点名(一般为列表中靠前的
input_*格式名称),将队友推理代码中feed_dict的key从'image_tensor:0'替换为你查到的输入节点名加:0后缀即可。额外需要注意的是,你训练的模型是28*28灰度输入,需要同步修改推理代码的预处理逻辑,将输入图片调整到对应尺寸、转灰度、按训练时的规则做归一化,避免推理结果异常。
方案2:修改冻结图节点名,完全适配原有推理代码
如果不希望改动原有推理逻辑,可以直接对现有冻结图的输入节点重命名,生成适配原有代码的新pb文件:
import tensorflow as tf from tensorflow.python.framework import graph_util with tf.Session() as sess: with tf.gfile.GFile('你的原冻结推理图路径.pb', 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) # 导入时将原输入节点映射为命名为image_tensor的新占位符 output_node = tf.import_graph_def( graph_def, input_map={"你查到的原输入节点名:0": tf.placeholder(tf.float32, shape=[None,28,28,1], name='image_tensor')}, return_elements=["你查到的原输出节点名:0"], name='' ) # 导出新的冻结推理图 new_graph_def = graph_util.convert_variables_to_constants( sess, sess.graph_def, ["你查到的原输出节点名"] ) with tf.gfile.GFile('适配后frozen_inference_graph.pb', 'wb') as f: f.write(new_graph_def.SerializeToString())
使用生成的新pb文件直接替换原有文件即可,无需修改任何推理代码逻辑。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

