作者用的是adam onecycle,使用了下面的配置。由於我不想只訓練200個epoch rpn階段,想多訓練一些週期,於是自己調整了訓練週期,但是這樣做訓練一段時間之後,學習率還是在上升的,這樣肯定是不行的,因爲一般訓練結束的時候學習率是很小的。
分析學習率變化有兩種方法,一種是理論分析,一種看代碼分析,一種是試驗分析。我採用最後者。但是如果真訓練的話又會用太長時間。於是我就把訓練的樣本從幾千個變成了1,這樣1S左右一個epoch。
接下來我更改總的學習週期,更改DECAY_STEP_LIST等,看看學習率變化曲線是怎樣的。
LR: 0.002 LR_CLIP: 0.00001 LR_DECAY: 0.5 DECAY_STEP_LIST: [100, 150, 180, 200] LR_WARMUP: True WARMUP_MIN: 0.0002 WARMUP_EPOCH: 1
下面是DECAY_STEP_LIST: [100, 150, 180, 200],epoches=200
下面是DECAY_STEP_LIST: [100, 150, 180, 200],epoches=200
可以看到好像和設置的 : [100, 150, 180, 200]沒有關係,和設置的總訓練週期有關係,先上升後下降。
現在改改[100, 150, 180, 200]中的數字個數試試。並沒有什麼卵用,不太清楚這裏的作用。
猜想是訓練方法的原因,如果不是adam_onecycle,可能這個列表就有用了。下面試試:
果然。。
DECAY_STEP_LIST: [10, 15, 18, 40] & epoches=100
LR_CLIP: 0.00001 LR_DECAY: 0.5 DECAY_STEP_LIST: [10, 15, 18, 20,25,27,28,29,30] LR_WARMUP: True WARMUP_MIN: 0.0002 WARMUP_EPOCH: 1 設置文件裏面的這些參數應該都是爲adam用的。
(一)、什麼是Warmup?
Warmup是在ResNet論文中提到的一種學習率預熱的方法,它在訓練開始的時候先選擇使用一個較小的學習率,訓練了一些epoches或者steps(比如4個epoches,10000steps),再修改爲預先設置的學習來進行訓練。引用自學習率預熱
LR: 0.002 代表最大的學習率。adam和adam_onecycle共用這個參數。