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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
Python线程之定位与销毁的实现
Feb 17 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python装饰器练习题及答案
Nov 01 Python
Django重设Admin密码过程解析
Feb 10 Python
Python调用C语言程序方法解析
Jul 07 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
浅谈Python中对象是如何被调用的
Apr 06 Python
python中的random模块和相关函数详解
Apr 22 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
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
chrome原生方法之数组
2011/11/30 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
理解python多线程(python多线程简明教程)
2014/06/09 Python
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
在Python下尝试多线程编程
2015/04/28 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
数据库的约束含义
2012/09/09 面试题
医学生个人求职信范文
2014/02/07 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
春季运动会开幕词
2015/01/28 职场文书
人口与计划生育责任书
2015/05/09 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js