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)[source]#
根据 1cycle 学习率策略设置每个参数组的学习率。
1cycle 策略将学习率从初始学习率调整到一个最大学习率,然后再从这个最大学习率调整到一个远低于初始学习率的最小学习率。该策略最初在论文 Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates 中进行了描述。
1cycle 学习率策略在每个 batch 后更改学习率。step 应在用于训练一个 batch 后调用。
此调度器不支持链式调用。
请注意,周期中的总步数可以通过以下两种方式之一确定(按优先顺序排列)
显式提供了 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
设置为 True。- 参数
optimizer (Optimizer) – 包装的优化器。
total_steps (int) – 周期中的总步数。请注意,如果此处未提供值,则必须通过提供 epochs 和 steps_per_epoch 的值来推断。默认为 None。
epochs (int) – 训练的 epoch 数。此参数与 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”之间与学习率成反比循环。默认为 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) – 上一个 batch 的索引。此参数用于恢复训练任务。由于 step() 应在每个 batch 后调用,而不是在每个 epoch 后调用,因此此数字表示计算出的总 batch 数,而不是计算出的总 epoch 数。当 last_epoch=-1 时,调度程序从头开始。默认为 -1。
示例
>>> 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()
- load_state_dict(state_dict)[source]#
加载调度器的状态。
- 参数
state_dict (dict) – 调度器的状态。应为调用
state_dict()
返回的对象。