PyTorch加载模型model.load_state_dict()问题,Unexpected key(s) in state_dict: “module.features..,Expected .

希望将训练好的模型加载到新的网络上。如上面题目所描述的,PyTorch在加载之前保存的模型参数的时候,遇到了问题。

    Unexpected key(s) in state_dict: "module.features. ...".,Expected ".features....". 直接原因是key值名字不对应。

    表明了加载过程中,期望获得的key值为feature...,而不是module.features....。这是由模型保存过程中导致的,模型应该是在DataParallel模式下面,也就是采用了多GPU训练模型,然后直接保存的。

    You probably saved the model using nn.DataParallel, which stores the model in module, and now you are trying to load it without . You can either add a nn.DataParallel temporarily in your network for loading purposes, or you can load the weights file, create a new ordered dict without the module prefix, and load it back.

解决上面的问题有三个办法:

1. 对load的模型创建新的字典,去掉不需要的key值"module".

# original saved file with DataParallel
state_dict = torch.load('checkpoint.pt')  # 模型可以保存为pth文件,也可以为pt文件。
# create new OrderedDict that does not contain `module.`
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in state_dict.items():
    name = k[7:] # remove `module.`,表面从第7个key值字符取到最后一个字符,正好去掉了module.
    new_state_dict[name] = v #新字典的key值对应的value为一一对应的值。 
# load params
model.load_state_dict(new_state_dict) # 从新加载这个模型。

2. 直接用空白''代替'module.'

model.load_state_dict({k.replace('module.',''):v for k,v in torch.load('checkpoint.pt').items()})

# 相当于用''代替'module.'。
#直接使得需要的键名等于期望的键名。

3. 最简单的方法,加载模型之后,接着将模型DataParallel,此时就可以load_state_dict。

如果有多个GPU,将模型并行化,用DataParallel来操作。这个过程会将key值加一个"module. ***"。

model = VGG()# 实例化自己的模型;
checkpoint = torch.load('checkpoint.pt', map_location='cpu')  # 加载模型文件,pt, pth 文件都可以;
if torch.cuda.device_count() > 1:
    # 如果有多个GPU,将模型并行化,用DataParallel来操作。这个过程会将key值加一个"module. ***"。
    model = nn.DataParallel(model) 
model.load_state_dict(checkpoint) # 接着就可以将模型参数load进模型。

 4. 总结

    从出错显示的问题就可以看出,key值不匹配,因此可以选择多种方法,将模型参数加载进去。 这个方法通常会在load_state_dict过程中遇到。将训练好的一个网络参数,移植到另外一个网络上面,继续训练。或者将训练好的网络checkpoint加载进模型,再次进行训练。可以打印出model state_dict来看出两者的差别。

model = VGGNet()
params=model.state_dict() #获得模型的原始状态以及参数。
for k,v in params.items():
    print(k) #只打印key值,不打印具体参数。

features.0.0.weight   
features.0.1.weight
features.1.conv.3.weight
features.1.conv.4.num_batches_tracked

model = VGGNet()
checkpoint = torch.load('checkpoint.pt', map_location='cpu')
# Load weights to resume from checkpoint。
# print('**************************************')
# 这个方法能够直接打印出你保存的checkpoint的键和值。
for k,v in checkpoint.items():
    print(k) 
print("*****************************************")

输出结果为:

module.features.0.0.weight",

"module.features.0.1.weight",

"module.features.0.1.bias

可以看出不匹配,模型的参数中,key值不同,多了module。

PS: 2020-12-25

在移植参数的过程中,对于出现 .total_ops和.total_params结尾的参数,可参考以下代码:

from collections import OrderedDict
checkpoint = torch.load(
    pretrained_model_file_path,
    map_location=(None if use_cuda and not remap_to_cpu else "cpu"))
new_state_dict = OrderedDict()
for k, v in checkpoint.items():
    if not k.endswith('total_ops') and not k.endswith('total_params'):
        name = k[7:]
        new_state_dict[name] = v

如果有用,记得点赞👍加收藏哦。!!!!

  • 107
    点赞
  • 262
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
`model.load_state_dict()` 函数是 PyTorch 中用于加载模型参数的函数。它的作用是将预训练或保存的模型参数应用到指定的模型对象上。 `load_state_dict()` 函数的基本语法如下: ```python model.load_state_dict(state_dict, strict=True) ``` 其中,`state_dict` 是一个包含模型参数的字典对象,它通常是通过 `torch.load()` 函数加载预训练或保存的模型文件得到的。`strict` 是一个布尔值参数,用于指定是否严格加载参数。 使用 `load_state_dict()` 函数可以完成以下任务: 1. 加载预训练模型参数:可以将预训练模型权重加载到指定的模型对象中。通常,需要先创建一个与预训练模型结构相同的空模型对象,然后使用 `load_state_dict()` 函数将预训练模型的参数应用到该模型对象上。 2. 加载保存的模型参数:可以将保存的模型参数加载到指定的模型对象中。在使用 `torch.save()` 函数保存模型时,通常使用 `model.state_dict()` 方法获取模型的参数字典,然后将其保存到文件中。加载时,可以使用 `torch.load()` 函数加载保存的模型文件,并使用 `load_state_dict()` 函数将加载的参数应用到模型对象上。 示例代码: ```python # 创建空模型对象 model = MyModel() # 加载预训练模型参数 pretrained_state_dict = torch.load('pretrained_model.pt') model.load_state_dict(pretrained_state_dict) # 或者加载保存的模型参数 saved_state_dict = torch.load('saved_model.pt') model.load_state_dict(saved_state_dict) ``` 通过以上代码,可以加载预训练模型的参数或保存的模型的参数,并将其应用到 `MyModel` 类型的 `model` 对象上。这样,`model` 对象就具有了与预训练模型或保存的模型相匹配的权重

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值