PyTorch修改预训练ResNet18全连接层后预测仅输出单类别问题求助
问题排查与修复方案
- 优先检查推理阶段是否调用
model.eval()
训练完成后执行预测前必须执行该方法,将BatchNorm、Dropout等层切换为推理模式。如果遗漏该步骤,上述层会保留训练阶段的随机逻辑,导致每次前向传播输出结果不稳定,甚至出现全输出单类的情况。 - 核对训练与预测阶段的预处理逻辑是否一致
确认预测时的图像缩放、裁剪、归一化操作和训练阶段的配置完全相同,尤其是归一化用到的均值、方差参数,必须和训练集计算得到的参数一致,不能直接混用ImageNet默认参数,避免输入分布漂移导致模型失效。 - 确认损失函数与输出层匹配
PyTorch的CrossEntropyLoss内置了LogSoftmax和NLLLoss计算,因此修改后的fc层不需要额外加Softmax激活。如果输出层额外添加了Softmax,会导致计算损失时的梯度异常,模型容易出现类别塌缩的问题。 - 检查模型保存与加载逻辑
修改ResNet18全连接层后,保存模型时建议只保存权重:torch.save(model.state_dict(), "model.pth"),加载时先实例化修改后的ResNet18结构,再加载权重,避免结构不匹配导致的参数异常。 - 固定全流程随机种子
在notebook开头添加如下代码固定所有随机源,避免每次运行时模型初始化、数据打乱、算子运算的随机性导致训练结果不可复现:import random, torch, numpy as np seed = 42 random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True - 验证训练准确率真实性
检查训练集和验证集是否存在数据重叠,避免虚高的准确率误导判断。可以随机抽取几张不同类别的训练集图像执行预测,确认模型在训练集上是否能正确分类,排除模型完全未拟合的问题。
内容的提问来源于stack exchange,提问作者MegaMath
相关产品推荐
相关产品推荐

