pytorch提供了两类函数用于学习率调整

  1. torch.optim.lr_scheduler: 根据学习率更新次数调整学习率
  2. torch.optim.lr_scheduler.ReduceLROnPlateau:根据验证集的评价指标调整学习率

另外,pytorch 1.10之后,学习率调整一般在参数更新之后,即lr_scheduler.step()optimizer.step()之后调用

LambdaLR

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
# 设置学习率为初始学习率乘以给定lr_lambda函数的值new_lr=lr_lambda(last_epoch) * base_lr当 last_epoch=-1时, base_lr为optimizer优化器中的lr每次执行 scheduler.step(),  last_epoch=last_epoch +1
  • optimizer:优化器
  • lr_lambda:函数或者函数列表
  • last_epoch:默认为-1,学习率更新次数计数;注意断点训练时last_epoch不为-1

整体例子

import torch
from torch.optim.lr_scheduler import LambdaLR
import torch.optim as optim
import torch.nn as nn
import torch.nn.functional as F
import random
from torch.nn import CrossEntropyLoss
import matplotlib.pyplot as plt# 定义模型
class Net(nn.Module):def __init__(self, n_feature, n_hidden, n_out):super(Net, self).__init__()self.hidden = nn.Linear(n_feature, n_hidden)self.out = nn.Linear(n_hidden, n_out)self.init_weights()def init_weights(self):initrange = 0.5self.hidden.weight.data.uniform_(-initrange, initrange)self.hidden.bias.data.zero_()self.out.weight.data.uniform_(-initrange, initrange)self.out.bias.data.zero_()def forward(self, x, y=None):x = self.hidden(x)x = torch.sigmoid(x)x = self.out(x)out = F.log_softmax(x, dim=1)loss = Noneif y is not None:loss_fct = CrossEntropyLoss()loss = loss_fct(out, y)return out, loss# 构造数据
data_x = [torch.randn(32, 50)] * 16
data_y = [[1 if random.random() > 0.5 else 0 for j in range(32)]] * 16# 模型
net = Net(n_feature=50, n_hidden=10, n_out=2)# 优化器
optimizer = optim.Adam(net.parameters(), lr=1e-3)# 学习率变化策略
lambda1 = lambda i: i // 10scheduler = LambdaLR(optimizer, lr_lambda=lambda1, last_epoch=-1)
base_lr = scheduler.base_lrs[0]
print(base_lr)
print(scheduler.get_lr()[0])
print(scheduler.last_epoch)
print("=========================")# 画图
x_plot = []
y_plot = []for epoch in range(10):for step, batch in enumerate(zip(data_x, data_y)):x, y = batchy = torch.tensor(y)out, loss = net(x, y)loss.backward()optimizer.step()optimizer.zero_grad()scheduler.step()x_plot.append(scheduler.last_epoch)y_plot.append(scheduler.get_lr()[0])print(lambda1(scheduler.last_epoch))print(base_lr)print(optimizer.param_groups[0]["lr"])assert lambda1(scheduler.last_epoch) * base_lr == optimizer.param_groups[0]["lr"], "error"plt.plot(x_plot, y_plot, 'r')
plt.title('lr value of LambdaLR with (lambda1 = lambda i: i // 10) ')
plt.xlabel('step')
plt.ylabel('lr')
plt.savefig('./LambdaLR.jpg')


new_lr=lr_lambda(last_epoch) * base_lr
这里学习率更新的次数和step相等,因为每个step都会更新学习率,因此:
new_lr= step//10
1e-3
当step=20,new_lr=0.002
*

Warmup预热学习率

常用的Warmup预热学习率也可以依靠LambdaLR实现,代码如下:


def get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_training_steps, last_epoch=-1):"""Warmup预热学习率:先从一个较小的学习率线性增加至原来设置的学习率,再进行学习率的线性衰减当 current_step < num_warmup_steps时,new_lr =current_step/num_warmup_steps * base_lr当current_step >= num_warmup_steps时,new_lr =(num_training_steps - current_step) / (num_training_steps -num_warmup_steps) * base_lrArgs:optimizer (:class:`~torch.optim.Optimizer`):The optimizer for which to schedule the learning rate.num_warmup_steps (:obj:`int`):The number of steps for the warmup phase.num_training_steps (:obj:`int`):The total number of training steps.last_epoch (:obj:`int`, `optional`, defaults to -1):The index of the last epoch when resuming training.Return::obj:`torch.optim.lr_scheduler.LambdaLR` with the appropriate schedule."""def lr_lambda(current_step: int):# 自定义函数if current_step < num_warmup_steps:return float(current_step) / float(max(1, num_warmup_steps))return max(0.0, float(num_training_steps - current_step) / float(max(1, num_training_steps - num_warmup_steps)))return LambdaLR(optimizer, lr_lambda, last_epoch)

