因为tensorflow的图计算方式,传统的调试方式是无法进行变量值动态查看的。google提供了tensorflow的官方调试其tfdbg来进行调试工作。
现将基本使用方式概述如下:
1、在源码中用tfdbf的专属Session来封装普通Session,这个很简单,如下:
from tensorflow.python import debug as tf_debug
sess2 = tf_debug.LocalCLIDebugWrapperSession(sess1)
session1是tf普通的session, 使用LocalCLIDebugWrapperSession封装过的session2,可以替代session1来执行后续操作。
2、在控制台命令行下执行python程序,并附带--debug参数,例如:
pyton -m demo.py --debug
此时,tf将执行该demo程序,一直到代码中遇到session.run()的语句会停止。此时,tfdbg将进入debug字符界面。这是一种特殊交互方式,需配合命令与鼠标一起操作。
3、tensor张量的debug
在debug某个张量之前,需事先知道这个张量的名称。根据个人经验,这个可以在IDE下,用普通的debug模式查看该张量的名称。
知道名称后,可以用如下指令列出该张量。
lt -n 张量名
如果tfdbg找到该张量,则会以列表形式罗列出来。
找到需要查看的张量,用鼠标可以点击打开。
如下示例:
4、有时候,需要查看的张量会不存在,那么很有可能是因为程序还没执行到产生该张量的代码位置。
根据个人的使用经验,需要debug的程序往往很长,而且该debug方式不同于常见的debuger。因此,需要观察log的输出,可以用来判断程序执行到哪个位置,进而判断想要查看的张量是否已经存在。
5、常用的tfdbg指令
命令 | 语法或选项 | 说明 | 示例 |
---|---|---|---|
lt |
列出转储张量。 | lt |
|
-n <name_pattern> |
列出名称符合指定正则表达式格式的转储张量。 | lt -n Softmax.* |
|
-t <op_pattern> |
列出指令类型符合指定正则表达式格式的转储张量。 | lt -t MatMul |
|
-f <filter_name> |
列出仅通过已注册张量过滤器的张量。 | lt -f has_inf_or_nan |
|
-f <filter_name> -fenn <regex> |
列出仅通过已注册张量过滤器的张量,不包括名称符合正则表达式的节点。 | lt -f has_inf_or_nan -fenn .*Sqrt.* |
|
-s <sort_key> |
按指定的 sort_key</ |