You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

训练后的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. 新图像与训练集分布差异过大

若新图像的拍摄环境、光线、角度、主体形态等与训练集差异极大,模型无法泛化,可能偏向预测某类(通常是训练集中特征最具共性的类别)。

解决办法

  • 收集与新图像分布一致的样本补充训练集,或对新图像应用训练时的数据增强操作(如轻微旋转、翻转);
  • 对同一张新图像进行多次增强后预测,取结果的众数或平均概率,提升鲁棒性。

快速验证步骤

  1. 取训练集中的一张图像作为“新图像”测试,若预测正确,说明问题出在新图像本身;若错误,排查类别映射或模型加载问题。
  2. 打印完整的预测概率数组,判断是概率分布异常还是类别映射错误:
    print("预测概率数组:", predictions)
    

内容的提问来源于stack exchange,提问作者Apurva Parkhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:15:39