問題
如上圖所示,第二次迭代時出現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、將歐式距離換成標准化歐式距離。標准化歐式距離是針對簡單歐式距離缺點而做的一種改進方案。
未完待續