时间:2021-05-22
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传参时筛选掉这些参数:
# 载入预训练模型参数后...for name, value in model.named_parameters(): if name 满足某些条件: value.requires_grad = False# setup optimizerparams = filter(lambda p: p.requires_grad, model.parameters())optimizer = torch.optim.Adam(params, lr=1e-4)将满足条件的参数的 requires_grad 属性设置为False, 同时 filter 函数将模型中属性 requires_grad = True 的参数帅选出来,传到优化器(以Adam为例)中,只有这些参数会被求导数和更新。
3、如果载入的这些参数中,所有参数都更新,但要求一些参数和另一些参数的更新速度(学习率learning rate)不一样,最好知道这些参数的名称都有什么:
# 载入预训练模型参数后...for name, value in model.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(lambda p: id(p) not in ignored_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官方文档
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言众所周知,Dataset和Dataloder是pytorch中进行数据载入的部件。必须将数据载入后,再进行深度学习模型的训练。在pytorch的一些案例教学
pytorch预训练层的使用方法将其他地方训练好的网络,用到新的网络里面加载预训练网络1.原先已经训练好一个网络AutoEncoder_FC()2.首先加载该网
在实践中经常会遇到这样的情况:1、用简单的模型预训练参数2、把预训练的参数导入复杂的模型后训练复杂的模型这时就产生一个问题:如何加载预训练的参数。下面就是我的总
之前在用预训练的ResNet的模型进行迁移训练时,是固定除最后一层的前面层权重,然后把全连接层输出改为自己需要的数目,进行最后一层的训练,那么现在假如想要只是把
使用预训练模型的代码如下:#加载预训练模型resNet50=models.resnet50(pretrained=True)ResNet50=ResNet(Bo