CyclicLR

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, verbose='deprecated')[源代码]

按照循环学习率策略 (CLR) 设置每个参数组的学习率。

该策略以恒定频率在两个边界之间循环调整学习率,详情参见论文 训练神经网络的周期性学习率。这两个边界的距离可以在每次迭代或每个周期的基础上进行调整。

循环学习率策略在每个批次结束后调整学习率。应在一个批次用于训练之后调用step函数。

此类包含了论文中提出的三种内置策略:

  • “三角形”:一个基本的三角形循环,不进行幅度缩放。

  • "triangular2": 每个周期初始幅度减半的基本三角形循环。

  • "exp_range": 每个周期迭代中,通过$\text{gamma}^{\text{cycle iterations}}$来缩放初始振幅的周期。

该实现参考了以下 GitHub 仓库:bckenstler/CLR

参数
  • optimizer (Optimizer) — 包裹后的优化器。

  • base_lr (floatlist) – 每个参数组在周期中的初始学习率,它是每个参数组的下限。

  • max_lr (floatlist) – 每个参数组在周期中的最大学习率。从功能上看,它定义了周期的振幅(max_lr - base_lr)。 周期内的实际学习率是基础学习率加上振幅缩放后的值;因此,根据具体的缩放函数,实际的学习率可能不会达到 max_lr。

  • step_size_up (int) – 在增加周期的一半中进行的训练迭代次数。默认值:2000

  • step_size_down (int) – 在一个周期的下降阶段中的训练迭代次数。如果未指定 step_size_down,则将其设置为 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 (函数) – 自定义缩放策略,通过单参数 lambda 函数定义,满足对于所有 x >= 0 的条件为 0 <= scale_fn(x) <= 1。如果指定了此参数,则忽略 ‘mode’ 参数。默认值:None

  • scale_mode (str) – {‘cycle’, ‘iterations’}. 确定 scale_fn 是在周期号上进行评估还是在每个周期的迭代次数(自周期开始以来的训练迭代次数)上进行评估。默认值:‘cycle’

  • cycle_momentum (bool) – 如果为 True,动量会在“base_momentum”和“max_momentum”之间与学习率相反地进行循环。默认值:True

  • base_momentum (floatlist) – 每个参数组在周期中的最小动量值。需要注意的是,动量与学习率是反向变化的;在一个周期的顶峰时,动量为 ‘base_momentum’ 而学习率为 ‘max_lr’。默认值:0.8

  • max_momentum (floatlist) – 每个参数组在周期中的最大动量边界。从功能上看,它定义了周期的振幅(max_momentum - base_momentum)。在一个周期中,动量是 max_momentum 和某个缩放因子之间的差值;因此,base_momentum 可能不会实际达到。需要注意的是,动量与学习率呈反向变化;在每个周期开始时,动量为 ‘max_momentum’ 而学习率为 ‘base_lr’ 。默认值:0.9

  • last_epoch (int) – 表示最后一批数据的索引。此参数用于恢复训练任务。由于step()应在处理完每批数据后调用,而不是在每个 epoch 结束时调用,因此该数字表示总的批次数量,而非总的 epoch 数量。当 last_epoch=-1 时,调度将从初始位置开始。默认值:-1

  • verbose (bool | str) –

    如果设置为True,则会对每次更新在标准输出中打印一条消息。默认值为False

    自版本 2.2 起已弃用:verbose 已被弃用。请使用 get_last_lr() 来访问学习率。

示例

>>> 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)
>>> data_loader = torch.utils.data.DataLoader(...)
>>> for epoch in range(10):
>>>     for batch in data_loader:
>>>         train_batch(...)
>>>         scheduler.step()
get_last_lr()

返回当前调度器计算出的最新学习率。

返回类型

List [float]

get_lr()[源代码]

在批次索引处计算学习率。

此函数将self.last_epoch视为最后一批次的索引。

如果 self.cycle_momentumTrue,该函数将会更新优化器的动量,这是一个副作用。

load_state_dict(state_dict)[源代码]

加载调度器的状态。

print_lr(is_verbose, group, lr, epoch=None)

显示当前学习率。

自版本 2.4 起已弃用:print_lr() 已被弃用,请使用 get_last_lr() 来访问学习率。

scale_fn(x)[源代码]

获取缩放政策。

返回类型

浮点数

step(epoch=None) 由于上述代码格式已经较为简洁,直接翻译可能难以形成自然语言描述。但根据上下文和意图,可以尝试如下表述: 进行一个训练步骤,参数`epoch`可选设置为`None`。

执行一个步骤。

本页目录