PyTorch torch.optim.lr_scheduler.CyclicLR

循环学习率策略在神经网络训练中的应用
本文介绍了CyclicLR,一种不同于传统固定或单调递减学习率的策略,它在训练神经网络时使学习率在预设的上下限之间周期性变化。关键参数包括基础学习率base_lr、最大学习率max_lr以及步长step_size_up和step_size_down。通过调整这些参数,可以有效地避免过早收敛或训练不充分的问题。在代码实例中,展示了如何使用PyTorch的CyclicLR调度器来实现这一策略,并在训练和验证过程中动态调整学习率。

1.出处介绍

  CyclicLR循环学习率出自于论文《Cyclical Learning Rates for Training Neural Networks》;与之前的固定或者单调递减的学习率不同,这是周期性变化。有三个参数:上边界max_lr,下边界base_lr,补长stepsize。如下所示,学习率在base_lr和max_lr震荡更新。
在这里插入图片描述

2.参数介绍

  • base_lr:基础学习率
  • max_lr:学习率上限
  • step_size_up:学习率上升的步数
  • step_size_down:学习率下降的步数
  • mode:共三种模式分别为triangular,triangular2和exp_range
  • gamma:exp_range中的常量gamma**(cycle iterations)
  • scale_fn:自定义缩放策略保证所有x≥0x\geq 0x0的情况下scale_fn(x)scale\_fn(x)scale_fn(x)的值域为[0,1][0,1][0,1]
  • scale_mode:两种模式cycle和iterations
  • cycle_momentum:如果为True,则动量与’base_momentum’和’max_momentum之间的学习率成反比
  • base_momentum:初始动量,即每个参数组的循环中的下边界。
  • max_momentum:每个参数组的循环中的上动量边界。

3.代码实例

#设置优化器
optimizer = torch.optim.SGD(model.parameters(),lr=opt.lr,momentum=0.9)
base_lr = 2e-3
max_lr = 6e-3

#设置学习率调节方法
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=500, step_size_down=500, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)

for epoch in range(opt.num_epochs):
	train(...)
	validate(...)
	scheduler.step()
### 替换 PyTorch 中的学习率调度器 在 PyTorch 中,除了 `torch.optim.lr_scheduler` 提供的标准学习率调度器外,还可以通过自定义函数或使用其他库来实现学习率调整。 #### 方法一:手动修改学习率 可以直接访问优化器的参数组并更新学习率: ```python for param_group in optimizer.param_groups: param_group['lr'] = new_learning_rate ``` 这种方法提供了最大的灵活性,允许在训练循环内的任何位置动态更改学习率[^1]。 #### 方法二:使用 LambdaLR 调度器 LambdaLR 是一种灵活的方式,可以通过定义 lambda 函数来自定义学习率的变化规律。例如线性衰减: ```python lambda1 = lambda epoch: 0.95 ** epoch scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1) ``` 这使得可以轻松创建复杂的学习率变化模式而无需编写额外的逻辑代码[^2]。 #### 方法三:CosineAnnealingLR 和 CosineAnnealingWarmRestarts 这两种调度策略模仿余弦波形改变学习率,在某些情况下能带来更好的泛化性能: ```python # 单周期余弦退火 scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10) # 多重重启版本 scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10) ``` 这些方法特别适合于长时间训练的任务,因为它们可以在多个时期内平滑地降低学习率. #### 自定义调度器 如果上述选项都不能满足需求,则可以选择继承 `_LRScheduler` 类构建自己的调度算法。这种方式最具有定制性和适应特殊场景的能力。 ```python from torch.optim.lr_scheduler import _LRScheduler class CustomScheduler(_LRScheduler): def __init__(self, optimizer, last_epoch=-1): super(CustomScheduler, self).__init__(optimizer, last_epoch) def get_lr(self): # 定义新的学习率计算方式 pass ``` 这种做法适用于那些希望完全控制学习率调整过程的研究人员和技术专家.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生面壁者章北海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值