当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python PyTorch OneCycleLR用法及代码示例


本文简要介绍python语言中 torch.optim.lr_scheduler.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=False)

参数

  • optimizer(Optimizer) -包装优化器。

  • max_lr(float或者list) -每个参数组在循环中的上层学习率边界。

  • total_steps(int) -循环中的总步数。请注意,如果此处未提供值,则必须通过提供纪元和steps_per_epoch 的值来推断。默认值:无

  • epochs(int) -训练的纪元数。如果未提供 total_steps 的值,则将其与 steps_per_epoch 一起使用,以便推断循环中的总步数。默认值:无

  • steps_per_epoch(int) -每个时期训练的步数。如果未提供 total_steps 的值,则将其与纪元一起使用,以便推断循环中的总步数。默认值:无

  • pct_start(float) -提高学习率所花费的周期百分比(以步骤数计)。默认值:0.3

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

  • cycle_momentum(bool) -如果 True ,动量与 ‘base_momentum’ 和 ‘max_momentum’ 之间的学习率成反比循环。默认值:真

  • 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) -如果 True ,每次更新都会向标准输出打印一条消息。默认值:False

按照1cycle学习率策略设置各参数组的学习率。 1cycle 策略将学习率从初始学习率退火到某个最大学习率,然后从该最大学习率退火到远低于初始学习率的某个最小学习率。该政策最初在论文中说明Super-Convergence:使用大学习率非常快速地训练神经网络.

1cycle learning rate policy 在每批之后改变学习率。 step 应该在批次用于训练后调用。

此调度程序不可链接。

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

  1. 明确提供了total_steps 的值。

  2. 提供了多个纪元(epochs)和每个纪元的步数(steps_per_epoch)。在这种情况下,总步数由 total_steps = epochs * steps_per_epoch 推断

您必须为total_steps 提供一个值,或者为时期和steps_per_epoch 提供一个值。

该调度程序的默认行为遵循 1cycle 的 fastai 实现,它声称“未发布的工作仅使用两个阶段就显示出更好的结果”。要改为模仿原始论文的行为,请设置 three_phase=True

示例

>>> 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(...)
>>>         scheduler.step()

相关用法


注:本文由纯净天空筛选整理自pytorch.org大神的英文原创作品 torch.optim.lr_scheduler.OneCycleLR。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。