標籤:

在 Keras 和 slim 中進行 debug

上一節提到了在 TensorFlow 中如何使用官方工具 debug,但是現在很多代碼都是升級到使用 Keras 或者 slim 了,那麼在這二者中,如何使用原有的 tfdbg 工具就成了一個問題,我們來看看具體實現。

Keras

在 TensorFlow 中可以顯式的調用的 tf_dbg 來包裝原有的 session,但是 Keras 把 session 的概念隱藏了起來,所以我們要導入並使用Keras後端模塊,讓Keras後端使用一個TFDBG包裝的Session對象。 例如,要使用 debug 的命令行界面( CLI 包裝器 ):

import tensorflow as tffrom keras import backend as keras_backendfrom tensorflow.python import debug as tf_debug# 後端包裝 sessionkeras_backend.set_session(tf_debug.LocalCLIDebugWrapperSession(tf.Session()))# .... 在這裡定義你的模型model.fit(...) # 運行到這裡就會進入 TFDBG 命令行界面.

slim

在 slim 中則只需要在 train 的步驟將 tf_debug 對象作為參數傳入相應的 session_wrapper 參數即可:

import tensorflow as tffrom tensorflow.python import debug as tf_debug# .... 在這裡定義你的模型,計算圖以及訓練的 OP# 開始訓練tf.contrib.slim.learning.train( train_op, logdir, number_of_steps=10, session_wrapper=tf_debug.LocalCLIDebugWrapperSession)

在 slim 中的測試代碼中,debug 的形式略有不同,需要傳入的是hooks 參數,傳入的對象也變為了 tf_debug.LocalCLIDebugHook :

import tensorflow as tffrom tensorflow.python import debug as tf_debug# .... 在這裡定義你的模型,計算圖以及測試的 OP# 開始測試tf.contrib.slim.evaluation.evaluate_once( , checkpoint_path, logdir, eval_op=my_eval_op, final_op=my_value_op, hooks=[tf_debug.LocalCLIDebugHook()])

其他

另外,如果出現了正在調試的模型非常大。通過 tfdbg 緩存的數據填滿了磁碟的可用空間,比如因為模型具有許多中間tensor、具有非常大的中間tensor,或者有許多tf.while_loop迭代導致了這種情況,有2種可能的解決方法:

1.新定義tensor緩存路徑

LocalCLIDebugWrapperSession和LocalCLIDebugHook的構造函數提供了一個關鍵字參數dump_root來指定tfdbg轉儲調試數據的路徑,可以使用它來讓tfdbg將調試數據緩存到具有較大可用空間的磁碟上。例如:

sess = tf_debug.LocalCLIDebugWrapperSession(dump_root =「/ with / lots / of / space」)

2.使用tfdbgsrun`命令的過濾選項只能查看圖形中的特定節點。例如:

tfdbg> run --node_name_filter .*hidden.* tfdbg> run --op_type_filter Variable.* tfdbg> run --tensor_dtype_filter int.*

上面的第一個命令只監視名稱與正則表達式相匹配的節點 node。第二個命令僅監視其名稱與正則匹配的操作OP。第三個只觀察其dtype匹配正則的張量。


推薦閱讀:

TensorFlow 教程 #06 - CIFAR-10
譯文 | 與TensorFlow的第一次接觸 第六章:並發
Tensorflow 的reduce_sum()函數到底是什麼意思,誰能解釋下?
配置深度學習主機與環境(TensorFlow+1080Ti):(二)Win10&Ubuntu雙系統與顯卡驅動安裝

TAG:TensorFlow |