Pycharm调试Tensorflow代码的时候为什么进不去loss等函数

在使用Pycharm调试(注意不是运行)使用Keras高级API的Tensorflow代码的时候,大部分函数时可以跟随断点进入的,但是某些函数内打了断点也进不去,不如loss函数,怎么解决呢?

为了帮助调试,您可以调用 tf.config.run_functions_eagerly(True) 来全局停用和重新启用 tf.function。这句话来自于官方教程,直接在主程序前面写上这句代码,就可以正常跳入了

该回答引用GPTᴼᴾᴱᴺᴬᴵ
如果您在 PyCharm 中打断点无法进入 Keras 高级 API 的某些函数内部(例如 loss 函数),可能是因为这些函数的实现在 C++ 中,而不是 Python 中。

您可以尝试以下方法来解决这个问题:

  1. 使用 tf.keras 的 Model.compile() 方法设置 run_eagerly=True 选项。这个选项将使得在 fit() 函数中的每个样本的训练都是以 eager mode 进行的,这样便能让断点在您的 loss 函数内生效。不过这种方式可能会影响训练速度。
  2. 将 tf.keras.backend.set_learning_phase(1) 加入您的代码。这会强制 TensorFlow 运行模式切换到 eager mode,这样断点就可以进入 loss 函数了。不过同样的,这也可能会影响训练速度。
  3. 通过打印和日志等方式,尝试在 loss 函数内查看变量和数据的值,从而进行调试。
  4. 您也可以使用 TensorFlow 提供的 tf.function 将您的 loss 函数转换为一个 TensorFlow 计算图,这样 PyCharm 就可以进入您的 loss 函数了。不过,这个过程可能需要一些工作量,且不是所有函数都支持这种方式。

希望这些方法能帮到您解决问题。

Debug情况下,有的函数确实进不去(有些函数在TensorFlow中是由优化器调用的),但实际上不影响他们运行。

后面的内容引用GPTᴼᴾᴱᴺᴬᴵ

如果您在Pycharm中使用Keras高级API进行调试,但是在某些函数中打了断点但无法进入,可能是由于以下原因之一:

函数未被调用。如果您在断点处设置了一个函数,但是该函数在代码的其他部分未被调用,则调试器将无法进入该函数。请确保在您想要进入的函数处设置断点之前,该函数已被调用。

优化器中的函数。有些函数在TensorFlow中是由优化器调用的,例如损失函数。这些函数在调试期间不会被直接调用,因此您无法在其中设置断点。但是,您可以在包含这些函数的其他函数中设置断点,例如在训练循环中设置断点。

为了调试这些函数,您可以使用以下方法之一:

在包含该函数的其他函数中设置断点。例如,您可以在训练循环中设置断点来捕获损失函数的调用。

在函数的第一行打印调试信息。例如,在损失函数的第一行打印一些调试信息,以查看函数是否被正确调用。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^