Tensorflow使用ImageDataGenerator训练异常:训练准确率99%但模型仅输出单类
问题原因及排查方案
训练集标签分布异常(最高概率原因)
你仅校验了验证集的单批次标签分布,未校验训练集全局标签分布,这是最核心的排查方向:
执行以下代码打印训练集标签统计信息:
import numpy as np # 打印类别映射关系 print("训练集类别映射:", train_generator.class_indices) # 打印总样本数 print("训练集总样本数:", train_generator.samples) # 打印各类别样本数量 print("训练集各类样本数统计:", np.unique(train_generator.classes, return_counts=True))
如果输出显示其中一类样本数为0,说明你解压训练集时目录结构错误,或flow_from_directory的classes参数配置错误,仅读取到了单类样本。此时模型统一输出该类即可拿到100%的训练准确率,而验证集两类样本均衡,所以准确率仅为随机猜测的50%左右。
图像数据未做归一化
你未贴出train_datagen、validation_datagen的初始化代码,该场景下高频错误是未添加rescale=1./255归一化配置:
原始图像像素值范围为0~255,未归一化的大数值输入会快速让卷积层输出进入激活函数饱和区,梯度消失,模型参数停止更新,只会输出初始化阶段倾向的某一类。如果训练过程中采样到的batch标签刚好和模型固定输出的类别匹配,就会出现训练准确率虚高的情况。
Dropout超参数配置不合理
你代码中的dropout_rate未给出具体数值,如果该值设置过高(≥0.8),会导致:
训练阶段随机失活大部分神经元,仅靠少量神经元刚好拟合了采样到的训练batch标签,出现虚高准确率;验证阶段Dropout关闭,全部神经元参与计算,输出结果直接偏移到单一类别,验证准确率接近50%。
内容的提问来源于stack exchange,提问作者Himanshu Naidu
相关产品推荐
相关产品推荐

