介绍
怎么在Pytorch中只导入部分模型参数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Pytorch的优点
1. Pytorch是相当简洁且高效快速的框架;2。设计追求最少的封装;3。设计符合人类思维,它让用户尽可能地专注于实现自己的想法;4。与谷歌的Tensorflow类似,公平的支持足以确保Pytorch获得持续的开发更新;5。PyTorch作者亲自维护的论坛供用户交流和求教问题6。入门简单
import torch as t 得到torch.nn import 模块 得到torch import 神经网络 得到torch.nn import  functional as F class 净(模块): def 才能__init__(自我): ,,,超级(净,自我). __init__ () ,,,self.conv1 =, nn.Conv2d(3, 32岁,3,1) ,,,self.conv2 =, nn.Conv2d (32、3、3、1) ,,,self.w =, nn.Parameter (t.randn (10)) ,,,for p 拷贝self.children (): ,,,,,nn.init.xavier_normal_ (p.weight.data) ,,,,,nn.init.constant_ (p.bias.data, 0) def 才能向前(自我,,x): ,,,out =, self.conv1 (x) ,,,out =, self.conv2 (x) , ,,,out =, F.avg_pool2d (, (out.shape [2], out.shape [3])) ,,,out =, F.linear(,重量=self.w) ,,,return 从
然后我们保存这个网络的初始值。
model =,净() t.save (model.state_dict () & # 39; xxx.pth& # 39;)
现在我们将净修改一下,多加几个卷积层,但并不加入到中,仅仅出于少些几行的目的。
import torch as t 得到torch.nn import 模块 得到torch import 神经网络 得到torch.nn import  functional as F , , class 净(模块): def 才能__init__(自我): ,,,超级(净,,自我). __init__ () ,,,self.conv1 =, nn.Conv2d(3, 32岁,,3,,1) ,,,self.conv2 =, nn.Conv2d(32岁,,3,,3,,1) ,,,self.conv3 =, nn.Conv2d (64 3 1) ,,,self.conv4 =, nn.Conv2d(64年,32岁,3,1) ,,,for p 拷贝self.children (): ,,,,,nn.init.xavier_normal_ (p.weight.data) ,,,,,nn.init.constant_ (p.bias.data, 0) , ,,,self.w =, nn.Parameter (t.randn (10) 3,) def 才能向前(自我,,x): ,,,out =, self.conv1 (x) ,,,out =, self.conv2 (x) , ,,,out =, F.avg_pool2d (,, (out.shape [2],, out.shape [3])) ,,,out =, F.linear(,,体重=self.w) ,,,return 从
我们现在试着导入之前保存的模型参数。
path =, & # 39; xxx.pth& # 39; 时间=model 净() model.load_state_dict (t.load(路径)) , & # 39;& # 39;& # 39; RuntimeError:错误(s),拷贝loading state_dict for 净: ,Missing 关键(s),拷贝state_dict:,“conv3.weight",,“conv3.bias",,“conv4.weight",,“conv4.bias"只 & # 39;& # 39;& # 39;
出现了没有在模型文件中找错误中到的关键字的错误。
现在我们这样导入模型
path =, & # 39; xxx.pth& # 39; 时间=model 净() 时间=save_model t.load(路径) 时间=model_dict model.state_dict () state_dict =,{凯西:v for k, v 拷贝save_model.items (), if k 拷贝model_dict.keys ()} print (state_dict.keys ()), #, dict_keys ((& # 39; w # 39;,, & # 39; conv1.weight& # 39;,, & # 39; conv1.bias& # 39;,, & # 39; conv2.weight& # 39;,, & # 39; conv2.bias& # 39;]) model_dict.update (state_dict) model.load_state_dict (model_dict)
看看上面的代码,很容易弄明白。其中model_dict。更新的作用是更新代码中搭建的模型参数字典。为啥更新我其实并不清楚,但这一步骤是必须的,否则还会报错。
为了弄清楚为什么要更新model_dict,我们不妨分别输出state_dict和model_dict的关键值看一看。
for k 拷贝state_dict.keys (): 打印(k)才能 , & # 39;& # 39;& # 39; w conv1.weight conv1.bias conv2.weight conv2.bias & # 39;& # 39;& # 39; for k  model_dict.keys拷贝(): 打印(k)才能 , & # 39;& # 39;& # 39; w conv1.weight conv1.bias conv2.weight conv2.bias conv3.weight conv3.bias conv4.weight conv4.bias & # 39;& # 39;& # 39;
关于怎么在Pytorch中只导入部分模型参数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。