OneCycleLR¶
- class 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的值。
提供了多个epoch(epochs)和每个epoch的步数(steps_per_epoch)。 在这种情况下,总步数通过以下公式推断: total_steps = epochs * steps_per_epoch
您必须为 total_steps 提供一个值,或者同时为 epochs 和 steps_per_epoch 提供值。
该调度器的默认行为遵循fastai实现的1cycle,声称“未发表的工作表明仅使用两个阶段可以获得更好的结果”。要模仿原始论文的行为,请设置
three_phase=True。- Parameters
优化器 (优化器) – 包装的优化器。
total_steps (int) – 循环中的总步数。请注意,如果此处未提供值,则必须通过提供epochs和steps_per_epoch的值来推断。 默认值:None
epochs (int) – 训练的轮数。这个参数与 steps_per_epoch 一起使用,以便在没有提供 total_steps 值的情况下推断出循环中的总步数。 默认值:None
steps_per_epoch (int) – 每个epoch的训练步数。这个参数与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’之间。 默认值:Truebase_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) –
如果
True,则向标准输出打印每条更新消息。默认值:False。自版本 2.2 起已弃用:
verbose已被弃用。请使用get_last_lr()来访问学习率。
示例
>>> data_loader = torch.utils.data.DataLoader(...) >>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, 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()¶
返回当前调度器计算的最后一个学习率。
- load_state_dict(state_dict)¶
加载调度器的状态。
- Parameters
state_dict (字典) – 调度器状态。应该是从调用
state_dict()返回的对象。
- print_lr(is_verbose, group, lr, epoch=None)¶
显示当前的学习率。