tensorflow 代码调试工具tfdbg的用法
在windows10下安装
使用tfdbg前确定安装好了tensorflow和pyrendline
终端输入
pip install pyreadline
如图:
在Mac OS X 上使用,请安装 ncurses库
tfdbg的命令表
命令 | 说明 | 例子 |
---|---|---|
lt |
列出转储的张量 | lt |
列表转储的张量,其名称与给定的正则表达式模式匹配。 | lt -n Softmax.* |
|
具有与给定正则表达式模式匹配的操作类型的列表转储张量。 | lt -t MatMul |
|
只列出通过注册的张量过滤器的张量。 | lt -f has_inf_or_nan |
|
仅列出传递已注册的张量筛选器的张量,不包括名称与正则表达式匹配的节点。 | lt -f has_inf_or_nan``-fenn .*Sqrt.* |
|
按给定的“Sort_key”对输出进行排序,其可能值为“timestamp”(默认)、“dump_size”、“op_type”和“tensor_name”。 | lt -s dump_size |
|
按相反顺序排序。 | lt -r -s dump_size |
|
pt |
打印转储张量的值 | |
打印张量值。 | pt hidden/Relu:0 |
|
使用[numpy](http://www.numpy.org/)样式的数组切片打印张量子数组。 | pt hidden/Relu:0[0:50,:] |
|
打印大张量的全部内容,不使用省略号。(对于大张量可能需要很长时间。) | pt -a hidden/Relu:0[0:50,:] |
|
突出显示属于指定数字范围的元素。多个范围可以一起使用。 | pt hidden/Relu:0 -a -r [[-inf,-1],[1,inf]] |
|
与指定的基于0的转储号对应的打印转储对于具有多个转储的张量是必需的。 | pt -n 0 hidden/Relu:0 |
|
包括张量数值的摘要(仅适用于具有布尔和数值类型(如“int*”和“float*”)的非空张量。) | pt -s hidden/Relu:0[0:50,:] |
|
使用Numpy.save() 将张量值(可能切片)写入Numpy文件 |
pt -s hidden/Relu:0 -w /tmp/relu.npy |
|
@[coordinates] |
导航到“pt”输出中的指定元素。 | @[10,0] or @10,0 |
/regex |
更少样式的给定正则表达式搜索。 | /inf |
/ |
滚动到下一行与搜索的regex(如果有)匹配。 | / |
pf |
在feed dict toSession.run 中打印一个值 |
|
打印提要的值。还要注意,“pf”命令有-a 、-r 和-s 标志(下面未列出),这些标志的语法和语义与“pt”的同名标志相同。 |
pf input_xs:0 |
|
eval |
计算任意Python和numpy表达式 | |
计算一个Python/numpy表达式,numpy可用作“np”,调试张量名称用倒引号括起来。 | eval "np.matmul(( output/Identity:0/ Softmax:0).T, Softmax:0)" |
|
完整打印大型评估结果,即不使用省略号。 | eval -a 'np.sum( Softmax:0, axis=1)' |
|
使用Numpy.save() 将计算结果写入Numpy文件 |
eval -a 'np.sum( Softmax:0, axis=1)' -w /tmp/softmax_sum.npy |
|
ni |
显示节点信息 | |
在输出中包含节点属性。 | ni -a hidden/Relu |
|
列出节点中可用的调试转储。 | ni -d hidden/Relu |
|
显示节点创建的Python堆栈跟踪。 | ni -t hidden/Relu |
|
li |
列出节点的输入 | |
递归地列出节点的输入(输入树) | li -r hidden/Relu:0 |
|
在“-r”模式下限制递归深度。 | li -r -d 3 hidden/Relu:0 |
|
包括控制输入。 | li -c -r hidden/Relu:0 |
|
显示输入节点的操作类型。 | li -t -r hidden/Relu:0 |
|
lo |
列出节点的输出接收方 | |
递归地列出节点的输出接收方(输出树) | lo -r hidden/Relu:0 |
|
在“-r”模式下限制递归深度。 | lo -r -d 3 hidden/Relu:0 |
|
通过控件边缘包括接收方。 | lo -c -r hidden/Relu:0 |
|
显示接收方节点的操作类型。 | lo -t -r hidden/Relu:0 |
|
ls |
列出创建节点所涉及的Python源文件 | |
将输出限制为与给定正则表达式路径模式匹配的源文件。 | ls -p .*debug_mnist.* |
|
将输出限制为与给定正则表达式模式匹配的节点名。 | ls -n Softmax.* |
|
ps |
打印Python源文件 | |
打印给定的Python源文件source.py,并用在每个源文件上创建的节点(如果有的话)注释行。 | ps /path/to/source.py |
|
对张量而不是默认节点执行注释。 | ps -t /path/to/source.py |
|
从给定行开始注释source.py。 | ps -b 30 /path/to/source.py |
|
限制每行批注中的元素数。 | ps -m 100 /path/to/source.py |
|
run |
继续下一个会话。run() | run |
在下一个“Session.run”中执行,不进行调试,并在运行之后立即转到CLI。 | run -n |
|
执行“Session.run”T-1次,不进行调试,然后运行带调试。然后在调试运行后立即转到CLI。 | run -t 10 |
|
继续执行“Session.run”,直到任何中间张量触发指定的张量筛选器(使筛选器返回“True”)。 | run -f has_inf_or_nan |
|
继续执行“Session.run”,直到节点名与正则表达式不匹配的任何中间张量触发指定的张量筛选器(使筛选器返回“True”)。 | run -f has_inf_or_nan -fenn .*Sqrt.* |
|
执行下一个“Session.run”,只监视名称与给定正则表达式模式匹配的节点。 | run --node_name_filter Softmax.* |
|
执行下一个“Session.run”,只监视操作类型与给定正则表达式模式匹配的节点。 | run --op_type_filter Variable.* |
|
执行下一个“Session.run”,只转储与给定正则表达式模式匹配的数据类型(dtype s)的张量。 |
run --tensor_dtype_filter int.* |
|
在分析模式下执行下一个“Session.run”调用。 | run -p |
|
ri |
显示有关当前运行的运行的信息,包括获取和馈送 | ri |
config |
设置或显示永久TFDBG UI配置 | |
设置配置项的值:{graph\u recursion\u depth ,mouse\u mode }。 |
config set graph_recursion_depth 3 |
|
显示当前的永久用户界面配置。 | config show |
|
version |
打印TensorFlow的版本及其关键依赖项 | version |
help |
打印常规帮助信息 | help |
打印给定命令的帮助。 | help lt |
举例
代码
import numpy as np
import tensorflow as tf
from tensorflow.python import debug as tf_debug
xs = np.linspace(-0.5, 0.49, 100)
x = tf.placeholder(tf.float32, shape=[None], name="x")
y = tf.placeholder(tf.float32, shape=[None], name="y")
k = tf.Variable([0.0], name="k")
y_hat = tf.multiply(k, x, name="y_hat")
sse = tf.reduce_sum((y - y_hat) * (y - y_hat), name="sse")
train_op = tf.train.GradientDescentOptimizer(learning_rate=0.02).minimize(sse)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# ========================================================================
# 被调试器封装的会话(添加以下代码)
sess = tf_debug.LocalCLIDebugWrapperSession(sess, ui_type="readline")
#=========================================================================
for _ in range(10):
sess.run(y_hat, feed_dict={x: xs, y: 10 * xs})
sess.run(train_op, feed_dict={x: xs, y: 42 * xs})
下面是运行结果
运行程序,终端输入代码:
tfdbg> run
打印张量,在终端输入代码:
tfdbg> pt y_hat:0