pytorch之学习率变化策略之LambdaLR相关推荐

  1. pytorch之学习率变化策略之MultiplicativeLR

    MultiplicativeLR torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verb ...

  2. PyTorch框架学习十四——学习率调整策略

    PyTorch框架学习十四--学习率调整策略 一._LRScheduler类 二.六种常见的学习率调整策略 1.StepLR 2.MultiStepLR 3.ExponentialLR 4.Cosin ...

  3. PyTorch学习之六个学习率调整策略

    PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 a. 有序调整:等间隔调整(Step),按需调整学习率( ...

  4. 【深度学习】图解 9 种PyTorch中常用的学习率调整策略

    learning rate scheduling 学习率调整策略 01 LAMBDA LR 将每个参数组的学习率设置为初始lr乘以给定函数.当last_epoch=-1时,将初始lr设置为初始值. t ...

  5. Pytorch —— 学习率调整策略

    1.为什么要调整学习率 学习率控制梯度更新的快慢,在训练中,开始时的学习率比较大,梯度更新步伐比较大,后期时学习率比较小,梯度更新步伐比较小. 梯度下降:wi+1=wi−g(wi)w_{i+1}=w_ ...

  6. pytorch优化器学习率调整策略以及正确用法

    优化器 optimzier优化器的作用:优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用. 从优化器的作用出发,要使得优化器能够起作用,需要主要两个东西: ...

  7. pytorch学习率下降策略

    阶段离散下降调整策略: 首先"阶段离散"下降调整这个词不是个专有名词,它只是一个形容. 符合这种调整策略的方法,一般是step,step学习率下降策略是最为常用的一种,表现为,在初 ...

  8. 干货|pytorch必须掌握的的4种学习率衰减策略

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨机器学习入坑者@知乎(已授权) 来源丨https://zhua ...

  9. pytorch必须掌握的的4种学习率衰减策略

    原文: pytorch必须掌握的的4种学习率衰减策略 1.指数衰减 2. 固定步长衰减 3. 多步长衰减 4. 余弦退火衰减 5. 上述4种学习率动态更新策略的说明 梯度下降算法需要我们指定一个学习率 ...

最新文章

  1. 还在担心工作被AI取代?不如掌握这门硬实力,抢占职场发展机遇
  2. java流处理为什么快_“任何情况下,都不可以堕胎”是道德普遍主义的观点。
  3. ajax 加载partial view ,并且 附加validate验证
  4. 事件控制块的原理与创建
  5. 一个好的APP需要后台产品经理么?
  6. 微服务设计 读书笔记 一
  7. 【LOJ】 #2540. 「PKUWC2018」随机算法
  8. padding和卷积的区别_TensorFlow笔记1——20.CNN卷积神经网络padding两种模式SAME和VALID...
  9. 简单配置nginx使之支持pathinfo
  10. unrecognized selector sent to instance
  11. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-7.App Widgets)...
  12. 谷歌眼镜设计规范之度量和网格
  13. SQL Server2008安装详细教程
  14. 如何快速激活数据恢复软件
  15. 【Unity3d学习】魔鬼与牧师(动作分离版本)
  16. 量子计算是人工智能的未来吗?
  17. SQL中Group by 简单理解
  18. Beyond Part Models: Person Retrieval with Refined Part Pooling (ECCV2018)
  19. 大学物理上册详细笔记_大学物理上册课堂笔记.pdf
  20. Unity获取隐藏的游戏对象

热门文章

  1. 配置Exchange邮箱完全访问权限
  2. 会场安排问题NYOJ14
  3. 获取数据库值,再在其值上做修改
  4. 日记 [2007年09月22日]solaris 10 挑战
  5. php 递归太多报错,php – javascript太多的递归?
  6. Oracle11使用现在数据库文件,oracle11g 重装操作系统后,如何利用原有oracle表空间文件还原数据库...
  7. linux系统修复找不到原安装,Linux 系统用安装盘来修复GRUB 详解
  8. 认真学习系列:《计算机网络自顶向下方法》笔记
  9. 机器学习实战——线性回归和局部加权线性回归(含python中复制的四种情形!)
  10. activimq java集成_Java消息队列-Spring整合ActiveMq