pytorch加载模型部分参数(pytorch 加载部分权重)

作者:电脑培训网 2024-05-06 14:47:35 387

Pytorch加载模型时,只导入部分层权重,即跳过指定的网络层。需求

当Pytorch加载模型时,仅导入某些层权重,并且跳过了一些指定的网络层。

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加载权重文件时报错MagicNumberError

有时,使用torch.load加载较旧的权重文件时,可能会报告幻数错误。这可能是因为该文件是使用泡菜存储的,并使用Latin1编码。在这种情况下,可以这样加载:

如果要过滤的话,可以在最后加上if,道理是一样的。

进口泡菜开放式作为f:obj=f.read使用泡菜加载,并且编码方法为latin1weights={key:forkeforkeyforkeyforkeyforkeyforkey,ploate_dictinprackle.loads中.Items}类似地,您可以使用判断flows={key:键的值,interprockle.loads中的值。项目“预测”不在键中)}model.load_state_dict

TypeError:abytes-likeobjectisrequired,not'str'

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博客

相关推荐