ResNet汽车识别模型测试集正常,手动预测输出固定结果求助
问题诊断与解决方案
核心问题分析
模型在批量测试集上表现正常,但单张图片预测时输出固定类别,说明单张图片的预处理流程与训练/测试阶段不一致,导致模型输入分布异常,进而输出无意义的固定结果。
具体修正步骤
1. 对齐预处理顺序(关键)
训练阶段的预处理顺序是:先resize到目标尺寸,再归一化;但你的手动测试代码是先归一化再resize,这会导致像素值的插值计算逻辑与训练时不符。修正后的代码如下:
import tensorflow as tf import numpy as np image_path = "pezo2.jpg" # 1. 读取图像并强制转为3通道RGB(避免灰度图问题) image = tf.io.read_file(image_path) image = tf.image.decode_image(image, channels=3) # 2. 先resize到训练时的目标尺寸,和训练流程一致 target_size = (256, 256) resized_image = tf.image.resize(image, target_size) # 3. 再执行归一化,和训练流程一致 normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1.0 / 255) normalized_image = normalization_layer(resized_image) # 4. 扩展维度为批量输入格式 image_array = np.expand_dims(normalized_image, axis=0) # 执行预测 yhat = new_model.predict(image_array)
2. 确认图像通道与维度
- 手动加载图像时必须强制指定
channels=3,避免部分图像是单通道灰度图,导致模型输入维度不匹配(模型要求输入为(None,256,256,3))。 - 预处理完成后,可以打印
image_array.shape确认是否为(1,256,256,3),确保符合模型输入要求。
3. 验证模型加载正确性
虽然测试集评估正常,但可以额外验证加载的模型是否为训练完成的版本:
# 打印模型结构,和训练代码中的结构对比 new_model.summary() # 对比训练时的最后一层参数数量,确认加载无误 print(new_model.layers[-1].get_weights()[0].shape) # 应为(512,8)
4. 排查标签映射一致性
训练时image_dataset_from_directory会按文件夹名称字典序生成类别顺序,你可以打印测试集的类别映射,确认预测结果对应的类别是否符合预期:
# 训练时获取类别映射 class_names = data.class_names print("类别顺序:", class_names) # 预测时查看对应类别 predicted_class_idx = np.argmax(yhat) print("预测类别:", class_names[predicted_class_idx])
额外建议
如果上述修正后仍有问题,可以尝试将训练时的归一化层整合到模型中,避免预处理流程不一致:
# 训练时将归一化层加入模型 input_layer = tf.keras.Input(shape=(256,256,3)) x = tf.keras.layers.experimental.preprocessing.Rescaling(1.0/255)(input_layer) x = resnet_model(x) # 后续自定义层不变... model = Model(inputs=input_layer, outputs=predictions)
这样保存的模型会自动处理归一化,手动测试时只需resize图像即可,无需额外归一化步骤。
内容的提问来源于stack exchange,提问作者Alphacell
相关产品推荐
相关产品推荐

