TensorFlow MNIST CNN模型:加载SavedModel进行图片预测求助
解决TensorFlow CNN模型加载后找不到输出张量的问题
我明白你遇到的麻烦了——跟着官方教程搭好CNN模型训练完,想拿单张图片测试却卡在找不到输出张量这一步。别慌,我给你一步步拆解解决方案:
第一步:先搞清楚你的模型里有哪些张量
加载完meta图之后,你可以先打印出所有操作的名称,这样就能轻松定位到输入和输出张量了。代码如下:
import tensorflow as tf # 加载模型图 sess = tf.Session() saver = tf.train.import_meta_graph('/tmp/mnist_convnet_model/model.ckpt-2000.meta') saver.restore(sess, tf.train.latest_checkpoint('/tmp/mnist_convnet_model/')) # 获取当前默认图 graph = tf.get_default_graph() # 打印所有操作名称,方便你筛选输入输出张量 for op in graph.get_operations(): print(op.name)
运行这段代码后,你会看到一堆类似Placeholder、reshape/Reshape、logits/BiasAdd、ArgMax这样的名称,这些就是你模型里所有操作的标识。
第二步:定位输入和输出张量
根据官方MNIST卷积教程的默认结构:
- 输入张量:教程里定义的输入占位符一般是
x = tf.placeholder(tf.float32, [None, 784]),对应的操作名称是Placeholder;如果你定义时给它加了自定义名称(比如x = tf.placeholder(..., name='input_x')),那就是input_x。注意要在名称后面加:0,代表该操作的第一个输出张量。 - 输出张量:教程最后一层是
logits = tf.layers.dense(inputs=pool2_flat, units=10, name='logits'),对应的输出张量名称是logits/BiasAdd:0;如果之后你定义了预测结果predictions = tf.argmax(input=logits, axis=1, name='predictions'),那直接用predictions:0会更方便,拿到的就是直接的类别预测值。
第三步:加载图片并预处理
MNIST模型接受的是28x28的灰度图,所以要把你的测试图片转换成对应格式:
import cv2 # 用PIL也可以,这里以OpenCV为例 # 加载单张测试图片(灰度模式) img = cv2.imread('your_test_image.png', cv2.IMREAD_GRAYSCALE) # 调整尺寸到模型要求的28x28 img = cv2.resize(img, (28, 28)) # 归一化到0-1之间(和训练时的预处理逻辑保持一致) img = img / 255.0 # 转换成模型需要的形状:如果输入是flatten后的784维,就转成(1, 784);如果是图片张量,就转成(1,28,28,1) img_input = img.reshape(1, 784)
第四步:运行预测
根据你找到的张量名称,执行预测:
# 获取输入和输出张量 input_tensor = graph.get_tensor_by_name('Placeholder:0') output_tensor = graph.get_tensor_by_name('predictions:0') # 或者用'logits/BiasAdd:0' # 喂入图片数据,得到预测结果 pred_result = sess.run(output_tensor, feed_dict={input_tensor: img_input}) print(f"这张图片的预测类别是:{pred_result[0]}")
小提示
- 建议你在定义模型时,给关键的占位符、输出层加显式自定义名称(比如
name='model_input'、name='model_output'),这样后续加载时不用猜默认名称,更不容易出错。 - 注意
tf.train.latest_checkpoint的参数是模型所在的文件夹路径,不是具体的ckpt文件名,别写错路径导致加载失败。
内容的提问来源于stack exchange,提问作者Sandeep Alur
相关产品推荐
相关产品推荐

