PyTorch训练保存的FER模型加载后测试精度波动问题求助
问题解决:加载PyTorch模型后测试精度不一致的修复方法
核心原因与对应解决方案
1. 数据加载环节存在随机性
测试集加载器若开启shuffle=True,或使用了随机裁剪、翻转等数据增强操作,会导致每次输入模型的数据顺序/内容不同,直接引发精度波动。
- 修复操作:
- 测试集DataLoader强制设置
shuffle=False - 移除测试阶段所有随机化的图像预处理操作
示例代码:
test_transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 删除随机裁剪、随机翻转等训练阶段用的增强操作 ]) test_loader = DataLoader(dataset=test_dataset, batch_size=32, shuffle=False, num_workers=4) - 测试集DataLoader强制设置
2. 模型未正确切换至评估模式
尽管你的测试函数中调用了model.eval(),但如果加载模型后未再次显式调用,Dropout、BatchNorm等层仍会处于训练模式,导致输出不稳定。
- 修复操作:
加载模型后必须立即调用model.eval(),确保所有层切换到评估状态
示例加载代码:model = YourFERModel() # 初始化与训练时完全一致的模型结构 model.load_state_dict(torch.load("model.pth")) model.to(DEVICE) model.eval() # 关键步骤,不可省略
3. 未固定全局随机种子
PyTorch、NumPy、Python的全局随机种子会影响数据加载、CUDA运算等环节的随机性,即使模型参数固定,种子不同也会导致结果波动。
- 修复操作:
在测试脚本开头固定所有相关随机种子:import torch import numpy as np import random def set_seed(seed=42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False set_seed()
4. 模型保存/加载方式错误
直接保存整个模型(torch.save(model, PATH))可能因环境差异(PyTorch版本、模型定义路径)导致参数加载异常,更可靠的方式是仅保存模型状态字典。
- 修复操作:
保存时:
加载时:torch.save(model.state_dict(), "model.pth")model = YourFERModel() # 必须先匹配训练时的模型结构 model.load_state_dict(torch.load("model.pth"))
针对你的测试函数的补充说明
你的test函数已正确使用model.eval()和torch.no_grad(),只需额外确保:
dataloaders['val']是无随机性的测试加载器(shuffle=False+无随机增强)- 加载模型后先执行
model.eval()再调用测试函数
按上述步骤调整后,重新加载模型测试的精度将与训练结束时的测试结果完全一致。
内容的提问来源于stack exchange,提问作者PRAMOD KUMAR
相关产品推荐
相关产品推荐

