pytorch参数初始化以及fine-tune

转发https://blog.csdn.net/hx14301009/article/details/82693935

 

前言

这篇文章算是论坛PyTorch Forums关于参数初始化和finetune的总结,也是我在写代码中用的算是“最佳实践”吧。最后希望大家没事多逛逛论坛,有很多高质量的回答。

参数初始化

参数的初始化其实就是对参数赋值。而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了data,grad等借口,这就意味着我们可以直接对这些参数进行操作赋值了。这就是PyTorch简洁高效所在。 

所以我们可以进行如下操作进行初始化,当然其实有其他的方法,但是这种方法是PyTorch作者所推崇的:

 
  1. def weight_init(m):

  2. # 使用isinstance来判断m属于什么类型

  3. if isinstance(m, nn.Conv2d):

  4. n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels

  5. m.weight.data.normal_(0, math.sqrt(2. / n))

  6. elif isinstance(m, nn.BatchNorm2d):

  7. # m中的weight,bias其实都是Variable,为了能学习参数以及后向传播

  8. m.weight.data.fill_(1)

  9. m.bias.data.zero_()

 

然后使用model.apply(weight_init) 即可初始化你的model参数

apply函数会递归地搜索网络内的所有module并把参数表示的函数应用到所有的module上。

Finetune

往往在加载了预训练模型的参数之后,我们需要finetune模型,可以使用不同的方式finetune。

局部微调

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

 
  1. model = torchvision.models.resnet18(pretrained=True)

  2. for param in model.parameters():

  3. param.requires_grad = False

  4. # 替换最后的全连接层, 改为训练100类

  5. # 新构造的模块的参数默认requires_grad为True

  6. model.fc = nn.Linear(512, 100)

  7.  
  8. # 只优化最后的分类层

  9. optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

全局微调

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

 
  1. ignored_params = list(map(id, model.fc.parameters()))

  2. base_params = filter(lambda p: id(p) not in ignored_params,

  3. model.parameters())

  4.  
  5. optimizer = torch.optim.SGD([

  6. {'params': base_params},

  7. {'params': model.fc.parameters(), 'lr': 1e-2}

  8. ], lr=1e-3, momentum=0.9)

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值