【问题标题】:Deep Learning with Python code no longer working. "TypeError: An op outside of the function building code is being passed a "Graph" tensor."使用 Python 代码进行深度学习不再有效。 “TypeError:函数构建代码之外的操作正在传递一个“图形”张量。”
【发布时间】:2020-08-05 18:57:49
【问题描述】:

我正在实现一个 Tensorflow 变分自动编码器,完全从“使用 Python 进行深度学习”一书中复制代码。直到几天前,代码运行良好,但到昨天它已经停止工作(我没有更改代码)。

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

具体报错信息如下:

TypeError:正在传递函数构建代码之外的操作 “图形”张量。可以有图张量 通过包含 tf.init_scope 在您的函数构建代码中。 图张量名称:dense_2/BiasAdd:0

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

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

【问题讨论】:

  • 如果你把这行放在代码tf.config.experimental_run_functions_eagerly(True)的顶部,你还会得到错误吗?

标签: python tensorflow machine-learning keras autoencoder


【解决方案1】:

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

但是,上述两种解决方案可能都不是可取的,因为它们正在修改 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])

【讨论】:

  • 谢谢。但是,如果自定义模型在使用模型内部时有损失怎么办?我该怎么办?
  • @Crispy13 在层内或模型实例(documentationguide)上调用 add_loss 方法。
  • 感谢您的回复。我确实喜欢那样,但提出了与作者相同的错误。如果你能看到我的 colab 笔记本就好了。 colab.research.google.com/drive/…
  • @Crispy13 我只能告诉你错误的张量是Tensor("add_1:0", shape=(2,), dtype=float32);找到它并修复它。
猜你喜欢
  • 2020-02-22
  • 2021-09-27
  • 2020-06-18
  • 2020-09-30
  • 2020-12-24
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多