pytorch 预训练模型读取修改相关参数的填坑问题

作者:DRACO于 时间:2021-11-07 01:08:36 

pytorch 预训练模型读取修改相关参数的填坑

修改部分层,仍然调用之前的模型参数。


resnet = resnet50(pretrained=False)
resnet.load_state_dict(torch.load(args.predir))

res_conv31 = Bottleneck_dilated(1024, 256,dilated_rate = 2)
print("---------------------",res_conv31)
print("---------------------",resnet.layer3[1])

res_conv31.load_state_dict(resnet.layer3[1].state_dict())

网络预训练模型与之前的模型对应不上,名称差个前缀


model_dict = model.state_dict()
# print(model_dict)
pretrained_dict = torch.load("/yzc/reid_testpcb/se_resnet50-ce0d4300.pth")
keys = []
for k, v in pretrained_dict.items():
      keys.append(k)
i = 0
for k, v in model_dict.items():
   if v.size() == pretrained_dict[keys[i]].size():
        model_dict[k] = pretrained_dict[keys[i]]
        #print(model_dict[k])
        i = i + 1
model.load_state_dict(model_dict)

最后是修改参数名拿来用的,


from collections import OrderedDict
pretrained_dict = torch.load('premodel')

new_state_dict = OrderedDict()

# for k, v in mgn_state_dict.items():
#     name = k[7:]  # remove `module.`
#     new_state_dict[name] = v
# self.model = self.model.load_state_dict(new_state_dict)

for k, v in pretrained_dict.items():
   name = "model.module."+k   # remove `module.`
   # print(name)
   new_state_dict[name] = v
self.model.load_state_dict(new_state_dict)

pytorch:加载预训练模型中的部分参数,并固定该部分参数(真实有效)

大家在学习pytorch时,可能想利用pytorch进行fine-tune,但是又烦恼于参数的加载问题。下面我将讲诉我的使用心得。

Step1: 加载预训练模型,并去除需要再次训练的层


#注意:需要重新训练的层的名字要和之前的不同。
model=resnet()#自己构建的模型,以resnet为例
model_dict = model.state_dict()
pretrained_dict = torch.load('xxx.pkl')
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
model_dict.update(pretrained_dict)
model.load_state_dict(model_dict)

Step2:固定部分参数


#k是可训练参数的名字,v是包含可训练参数的一个实体
#可以先print(k),找到自己想进行调整的层,并将该层的名字加入到if语句中:
for k,v in model.named_parameters():
   if k!='xxx.weight' and k!='xxx.bias' :
       v.requires_grad=False#固定参数

Step3:训练部分参数


#将要训练的参数放入优化器
optimizer2=torch.optim.Adam(params=[model.xxx.weight,model.xxx.bias],lr=learning_rate,betas=(0.9,0.999),weight_decay=1e-5)

Step4:检查部分参数是否固定

debug之后,程序正常运行,最好检查一下网络的参数是否真的被固定了,如何没固定,网络的状态接近于重新训练,可能会导致网络性能不稳定,也没办法得到想要得到的性能提升。


for k,v in model.named_parameters():
  if k!='xxx.weight' and k!='xxx.bias' :
  print(v.requires_grad)#理想状态下,所有值都是False

需要注意的是,操作失误最大的影响是,loss函数几乎不会发生变化,一直处于最开始的状态,这很可能是因为所有参数都被固定了。

来源:https://blog.csdn.net/chanbo8205/article/details/89923453

标签:pytorch,预训练,模型,参数
0
投稿

猜你喜欢

  • Python基础之文件操作及光标移动详解

    2022-12-01 02:23:17
  • js处理括弧配对替换的方法

    2008-01-16 13:48:00
  • Javascript typeof 用法

    2013-10-20 20:49:40
  • 详细介绍Python中的偏函数

    2022-12-28 08:40:53
  • 智能录入表格[适合BS模式项目的录入页面]

    2008-03-09 19:02:00
  • python实现凯撒密码、凯撒加解密算法

    2023-08-27 17:49:22
  • 自动定时备份sqlserver数据库的方法

    2011-11-03 17:28:17
  • 分面搜索(Faceted Search)

    2009-07-31 12:44:00
  • 关于递归运算的顺序测试代码

    2023-08-24 13:04:16
  • asp读取xml实例代码

    2011-03-08 11:13:00
  • 如何用ASP建立Index Server查询对象并为其参数赋值?

    2010-06-11 19:59:00
  • Python基于SMTP协议实现发送邮件功能详解

    2022-07-17 00:31:00
  • 6行的js上下滑动广告效果

    2008-11-27 12:26:00
  • Python Selenium自动化获取页面信息的方法

    2023-08-22 18:29:31
  • MySql 随机取N条数据

    2009-03-17 12:46:00
  • PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析

    2023-11-23 11:50:55
  • Python如何使用字符打印照片

    2023-06-12 09:20:34
  • 使用WingPro 7 设置Python路径的方法

    2022-05-23 03:59:56
  • XHTML代码的基本应用

    2007-10-26 12:32:00
  • 如何利用SQL Server数据库快照形成报表

    2009-01-15 11:55:00
  • asp之家 网络编程 m.aspxhome.com