pytorch加载预训练模型、微调、以及现有模型中加入自己的层、为不同层设置不同的参数更新

**加载预训练:**分为两种
1.加载自己之前训练的模型。

pretrained_params = torch.load('Pretrained_Model')
model = New_Model(xxx)
model.load_state_dict(pretrained_params.state_dict(),strict=False)

2.加载pytorch中模型
以残差网络18为例

import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
pretrained_dict = resnet18.state_dict()
model_dict = new_model.state_dict()
# 将pretrained_dict里不属于model_dict的键剔除掉
pretrained_dict =  {
    
    k: v for k, v in pretrained_dict.items() if k in model_dict  and v.shape ==model_dict[k].shape}
# 更新现有的model_dict
model_dict.update(pretrained_dict)
# 加载我们真正需要的state_dict
new_model.load_state_dict(model_dict)

微调:

for name, value in model.named_parameters():
    if name 你需要固定的层:
        value.requires_grad = False
        
params = filter(lambda p: p.requires_grad, model.parameters())
optimizer = torch.optim.Adam(params, lr=1e-5)

如果你不知道你需要固定层的名字可通过:

print(model.state_dict().keys())

现有模型中加入自己的层:
1.首先新建自己的模型
2.将现有模型参数加载进入
以加载的ResNet18为例

import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
pretrained_dict = resnet18.state_dict()
model_dict = new_model.state_dict()
# 将pretrained_dict里不属于model_dict的键剔除掉
pretrained_dict =  {
    
    k: v for k, v in pretrained_dict.items() if k in model_dict  and v.shape ==model_dict[k].shape}
# 更新现有的model_dict
model_dict.update(pretrained_dict)
# 加载我们真正需要的state_dict
new_model.load_state_dict(model_dict)

为不同层设置不同的参数更新:
假设要求encode等层学习率为1e-5, 而decoder层的学习率为1e-3,1.我们需要先将解码层decoder的参数提取出来
2.通过filter过滤得其它层的参数,然后将他们数组方式传入优化器中。

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-5},                              {
    
    'params':model.decoder.parameters()}],lr=1e-3, momentum=0.8)                         

猜你喜欢

转载自blog.csdn.net/qq_43360777/article/details/106305469
今日推荐