首页 > 其他分享 >关于学习率-----linearLR

关于学习率-----linearLR

时间:2022-10-05 22:02:19浏览次数:76  
标签:optimizer self 学习 epoch lr linearLR factor ----- 参数

1. lr_scheduler综述

torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果。

学习率的调整应该放在optimizer更新之后,下面是一个参考:

 

>>> model = [Parameter(torch.randn(2, 2, requires_grad=True))]
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

>>> scheduler = torch.optim.lr_scheduler.LinearLR(self.opt, start_factor=0.5, total_iters=4)
>>> for epoch in range(20): 
>>>    for input, target in dataset:
>>>        optimizer.zero_grad()
>>>        output = model(input) 
>>>        loss = loss_fn(output, target) 
>>>        loss.backward() 
>>>        optimizer.step() 
>>>    scheduler.step()

注意: 在PyTorch 1.1.0之前的版本,学习率的调整应该被放在optimizer更新之前的。如果我们在 1.1.0 及之后的版本仍然将学习率的调整(即 scheduler.step())放在 optimizer’s update(即 optimizer.step())之前,那么 learning rate schedule 的第一个值将会被跳过。所以如果某个代码是在 1.1.0 之前的版本下开发,但现在移植到 1.1.0及之后的版本运行,发现效果变差,需要检查一下是否将scheduler.step()放在了optimizer.step()之前。

2. optimizer综述

torch.optim 是一个实现各种优化算法的包。

要使用torch.optim,必须构造一个optimizer对象,该对象将保持当前状态,并将根据计算出的梯度更新参数。

要构造一个optimizer,我们必须给它一个包含要优化的参数(所有参数应该是Variable类型)的迭代器。然后,可以指定特定于optimizer的选项,如学习率、权重衰减等。

例如:

optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.05)

optimizer也支持指定每个参数的选项。要做到这一点,不是传递一个Variable的迭代,而是传递一个可迭代的dict。每个变量都将定义一个单独的parameter group,并且应该包含一个 params 键,包含一个属于它的参数列表。其他键应该与优化器接受的关键字参数匹配,并将用作该组的优化选项。

我们仍然可以将选项作为关键字参数传递。它们将作为默认值,在没有覆盖它们的组中使用。如果只希望改变单个选项,同时保持参数组之间所有其他选项的一致性时,这种方法非常有用。

例如,想要指定每层的学习速度时:

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,并且所有参数的momentum为0.9。

所有的优化器都实现了一个 step()方法来更新参数:optimizer.step()。当使用如backward()等方法计算出梯度后,就可以调用step()更新参数。

例如:

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


torch.optim.optimizer(params, defaults)

参数:

  • params(iterable) - 可迭代的torch.Tensor或dict,用来指定需要优化的张量。
  • defaults(dict) - dict,包含优化选项的默认值(当参数组没有指定它们时生效)。

方法:

  • Optimizer.add_param_group - 添加一个参数组到优化器的参数组
  • Optimizer.load_state_dict - 加载优化器状态
  • Optimizer.state_dict - 以字典形式返回优化器的状态
  • Optimizer.step - 执行单个优化步骤(参数更新)
  • Optimizer.zero_grad - 所有需优化张量的梯度清零

3. linearLR综述

  • 在epoch数达到total_iters数值之前,使用线性改变乘法因子衰减学习率。
  • 计算公式和pytorch计算代码如下:

def _get_closed_form_lr(self):
        return [base_lr * (self.start_factor +
                (self.end_factor - self.start_factor) * min(self.total_iters, self.last_epoch) / self.total_iters)
                for base_lr in self.base_lrs]
  • pytorch调用及相关参数:
torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=0.3333333333333333, end_factor=1.0, total_iters=5, last_epoch=- 1, verbose=False)
 

