图像分类模型测试精度极低,代码是否存在Bug?求优化方案
自定义图像分类任务问题排查与解决方案
一、代码中的致命Bug
- 模型模式错误:加载预训练ResNet后调用了
resnet.eval(),这会将批量归一化(BN)、Dropout等层切换为评估模式,训练时这些层无法更新参数,模型根本无法有效学习。 - 变量名与计数逻辑错误:
- 训练函数参数为
optimiser,但代码中使用未定义的optimizer(拼写错误),会直接抛出运行时错误; - 训练准确率计算时使用了未定义的
train_correct变量,实际统计的是correct; - 样本计数错误:
total +=1是按批次计数而非样本数,正确统计应为total += labels.size(0),这就是你看到训练精度虚高的核心原因——准确率计算完全错误。
- 训练函数参数为
- 测试代码逻辑冗余:
torch.max(outputs, 1)返回的第一个值是类别概率的最大值,第二个是类别索引,后续possible_scores= np.argmax(scores.detach().numpy())无意义,单样本场景下还会引发维度错误。
二、过拟合的潜在诱因(修复代码后需关注)
你的数据集每类仅约60张样本,87类的规模属于小样本场景,即使代码修复,仍可能存在过拟合问题:
- 预训练模型微调策略错误:直接修改全连接层后训练所有参数,且使用0.01的大学习率,会破坏预训练的通用特征,导致模型快速过拟合。
- 数据增强不足:未对自定义数据集做随机裁剪、翻转、色彩抖动等增强操作,样本多样性不足,模型易记住训练样本。
- 正则化手段单一:仅依赖L2正则化(weight_decay),未结合Dropout、早停(Early Stopping)、标签平滑等手段。
三、适合小样本自定义分类的模型推荐
- MobileNetV2/V3:轻量型模型,参数规模小,在小数据集上不易过拟合,同时具备良好的特征提取能力。
- EfficientNet-B0/B1:通过复合缩放优化模型效率,小版本模型在小样本场景下表现稳定,泛化性优于大模型。
- ViT-B/16(微调版):视觉Transformer,需采用小学习率(如1e-5)冻结大部分预训练层,仅微调最后几层,结合CutMix、MixUp等增强手段,可在小样本任务中取得不错效果。
- Prototypical Network:专为小样本分类设计的模型,基于度量学习思路,适合每类样本数量极少的场景。
内容的提问来源于stack exchange,提问作者Sire
相关产品推荐
相关产品推荐

