OneCycleLR

torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr, total_steps=None, epochs=None, steps_per_epoch=None, pct_start=0.3, anneal_strategy='cos', cycle_momentum=True, base_momentum=0.85, max_momentum=0.95, div_factor=25.0, final_div_factor=10000.0, three_phase=False, last_epoch=-1, verbose='deprecated')[源代码]

按照1cycle学习率策略设置每个参数组的学习率。

1cycle策略将学习率从初始值逐渐增加到一个最大值,然后再减少到一个小于初始值的最小值。这一策略最初在论文超收敛:使用大步长快速训练神经网络中被提出。

1cycle 学习率策略在每个批次结束后调整学习率。每当使用一个批次进行训练后,应调用 step 函数。

此调度器不能链接。

还需注意,循环中的总步数可通过以下两种方式之一确定(按优先级顺序列出):

  1. total_steps 的值被明确给出。

  2. 提供了多个纪元(epochs)和每个纪元内的步骤数量(steps_per_epoch)。在这种情况下,总步骤数可以通过公式 total_steps = epochs * steps_per_epoch 来计算。

你必须提供 total_steps 的值,或者同时提供 epochs 和 steps_per_epoch 的值。

此调度程序的默认行为遵循 fastai 对 1cycle 的实现,后者声称“未发表的研究显示,仅使用两个阶段可以取得更好的效果”。若要模仿原始论文中的行为,请设置 three_phase=True

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

  • max_lr (floatlist) – 周期内每个参数组的最大学习率。

  • total_steps (int) – 周期内的总步数。如果没有提供此值,则必须通过指定 epochs 和 steps_per_epoch 来推断。默认值:None

  • epochs (int) – 要进行训练的轮次。此参数与 steps_per_epoch 结合使用,用于推断周期中的总步数(如果未提供 total_steps 值)。默认值:None

  • steps_per_epoch (int) – 每个纪元的训练步数。此参数与 epochs 结合使用,用于推断周期中的总步数(如果未提供 total_steps 的值)。默认值:None

  • pct_start (float) – 增加学习率过程中所占周期(以步数计算)的百分比。默认值:0.3

  • anneal_strategy (str) – {‘cos’, ‘linear’} 指定退火策略,其中 “cos” 表示余弦退火,“linear” 表示线性退火。默认值: ‘cos’

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

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

  • max_momentum (floatlist) – 每个参数组在周期中的最大动量值。从功能上讲,它定义了循环的幅度(max_momentum - base_momentum)。需要注意的是,动量与学习率是反向变化的;在一个周期开始时,动量为“max_momentum”,而学习率为“base_lr”。默认值:0.95

  • div_factor (float) – 确定初始学习率 initial_lr = max_lr/div_factor。默认值为 25。

  • final_div_factor (float) – 用于确定最小学习率,计算公式为 min_lr = initial_lr / final_div_factor。默认值: 1e4

  • three_phase (bool) – 如果为 True,则使用调度的第三阶段根据 ‘final_div_factor’ 来减少学习率,而不是修改第二阶段。前两个阶段将在由 ‘pct_start’ 指示的步骤处对称。

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

  • verbose (bool | str) –

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

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

示例

>>> data_loader = torch.utils.data.DataLoader(...)
>>> optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)
>>> scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, steps_per_epoch=len(data_loader), epochs=10)
>>> for epoch in range(10):
>>>     for batch in data_loader:
>>>         train_batch(...)
>>>         optimizer.step()
>>>         scheduler.step()
get_last_lr()

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

返回类型

List [float]

get_lr()[源代码]

计算每个参数组的学习率。

load_state_dict(state_dict)

加载调度器的状态。

参数

state_dict (dict) – 调度器状态。应为调用state_dict()返回的对象。

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

显示当前学习率。

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

state_dict()

返回调度器的状态,形式为 dict

它包含了 self.__dict__ 中每个非优化器变量的条目。

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

执行一个步骤。

本页目录