工程實踐_深度學習訓練模型時Loss出現NAN的原因及解決辦法

原因1:梯度爆炸

產生原因:學習率過大。

解決方法:
3. 數據歸一化(減均值,除方差,或者加入normalization:BN,L2 norm等)。
4. 更換參數初始化方法(對於CNN,一般用xavier或者msra的初始化方法)。
5. 減小學習率,減小Batch size。
6. 加入梯度截斷(gradient clipping)。

原因2:網絡結構設計問題

解決方法:

  1. 加如BN層進行歸一化。
  2. 修改網絡結構(如增加網絡寬度、增加網絡層數)。
  3. 改變層的學習率,每個層都可以設置學習率,可以嘗試減小後面層的學習率。

原因3: 不同框架遷移時的代碼問題

解決方法:

  1. debug不同框架下產生的代碼錯誤。
  2. 不同框架下的函數意義不同,需要準確遷移。

原因4: 數據集的問題

1.可能數據集中存在髒數據。從而導致無法訓練的問題。

解決方法:

通過設置batch_size = 1,shuffle = False,一步一步地將sample定位到了所有可能的髒數據,並且刪掉。

2.可能是數據集label數量和模型中設置的label數量不一致。

原因5:損失函數設置問題

例子:

在TensorFlow中,如果使用交叉熵:cross_entry = -tf.reduce_sum(tf.log(y_conv))的話,最後softmax輸出層的y_conv取值範圍在[0,1]中是允許取0的,但是log(0)很有可能會導致NaN的出現。

所以在設置損失函數時要注意細節。

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