1,为什么要使用 tfdebug 来进行 debug?
原因:一般来说,我们对 python 代码进行简单的 debug 会使用 pdb 工具,这个很简单,import pdb 后在最我们需要程序停止的位置后面加上 pdb.set_trace(),就可以通过打印查看前面的变量了(详细的自己百度 python 的 pdb 工具),但是!BUT!最初我们很多人都会天真的想,调试 tensorflow 的代码,如果想查看网络某层的值,那就在那个层定义后面加上pdb.set_trace() 啊~然而,最无语的是在 tensorflow 中,层的定义部分是 tensorflow 创建图的地方,因为 tensorflow 是静态图,所以它初始创建了以后就不会再去执行那些代码,所以,设置断点不可能跟踪到,因为它不执行啊!(这里,安利一下 pytorch,pytorch 就可以用 pdb 调试哦~)——有了上述问题,tfdebug 就登场了!
2,什么是 tfdebug?
tfdebug 是 tensorflow debugger 的简称,是 tensorflow 的专用调试器,它可以让你看到运行 tensorflow 的 graph 时的内部结构体和状态,从而达到 pdb 在 pytorch 中的效果,而且 tfdebug 特别简单,比 pdb.set_trace() 还要简单方便!
3,基本指令——初始化:
调包:from tensorflow.python import debug as tf_debug
正常操作1:sess = tf.Session()
正常操作2:sess.run(tf.global_variables_initializer()) (这里不需要封装,因为没啥可看的)
用调试器封装会话:sess = tfdbg.LocalCLIDebugWrapperSession(sess)
执行被封装的会话:sess.run(train_op)
完了?对!完了~
4,看你想看的:
正常操作执行代码,会出现 debug 界面,很友好的;
Tips: debug 界面中带下划线的东西 都是可以用鼠标点一下,就会触发相应操作的;
run 指令:执行一次 sess.run(train_op) , 执行后会会在界面上显示所有 tensor;
查看tensor的值(两种做法取其一):
①,用鼠标点击 “Tensor name”,查看相应的 tensor 详情;
②,输入pt tensor_name 指令;
Tips:输入@数字指令可以直接跳到对应的元素位置;
Tips:可以按键盘上“Page Up/Page Down”按键来翻页显示;
5,更高级的查看(接第4部分):
如果对 graph 中某个 node 感兴趣,可以使用 ni 命令查看(在程序中使用 tf api 构建 graph 时,最好加入 name 参数);
通过 ls 命令可以查看创建节点的框架源码,鼠标点击源码则自动跳转到创建代码处,适合跟踪框架代码;
6,一般流程:
pt 看哪里出现了异常,ni + pt 追踪异常的源头!
7,最后:
运行 run -f has_inf_or_nan 可以找到出现nan的变量;
8,细节参考博客:https://blog.csdn.net/u010312436/article/details/78656723