一、訓練出現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很難訓練啊!!!