如何在TensorFlow 2.0中调试Keras?

6

实际上,我发现这个问题已经存在于 TensorFlow 1.13.0 版本中(tensorflow1.12.0 版本运行良好)。

以下是我的代码示例:

def Lambda layer(temp):
    print(temp)
    return temp

它是我Keras模型中使用的一个lambda层。在tensorflow1.12.0中,print(temp)可以输出以下详细数据

[<tf.Tensor: id=250, shape=(1024, 2, 32), dtype=complex64, numpy=
array([[[ 7.68014073e-01+0.95353246j,  7.01403618e-01+0.64385843j,
          8.30483198e-01+1.0340731j , ..., -8.88018191e-01+0.4751519j ,
         -1.20197642e+00+0.6313924j , -1.03787208e+00+0.22964947j],
        [-7.94382274e-01+0.56390345j, -4.73938555e-01+0.55901265j,
         -8.73749971e-01+0.67095983j, ..., -5.81580341e-01-0.91620034j,
         -7.04443693e-01-1.2709806j , -3.23135853e-01-1.0887597j ]],

这是因为我使用了1024作为batch_size。但当我更新到tensorflow1.13.0或TensorFlow 2.0时,相同代码的输出

Tensor("lambda_1/truediv:0", shape=(None, 1), dtype=float32)

这很糟糕,因为我无法知道具体的错误。 那么,有什么解决方法吗?

1个回答

4

你看到这个输出是因为Keras模型被转换为其图形表示,因此print打印tf.Tensor图形描述。

在使用Tensorflow 2.0时要查看tf.Tensor的内容,应该使用tf.print而不是print,因为前者会被转换为其图形表示,而后者不会。


1
谢谢您的回复。它有效!但是,通过添加大量的tf.print来检查变量进行调试确实非常复杂。在tensorflow 1.12.0中,我可以在lambda层内使用断点进行调试,程序会在那里停止。然而,在2.0中,程序在训练开始后不会停在lambda层,因此我无法轻松调试(由于我的自定义损失函数很复杂,我真的需要检查许多变量以确保我的函数正确)。您有什么想法吗? - LinTIna
当源代码转换为图形时,有一些简单的调试方法。可能最好的方法是首先使用keras编写模型,然后使用tf.GradienTape手动编写训练循环以及所有急切的内容。这样,您可以使用调试器轻松调试。然后,如果您想要,可以放弃自定义训练循环并使用Keras(或更好的是,只需使用@tf.function装饰训练循环并将循环转换为图形以加速)。 - nessuno
谢谢,也许这是目前为止最好的解决方案。我真的很喜欢tf 1.12.0中的调试方式,有点失望它在tf 2.0中消失了。希望将来会有更方便的调试方法。 - LinTIna
只需使用纯粹的急切模式(具有强大的自定义训练循环和记录功能),然后转换为图形。这样,您可以同时获得最佳效果,相信我 :) 但是,如果此答案解决了您的问题,请记得将其标记为已接受! - nessuno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接