標籤:

TensorFlow的Debugger調試實例

正文共1845個字,3張圖,預計閱讀時間5分鐘。

之前有翻譯整理過關於TensofFlow的Debugger的簡單教程,具體內容見這裡(jianshu.com/p/9fd237c7f)。這次用自己實際的例子,來簡要的做個使用介紹。

首先是代碼遇到了問題,訓練過程中的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對象之後,就可以啟動代碼,運行後會看到如下界面:

圖1 啟動調試器

這是可以輸入運行的指令(如果不清楚TensorFlow Debugger的指令,可以查看之前的教程jianshu.com/p/9fd237c7f

r -f has_inf_or_nan

這樣運行就會在有過濾器的情況下運行,並會捕獲出現了過濾器指定數值的Tensor,我們這裡指定的是出現了inf或者nan值的Tensor。運行後,結果如下圖所示:

圖2 捕獲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

上述指令運行後如下圖:

圖3 找到nan值的來源Tensor

從結果中可以看到,這個張量有一個輸入的張量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 |