原因1:梯度爆炸
產生原因:學習率過大。
解決方法:
3. 數據歸一化(減均值,除方差,或者加入normalization:BN,L2 norm等)。
4. 更換參數初始化方法(對於CNN,一般用xavier或者msra的初始化方法)。
5. 減小學習率,減小Batch size。
6. 加入梯度截斷(gradient clipping)。
原因2:網絡結構設計問題
解決方法:
- 加如BN層進行歸一化。
- 修改網絡結構(如增加網絡寬度、增加網絡層數)。
- 改變層的學習率,每個層都可以設置學習率,可以嘗試減小後面層的學習率。
原因3: 不同框架遷移時的代碼問題
解決方法:
- debug不同框架下產生的代碼錯誤。
- 不同框架下的函數意義不同,需要準確遷移。
原因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的出現。
所以在設置損失函數時要注意細節。