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编写爬虫小程序
May 14 Python
10款最好的Python开发编辑器
Jul 03 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
python默认参数调用方法解析
Feb 09 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
python中把元组转换为namedtuple方法
Dec 09 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
js实现简单抽奖功能
2020/11/24 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python 编写简单网页服务器的实例
2018/06/01 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
自我鉴定模板
2013/10/29 职场文书
最新创业融资计划书
2014/01/19 职场文书
决心书范文
2014/03/11 职场文书
我的画教学反思
2014/04/28 职场文书
企业文化宣传标语
2014/06/09 职场文书
工作保证书
2015/01/17 职场文书
工作自我推荐信范文
2015/03/25 职场文书
银行服务理念口号
2015/12/25 职场文书
导游词之临安白水涧
2019/11/05 职场文书