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中定义结构体的方法
Mar 04 Python
python3.5仿微软计算器程序
Mar 30 Python
python实现八大排序算法(2)
Sep 14 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
python实现机器学习之元线性回归
Sep 06 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
python Django中models进行模糊查询的示例
Jul 18 Python
Python爬虫使用代理IP的实现
Oct 27 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
区分python中的进程与线程
Aug 13 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
SSI指令
2006/11/25 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
js 数组操作代码集锦
2009/04/28 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[03:08]Ti4观战指南上
2014/07/07 DOTA
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
django反向解析和正向解析的方式
2018/06/05 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
写自荐信的注意事项
2014/03/09 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
家长给学校的建议书
2014/05/15 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
审美与表现自我评价
2015/03/09 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android