使用Python代码进行深度学习不再起作用。 “ TypeError:函数构建代码外部的op正在传递“ Graph”张量。”

时间:2020-08-05 18:57:49

标签: python tensorflow machine-learning keras autoencoder

我正在实现Tensorflow变体自动编码器,正是从《用Python进行深度学习》一书中复制了代码。直到几天前,该代码仍能正常工作,但截至昨天它已停止工作(我尚未更改代码)。

该代码用于生成模型,该模型可以复制MNIST数据集中的图像。

具体错误消息如下:

TypeError:正在传递函数构建代码之外的op 一个“图”张量。可能有图张量 通过包含以下内容泄漏出功能构建上下文 函数构建代码中的tf.init_scope。 图张量的名称为:density_2 / BiasAdd:0

我已在下面的Google Collaborative文件中提供了该代码,因此您可以尝试自己运行它:

https://colab.research.google.com/drive/1ArmP3Nns2T_i-Yt-yDXoudp6Lhnw-ghu?usp=sharing

1 个答案:

答案 0 :(得分:2)

您定义的用于计算损耗的自定义层(即CustomVariationalLayer)正在访问尚未直接传递给模型的模型张量。这是不允许的,因为启用了急切模式,但是默认情况下在图形模式下执行图层中的功能。要解决此问题,您可以完全使用tf.compat.v1.disable_eager_execution()禁用eager模式,也可以使用tf.config.run_functions_eagerly(True)来使所有功能快速运行。

但是,上述两个解决方案可能都不理想,因为它们正在修改TF的默认行为(尤其是后者,因为它可能会降低性能)。因此,除了使用这些解决方案之外,您还可以修改CustomVariationalLayer的定义以将z_meanz_log_var作为其其他输入:

class CustomVariationalLayer(keras.layers.Layer):
    def vae_loss(self, x, z_decoded, z_mean, z_log_var):
        # ...

    def call(self, inputs):
        x = inputs[0]
        z_decoded = inputs[1]
        z_mean = inputs[2]
        z_log_var = inputs[3]
        loss = self.vae_loss(x, z_decoded, z_mean, z_log_var)
        # ...

y = CustomVariationalLayer()([input_img, z_decoded, z_mean, z_log_var])