Pytorch模型训练(5) - Optimizer
《Optimizer》
本文总结Pytorch中的Optimizer
Optimizer是深度学习模型训练中非常重要的一个模块,它决定参数参数更新的方向,快慢和大小,好的Optimizer算法和合适的参数使得模型收敛又快又准
但本文不会讨论什么任务用什么Optimizer,及其参数设置,只是总结下Pytorch中的Optimizer
文章目录
Pytorch模型训练(0) - CPN源码解析
Pytorch模型训练(1) - 模型定义
Pytorch模型训练(2) - 模型初始化
Pytorch模型训练(3) - 模型保存与加载
Pytorch模型训练(4) - Loss Function
Pytorch模型训练(5) - Optimizer
Pytorch模型训练(6) - 数据加载
Pytorch的torch.optim是包含各种优化器算法的包,支持通用优化器方法,接口通用性好,也方便集成更加复杂的算法
怎样使用一个Optimizer ?
要使用Optimizer,我们首先要创建一个Optimizer对象,该对象会保持当前状态,并根据计算梯度来更新参数
创建Optimizer时,需要为其提供一些需要迭代的参数进行迭代,还可以指定一些可选的,特定的,用于优化的参数,如学习率,权重衰减等参数
Example:
注意1:如果需要将模型移到GPU,可以通过".cuda"来实现
注意2:在训练中,最好保持模型和优化在相同位置,即要在GPU,都在GPU
Optimizer支持特殊参数指定选项,这样需要用一个字典(dict)类型的可迭代参数代替变量(Variable)可迭代参数;它们有各自的参数组,用"params"关键字将他们独立开(包含属于它的参数列表)
在需要不同层不同参数时,非常有用,如:
也就是,classifier.parameters的学习率为1e-3,base.parameters的学习率为le-2,动量0.9适用所有参数
迭代,更新参数,一般有下面2中方式:
方式1:
该方式能满足大多需求,一般只要进行梯度需要,如backward(),这个step()函数就需要被召唤
Example:
方式2:
一些特殊算法,如共轭梯度(Conjugate Gradient) 和 LBFGS 需要多次重新评估函数,所以需要传入一个允许重新计算模型的闭包(closure),来清理梯度,计算loss并返回
Example:
参数:
1)params:可迭代对象,需要被优化的参数对象,一般为张量(torch.Tensor)或字典(dict)
2)defaults:字典类型,一些优化选项,基本都有默认值
方法:
1)add_param_group(param_group)
增加需要优化的参数到param_groups,如在使用预训练模型进行微调时,很有用,可以将冻结层参数添加到训练中
2)load_state_dict(state_dict)
加载优化器参数
3)state_dict()
返回优化器状态,字典类型,包括优化器状态和参数组
4)step(closure)
单步更新
5)zero_grad()
清空优化器参数的梯度
这些Optimizer部分,我罗列的比较简单,因为在应用层,无非是他们的参数,而这些参数就关乎算法原理,不是本文重点,有兴趣可以参见梯度下降算法原理的博客
这些优化器中往往需要多个参数,共同控制才能达到优化目的,但大多数参数都有默认参考值,这些值都是大牛们经过多方验证得出的,所以我们在训练模型时,需要手动设置的参数并不多
其中最需要我们手动调节的就是学习率,关于学习率衰减理论部分可参见个人博客;而Pytorch中怎么调用呢?
提供了基于epochs调节学习率的方法;主要有以下几种:
Example:
1)实例化Adam优化器
2)若resume,加载优化器状态
3)训练时(学习率调节,train,优化器迭代,模型保存)
细节1:学习率调节函数adjust_learning_rate
细节2:train函数,优化器迭代
同类文章排行
- 精雕机的错位原因有那些?
- 数控精雕机主轴加工后的保养方法
- cnc高光机在使用时候需要注意什么
- 精雕机不归零加工完闭后不回工作原点?
- 主轴达不到指定转速?
- 一个高端数控系统对精雕机的重要性
- 高光机主轴轴承容易坏的原因
- 手机边框高光机的特点
- 开机无反应,机床没电,手柄无反应,不显示?
- 五金高光机的质量判断的四大标准