参数

  • optimizer(Optimizer) -包装优化器。

  • start_factor(float) -我们在第一个 epoch 中乘以学习率(base_lr)的数字。在接下来的 epoch 中,乘法因子向 end_factor 变化。默认值:1./3。

  • end_factor(float) -我们在线性变化过程结束时乘以学习率(base_lr)的数字。默认值:1.0。

  • total_iters(int) -乘法因子达到1的迭代次数。默认值:5。

  • last_epoch(int) -最后一个纪元的索引。默认值:-1。

  • verbose(bool) -如果 True ,每次更新都会向标准输出打印一条消息。默认值:False

 

通过线性改变小的乘法因子来衰减每个参数组的学习率,直到 epoch 的数量达到预定义的里程碑:total_iters。

请注意,这种衰减可能与此调度程序外部对学习率的其他更改同时发生。当last_epoch=-1 时,设置初始 lr 为 lr。

  • 举例说明:
lr_scheduler = LinearLR(optimizer, start_factor=0.5, total_iters=4)
base_lr=0.05
# epoch == 0→lr = base_lr * start_factor = 0.05 * 0.5=0.025;
# epoch == 1→lr = 0.05 * (0.5 + 0.5 * 0.25) = 0.3125;
......
# epoch ≥ 4→lr = base_lr * end_factor = 0.05(当epoch数等于total_iters时,min(self.total_iters, self.last_epoch) / self.total_iters = 1)

 

 

标签:optimizer,self,学习,epoch,lr,linearLR,factor,-----,参数
From: https://www.cnblogs.com/zz-w/p/16756527.html

相关文章

  • linux --- 虚拟文件系统
    Linux内核包含了文件管理子系统组件,它主要实现了虚拟文件系统(VirtualFileSystem,VFS),虚拟文件系统屏蔽了各种硬件上的差异以及具体实现的细节,为所有的硬件设备提供统一的......
  • 【Java8新特性】- Lambda表达式
    Java8新特性-Lambda表达式......
  • gRPC框架学习:4、proto文件编译
    gRPC框架学习:4、proto文件编译文章目录​​gRPC框架学习:4、proto文件编译​​​​1.前言​​​​2.编译器总的地址​​​​3.具体语言编译器地址​​1.前言通过前面的学......
  • 学习+科研+做项目 深度学习最全详细资料
    ​​李宏毅2020机器学习深度学习(完整版)国语​​​​[双语字幕]吴恩达深度学习deeplearning.ai​​​​深度学习(卷积网络、循环神经网络、对抗神经网络、Tensorflow实战)​......
  • 学习+做项目+科研 Keras详细讲解-视频
    ​​【莫烦Python】Keras快速搭建神经网络​​​​Keras深度学习快速简明教程最易学的深度学习入门课程人人都可以学的人工智能入门​​​​keras入门​​​​Keras项目......
  • 学习+做项目+科研 MXNet最全详细视频资料
    更多资料请关注公众号:计算机视觉与图形学实战​​[MXNet/Gluon]动手学深度学习第一课:从上手到多类分类​​目录播放量9.4万-[30min]介绍-[15min]演示从干净系统安装......
  • C语言学习记录4
    #每日落日分享#今天浅显的学习了'getchar',现在记录下来。#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intch=0;charpassword[20]={0};......
  • FPGA学习--VHDL基本结构
    一个完整的VHDL程序,或者说设计实体,通常要求最低能为VHDL综合器所支持,并能作为一个独立的设计单元,即元件的形式而存在的VHDL程序。在VHDL程序中,通常包含实体(ENTITY)、结构体......
  • POJ - 2348 Euclid's Game
    Euclid'sGame博弈很经典的博弈了首先明确每个状态必然都对应着一个局面,先手必败\(or\)先手必胜如果当前局面对于先手来说是能够选择的,也就是\(b>=a*2\),对于一......
  • Codeforces Round #824 (Div. 2) C - Phase Shift
    (有点难以描述的)题意:给出一串字母,为每一个字母找一个映射,要求:1)所有的映射连起来形成一个且只有一个环;2)这个环内包含26个字母;3)映射后形成的新字符串字典序最小。解:随便找两......