训练后的Keras模型预测异常:新图片均输出同一类别
问题分析与解决办法
1. 类别名称顺序不匹配
训练时flow_from_directory会按文件夹名称的字母顺序自动生成类别索引映射,若你手动定义的class_names列表顺序与该映射不一致,会导致预测结果的类别映射错误,表现为“始终预测同一类别”(实际是索引对应错了)。
解决办法
训练时直接从生成器中提取类别名称,确保顺序完全一致:
# 训练阶段保存类别映射 class_indices = train_generator.class_indices # 获取按训练时顺序排列的类别名称 class_names = list(class_indices.keys())
预测时直接使用这个class_names,不要手动编写类别列表。
2. 新图像预处理与训练集不一致
虽然你做了img_array /= 255.的归一化,但仍存在潜在差异:
- 若新图像是灰度图,
image.load_img默认会将其转为3通道,但像素值完全相同,模型无法提取有效特征; - 图像的色彩空间、通道顺序(如RGB/BGR)与训练集不匹配。
解决办法
- 加载图像时明确指定颜色模式,与训练集保持一致:
# 训练集是RGB则明确指定 img = image.load_img(img_path, target_size=(IMAGE_SIZE, IMAGE_SIZE), color_mode="rgb") - 检查图像通道数,若为单通道则转为3通道:
import numpy as np if img_array.shape[-1] == 1: img_array = np.repeat(img_array, 3, axis=-1)
3. 模型加载异常(若使用保存后的模型预测)
如果训练后保存模型再加载使用,若加载方式错误(如仅加载结构未加载权重),会导致模型权重随机,出现始终预测同一类的情况。但你在训练Notebook内测试正常,此情况仅在跨环境加载时需要排查。
解决办法
确保模型完整保存与加载:
# 训练后保存完整模型 model.save("image_classifier.h5") # 加载模型 from tensorflow.keras.models import load_model model = load_model("image_classifier.h5")
加载后用训练集图像测试,确认权重正确加载。
4. 新图像与训练集分布差异过大
若新图像的拍摄环境、光线、角度、主体形态等与训练集差异极大,模型无法泛化,可能偏向预测某类(通常是训练集中特征最具共性的类别)。
解决办法
- 收集与新图像分布一致的样本补充训练集,或对新图像应用训练时的数据增强操作(如轻微旋转、翻转);
- 对同一张新图像进行多次增强后预测,取结果的众数或平均概率,提升鲁棒性。
快速验证步骤
- 取训练集中的一张图像作为“新图像”测试,若预测正确,说明问题出在新图像本身;若错误,排查类别映射或模型加载问题。
- 打印完整的预测概率数组,判断是概率分布异常还是类别映射错误:
print("预测概率数组:", predictions)
内容的提问来源于stack exchange,提问作者Apurva Parkhi
相关产品推荐
相关产品推荐

