TensorFlow的Debugger調試實例
正文共1845個字,3張圖,預計閱讀時間5分鐘。
之前有翻譯整理過關於TensofFlow的Debugger的簡單教程,具體內容見這裡(https://www.jianshu.com/p/9fd237c7fda3)。這次用自己實際的例子,來簡要的做個使用介紹。
首先是代碼遇到了問題,訓練過程中的loss不是為nan,就是為負數,讓我覺得很奇怪,但是自己去檢查代碼又找不到問題出在哪裡,這時候就想到了TensorFlow自帶的Debugger。之前也有使用過,如果在沒出問題的情況下,Debugger還是比較給力的。
01
用Debugger封裝需要調試的Session
首先在代碼的開頭需要import對應的debugger模塊(官方教程喜歡import debug as tf_debug,我這裡就簡寫了,為了省事,看個人習慣吧)
from tensorflow.python import debug as tfdbg
然後在創建完Session的對象後,用調試器的Session進行封裝
# 沒有調試器之前的寫法with tf.Session(config=config) as sess: # 加入調試器需要加入以下這行 sess = tfdbg.LocalCLIDebugWrapperSession(sess) # 需要調試nan值,因此加上nan的過濾器 sess.add_tensor_filter("has_inf_or_nan", tfdbg.has_nan_or_inf)
02
調試過程
在用調試器封裝好Session對象之後,就可以啟動代碼,運行後會看到如下界面:
這是可以輸入運行的指令(如果不清楚TensorFlow Debugger的指令,可以查看之前的教程https://www.jianshu.com/p/9fd237c7fda3)
r -f has_inf_or_nan
這樣運行就會在有過濾器的情況下運行,並會捕獲出現了過濾器指定數值的Tensor,我們這裡指定的是出現了inf或者nan值的Tensor。運行後,結果如下圖所示:
按照圖中順序,出現nan值的第一個Tensor是d_loss/Log:0,那麼這個時候可以用下列指令直接查看這個Tensor的值。
pt d_loss/Log:0 -a
很顯然,你會在列印的數值中找到nan或者inf值,但是調試的本意並不是查看這些nan值,而是需要知道來源,因此,我們需要知道這個Tensor數據的來源,可以使用下列指令:
ni d_loss/Log:0
上述指令運行後如下圖:
從結果中可以看到,這個張量有一個輸入的張量Discrim/add_2,這個時候用指令pt查看下Discrim/add_2的數值,發現在調用tf.log計算前(就是輸入到d_loss/Log:0節點前)的數值為-1.11897061e-05,然後調用tf.log就出現了nan,因為log計算定義域為正數。
查看數值只會知道原因,要查找來源,需要使用指令定位這個來源的數據在源碼中的位置:
ni -t Discrim/add_2
命令輸出的結果是一個堆棧的內容,最終可以定位到代碼"D_output3 = tf.matmul(D_output2, dWeights3) + dbiases3"這行,於是發現由於輸出D_output3的時候,是直接輸出的,沒有加sigmoid激活函數,導致輸出值為負,然後在輸出之前添加sigmoid激活函數,將數值映射到(0,1)區間,代碼即可正確運行了。
03
總結
使用TensorFlow的Debugger並不困難,大致總結起來有這麼幾個流程:
1.import要使用的TensorFlow的調試模塊
from tensorflow.python import debug as tfdbg
2.使用調試模塊的會話對象包裝原有的Session對象
with tf.Session(config=config) as sess:
sess = tfdbg.LocalCLIDebugWrapperSession(sess)
3.加入異常值對應的過濾器
sess.add_tensor_filter("has_inf_or_nan", tfdbg.has_nan_or_inf)
4.運行代碼,並在帶過濾器的情況下運行
r -f has_inf_or_nan
5.跟蹤異常值產生的節點,並找到異常值來源在源碼中的位置(這個比較靈活,有些可能需要回溯幾個節點,有些直接可查)
ni -t Discrim/add_2
推薦閱讀:
※使用TensorFlow分類手寫數字
※ChatGirl 一個基於 TensorFlow Seq2Seq 模型的聊天機器人
※調試TensorFlow的過程中用到的一些PyCharm技巧——將2空格縮進改成4空格縮進,
※Tensorflow 中怎麼定義自己的層呢?
※TensorFlow Tutorial-1
TAG:TensorFlow |