pytorch 如何finetune

2022-10-04 11:09:15

参考文章:
使用pytorch读取、使用预训练模型进行finetune:以Resnet-101为例

用pytorch实现预训练网络的finetune

局部微调

有时候我们加载了训练模型后,只想调节最后的几层,其他层不训练。其实不训练也就意味着不进行梯度计算,PyTorch中提供的requires_grad使得对训练的控制变得非常简单。

model= torchvision.models.resnet18(pretrained=True)for paramin model.parameters():
    param.requires_grad=False# 替换最后的全连接层, 改为训练100类# 新构造的模块的参数默认requires_grad为True
model.fc= nn.Linear(512,100)# 只优化最后的分类层
optimizer= optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

全局微调,不同学习率

有时候我们需要对全局都进行finetune,只不过我们希望改换过的层和其他层的学习速率不一样,这时候我们可以把其他层和新层在optimizer中单独赋予不同的学习速率。比如:

ignored_params=list(map(id, model.fc.parameters()))
base_params=filter(lambda p:id(p)notin ignored_params,
                     model.parameters())

optimizer= torch.optim.SGD([{'params': base_params},{'params': model.fc.parameters(),'lr':1e-2}], lr=1e-3, momentum=0.9)

其中base_params使用1e-3来训练,model.fc.parameters使用1e-2来训练,momentum是二者共有的。

  • 作者:xys430381_1
  • 原文链接:https://blog.csdn.net/xys430381_1/article/details/106323439
    更新时间:2022-10-04 11:09:15