预训练ResNet50模型混淆矩阵异常仅识别一类问题排查
混淆矩阵全预测单一类别原因分析
以下是几种常见的原因及排查方向:
- 数据集类别不平衡:如果训练集里某一类样本数量远多于另一类,模型会“偷懒”优先预测数量多的类别来降低损失。去train文件夹下数一下两个子文件夹的样本数量,看看是不是差距悬殊。
- 标签映射不匹配:测试生成器的类别索引和模型输出的类别索引可能对不上。比如模型输出的索引0对应B类,但
test_generator.classes里的0实际是A类,导致看起来全预测成0类。可以打印test_generator.class_indices看看类别和索引的对应关系,再对比模型预测结果的分布。 - 模型训练不到位:训练轮数太少,模型还没学到区分两类的特征;或者学习率设置得不合适,导致模型卡在了局部最优解,一直输出同一类。可以查看训练过程中的loss和accuracy曲线,看是不是没下降或者波动异常。
- 训练与测试预处理不一致:训练时的图像预处理(比如归一化、尺寸调整、数据增强)和测试时的不一样。比如训练时对图像做了特定的像素归一化,测试时没做,模型就没法正确识别。检查
train_generator和test_generator的预处理参数是否完全一致。 - 预训练层冻结过度:如果把ResNet50的所有层都冻结了,只训练最后一层分类器,可能分类器能力不够,没法学到区分两类的深层特征。可以尝试解冻ResNet50顶层的几层卷积层,和分类器一起训练。
- 样本本身区分度低或标注错误:两类样本的视觉特征本来就很像,或者存在大量标注错误的样本,导致模型学不到有效区分的特征。手动挑一些样本看看,是不是两类长得太像,或者有标错类的情况。
内容的提问来源于stack exchange,提问作者SanKyuu
相关产品推荐
相关产品推荐

