CyclicLR#
- class torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, 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)[source]#
根据循环学习率策略(CLR)为每个参数组设置学习率。
该策略以恒定的频率在两个边界之间循环学习率,具体细节请参阅论文 Cyclical Learning Rates for Training Neural Networks。两个边界之间的距离可以按迭代或按周期进行缩放。
循环学习率策略在每个 batch 之后更改学习率。应该在使用了 batch 进行训练之后调用 step。
这个类有三种内置策略,如论文所述:
“triangular”:基础的三角循环,没有幅度缩放。
“triangular2”:基础的三角循环,每个周期将初始幅度减半。
“exp_range”:一种循环,在每个周期迭代时,初始幅度按 进行缩放。
此实现改编自 github 仓库: bckenstler/CLR
- 参数
optimizer (Optimizer) – 包装的优化器。
max_lr (float 或 list) – 每个参数组在周期内的上学习率边界。从功能上讲,它定义了周期的幅度(max_lr - base_lr)。在任何周期内的学习率是 base_lr 与幅度的一些缩放的总和;因此,根据缩放函数,max_lr 可能不会真正达到。
step_size_up (int) – 周期增加半程的训练迭代次数。默认为:2000
step_size_down (int) – 周期减少半程的训练迭代次数。如果 step_size_down 为 None,则设置为 step_size_up。默认为:None
mode (str) – {triangular, triangular2, exp_range} 中的一个。值对应于上面详细介绍的策略。如果 scale_fn 不为 None,则忽略此参数。默认为:‘triangular’
gamma (float) – ‘exp_range’ 缩放函数中的常数:gamma**(cycle iterations) 默认为:1.0
scale_fn (function) – 自定义缩放策略,由单个参数的 lambda 函数定义,其中所有 x >= 0 的 scale_fn(x) 都在 0 和 1 之间。如果指定了,则忽略 ‘mode’。默认为:None
scale_mode (str) – {‘cycle’, ‘iterations’}。定义 scale_fn 是在周期数还是周期迭代数(从周期开始的训练迭代数)上进行评估。默认为:‘cycle’
cycle_momentum (bool) – 如果为
True
,则动量与学习率成反比地在 ‘base_momentum’ 和 ‘max_momentum’ 之间循环。默认为:Truebase_momentum (float 或 list) – 每个参数组在周期内的下动量边界。请注意,动量与学习率成反比循环;在周期的峰值处,动量为 ‘base_momentum’,学习率为 ‘max_lr’。默认为:0.8
max_momentum (float 或 list) – 每个参数组在周期内的上动量边界。从功能上讲,它定义了周期的幅度(max_momentum - base_momentum)。在任何周期内的动量是 max_momentum 与幅度的一些缩放的差值;因此,根据缩放函数,base_momentum 可能不会真正达到。请注意,动量与学习率成反比循环;在周期的开始处,动量为 ‘max_momentum’,学习率为 ‘base_lr’。默认为:0.9
last_epoch (int) – 最后一个 batch 的索引。此参数用于恢复训练任务。由于 step() 应在每个 batch 之后而不是每个 epoch 之后调用,因此此数字表示计算的 *batch* 的总数,而不是计算的 epoch 的总数。当 last_epoch=-1 时,计划从头开始。默认为:-1
示例
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) >>> scheduler = torch.optim.lr_scheduler.CyclicLR( ... optimizer, ... base_lr=0.01, ... max_lr=0.1, ... step_size_up=10, ... ) >>> data_loader = torch.utils.data.DataLoader(...) >>> for epoch in range(10): >>> for batch in data_loader: >>> train_batch(...) >>> scheduler.step()