CyclicLR¶
- class torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=2000, step_size_down=None, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)[source][source]¶
根據迴圈學習率策略(CLR)設定每個引數組的學習率。
該策略以恆定頻率在兩個邊界之間迴圈調整學習率,詳見論文 用於訓練神經網路的迴圈學習率 (Cyclical Learning Rates for Training Neural Networks)。兩個邊界之間的距離可以按迭代或按週期的基礎進行縮放。
迴圈學習率策略在每個批次後更改學習率。step 應該在每個批次用於訓練後呼叫。
這個類有三種內建策略,如論文中所述:
“triangular”:基本的三角迴圈,不進行幅度縮放。
“triangular2”:基本的三角迴圈,每個週期將初始幅度減半。
“exp_range”:每個週期迭代中將初始幅度按 進行縮放的迴圈。
此實現改編自 GitHub 倉庫:bckenstler/CLR
- 引數
optimizer (Optimizer) – 包裝的最佳化器。
max_lr (float 或 list) – 每個引數組在週期中的學習率上邊界。功能上,它定義了週期的幅度 (max_lr - base_lr)。任何週期的學習率都是 base_lr 加上幅度的某個縮放值;因此,根據縮放函式,可能實際上達不到 max_lr。
step_size_up (int) – 週期上升階段的訓練迭代次數。預設值:2000
step_size_down (int) – 週期下降階段的訓練迭代次數。如果 step_size_down 為 None,則將其設定為 step_size_up。預設值:None
mode (str) – 必須是 {triangular, triangular2, exp_range} 之一。這些值對應於上面詳述的策略。如果 scale_fn 不為 None,則忽略此引數。預設值:‘triangular’
gamma (float) – ‘exp_range’ 縮放函式中的常數:gamma**(週期迭代次數) 預設值:1.0
scale_fn (function) – 自定義縮放策略,由一個單引數 lambda 函式定義,其中對於所有 x >= 0,都有 0 <= scale_fn(x) <= 1。如果指定,則忽略 ‘mode’。預設值:None
scale_mode (str) – {‘cycle’, ‘iterations’}。定義 scale_fn 是基於週期數還是週期迭代次數(從週期開始以來的訓練迭代次數)進行評估。預設值:‘cycle’
cycle_momentum (bool) – 如果為
True,動量將與學習率成反比地在 ‘base_momentum’ 和 ‘max_momentum’ 之間迴圈。預設值:Truebase_momentum (float 或 list) – 每個引數組在週期中的動量下邊界。注意,動量與學習率成反比地迴圈;在週期的峰值,動量為 ‘base_momentum’,學習率為 ‘max_lr’。預設值:0.8
max_momentum (float 或 list) – 每個引數組在週期中的動量上邊界。功能上,它定義了週期的幅度 (max_momentum - base_momentum)。任何週期的動量都是 max_momentum 減去幅度的某個縮放值;因此,根據縮放函式,可能實際上達不到 base_momentum。注意,動量與學習率成反比地迴圈;在週期的開始,動量為 ‘max_momentum’,學習率為 ‘base_lr’。預設值:0.9
last_epoch (int) – 上一個批次的索引。此引數用於恢復訓練任務。由於 step() 應該在每個批次之後呼叫,而不是在每個 epoch 之後呼叫,因此此數字表示計算的總 *批次* 數,而不是計算的總 epoch 數。當 last_epoch=-1 時,排程器從頭開始。預設值:-1
示例
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) >>> scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1) >>> data_loader = torch.utils.data.DataLoader(...) >>> for epoch in range(10): >>> for batch in data_loader: >>> train_batch(...) >>> scheduler.step()