为何处于eval模式的已保存PyTorch模型每次推理结果不同?
PyTorch保存加载权重后结果不一致的排查方案
- 确认推理模式已开启:加载模型后必须调用
model.eval(),否则Dropout、BatchNorm等层会处于训练模式,产生随机输出 - 锁定全链路随机种子:不仅要设置PyTorch的种子,还要同步NumPy、Python全局种子,代码示例:
import torch import numpy as np import random def set_seed(seed=42): torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) np.random.seed(seed) random.seed(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False - 规范权重保存/加载方式:必须用
state_dict()保存和加载,避免直接保存整个模型导致的潜在问题,示例:# 保存权重 torch.save(model.state_dict(), 'model_weights.pth') # 加载权重 model.load_state_dict(torch.load('model_weights.pth')) - 验证输入数据一致性:加载模型后的输入张量要和保存前完全匹配,包括张量类型、设备、归一化参数等,避免预处理环节的差异影响结果
- 保证设备环境一致:确认保存和加载时使用的设备(CPU/GPU)相同,跨设备加载需指定
map_location参数:model.load_state_dict(torch.load('model_weights.pth', map_location=torch.device('cpu')))
内容的提问来源于stack exchange,提问作者John Curry
相关产品推荐
相关产品推荐

