APTOS 2019数据集疾病分级混淆矩阵最后两列全零问题求助
问题分析与解决方案:APTOS 2019疾病分级模型混淆矩阵最后两列全零
核心问题定位
模型完全无法识别class4和class5,召回率为0,说明这两类的特征未被模型有效学习。结合数据集分布(class4仅193张、class5仅295张,远少于class0的1805张),核心问题大概率是极端样本不平衡+潜在的数据集/模型配置错误。
排查与解决步骤
1. 先排查数据层面的基础问题
- 核对测试集类别分布:统计测试集中class4和class5的样本数量,确认这两类确实存在且标签正确。可通过代码快速验证:
若测试集里这两类样本为0,混淆矩阵全零是必然结果;若有样本,需检查标签编码是否与训练集一致——原APTOS 2019是0-4级分类,你这里的class3/4/5需对应转换为连续索引(比如class0→0、class1→1、class3→2、class4→3、class5→4),避免模型输出索引与实际类别不匹配。import numpy as np print(np.bincount(test_labels)) - 验证训练集标签有效性:随机抽取class4和class5的样本人工核对,排除标签标注错误导致模型无法学习的情况。
2. 针对极端样本不平衡的强化优化
- 手动调整类别权重:不要仅依赖
class_weight='balanced',给小样本类设置更高权重,强制模型分配更多注意力。比如class4权重设为1805/193≈9.3,class5设为1805/295≈6.1:
(注:需先将你的非连续类别编号映射为0-4的连续索引)class_weights = {0:1.0, 1:4.9, 2:1.8, 3:9.3, 4:6.1} - 小样本类专属数据增强:对class4和class5的样本单独应用更强的增强策略,比如随机旋转±30°、随机裁剪、亮度对比度随机调整、高斯噪声添加等,大幅提升样本多样性,避免模型过拟合到少数样本的特征。
- 替换损失函数:用Focal Loss替代普通交叉熵损失,降低易分类大样本的权重,强制模型关注难分类的小样本:
import tensorflow as tf def focal_loss(y_true, y_pred, alpha=0.25, gamma=2): cross_entropy = -y_true * tf.math.log(y_pred + 1e-8) weight = alpha * tf.math.pow(1 - y_pred, gamma) loss = weight * cross_entropy return tf.reduce_sum(loss) - 过采样+迁移学习结合:用图像版过采样(如SMOTE-IMB)扩充小样本类,同时基于预训练模型(如ResNet50、EfficientNet)做迁移学习:先冻结预训练层,用全数据集训练最后几层,再逐步解冻部分层,用小样本类数据重点微调。
3. 训练策略调整
- 监控小样本类指标:将早停策略的监控指标从整体准确率改为class4和class5的召回率,避免模型在大样本类上过度拟合而忽略小样本。
- 降低学习率:使用更小的学习率(如1e-5)配合AdamW优化器,让模型更平缓地学习小样本类的特征,避免大样本类的梯度淹没小样本的梯度。
- 集成学习辅助:训练多个子模型,每个子模型侧重不同的类别组合(比如一个侧重class0/1,另一个侧重class3/4/5),最后通过投票或加权融合结果,提升小样本类的识别能力。
4. 验证排查
先在训练集上测试class4和class5的预测结果:如果训练集上也全零,说明模型根本没学到,问题出在数据配置或模型结构;如果训练集上能正常预测,说明是过拟合或测试集分布异常,需调整正则化或重新核对测试集。
内容的提问来源于stack exchange,提问作者user169076
相关产品推荐
相关产品推荐

