pytorch 预训练模型读取修改相关参数的填坑问题
作者:DRACO于 发布时间:2021-11-07 01:08:36
标签:pytorch,预训练,模型,参数
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


猜你喜欢
- 1、先导入HTMLTestRunner模块见生成HTMLTestRunner模块2、实例如下(1)单用例文件执行且生成报告import un
- 一、pytest.ini说明pytest.ini是pytest的全局配置文件,一般放在项目的根目录下固定的配置文件(pytest.ini),
- 跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是JSONPJSONP在我的理解,它并不是ajax,它是在文档中插入一个s
- Psyco 是严格地在 Python 运行时进行操作的。也就是说,Python 源代码是通过 python 命令编译成字节码的,所用的方式和
- 前言在《Python中if语句的使用方法》中提到,对于一种可能性、两种可能性或者多种可能性的情况,可以通过if语句来实现。而用if语句实现多
- 一、什么是vscode** Visual Studio Code (简称 VS Code /
- 操作方法如下所示:File-->Settings-->Editor-->Color&Fonts-->Lang
- 描述int函数可以将一个指定进制的数字型字符串或者十进制数字转化为整形。语法int(object, base)名称说明备注object一个数
- mysqladmin是MySQL官方提供的shell命令行工具,它的参数都需要在shell
- 模块在python编程中的地位举足轻重,熟练运用模块可以大大减少代码量,以最少的代码实现复杂的功能。下面介绍一下在python编程中如何导入
- 导语应好友邀请,帮他写了个小程序,功能类似于实时监控自己关注的UP主,如果关注的UP主中有人发布了抽奖的动态,就自动参与这个抽奖。这样就能不
- 通过购物车的一个案列,把vuex学习了一篇。vuex概念浅谈Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储
- 开发环境:Ubuntu16.04+Django 1.11.9+Python2.7一:使用自定义函数输出日志到log文件:import tim
- mysql版本:8.0.28xtrabackup版本:8.0.281、安装xtrabackup下载地址:Download Percona X
- 在这篇文章中,我将展示如何在 CentOS/RHEL 7、Debian 以及它的衍生版本比如 Ubuntu(最新的 Ubuntu 16.04
- blankzheng的blog:http://www.planabc.net/margin在中文中我们翻译成外边距或者外补白(本文中引用外边
- android开发中在和服务器端接口对接时出现编码问题,从服务器端获取到的数据是 "\u8bbe\u59071ID-\u
- Access 连接字符串 strConnect = “Provider=Microsoft.Jet.OLEDB.4.0;
- Qt Designer的介绍在PyQt中编写UI界面可以直接通过代码来实现,也可以通过Qt Designer来完成。Qt Designer的
- 1. 引言Python程序有许多模块和第三方包,这非常有助于高效编程。了解这些模块的正确使用方法是很重要的,在本文中,主要介绍一些非常实用的