PyTorch微调VGG16后多次加载模型权重不一致问题
问题:两次加载同一微调VGG16模型后参数不一致
我用CIFAR-10数据集微调了PyTorch预训练VGG16模型,但每次通过load_state_dict()加载该模型后,用model.parameters()查看权重时,发现部分权重存在差异。两次加载间并未修改模型,按道理参数应该完全一致。测试代码如下:
import torch from torch import nn from torchvision.models import vgg16 import numpy as np vgg = vgg16(pretrained=True) vgg.classifier[6] = nn.Linear(in_features=4096, out_features=10) vgg.load_state_dict(torch.load("vgg16_model.pth", map_location='cpu'), strict=False) params1 = np.array([param.detach().numpy() for param in vgg.parameters()]) vgg2 = vgg16(pretrained=True) vgg2.classifier[6] = nn.Linear(in_features=4096, out_features=10) vgg2.load_state_dict(torch.load("vgg16_model.pth", map_location='cpu'), strict=False) params2 = np.array([param.detach().numpy() for param in vgg2.parameters()]) print(np.array_equal(params1, params2))
输出:
False
补充:已确认在转换为数组前,模型参数就存在差异。
可能原因与解决办法
- 未加载的随机初始化参数导致差异:你替换了
classifier[6]层,但加载时使用strict=False,如果保存的模型中没有该新层的参数,两次初始化这个层会生成不同的随机权重,这就是差异的核心来源。解决办法:要么确保保存模型时包含所有层的参数(微调完成后完整保存state_dict),要么在创建模型前固定随机种子:torch.manual_seed(42) torch.cuda.manual_seed_all(42) np.random.seed(42) - 模型保存不完整:如果保存模型时只保存了部分层的参数,而非完整的
state_dict,会导致加载时部分参数无法覆盖,保留初始化的随机值。解决办法:检查保存代码,确保使用torch.save(vgg.state_dict(), "vgg16_model.pth")完整保存模型状态字典。 - 浮点数精度判断问题:
np.array_equal会严格对比每个元素的精确值,而浮点数运算或存储可能存在极小精度误差,导致判断为不一致。可以改用np.allclose(params1, params2, atol=1e-6)来判断参数是否在合理精度范围内一致。 - 环境/版本差异:不同PyTorch或torchvision版本对预训练模型的初始化细节可能有细微差别,导致两次加载的基础模型参数存在差异。解决办法:统一两次加载时的PyTorch、torchvision版本及依赖环境。
内容的提问来源于stack exchange,提问作者liz
相关产品推荐
相关产品推荐

