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()返回的物件。