TensorFlow的Debugger调试实例

正文共1845个字,3张图,预计阅读时间5分钟。


之前有翻译整理过关于TensofFlow的Debugger的简单教程,具体内容见这里(https://www.jianshu.com/p/9fd237c7fda3)。这次用自己实际的例子,来简要的做个使用介绍。


首先是代码遇到了问题,训练过程中的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的指令,可以查看之前的教程https://www.jianshu.com/p/9fd237c7fda3)


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


原文链接:https://www.jianshu.com/p/f5c99a85cdf4


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值