深度学习模型预测触发Graph Execution Error报错如何解决
推理预测报错排查
核心报错原因
传入卷积层的张量维度不符合要求,模型期望4维输入(批次大小、图像高度、图像宽度、通道数),实际只拿到3维张量,触发维度不兼容错误。
代码问题定位
- 预处理逻辑错误
你代码里的img = np.array(img)[:,:,1] # Resize image完全没有实现resize功能,作用是提取RGB图像的第2个通道(绿色通道),执行后原形状为(H, W, 3)的3通道图像会变成形状为(H, W)的2维矩阵,直接丢失了通道维度。后续你只在最前面加了批次维度,最终传入模型的张量形状是(1, H, W),只有3个维度,不满足卷积层的输入要求。 - 函数调用不严谨
代码里read_file、decode_image、resize、expand_dims都没有写所属模块前缀,如果你没有提前把这些函数导入到全局命名空间,会直接触发名称未定义错误;就算已经导入,也容易出现同名函数歧义。 - 预测逻辑隐患
你当前用tf.round处理预测结果只适合二分类场景,如果是新冠/正常/肺炎三分类任务,这种取结果的方式会直接得到错误的分类索引。
修正后可运行代码
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 提前确认img_height、img_width、model、label_data已正确定义 def load_img(filename): img = tf.io.read_file(filename) img = tf.io.decode_image(img, channels=3, expand_animations=False) # 注意如果输入不是正方形,resize参数要写为[img_height, img_width],不要两个参数都填img_height img = tf.image.resize(img, size=[img_height, img_width]) img = np.array(img) img = img / 255.0 return img # 加载所有推理样本 inf_samples = [ load_img(r'ML2\COVID-19\inf_set\covid\covid - 1.jpeg'), load_img(r'ML2\COVID-19\inf_set\covid\covid - 2.jpeg'), load_img(r'ML2\COVID-19\inf_set\normal\Normal - 1.jpeg'), load_img(r'ML2\COVID-19\inf_set\normal\Normal - 2.jpeg'), load_img(r'ML2\COVID-19\inf_set\pneumonia\Pneumonia - 1.jpeg'), load_img(r'ML2\COVID-19\inf_set\pneumonia\Pneumonia - 2.jpeg') ] plt.figure(figsize=(35, 5)) plt.suptitle('Prediction Results', fontsize=15) for idx, img in enumerate(inf_samples, 1): plt.subplot(1, 6, idx) # 显式加批次维度,输入形状变为(1, H, W, 3),匹配模型输入要求 pred = model.predict(np.expand_dims(img, axis=0), verbose=0) # 二分类用下面这行 res = int(tf.round(pred)[0][0]) # 三分类请注释上面那行,改用下面这行取最大概率索引 # res = int(tf.argmax(pred, axis=1)[0]) plt.imshow(img) plt.title(f"Prediction: {label_data[res]}") plt.axis('off') plt.show()
额外说明
- 如果你训练模型时用的是单通道灰度输入,不要用切片取单个通道的写法,替换为
img = tf.image.rgb_to_grayscale(img)即可,转换后形状为(H, W, 1),加批次维度后是符合要求的4维张量。 - 路径字符串前加
r是Windows系统下的正确写法,可以避免转义字符导致的文件找不到错误。
内容的提问来源于stack exchange,提问作者sildaf88
相关产品推荐
相关产品推荐

