深圳市万利机械科技有限公司官网! 收藏本站 联系方式 关于优盈娱乐
首页-优盈娱乐-注册登录站

定制高速高光机、精雕机设备研发生产厂家

寿命长达10年,精准度达0.01MM,效率高

免费打样咨询:
400-123-4567
当前位置: 首页 > 优盈资讯 > 公司动态

Pytorch模型训练(5) - Optimizer

文章作者:佚名 人气:发表时间:2024-03-04 13:06:25

《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:

 
 
 

所有Optimizer的基类

参数:
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函数,优化器迭代

 
        

平台注册入口