如何解決loss NAN的問題


問題

  如上圖所示,第二次迭代時出現NAN值,nan表示無窮大或者非數值,一般是在一個數除以0或者log(0)時會出現無窮大。可能的原因有:1)學習率過大;2)batch過大;3)不當的損失函數等。

  試着將學習率和batch分別調低,但還是會出現nan,說明不是學習率和batch的問題。

定位loss NAN的方法

  使用tensorflow的代碼調試模塊tfdbg,可以看到運行tensorflow graph時的內部結構體和狀態,方便排查變量出現NAN、inf的情況。tfdbg的官方文檔介紹 https://www.tensorflow.org/versions/master/how_tos/debugger/ 

  使用過濾器可以幫助查找異常值,命令:run -f has_inf_or_nan。如下圖所示,在第一行中has_inf_or_nan過濾器在第一次Session.run調用期間第一次被觸發。第一個出現異常值的tensor是計算歐式距離的tensor。

  點第一個打印出來的結果如下圖,發現其中有個值是-inf。

  點擊node_info查看該節點的信息,如下圖所示。該節點的操作是SqrtGrad,有兩個輸入。

  點擊第一個input-->[Sqrt]-->print_tensor,查看Sqrt的運算結果。發現其中有個值的結果為0,所以應該是計算歐式距離的時候這些0值導致最后計算loss的時候輸出為NAN。

解決方法

  1、去掉tf.sqrt函數

  2、直接去掉歐式距離

  3、將歐式距離換成標准化歐式距離。標准化歐式距離是針對簡單歐式距離缺點而做的一種改進方案。

未完待續

 


免責聲明!

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



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