大家好~最近用 MindSpore 2.2.10 做 ResNet18 图像分类模型训练,踩了两个典型坑,整理成经验分享给同方向的朋友👇
一、场景:ResNet18 图像分类训练
数据集是自定义的小样本图像集(约 5k 张),目标是实现分类任务,但训练过程中遇到两个核心问题:
二、踩坑 1:过拟合严重(训练集 98%,验证集仅 65%)
初始训练配置:
- 数据增强仅用了 Resize+Normalize;
- 优化器用 Adam,未加权重衰减;
- 没加正则化层。
训练到第 10 轮就出现 “训练集准确率飙升,验证集纹丝不动” 的过拟合情况。
三、踩坑 2:开启混合精度后出现 Nan/Inf
为了加速训练,开启 MindSpore 的混合精度训练(amp.auto_mixed_precision(model, amp_level="O2")),结果训练到第 3 轮,loss 直接变成 Nan。
四、排查 & 解决过程
针对 “过拟合”:
强化数据增强(补 MindSpore 的 ImageTransform 操作):
from mindspore.dataset.vision import transforms trans = transforms.Compose([ transforms.RandomHorizontalFlip(prob=0.5), # 新增随机水平翻转 transforms.RandomCrop(size=224, padding=4), # 新增随机裁剪 transforms.Resize((224,224)), transforms.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]) ])给优化器加权重衰减(weight_decay=1e-4):
optimizer = nn.Adam(model.trainable_params(), learning_rate=1e-4, weight_decay=1e-4)新增 Dropout 层(在 ResNet18 的全连接层前加nn.Dropout(p=0.5));
调整后,验证集准确率从 65% 提升到 89%。
针对 “混合精度 Nan”:
- 排查原因:学习率过高 + 未配置 loss scale;
- 改用动态 Loss Scale(MindSpore 推荐方案):
from mindspore import amp loss_scale_manager = amp.DynamicLossScaleManager() model = amp.auto_mixed_precision(model, amp_level="O2", loss_scale_manager=loss_scale_manager)加梯度裁剪(限制梯度范围):
from mindspore.nn.wrap import GradientClipByNorm optimizer = GradientClipByNorm(optimizer, clip_norm=1.0)降低初始学习率到5e-5;
重新训练后,Nan 问题消失,训练速度提升约 40%。
五、总结 Tips
- 小样本训练:优先强化 MindSpore 的数据增强 + 加权重衰减 / 正则化;
- MindSpore 混合精度:必须配
loss_scale_manager,高学习率易出 Nan,建议加梯度裁剪。