You need to enable JavaScript to run this app. ImageDataGenerator下flow_from_directory预测顺序异常问题排查
优惠活动
大模型
产品
解决方案
定价
更多

ImageDataGenerator下flow_from_directory预测顺序异常问题排查

问题核心原因

Keras 自带的 ImageDataGenerator.flow_from_directory() 方法默认开启 shuffle=True 参数,即不管是训练集、验证集还是测试集的迭代器,只要没有显式关闭打乱逻辑,每次迭代器被触发执行时,都会对全部样本的排列顺序做随机重排。
结合你的场景具体解释:

  • 测试集迭代器未关闭打乱逻辑时,每次调用 model.predict(test_it),生成器都会重新随机打乱测试样本的顺序后再分批喂给模型。因为样本排列顺序每次都不同,模型输出的预测值自然没有固定先后顺序,出现相同输入下每次预测结果序列不一致的现象。
  • 你之前用 model.evaluate(test_it) 能得到稳定的88%准确率,是因为 evaluate 过程中,生成器是同时把「打乱顺序的样本」和「对应匹配的打乱顺序的标签」一起输入模型计算指标,输入和标签始终是一一绑定的,所以不会因为顺序打乱影响指标计算结果。但你如果要把预测值和自己预先整理的真实标签逐样本匹配,就会出现完全错位的问题。

另外你提供的代码片段里存在两处语法笔误:一是 datagen_train 定义时括号未闭合、语句末尾多了多余逗号;二是定义的训练生成器变量名为 datagen_train,但后续迭代器调用时引用了不存在的cnn2_datagen变量,运行时需要先修正这两处问题才能正常执行。

可落地的解决步骤
  • 给测试集迭代器显式关闭样本打乱逻辑,同时固定随机种子保证顺序完全可复现,修改后的代码如下:
# 训练/验证生成器不需要改动,shuffle对训练过程有正向作用
datagen_train = ImageDataGenerator(validation_split=0.2, zoom_range = 0.2, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip = True)
datagen_test = ImageDataGenerator()

train_it = datagen_train.flow_from_directory(TRAIN_FOLDER, class_mode='binary', batch_size=32, target_size=(150,150), subset='training')
val_it = datagen_train.flow_from_directory(TRAIN_FOLDER, class_mode='binary', batch_size=32, target_size=(150,150), subset='validation')
# 核心修改点:测试迭代器关闭shuffle、固定seed
test_it = datagen_test.flow_from_directory(
    TEST_FOLDER, 
    class_mode='binary', 
    batch_size=32, 
    target_size=(150,150),
    shuffle=False, # 关闭随机打乱,保证样本按文件夹内的固有顺序排列
    seed=42 # 固定随机状态,彻底消除顺序波动
)
  • 直接从测试迭代器中提取和预测顺序完全对齐的真实标签,不要自行遍历文件夹匹配标签。因为当 shuffle=False 时,迭代器的样本排列顺序是固定的,其内部存储的classes属性就是和预测输出顺序一一对应的真实标签序列,示例代码:
# 跑推理得到概率值
y_pred_proba = model.predict(test_it)
# 二分类硬预测值转换,默认阈值0.5
y_pred = (y_pred_proba > 0.5).astype(int)
# 直接从测试迭代器取对齐的真实标签
y_true = test_it.classes
# 此时y_pred和y_true逐位置对应,可直接计算混淆矩阵、分类报告等指标
额外注意事项
  • 不需要关闭训练集、验证集迭代器的shuffle逻辑:训练阶段打乱样本顺序能提升模型泛化能力,避免模型学习到样本排列带来的虚假特征。
  • 测试集生成器不要加任何随机数据增强逻辑:所有翻转、缩放、位移操作都会给测试样本引入随机扰动,既会降低推理结果的可复现性,也会让测试集评估结果失去参考价值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 00:45:01