深度學習問題檢查——訓練出現nan, loss不降

一、訓練出現nan的原因

https://blog.csdn.net/ch07013224/article/details/80324373

1,檢查數據。數據的label有無錯誤。 製作lst修改過標籤

2,檢查參數。保存的網絡層和損失層所有的參數

3,檢查是否有分母爲0,或者log裏爲負數或者0,softmax裏的exp是否太大,

根號是否有負數

 

1.如果在迭代的100輪以內,出現NaN,一般情況下的原因是因爲你的學習率過高,需要降低學習率。可以不斷降低學習率直至不出現NaN爲止,一般來說低於現有學習率1-10倍即可。

2.如果當前的網絡是類似於RNN的循環神經網絡的話,出現NaN可能是因爲梯度爆炸的原因,一個有效的方式是增加“gradient clipping”(梯度截斷來解決)

3.可能用0作爲了除數;

4.可能0或者負數作爲自然對數

5.需要計算loss的數組越界(尤其是自己,自定義了一個新的網絡,可能出現這種情況)

6.在某些涉及指數計算,可能最後算得值爲INF(無窮)(比如不做其他處理的softmax中分子分母需要計算exp(x),值過大,最後可能爲INF/INF,得到NaN,此時你要確認你使用的softmax中在計算exp(x)做了相關處理(比如減去最大值等等))

 

1,是否有髒數據

可能有,因爲大的數據集還沒有訓練完成一遍.

2,log出現負數

 

 

二、訓練loss不降得原因

https://blog.csdn.net/liuweiyuxiang/article/details/80856991

train loss 不斷下降,test loss不斷下降,說明網絡仍在學習; 

train loss 不斷下降,test loss趨於不變,說明網絡過擬合; 

train loss 趨於不變,test loss不斷下降,說明數據集100%有問題; 

train loss 趨於不變,test loss趨於不變,說明學習遇到瓶頸,需要減小學習率或批量數目; 

train loss 不斷上升,test loss不斷上升,說明網絡結構設計不當,訓練超參數設置不當,數據集經過清洗等問題。

 

loss不降,不收斂問題檢查過程:

  • 靜態檢查:

1,輸入數據檢查

1)是否輸入有髒數據

2)是否輸入數據label有錯誤

2,網絡模型檢測、損失檢查

1)模型和損失是否合理,是否符合論文中公式

2)模型和損失初始化是否合理

  • 動態檢查

1,是否梯度有更新

1)學習率是否過大或者過小,不合適——》選擇合適的學習率和學習算法

2)打印網絡,觀察網絡中各個層的參數是否變化

  • 遷移框架檢查

1,不同框架,輸入數據、模型框架、損失、參數是否一致——》參考舊框架參數

1)同一個訓練集、驗證集

2)同一個框架LResnet50e-IR

3) 損失 cosface/

4) 參數:優化算法,batch-norm等參數

2,不同框架,模型優化流程等是否有問題

1)sgd是如何同時更新損失中的參數和網路中的參數

3,遷移框架版本問題——》參考新框架官網文檔

1)pytorch0.4~1.0問題

不同版本是否有問題

2)參考官網代碼,修改官方代碼

親身實驗:pytorch上LResnet50E-IR + cosface 訓練不收斂原因

1,數據集問題:訓練數據集沒有正確檢測和對齊

2,沒有將loss的優化加入優化器裏

3,model驗證完之後忘了轉回訓練模式(模型裏有batchnorm和dropout會出問題),model.train和model.eval相互轉化,——可以解釋每次eval結果會不穩定的原因

4,cosface的尺度參數s傳入爲1,所以開始優化下降到10就不變化,因爲8萬label半徑爲1很難訓練啊!!!

 

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