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实现apahce网站日志分析示例
Apr 02 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
python制作一个桌面便签软件
Aug 09 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
python爬取微信公众号文章的方法
Feb 26 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
通过python连接Linux命令行代码实例
Feb 18 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
Python常用配置文件ini、json、yaml读写总结
Jul 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中file_put_contents追加和换行的实现方法
2017/04/01 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
jQuery异步提交表单实例
2017/05/30 jQuery
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
vue实现多级菜单效果
2019/10/19 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
python学习数据结构实例代码
2015/05/11 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
目前最全的python的就业方向
2018/06/05 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
店长岗位职责
2013/11/21 职场文书
图书室管理制度
2014/01/19 职场文书
人事专员的职责
2014/02/26 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
工作简历的自我评价
2019/05/16 职场文书
python编写五子棋游戏
2021/05/25 Python
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
Vue2.0搭建脚手架
2022/03/13 Vue.js
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS