使用ImageDataGenerator训练准确率75%但evaluate_generator准确率0%问题
嘿,这个问题我之前帮朋友排查过类似的,咱们一步步来揪出问题所在:
训练与评估的ImageDataGenerator参数不匹配
这是最常见的原因!你得确保训练和评估用的generator在rescale、class_mode、classes这些核心参数上完全一致:- 比如训练时你用了
rescale=1./255来归一化图片,那评估的generator也必须加这个参数——不然模型看到的评估图片像素值是0-255,和训练时的0-1完全不在一个分布,预测自然全错。 - 你用了
categorical_crossentropy损失,说明训练时generator的class_mode是'categorical'(生成独热编码标签),那评估的generator绝对不能设成'sparse'或者'binary',否则标签格式和模型输出不匹配,准确率直接跌到0。
- 比如训练时你用了
类别列表顺序不一致
你定义了classes = <list of classes>,那训练和评估的generator都必须显式传入这个classes参数!如果评估时没传,或者传了另一个顺序不同的列表,模型预测的类别索引会和真实标签的索引完全错位——比如模型以为索引0是猫,而评估数据里索引0是狗,所有预测都对应错了类别,准确率当然是0。evaluate_generator的steps参数设置错误
你得确认steps参数的值等于验证集样本总数 ÷ batch_size。如果steps设得太小(比如只设了1),模型只评估了一小部分数据,刚好全错;或者设得太大,generator重复生成数据,导致计算逻辑混乱。另外,记得调用evaluate_generator前可以给generator加个val_generator.reset(),避免之前的迭代残留影响结果。模型权重的意外重置
虽然你没提到保存加载,但也要检查一下:在训练完到评估之间,有没有不小心重新编译了模型,或者覆盖了pretrained_model变量?如果训练后的权重被重置成初始状态,那评估当然会得到随机水平的准确率(0%刚好是极端情况)。
举个正确的示例参考,训练和评估的generator要这么写:
# 训练generator train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=20) train_gen = train_datagen.flow_from_directory( 'train_dir', target_size=(224,224), batch_size=32, class_mode='categorical', classes=classes # 必须传入统一的类别列表 ) # 评估generator(核心参数完全对齐) val_datagen = ImageDataGenerator(rescale=1./255) # 只做归一化,不做数据增强 val_gen = val_datagen.flow_from_directory( 'val_dir', target_size=(224,224), batch_size=32, class_mode='categorical', classes=classes # 和训练用同一个类别列表 ) # 评估时计算正确的steps val_steps = val_gen.samples // val_gen.batch_size accuracy = pretrained_model.evaluate_generator(val_gen, steps=val_steps, verbose=1)
先从这几个点排查,大概率能解决问题!
内容的提问来源于stack exchange,提问作者Ben Sandler

