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')[source][source]¶
根據 1cycle 學習率策略設定每個參數群組的學習率。
1cycle 策略會將學習率從初始學習率退火到某個最大學習率,然後從該最大學習率退火到某個遠低於初始學習率的最小學習率。此策略最初在論文 Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates 中描述。
1cycle 學習率策略會在每個批次後更改學習率。step 應該在批次用於訓練後調用。
此排程器不可鏈式使用。
另請注意,週期中的總步數可以透過兩種方式確定(依優先順序排列)
明確提供 total_steps 的值。
提供 epochs(epoch 數)和 steps_per_epoch(每個 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) – 要訓練的 epoch 數。 如果未提供 total_steps 的值,則將此值與 steps_per_epoch 一起使用,以推斷週期中的總步數。 預設值:None
steps_per_epoch (int) – 每個 epoch 要訓練的步數。 如果未提供 total_steps 的值,則將此值與 epochs 一起使用,以推斷週期中的總步數。 預設值: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) – 最後一個批次的索引。此參數用於恢復訓練任務。由於應在每個批次之後而不是在每個 epoch 之後調用 step(),因此此數字表示計算的批次總數,而不是計算的 epoch 總數。當 last_epoch=-1 時,排程從頭開始。預設值:-1
如果
True
,則為每次更新將訊息列印到 stdout。預設值: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()
- load_state_dict(state_dict)[source]¶
載入排程器的狀態。
- 參數
state_dict ( dict) – 排程器狀態。應該是從呼叫
state_dict()
返回的物件。