欢迎浏览我公司网站!!
行业资讯
PyTorch 中 torch.optim优化器的使用
时间: 2024-02-28浏览次数:
建立优化器实例循环:清空梯度向前传播计算Loss反向传播更新参数示例:PyTorch提供了来帮助用户改变学习率,下边将从入手,看一下这个类是如何工作的。为什么从Optimizer入手,因为无论是Adam还是SGD,都是继承的这个类。同时,scheduler也是给所有的Optimizer服务的,所以需要用的方法都会定义在这个基类里
  1. 建立优化器实例
  2. 循环:
    1. 清空梯度
    2. 向前传播
    3. 计算Loss
    4. 反向传播
    5. 更新参数

示例:

 
 

PyTorch提供了来帮助用户改变学习率,下边将从入手,看一下这个类是如何工作的。

为什么从Optimizer入手,因为无论是Adam还是SGD,都是继承的这个类。同时,scheduler也是给所有的Optimizer服务的,所以需要用的方法都会定义在这个基类里,直接看一下这个类的属性即可。给出Doc中的代码链接

首先是初始化方法?,这个方法的params参数,就是我们在初始化优化器的时候传入的网络的参数,如,而后边所有的参数都将合并成dict参数作为这个方法的defaults。
看一下中存的都是什么:

 


可以看到,这里边存的就是整个网络的参数。
有两种定义optimizer的方法:

第一种方法:

 
在这个初始化方法中,会把这些参数先改造成 [{'params': Alexnet.parameters()}]
这样的一个长度为1的list。然后对这个list进行加工,添加上defaults中的参数,如果我们使用Alexnet来做一个例子的话,就是下边这个样子:
 

第二种方法:有时候,训练时需要给不同层分配不同的学习率,这时就可以通过optimizer中?param_groups来分配

 

为传入的本身就是dict的形式,所以会继续对他进行加工,添加上后边的参数,我们直接看结果:

 

这次的list变成了两个元素,而且每个元素的组成和使用Adam也不一样了,这很明显,因为不同的优化器需要的参数不同嘛~(关于不同层的lr不同的设置这里给出官网链接)

但是两者是相似的,就是每个元素都有params和lr,这就够了。

所有的动态修改lr的类,都是继承的这个类,所以我们看一下这个类包含什么方法。源码链接

在初始化方法中,包含两个参数,第一个参数就是我们上边提到的optimizer的任何一个子类。第二个参数的意思是当前执行到了哪个epoch。我们不指定它的时候,虽然默认是-1,但是init中会调用一次step并设置为0。

PyTorch 1.1.0 之后的版本先训练,然后再。

当我们调用了初始化后,会给optimizer增加一个字段,看一下:

 

新增加的字段就是原始的lr。

在方法中,通常情况下我们不需要指定这个参数epoch,因为每次调用他都会增加1。在这个函数中会调用一个需要重载的方法?,每次调用都会从这个方法中提取改变后的lr,赋值给optimizer。

这里其实我一直有个疑问的,就是scheduler的step和optimizer的step是一个什么关系,其实通过源码,看到这里,这俩函数没啥关系!scheduler的step只会修改lr,两者都需要执行!

下边看一下两个scheduler的对比一下。先看一下SetpLR:

 

这个会在设置的步长的整倍数的时候将 lr*gamma。
而ExponentialLR则会在每轮结束的时候都进行乘gamma的操作,这个减小也真的是指数倍的。

 
 
 
 

Pytorch 中 torch.optim.lr_scheduler 动态调整学习率的方法详解及示例参考? :?Pytorch动态调整学习率的方法详解及示例_风雪夜归人o的博客-CSDN博客_动态学习率

PyTorch torch.optim.lr_scheduler 学习率 - LambdaLR;StepLR;MultiStepLR;ExponentialLR_zisuina_2的博客-CSDN博客_lambdalr

还有一种用的可能少一点:

代码如下:表示每20个epoch学习率调整为之前的10%

 


Copyright © 2002-2022 盛煌-盛煌娱乐-盛煌全球注册认证站 版权所有

粤IP*******

平台注册入口