timm 中,我们总共有四种不同的调度器

  1. SGDR: 带暖启动的随机梯度下降
  2. 分类中的双曲正切衰减随机梯度下降
  3. StepLR
  4. PlateauLRScheduler

在本教程中,我们将详细介绍每种调度器,并探讨如何使用 timm 训练脚本利用这些调度器训练模型,或者将它们用作自定义 PyTorch 训练脚本的独立调度器。

可用调度器

在本节中,我们将介绍 timm 中各种可用的调度器。

SGDR

首先,我们来看一下在 timm 中也称为 cosine 调度器的 SGDR 调度器。

SGDR 调度器,即 带暖启动的随机梯度下降 调度器,使用余弦调度来安排学习率,但进行了一些调整。它会在经过一定数量的 epoch 后将学习率重置为初始值。

SGDR

StepLR

StepLR 是一种基本的阶梯式学习率调度器,支持预热和噪声。

StepLR 退火调度如下所示:

StepLR

在经过一定数量的 decay_epochs 后,学习率会更新为 lr * decay_rate。在上面的 StepLR 调度中,decay_epochs 设置为 30,decay_rate 设置为 0.5,初始 lr 为 1e-4。

分类中的双曲正切衰减随机梯度下降

这也称为 tanh 退火。tanh 代表双曲正切衰减。使用此调度器进行退火如下所示:

Tanh

它与 SGDR 类似,都是在经过一定数量的 epoch 后将学习率设置为初始 lr,但退火是使用 tanh 函数完成的。

PlateauLRScheduler

此调度器与 PyTorch 的 ReduceLROnPlateau 调度器非常相似。基本思想是跟踪评估指标,并根据评估指标的值,如果在一定数量的 epoch 内评估指标停滞不前,则使用 StepLR 降低 lr

timm 训练脚本中使用各种调度器

使用 timm 的训练脚本训练模型非常简单。基本上,我们只需使用 --sched 标志传递一个参数来指定要使用的调度器以及各种超参数。

  • 对于 SGDR,我们传递 --sched cosine
  • 对于 PlatueLRScheduler,我们传递 --sched plateau
  • 对于 TanhLRScheduler,我们传递 --sched tanh
  • 对于 StepLR,我们传递 --sched step

因此,调用训练脚本看起来像这样:

python train.py --sched cosine --epochs 200 --min-lr 1e-5 --lr-cycle-mul 2 --lr-cycle-limit 2