Pytorch加载模型时,只导入部分层权重,即跳过指定的网络层。需求
当Pytorch加载模型时,仅导入某些层权重,并且跳过了一些指定的网络层。
方法一
通用方法:加载权重时使用是否过滤网络层
''模型是定义的网络结构:类模型:def__init__:super.__INT__INT__…………def向前:……''model=model()#加载已有的模型参数,后缀名可能不同ptrained_dict=torch.load('model.pkl')model_dict=model.state_dict()#关键在于以下从model_dict中读取key和value时,使用if过滤掉不必要的网络层ptrained_dict={key:valueforkey,valueinptrained_dict.items()if(keyinmodel_dictand'Prediction'notinkey)}model_dict.updatemodel.load_state_dict
方法二
不完全匹配。仅加载权重中存在的参数。如果他们不匹配,他们将被跳过。
#load_state_dict()默认为strict=True,需要完全匹配,否则会报错#改为strict=False后,只有现有参数ptrained_dict=torch.load(weight_path)model.load_state_dict(ptrained_dict,strict=False)将被匹配
方法三
不使用原始权重文件进行培训,而是复制原始权重文件。复制的文件仅包含所需的网络层,并且复制的权重文件直接用于后续培训。
#复制原始加权文件。复制的文件仅包含所需的网络层。#然后直接使用复制的文件进行训练。importpicklemodel=model()net=modelpath_weight='R-50.pkl'path_weight2='R2-50.pkl'withopen(path_weight,'rb')asf:obj=f.read()#使用pickle。loads加载权重信息la_obj=pickle.loads使用iffor滤波strigts={key:键的值,la_obj.items}#ifkeyinla_obj中的keyinla_obj和backbone中的值。bottom_up.stem.conv1.conv1.关键'不在键}使用Print查看权重文件信息打印进行文件深副本,并保存ITstate_dict=copy.deepcopywithopen
以下是优化加载参数的特殊要求:固定参数或不同的参数更新速度。
方法四
如果加载的某些参数不需要更新,也就是说,它们是固定的,并且不参加培训,则需要手动将这些参数的梯度属性设置为Fasle,并在当时过滤这些参数。优化器传递参数:
#加载预训练模型参数后.forname,valueinmodel.named_parameters():ifnamemeetcertaincriteria:value.requires_grad=False#setupoptimizationrparams=filter(lambdap:p.requires_grad,model.parameters())优化器=torch.optim.adam
方法五
如果所有加载的参数都已更新,但某些参数需要以与其他参数不同的速度更新,则最好知道这些参数的名称:
在加载预训练的模型参数之后.对于名称,model.named_parameters中的值。
假设该模型有两个部分:编码器,查看器和解码器。参数名称为:
'encoder.visual_emb.0.weight','encoder.visual_emb.0.bias','viewer.bd.Wsi','viewer.bd.bias','decoder.core.layer_0.weight_ih','decoder.core.layer_0.weight_hh',
假设编码器和查看器的学习率必须为1E-6,并且解码器的学习率为1E-4,那么当参数传递到优化器中时:
bignored_params=list))base_params=filter不忽略的_params,model.parameters:base_params,'lr':1e-6},{'params':model.decoder.parameters}],lr=1e-4,动量=0.9)
代码的结果是,除了解码器参数的Learning_rate=1E-4之外,其他参数还具有Learning_rate=1E-6。
传入优化器时,与一般参数传递方式torch.optim.Adam(model.parameters(),lr=xxx)不同。参数部分中使用了一个列表。列表的每个元素都有两个关键值:参数和LR。如果没有lr,则应用Adam的lr属性。除了lr之外,Adam的属性对于参数来说是通用的。
遇见的问题
有时,使用torch.load加载较旧的权重文件时,可能会报告幻数错误。这可能是因为该文件是使用泡菜存储的,并使用Latin1编码。在这种情况下,可以这样加载:
如果要过滤的话,可以在最后加上if,道理是一样的。
进口泡菜开放式作为f:obj=f.read使用泡菜加载,并且编码方法为latin1weights={key:forkeforkeyforkeyforkeyforkeyforkey,ploate_dictinprackle.loads中.Items}类似地,您可以使用判断flows={key:键的值,interprockle.loads中的值。项目“预测”不在键中)}model.load_state_dict
python3和python2在套接字返回值的解码上存在差异。
插座是插座,用于描述IP地址和端口。应用程序通过套接字向网络发出请求或响应网络请求,套接字可以认为是计算机网络的数据接口。目前有两种类型的套接字:基于文件的和基于网络的。
解决方案:
使用函数encode()和decode():
STR通过encode函数编码为字节Byt,并通过DECODE函数转换为str。附加信息:
str-字节
#声明一个字符串s:s='abc'type(s)class'str'#四种转换方法:b1=s.encode()type(b1)class'bytes'b2=str.encode(s)type(b2)类“字节”b3=s.Encodetype类字节'b4=bytestype类字节'
字节-str
#声明一个bytes:b=b'abc'type(b)class'bytes'#三种转换方法:s1=bytes.decode(b)type(s1)class'str's2=b.decode()type(s2)类'str's3=str类型类'str'
参考博客
如何在Pytorch中只导入部分层权重_西盟凌海的博客-CSDN博客_pytorch加载部分权重
pytorch微调模型——只加载预训练模型的某些层_农夫山泉二号博客-CSDN博客
Pytorch加载模型不完全匹配
在pytorch中加载预训练模型后,如果我只想训练单个层该怎么办?_mubai-'sBlog-csdnblog_pytorch仅训练最后一层
PyTorch|保存和加载模型-知乎(zhihu.com)
魔法数字错误时,装载负载重量-查找高端玩家的新鲜度-博客公园
Python错误:TypeError:abytes-likeobjectisrequired,not‘str‘_程序袁三妹的博客-CSDN博客
本文主要介绍Linux中用于终止进程的kill、pikill和killall命令的用法。是入门学习Linux的基础知识。有需要的朋友可以参考一下.16-01-1…
React功能组件在父子之间传递值并调用方法。一.前言React作为前端语言,具有独特的灵活性,这也是它的魅力所在。前端组件化也将整个前端划分为组件。本期我们讲…
Element-UI--@change回调函数参数用法原文地址:Element-UI--_IT刀锋博客@change回调函数参数用法-CSDN博客简介说明本文介…
当宽带连接无法连接时,提示“网络连接,无法加载远程访问连接管理器服务。错误711:操作无法完成,因此无法及时启动远程访问.当宽带连接无法连接时无法连接,提示“网…
源创散文集|【进阶】Java高级JVM实战文章目录前言1.面试题解析2.JVM理论详解JVM的位置JVM架构类加载器3.JVM双亲委托机制4.Native关键字…
2024-10-23 06:15:33
2024-10-23 04:24:04
2024-10-23 02:33:07
2024-10-23 01:01:19
2024-10-22 23:06:05
大家好,今天小编关注到一个比较有意思的话题,就是关于电脑培训班结课讲话的问题,于…
大家好,今天小编关注到一个比较有意思的话题,就是关于温州海员培训班学校的问题,于…