python PyTorch参数初始化和Finetune

作者:ycszen 时间:2023-04-26 08:53:44 

前言

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

参数初始化

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

python PyTorch参数初始化和Finetune

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


def weight_init(m):
# 使用isinstance来判断m属于什么类型
 if isinstance(m, nn.Conv2d):
   n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
   m.weight.data.normal_(0, math.sqrt(2. / n))
 elif isinstance(m, nn.BatchNorm2d):
# m中的weight,bias其实都是Variable,为了能学习参数以及后向传播
   m.weight.data.fill_(1)
   m.bias.data.zero_()

Finetune

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

局部微调

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


model = torchvision.models.resnet18(pretrained=True)
for param in 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) not in ignored_params,
          model.parameters())

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

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

来源:http://blog.csdn.net/u012759136/article/details/65634477

标签:pytorch,参数,初始化
0
投稿

猜你喜欢

  • 百度编辑器复制微信图片无法保存

    2023-08-14 17:32:46
  • SQLserver 2008将数据导出到Sql脚本文件的方法

    2024-01-13 05:02:45
  • vue中将el-switch值true、false改为number类型的1和0

    2024-04-27 15:57:43
  • python 输入字符串生成所有有效的IP地址(LeetCode 93号题)

    2022-09-06 00:16:57
  • 关于微信小程序使用echarts/数据刷新重新渲染/图层遮挡问题

    2024-05-22 10:39:44
  • Python GUI和游戏开发从入门到实践

    2021-01-09 15:30:47
  • sqlserver索引的原理及索引建立的注意事项小结

    2012-08-21 10:54:34
  • pytest测试框架+allure超详细教程

    2023-03-18 21:38:00
  • Python 打印不带括号的元组的实现

    2022-08-12 15:47:45
  • 举例讲解Python常用模块

    2022-03-21 07:35:49
  • JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析

    2023-09-04 22:44:33
  • 完美解决webstorm启动索引文件卡死的问题

    2022-04-05 05:52:29
  • python 正则表达式参数替换实例详解

    2022-08-11 18:21:44
  • python图形界面开发之wxPython树控件使用方法详解

    2022-05-04 04:39:28
  • python解决js文件utf-8编码乱码问题(推荐)

    2023-03-19 04:55:27
  • sql server 表结构修改方法

    2024-01-16 15:51:40
  • JavaScript门道之标准库

    2024-06-05 09:53:21
  • Echarts利用多X轴实现七天天气预报效果的示例代码

    2024-03-11 10:33:05
  • python根据开头和结尾字符串获取中间字符串的方法

    2021-01-02 01:44:28
  • widows下安装pycurl并利用pycurl请求https地址的方法

    2023-07-09 03:21:18
  • asp之家 网络编程 m.aspxhome.com