You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:45:20