怎么在Pytorch中只导入部分模型参数

  介绍

怎么在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中只导入部分模型参数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

怎么在Pytorch中只导入部分模型参数