TensorFlow 调试

17 Mar 2025 | 5 分钟阅读

调试是一个繁琐且具有挑战性的任务。我们必须编写代码并通过 tensorflow 调试来识别问题。通常有许多指南,并且对于许多语言和框架,调试过程通常都有很好的文档记录。

TensorFlow 有一个名为 tfdbg 的 TensorFlow 调试器,它允许我们观察正在运行的图的基本工作和状态。这些用任何调试器(例如 python 中的 pdb)调试起来都很困难。

本教程将教我们如何使用 tfdbg CLI 来调试 nans 和 icons 的出现,这些是 tensor flow 中最常见的错误类型。下面给出一个低级 API 示例。

Python-m tensorflow.python.debug.examples.debug_mnist

上面的代码用于训练一个用于 MNIST 数字图像识别的神经网络,并且在经过几个步骤后,准确率会增加,然后在饱和。

此错误可能是 infs 和 nans,它们是最常见的错误。现在使用 tfdbg 调试问题,并确切地知道问题从哪里开始。

使用 tfdbg 包装 TensorFlow 会话

添加以下代码行以使用 tfdbg,并使用调试器包装器包含会话对象。

包装器类提供了一些附加功能,其中包括:如果我们希望控制执行并了解图的内部状态,则可以在 Session.run() 之前和之后调用 CLI。

可以添加过滤器以协助诊断。在提供的示例中,有一个名为 tfdbg.has_inf_or_nan 的过滤器,它确定任何中间张量(既不是输入也不是输出)中是否存在 Nan 或 inf。

我们可以随时为满足我们需求的自定义过滤器编写代码,并且可以查看 API 文档以获取更多信息。

使用 tfdbg 调试 TensorFlow 模型训练,

是时候使用-debug 标志来训练模型了

获取的数据可以显示在屏幕上,看起来如下图所示

TensorFlow Debugging

上图是运行启动界面。之后,在提示符处输入 r

tfdbg>run

这将使 TensorFlow 调试器运行,如果下一个会话调用计算测试数据集的准确率。

例如

TensorFlow Debugging

在执行运行后,我们可以使用命令列出张量。

常用 TensorFlow 调试命令

在 tfdbg> 提示符处查看以下命令:请注意,无论何时输入命令,都将看到一个全新的显示输出。这类似于浏览器中的互联网页面。我们可以通过单击 CLI 左上角附近的 <- 和 -> 文本箭头在这些屏幕之间导航。

tfdbg CLI 的功能

与上面索引的 TensorFlow 调试命令类似,tfdbg CLI 提供了以下附加功能

导航以那些字符开头的之前的 tfdbg 指令。

要浏览之前的 tfdbg 指令,请键入一些字符,然后按向上或向下箭头键。 Tfdbg 将向我们显示以那些态度开头的指令的历史记录。

要浏览屏幕输出的记录,请执行以下两项操作

单击屏幕顶部左上角的带下划线的 <- 和 -> 超链接。 要将屏幕输出重定向到记录而不是屏幕,请退出命令将 pt 命令的输出重定向到

查找 nans 和 infs

在第一次 Run() 调用中,似乎没有任何复杂的数值。 我们可以通过使用命令 run 或其简写 r 继续进行跟踪。

我们还可以使用 -t 标志在某些 Session.Run() 调用之前移动。

Run() 调用而不在运行开始或运行停止激活时停止,直到图中的第一个 Naninf 值。 这类似于 tensorflow 中的程序语言调试器中的条件断点

前面的命令效果很好,因为当创建包装的会话时,已注册了一个称为 has_inf_or_nan 的张量清除器以供使用。

有关预期签名和返回 predicate 可调用对象的值(与 add_tensor_filter() 一起使用)的更多统计信息,请参阅 API 文档。

TensorFlow Debugging

因为显示在第一行,因此在第四次 会话中首先调用 has_inf_or_nan 过滤器。

Run() 调用:Adam 优化器前向后向训练跳过图。 在此 Run 中,36 个中间张量包含 naninf 值。

向下滚动一点,我们将注意到一些分散的 inf 值。 如果 infNan 的实例难以用肉眼识别,我们可以使用以下命令来执行正则表达式搜索并突出显示输出

或者,作为替代方案

我们还可以使用 -s 或 -numeric_summary 命令来获取张量中数值类型的摘要

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

TensorFlow Debugging

我们看到这个节点具有 op 类型 log,并且它的输入是节点 softmax。 然后运行以下命令以更深入地观察输入张量

查看输入张量中的值,查找零

现在很明显,不好的数值的根源是节点 cross-entropy/Log 谈论零的对数。

要找到 python 源代码中的错误行,请使用 ni 命令的 -t 标志来显示节点的创建的回溯

tfdbg>ni -t cross_entropy/Log

万一我们在显示的顶部单击“node_info”,tfdbg 会自动显示节点的创建的回溯。

从回溯中,我们看到 op 是在以下行构建的:debug_minist.Py

它可以注释 python 记录的行,并带有所创建的 pops 或张量。

TensorFlow Debugging