PyTorch的Optimizer训练工具的实现


Posted in Python onAugust 18, 2019

torch.optim 是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。

使用 torch.optim,必须构造一个 optimizer 对象。这个对象能保存当前的参数状态并且基于计算梯度更新参数。

例如:

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

构造方法

Optimizer 的 __init__ 函数接收两个参数:第一个是需要被优化的参数,其形式必须是 Tensor 或者 dict;第二个是优化选项,包括学习率、衰减率等。

被优化的参数一般是 model.parameters(),当有特殊需求时可以手动写一个 dict 来作为输入。

例如:

optim.SGD([
  {'params': model.base.parameters()},
  {'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)

这样 model.base 或者说大部分的参数使用 1e-2 的学习率,而 model.classifier 的参数使用 1e-3 的学习率,并且 0.9 的 momentum 被用于所有的参数。

梯度控制

在进行反向传播之前,必须要用 zero_grad() 清空梯度。具体的方法是遍历 self.param_groups 中全部参数,根据 grad 属性做清除。

例如:

for input, target in dataset:
  def closure():
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    return loss
  optimizer.step(closure)

调整学习率

lr_scheduler 用于在训练过程中根据轮次灵活调控学习率。调整学习率的方法有很多种,但是其使用方法是大致相同的:用一个 Schedule 把原始 Optimizer 装饰上,然后再输入一些相关参数,然后用这个 Schedule 做 step()。

比如以 LambdaLR 举例:

lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
 train(...)
 validate(...)
 scheduler.step()

上面用了两种优化器

优化方法

optim 库中实现的算法包括 Adadelta、Adagrad、Adam、基于离散张量的 Adam、基于 ∞ \infty∞ 范式的 Adam(Adamax)、Averaged SGD、L-BFGS、RMSProp、resilient BP、基于 Nesterov 的 SGD 算法。

以 SGD 举例:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
optimizer.zero_grad()
loss_fn(model(input), target).backward()
optimizer.step()

其它方法的使用也一样:

opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=0.1, betas=(0.9, 0.99)
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=0.1, alpha=0.9)
...
...

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

Python 相关文章推荐
python抓取网页图片并放到指定文件夹
Apr 24 Python
Python程序设计入门(2)变量类型简介
Jun 16 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
numpy.linspace函数具体使用详解
May 27 Python
django 连接数据库 sqlite的例子
Aug 14 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
详解Python中的进程和线程
Jun 23 Python
Pytorch反向求导更新网络参数的方法
Aug 17 #Python
pytorch 模型可视化的例子
Aug 17 #Python
pytorch 输出中间层特征的实例
Aug 17 #Python
基于pytorch的保存和加载模型参数的方法
Aug 17 #Python
pytorch 固定部分参数训练的方法
Aug 17 #Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 #Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 #Python
You might like
php中的一些数组排序方法分享
2012/07/20 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
2011/04/28 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
详解python中的json的基本使用方法
2016/12/21 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
接口的多继承会带来哪些问题
2015/08/17 面试题
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
公司前台辞职报告
2014/01/19 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
法人授权委托书
2014/04/03 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL