pytorch载入预训练模型后,实现训练指定层
1、有了已经训练好的模型参数,对这个模型的某些层做了改变,如何利用这些训练好的模型参数继续训练:
pretrained_params=torch.load('Pretrained_Model') model=The_New_Model(xxx) model.load_state_dict(pretrained_params.state_dict(),strict=False)
strict=False使得预训练模型参数中和新模型对应上的参数会被载入,对应不上或没有的参数被抛弃。
2、如果载入的这些参数中,有些参数不要求被更新,即固定不变,不参与训练,需要手动设置这些参数的梯度属性为Fasle,并且在optimizer传参时筛选掉这些参数:
#载入预训练模型参数后... forname,valueinmodel.named_parameters(): ifname满足某些条件: value.requires_grad=False #setupoptimizer params=filter(lambdap:p.requires_grad,model.parameters()) optimizer=torch.optim.Adam(params,lr=1e-4)
将满足条件的参数的requires_grad属性设置为False,同时filter函数将模型中属性requires_grad=True的参数帅选出来,传到优化器(以Adam为例)中,只有这些参数会被求导数和更新。
3、如果载入的这些参数中,所有参数都更新,但要求一些参数和另一些参数的更新速度(学习率learningrate)不一样,最好知道这些参数的名称都有什么:
#载入预训练模型参数后... forname,valueinmodel.named_parameters(): print(name) #或 print(model.state_dict().keys())
假设该模型中有encoder,viewer和decoder两部分,参数名称分别是:
'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',
假设要求encode、viewer的学习率为1e-6,decoder的学习率为1e-4,那么在将参数传入优化器时:
ignored_params=list(map(id,model.decoder.parameters())) base_params=filter(lambdap:id(p)notinignored_params,model.parameters()) optimizer=torch.optim.Adam([{'params':base_params,'lr':1e-6}, {'params':model.decoder.parameters()} ], lr=1e-4,momentum=0.9)
代码的结果是除decoder参数的learning_rate=1e-4外,其他参数的额learning_rate=1e-6。
在传入optimizer时,和一般的传参方法torch.optim.Adam(model.parameters(),lr=xxx)不同,参数部分用了一个list,list的每个元素有params和lr两个键值。如果没有lr则应用Adam的lr属性。Adam的属性除了lr,其他都是参数所共有的(比如momentum)。
以上这篇pytorch载入预训练模型后,实现训练指定层就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
参考:
pytorch官方文档
https://www.nhooo.com/article/134943.htm
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。