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)[原始碼][原始碼]¶
根據 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。- 引數
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 or list) – 週期中每個引數組的最低動量邊界。請注意,動量與學習率呈反比迴圈;在週期的峰值,動量為 ‘base_momentum’,學習率為 ‘max_lr’。預設值:0.85
max_momentum (float or 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 後呼叫,因此此數字表示計算的總 batches 數,而不是計算的總 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)[原始碼]¶
載入排程器的狀態。
- 引數
state_dict (dict) – 排程器狀態。應該是由呼叫
state_dict()返回的物件。