深入学习Python代码不再有效&引用;TypeError:函数构建代码之外的op被传递一个“;图;张量;

深入学习Python代码不再有效&引用;TypeError:函数构建代码之外的op被传递一个“;图;张量;,python,tensorflow,machine-learning,keras,autoencoder,Python,Tensorflow,Machine Learning,Keras,Autoencoder,我正在实现一个Tensorflow变分自动编码器,完全复制了《Python深度学习》一书中的代码。直到几天前,代码还可以正常工作,但截至昨天它已经停止工作了(我还没有更改代码) 代码用于生成模型,该模型可以从MNIST数据集中复制图像 具体错误消息如下: TypeError:正在传递函数构建代码之外的op “图形”张量。有可能有图张量 通过包含 函数构建代码中的tf.init_作用域。 图张量的名称为:稠密_2/biasad:0 我已经在下面的Google协作文件中提供了代码,因此您可以尝试自己

我正在实现一个Tensorflow变分自动编码器,完全复制了《Python深度学习》一书中的代码。直到几天前,代码还可以正常工作,但截至昨天它已经停止工作了(我还没有更改代码)

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

具体错误消息如下:

TypeError:正在传递函数构建代码之外的op “图形”张量。有可能有图张量 通过包含 函数构建代码中的tf.init_作用域。 图张量的名称为:稠密_2/biasad:0

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


您定义用于计算损失的自定义层,即
CustomVariationalLayer
,正在访问尚未直接传递给它的模型的张量。这是不允许的,因为启用了渴望模式,但层中的函数默认以图形模式执行。要解决此问题,您可以使用
tf.compat.v1.disable_eager_execution()
完全禁用急切模式,或者使用
tf.config.run_functions_急切地(True)
使所有函数急切地运行

然而,上述两种解决方案可能都不可取,因为它们正在修改TF的默认行为(尤其是后者,因为后者可能会降低性能)。因此,您可以修改
CustomVariationalLayer
的定义,将
z_mean
z_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])

如果您将这一行放在代码顶部
tf.config.experimental\u run\u functions\u急切地(True)
,您是否仍然会收到错误?谢谢。但是,如果使用模型内部构件的自定义模型有损失,该怎么办?我该怎么办?@Crispy13 Call
add_loss
方法在层内或模型实例(,)上。感谢您的回复。我确实喜欢这样,但作者也犯了同样的错误。如果你能看看我的colab笔记本就好了@Crispy13我能告诉你的是,错误的张量是
张量(“add_1:0”,shape=(2,),dtype=float32)
;找到它的位置并修复它。