神經網絡訓練時出現nan錯誤


現在一直在用TensorFlow訓練CNN和LSTM神經網絡,但是訓練期間遇到了好多坑,現就遇到的各種坑做一下總結

1.問題一;訓練CNN的時候出現nan

CNN是我最開始接觸的網絡,我的研究課題就是利用CNN,LSTM等網絡對人體動作做識別。動作數據來源於手機的加速度計,做動作的人在固定位置攜帶手機並做特定動作,實驗人員接收手機的加速度計數值並打上特定的動作標簽。

在訓練CNN網絡時一共遇到兩處坑,一是遇到在訓練期間遇到nan錯誤,這個錯誤很常見。nan的錯誤多源於你的學習率設置的太大或者batchsize設置的太大,可以10倍10倍的減小學習率直到nan錯誤不出現。其實要弄明白nan錯誤怎么出現的才能真正的解決這個錯誤。

這個錯誤是因為logits輸出太大變成INF,對這個取log就會在求梯度就會變成nan,nan是not a number 的縮寫,表示不是一個有理數。所以除了調小學習率這個解決方案,另一個解決方案還可以給loss加正則化項。

2.問題二;在訓練CNN的時候loss一直降不下去

我用普通的卷積核對數據做卷積,准確率保持在0.4左右不動了,loss也是到后面基本不降,各種調網絡結構終於找到一種深度可分離卷積結構可以使准確率達到0.9左右。深度卷積與我們了解的普通卷積網絡的不同點就是它只做單通道卷積,也就是一次卷積后各個通道的卷積結果不相加,各自獨立做為一個featuremap。但是這種網絡結構的神經元個數增長很快,所以它的訓練會比普通卷積慢很多,對於通道數過多的數據並不是很適合,但是這種網絡的魯棒性很好。

其實我這里出現loss不降的原因我后來找到了,是因為我的數據里有錯誤,數據本身就含有了nan的數據,錯誤的數據導致網絡無法收斂

3.問題三;訓練LSTM網絡循環出現nan的錯誤,一到特定的batch就出現nan

一出現這個問題我就意識到肯定是數據出了問題,后來把數據中的nan替換掉就正常了。因為我的數據加載完后是numpy格式的,替換只需要加一句train= np.nan_to_num(train)就可以了

對數據做一個這樣的簡單處理,普通卷積網也正常了,真是豁然開朗啊,不用深度卷積,只用普通卷積就可以達到0.96的准確率。

 

4.我后來把CNN和LSTM聯合起來對動作識別,發現不對數據處理nan錯誤,網絡仍然可以正常運行並達到0.97的准確率。證明我自己搭的這個網絡結構有很好的魯棒性。

 

總結:

通過以上遇到問題可以總結出導致nan問題的原因有如下三個:

1.梯度爆炸:觀察log,注意每一輪迭代后的loss。loss隨着每輪迭代越來越大,最終超過了浮點型表示的范圍,就變成了NaN。

2.不當的損失函數:有時候損失層中loss的計算可能導致NaN的出現。比如,給InfogainLoss層(信息熵損失)輸入沒有歸一化的值,使用帶有bug的自定義損失層等等。觀測訓練產生的log時一開始並不能看到異常,loss也在逐步的降低,但突然之間NaN就出現了

3.錯誤的輸入:輸入中就含有NaN,每當學習的過程中碰到這個錯誤的輸入,就會變成NaN。觀察log的時候也許不能察覺任何異常,loss逐步的降低,但突然間就變成NaN了。

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM