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 函数。
此调度器不能链接。
还需注意,循环中的总步数可通过以下两种方式之一确定(按优先级顺序列出):
-
total_steps 的值被明确给出。
-
提供了多个纪元(epochs)和每个纪元内的步骤数量(steps_per_epoch)。在这种情况下,总步骤数可以通过公式 total_steps = epochs * steps_per_epoch 来计算。
你必须提供 total_steps 的值,或者同时提供 epochs 和 steps_per_epoch 的值。
此调度程序的默认行为遵循 fastai 对 1cycle 的实现,后者声称“未发表的研究显示,仅使用两个阶段可以取得更好的效果”。若要模仿原始论文中的行为,请设置
three_phase=True
。- 参数
-
-
optimizer (Optimizer) — 包裹后的优化器。
-
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 (float 或 list) – 每个参数组在周期中的最小动量值。需要注意的是,动量与学习率是反向变化的;在一个周期的顶峰时,动量为 ‘base_momentum’ 而学习率为 ‘max_lr’。默认值:0.85
-
max_momentum (float 或 list) – 每个参数组在周期中的最大动量值。从功能上讲,它定义了循环的幅度(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_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`。
-
执行一个步骤。
-