TensorFlow调试详细步骤实例解释

本文概述

  • 使用tfdbg调试TensorFlow模型培训
  • tfdbg CLI的功能
  • 查找nan和infs
调试是一项繁琐而艰巨的任务。我们必须编写代码并通过张量流调试来识别问题。通常, 有很多指南, 并且调试过程对于许多语言和框架都有很好的文档说明。
TensorFlow有一个名为tfdbg TensorFlow Debugging的调试器, 它使我们能够观察基本的工作和运行图的状态。使用python中的pdb等任何调试器很难调试这些。
本教程将教我们如何使用tfdbg CLI调试nan和图标的外观, 它们是在张量流中发现的最常见的错误类型。下面给出的是一个低级API示例。
python-m tensorflow.python.debug.examples.debug_mnist
上面给出的代码是用于MNIST数字图像识别的神经网络, 在经过几步饱和之后, 精度会提高。
这个错误可能是infs和nans, 它们具有最常见的错误。现在使用tfdbg调试问题并知道问题从何处开始。
用tfdbg包装TensorFlow会话
添加以下代码行以使用tfdbg, 并使用调试器包装器包含会话对象。
From tensorflow.python import debug as tf_debugsess= tf_debug.LocalCLIDebugWrapperSession (sess)

包装类提供了一些附加功能, 其中包括:可以在Session之前和之后调用CLI。如果我们希望控制执行并知道图的内部状态, 请运行()。
可以添加过滤器以帮助诊断。在所提供的示例中, 有一个名为tfdbg.has_inf_or_nan的过滤器, 该过滤器确定在任何中间张量(既不是输入也不是输出)中存在Nan或inf。
我们始终可以为符合我们需求的自定义过滤器编写代码, 我们可以查看API文档以获取同样的其他信息。
使用tfdbg调试TensorFlow模型培训 现在该训练包含-debug标志的模型了:
python-mtensorflow.python.debug.examples.debug_mnist-debug

提取的数据可以显示在屏幕上, 如下图所示:
TensorFlow调试详细步骤实例解释

文章图片
上图是运行启动界面。之后, 在提示符下输入r:
tfdbg> 运行
如果下一次会话调用, 将使TensorFlow调试器运行, 计算测试数据集的准确性。
例如:
TensorFlow调试详细步骤实例解释

文章图片
执行run之后, 可以使用命令列出张量。
常用的TensorFlow调试命令
请在tfdbg> 提示符下查看以下命令:请注意, 每当我们输入命令时, 都会看到全新的显示输出。这类似于浏览器中的互联网页面。我们可以通过单击CLI左上角附近的< -和-> 文本箭头在这些屏幕之间导航。
tfdbg CLI的功能 同样, 就像上面索引的TensorFlow调试命令一样, tfdbg CLI提供了以下附加功能:
浏览以字符开头的tfdbg指令。
要浏览前面的tfdbg指令, 请键入一些字符, 并带有向上或向下箭头键。 Tfdbg将向我们展示从一个人的态度开始的指令的历史。
要浏览屏幕输出的记录, 请执行以下两项操作:
单击紧贴顶峰的带下划线的< -and-> 超链接, 该超链接位于显示屏的左上角。要将显示屏幕的输出重定向到优先于屏幕的记录, 请退出该命令, 将pt命令的输出重定向到
/tmp/xent_value_slices.txtfile:tfdbg> pt crosses_entropy/Log:0[:, 0:10] > /tmp/xnt_value_slices.txt

查找nan和infs 在第一次咨询Run()调用时, 它不会出现任何复杂的数值。我们可以通过使用命令run或它的简写r来跟随run。
我们还可以使用-t标志在Session之前和某些会话中进行传输。一次运行()个调用,
在不停止运行开始或运行停止激活的情况下运行Run(), 直到图形中的主要Nan或inf值为止。这类似于tensorflow中过程语言调试器中的条件断点:
tfdbg> run -f has_inf_or_nan

上面的命令之所以有效, 是因为在创建包装的协商后, 将张量清除了称为has_inf_or_nan的张量进行了注册。
def my_filter_callable (datum, tensor): return len(tensor. Shape) == 0 and tensor == 0sess.add_tensor_filter('my_filter', my_filters_callable)The tfdbg run-start prompt Run until our filter is precipitated:tfdbg> run -f my_filter

有关预期签名的更多统计信息, 请参见API文档, 然后返回与add_tensor_filter()一起使用的谓词可调用的值。
TensorFlow调试详细步骤实例解释

文章图片
因为显示建议在第一行, 所以将has_inf_or_nan过滤掉首先进行第四次咨询。
Run()调用:Adam优化器的前后教育跳过该图。在此运行中, 有36个中间张量包含nan或inf值。
tfdbg> pt dross_entropy/Log:0

向下滚动一下, 我们将输入一些分散的inf值。如果很难通过视觉识别inf和Nan的实例, 我们可以使用以下命令执行正则表达式查找并突出显示输出:
tfdbg> /inf

或者, 作为替代:
tfdbg> /(inf|nan)

我们还可以使用-s或-numeric_summary命令来获取张量内各种数值的摘要:
tfdbg> pt -s cross_entropy/Log:0

我们可以看到cross_entropy / Log的数千个元素中的几个:零张量是-infs(负无穷大)。
tfdbg> ni cross_entropy/Log

TensorFlow调试详细步骤实例解释

文章图片
我们看到该节点具有操作类型日志, 并且其输入是节点softmax。然后运行以下命令以更深入地观察输入张量:
tfdbg> pt Softmax:0

看一下输入张量中的值, 寻找零:
tfdbg> /0\.000

现在很清楚, 可怕的数值的基础是零点的节点交叉熵/对数对话记录。
要在python供应代码中找出错误的行, 请使用ni命令的-t标志显示节点生产的追溯:
tfdbg> ni -t cross_entropy / Log
如果我们单击显示顶部的” node_info” , 则tfdbg会机械地建议对节点创建的回溯。
从回溯中, 我们看到op是在以下行构建的:debug_minist.Py:
Diff=y_*tf.log(y)

【TensorFlow调试详细步骤实例解释】它可以用pops或张量顶住它们来注释python记录的行。
TensorFlow调试详细步骤实例解释

文章图片

    推荐阅读