faster rcnn調參 總結(吐血)

 

1. 假設一次訓練有10個epoch,可能會出現以下情況:訓練好一次模型去測試,測試的準確率爲0.92。又去訓練一次模型(不是在之前訓練模型的基礎上,而是單獨進行一次訓練),模型訓練好去測試,測試準確率爲0.93或者0.89。如果我改變一個模型的參數,比如調小dropout的值,可能訓練出來的模型去測試準確率爲0.94,這不能就得出調小dropout就能很明顯提升模型的效果。因爲單獨訓練一次模型,也可能達到這個效果。造成這種情況出現的原因就是數據量太小,數據量小,可能兩次訓練的模型去測試的準確率變化比較大。如果數據量大,兩次訓練的模型去測試準確率變化可能在0.0000幾或者0.000幾,但改變參數可能就是0.00幾,這樣就很容易看出調整參數是否能提高準確率了。解決方法就是可以在不改變參數前多訓練幾次,一般會在一個範圍波動,改變參數也多訓練幾次,這樣如果整個範圍相較於之前都升高就表明調參確實提高了準確率。

2.   learning rate影響的是

3.高學習率有利於加快迭代更新的速度,但不利於找到局部/全局最優點;低學習率有利於找到局部最優點,但可能使得模型無法跳出局部最優而無法獲取全局最優;一般先利用較大的學習率尋找全局近似最優,再利用較小的學習率尋找局部最優,以期望獲取模型的全局最優解。實際中,使用驗證集是獲得合適LR的有效手段。開始訓練時,LR通常設爲0.1(這個值有待驗證)。在實踐中,當你觀察到在驗證集上的loss或者準確率不在變化時,將LR除以2或5後繼續跑。

4.關於學習率的大小

  * 太大: loss爆炸, 或者nan
  * 太小: 半天loss沒反映(但是, LR需要降低的情況也是這樣, 這裏可視化網絡中間結果, 不是weights, 有效果, 倆者可視化結果是不一樣的, 太小的話中間結果有點水波紋或者噪點的樣子, 因爲filter學習太慢  的原因, 試過就會知道很明顯)
  * 需要進一步降低了: loss在當前LR下一路降了下來, 但是半天不再降了.

5.數據庫太小一般不會帶來不收斂的問題,只要你一直在train總會收斂(rp問題跑飛了不算)。反而不收斂一般是由於樣本的信息量太大導致網絡不足以fit住整個樣本空間。樣本少只可能帶來過擬合的問題,你看下你的training set上的loss收斂了嗎?如果只是validate set上不收斂那就說明overfitting了,這時候就要考慮各種anti-overfit的trick了,如dropout,SGD,增大minibatch的數量,減少fc層的節點數量,momentun, finetune等。(我自己覺得,train不是一定收斂的,但樣本信息量太大導致網絡不足以fit住整個樣本空間是造成不收斂的一種情況)

   learning rate設大了會帶來跑飛(loss突然一直很大)的問題,這個是新手最常見的情況——爲啥網絡跑着跑着看着要收斂了結果突然飛了呢?可能性最大的原因是你用了relu作爲激活函數的同時使用了softmax或者帶有exp的函數做分類層的loss函數。當某一次訓練傳到最後一層的時候,某一節點激活過度(比如100),那麼exp(100)=Inf,發生溢出,bp後所有的weight會變成NAN,然後從此之後weight就會一直保持NAN,於是loss就飛起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章