python PyTorch参数初始化和Finetune


Posted in Python onFebruary 11, 2018

前言

这篇文章算是论坛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是二者共有的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python三种遍历文件目录的方法实例代码
Jan 19 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python中cPickle类使用方法详解
Aug 27 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
iPython pylab模式启动方式
Apr 24 Python
如何利用Python识别图片中的文字
May 31 Python
Python 合并拼接字符串的方法
Jul 28 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
如何利用python发送邮件
Sep 26 Python
Python实现扫码工具的示例代码
Oct 09 Python
Python装饰器用法示例小结
Feb 11 #Python
python PyTorch预训练示例
Feb 11 #Python
TensorFlow中权重的随机初始化的方法
Feb 11 #Python
python的staticmethod与classmethod实现实例代码
Feb 11 #Python
Python语言的变量认识及操作方法
Feb 11 #Python
利用Opencv中Houghline方法实现直线检测
Feb 11 #Python
tensorflow输出权重值和偏差的方法
Feb 10 #Python
You might like
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
python3 requests库文件上传与下载实现详解
2019/08/22 Python
django ajax发送post请求的两种方法
2020/01/05 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
电子商务专业自我鉴定
2013/12/18 职场文书
初中数学教学反思
2014/01/16 职场文书
火车来了教学反思
2014/02/11 职场文书
教师职称自我鉴定
2014/02/12 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
有关环保的标语
2014/06/13 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
开业典礼致辞
2015/07/29 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