您好、欢迎来到现金彩票网!
当前位置:秒速牛牛官方网站 > 调试模型 >

TensorFlow 调试程序

发布时间:2019-07-17 09:35 来源:未知 编辑:admin

  是 TensorFlow 的专用调试程序。借助该调试程序,您可以在训练和推理期间查看运行中 TensorFlow 图的内部结构和状态,由于 TensorFlow 的计算图模式,使用通用调试程序(如 Python 的

  本教程展示了如何使用tfdbgCLI 调试出现naninf的问题,这是 TensorFlow 模型开发期间经常出现的一种错误。下面的示例适用于使用低阶 TensorFlowSessionAPI 的用户。本文档的后面部分介绍了如何将tfdbg与 TensorFlow 的更高阶 API(包括tf.estimatortf.keras/keras和)结合使用。要观察此类问题,请在不使用调试程序的情况下运行以下命令(可在此处找到源代码):

  此代码训练了一个简单的神经网络来识别 MNIST 数字图像。请注意,在完成第一个训练步之后,准确率略有提高,但之后停滞在较低(近机会)水平:

  您想知道哪里出了问题,怀疑训练图中的某些节点生成了错误数值(例如inf和nan),因为这是导致此类训练失败的常见原因。我们可以使用 tfdbg 来调试此问题,并确定第一次出现此数字问题的确切图节点。

  要向示例中的 tfdbg 添加支持,我们只需添加下列代码行,并使用调试程序封装容器封装会话对象。此代码已添加到debug_mnist.py中,因此您可以在命令行中使用--debug标记激活 tfdbg CLI。

  此封装容器与会话具有相同的界面,因此启用调试时不需要对代码进行其他更改。该封装容器还提供其他功能,包括:

  在本示例中,我们已经注册了一个名为tfdbg.has_inf_or_nan的张量过滤器,它仅仅确定任何中间张量(不是Session.run()调用的输入或输出、而是位于从输入到输出的路径中的张量)中是否存在任何nan或inf值。此过滤器可以确定是否存在nan和inf,这是一种常见的用例,我们在debug_data模块中包含了此过滤器。

  调试封装容器会话会在将要执行第一次Session.run()调用时提示您,而屏幕上会显示关于获取的张量和 feed 字典的信息。

  run命令会让 tfdbg 一直执行,直到下一次Session.run()调用结束,而此调用会使用测试数据集计算模型的准确率。tfdbg 会扩展运行时图来转储所有中间张量。运行结束后,tfdbg 会在 run-end CLI 中显示所有转储的张量值。例如:

  请注意,每次输入命令时,都会显示新的屏幕输出。这有点类似于浏览器中的网页。您可以通过点击 CLI 左上角附近的--和--文本箭头在这些屏幕之间导航。

  在第一个Session.run()调用中,没有出现存在问题的数值。您可以使用命令run或其简写形式r转到下一次运行。

  提示:如果您反复输入run或r,则将能够依序在Session.run()调用之间移动。

  您还可以使用-t标记一次向前移动多个Session.run()调用,例如:

  在每次Session.run()调用之后,您无需重复输入run并在 run-end 界面中手动搜索nan和inf(例如,通过使用上表中显示的pt命令),而是可以使用以下命令让调试程序反复执行Session.run()调用(不在 run-start 或 run-end 提示符处停止),直到第一个nan或inf值出现在图中。这类似于一些程序式语言调试程序中的条件断点:

  注意:上述命令可正常运行,因为在创建封装会话时已为您注册了一个名为has_inf_or_nan的张量过滤器。此过滤器会检测nan和inf(如前所述)。如果您已注册任何其他过滤器,则可以使用“run -f”让 tfdbg 一直运行,直到任何张量触发该过滤器(导致过滤器返回 True)为止。

  然后在 tfdbg run-start 提示符处运行,直到您的过滤器被触发:

  如屏幕所示,在第一行中,has_inf_or_nan过滤器在第四次Session.run()调用期间第一次被触发:Adam 优化器前向-后向训练通过了图。在本次运行中,36 个(共 95 个)中间张量包含nan或inf值。这些张量按时间先后顺序列出,具体时间戳显示在左侧。在列表顶部,您可以看到第一次出现错误数值的第一个张量:cross_entropy/Log:0。

  要查看张量的值,请点击带下划线的张量名称cross_entropy/Log:0或输入等效命令:

  向下滚动一点,您会发现一些分散的inf值。如果很难用肉眼找到出现inf和nan的地方,可以使用以下命令执行正则表达式搜索并突出显示输出:

  您还可以使用-s或--numeric_summary命令获取张量中的数值类型的快速摘要:

  您可以从摘要中看到cross_entropy/Log:0张量的若干个元素(共 1000 个)都是-inf(负无穷大)。

  为什么会出现这些负无穷大的值?为了进一步进行调试,通过点击顶部带下划线的node_info菜单项或输入等效的 node_info (ni) 命令,显示有关节点cross_entropy/Log的更多信息:

  您可以看到,此节点的指令类型为Log,输入为节点Softmax。运行以下命令可进一步查看输入张量:

  确实存在零。现在很明显,错误数值的根源是节点cross_entropy/Log取零的对数。要在 Python 源代码中找出导致错误的行,请使用ni命令的-t标记来显示节点构造的回溯:

  如果您点击屏幕顶部的“node_info”,tfdbg 会自动显示节点构造的回溯。

  从回溯中可以看到该操作是在以下行构建的 -debug_mnist.py:

  tfdbg有一个可以轻松将张量和指令追溯到 Python 源文件中的行的功能。它可以用行创建的指令或张量注解 Python 文件的行。要使用此功能,只需点击ni -t op_name命令的堆栈追踪输出中带下划线的行编号,或者使用ps(或print_source)命令,例如:ps /path/to/source.py。例如,以下屏幕截图显示了ps命令的输出。

  确认没有任何张量被标记为包含nan或inf值,并且准确率现在继续上升(而不是停滞不变)。成功!

  本部分介绍了如何调试使用EstimatorAPI 的 TensorFlow 程序。这些 API 提供的部分便利性是它们在内部管理Session。这样一来,上面的部分介绍的LocalCLIDebugWrapperSession就不适用了。幸运的是,您仍然可以使用tfdbg提供的特殊hook调试它们。

  要结合使用 TFDBG 和tf.keras,请允许 Keras 后端使用 TFDBG 封装的会话对象。例如,要使用 CLI 封装容器,请运行以下代码:

  TFDBG 支持对tf-slim进行训练和评估调试。如下所述,训练和评估需要略微不同的调试工作流程。

  您的模型往往在您没有终端访问权限的远程机器或进程上运行。要在这种情况下调试模型,您可以使用tfdbg的offline_analyzer二进制文件(如下所述)。它在转储的数据目录上运行。可以对较低阶的SessionAPI 以及较高阶的EstimatorAPI 执行此操作。

  如果您直接与tf.SessionAPI(python版)互动,则可以使用tfdbg.watch_graph方法配置对其调用Session.run()方法的RunOptions原型。这样一来,在发生Session.run()调用时,中间张量和运行时图会被转储到您选择的共享存储位置(以降低性能为代价)。例如:

  之后,在您拥有终端访问权限的环境(例如,一台可以访问上述代码指定的共享存储位置的本地计算机)中,您可以使用tfdbg的offline_analyzer二进制文件加载和检查共享存储上的转储目录中的数据。例如:

  如果您的模型代码是采用 C++ 或其他语言编写的,则您还可以修改RunOptions的debug_options字段以生成可离线检查的调试转储。要了解详情,请参阅原型定义。

  答:否。调试程序在图中插入了其他特殊用途的调试节点来记录中间张量的值。这些节点减缓了图的执行。如果您对分析模型感兴趣,请查看:

  答:可以。tfdbg 在运行时期间会拦截指令生成的错误,并在 CLI 中向用户显示具体错误以及一些调试说明。请查看下面的示例:

  答:这是一个常见用例,其中Session对象同时在多个线程中使用。通常情况下,子线程负责后台任务,例如运行入列指令。您通常仅需要调试主线程(或者不太频繁地仅调试一个子线程)。您可以使用LocalCLIDebugWrapperSession的thread_name_filter关键字参数实现这种类型的线程选择性调试。例如,您要仅通过主线程进行调试,请按如下方式构造一个封装的Session:

  以上示例的前提是 Python 中的主线程具有默认名称MainThread。

  问:我正在调试的模型非常大。tfdbg 转储的数据占满了磁盘的可用空间。我该怎么做?

  确保 dump_root 指向的目录为空或不存在。 在退出之前,tfdbg会清理转储目录。

  上面的第一个命令仅查看名称符合正则表达式格式.*hidden.*的节点。上面的第二个命令仅查看名称符合格式Variable.*的操作。上面的第三个命令仅查看 dtype 符合格式int.*(例如int32)的张量。

  答:这是因为 tfdbg CLI 默认在终端中启用了鼠标事件。此mouse-mask模式会替换默认的终端交互,包括文本选择。您可以通过使用命令mouse off或m off来重新启用文本选择。

  答:您之所以没有看到转储数据,是因为执行的 TensorFlow 图中的每个节点都由 TensorFlow 运行时进行了常数折叠处理。在本示例中,a是一个常数张量;因此,已获取的张量b其实也是一个常数张量。TensorFlow 的图优化将包含a和b的图折叠成单个节点,以加快图的未来运行速度,因此,tfdbg不会生成任何中间张量转储。不过,如果a是一个tf.Variable,如下例所示:

  问:我正在调试一个产生垃圾无穷数或 NaN 的模型。但是,我的模型中有一些节点已知会在输出张量中产生无穷值或 NaN,即使在完全正常的条件下也是如此。我如何在run -f has_inf_or_nan操作期间跳过这些节点?

  答:有,TensorBoard 调试程序插件就是 tfdbg 的 GUI。它提供了诸如计算图检查、张量值实时可视化、张量连续性和条件性断点以及将张量关联到其图形构建源代码等功能,所有这些功能都在浏览器环境中运行。要开始使用,请访问相关 README 文件。

http://sec-ir.com/diaoshimoxing/606.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有