当前位置: 首页 > 面试题库 >

AttributeError:图层没有入站节点,或者AttributeError:图层从未被调用

祁鸿哲
2023-03-14
问题内容

我需要一种方法来获取TensorFlow中任何类型的层(即Dense,Conv2D等)的输出张量的形状。根据文档,有output_shape可以解决问题的属性。但是,每次访问它都会得到AttributedError

这是显示问题的代码示例:

import numpy as np
import tensorflow as tf


x = np.arange(0, 8, dtype=np.float32).reshape((1, 8))
x = tf.constant(value=x, dtype=tf.float32, verify_shape=True)

dense = tf.layers.Dense(units=2)

out = dense(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(fetches=out)
    print(res)
    print(dense.output_shape)

print(dense.output_shape)语句将产生错误消息:

AttributeError: The layer has never been called and thus has no defined output shape.

print(dense.output)将产生:

AttributeError('Layer ' + self.name + ' has no inbound nodes.')
AttributeError: Layer dense_1 has no inbound nodes.

有什么办法可以解决该错误?

PS:
我知道在上面的示例中,我可以通过获得输出张量的形状out.get_shape()。但是我想知道为什么output_shape财产不起作用以及如何解决?


问题答案:

TL; DR

我该如何解决? 定义输入层:

x = tf.keras.layers.Input(tensor=tf.ones(shape=(1, 8)))
dense = tf.layers.Dense(units=2)

out = dense(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(fetches=out)
    print(dense.output_shape) # shape = (1, 2)

根据Keras文档,如果层具有单个 节点
,则可以通过以下方式获取其输入张量,输出张量,输入形状和输出形状:

  • 层输入
  • 层输出
  • layer.input_shape
  • layer.output_shape

但是在上面的示例中,当我们调用layer.output_shape或其他属性时,它引发了看起来有些奇怪的异常。

如果深入源代码,则错误是由 入站节点 引起的。

if not self._inbound_nodes:
  raise AttributeError('The layer has never been called '
                       'and thus has no defined output shape.')

这些入站节点是什么?

节点 描述了 两个层之间的连接 。每次将图层连接到一些新输入时,都会将一个节点添加到 layer._inbound_nodes
。每次层的输出被另一层使用时,都会将一个节点添加到 layer._outbound_nodes

如您在上面看到的,当self._inbounds_nodes为None时,它将引发异常。 _ 这意味着,当一个层未连接到输入层或更普遍时,先前的所有层都没有连接到输入层,这self._inbounds_nodes是空的,这导致了问题_。

请注意,x在您的示例中,它是张量而不是输入层。请参阅另一个示例以获取更多说明:

x = tf.keras.layers.Input(shape=(8,))
dense = tf.layers.Dense(units=2)

out = dense(x)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = sess.run(fetches=out, feed_dict={x: np.ones(shape=(1, 8))})
    print(res)
    print(res.shape)  # shape = (1,2)
    print(dense.output_shape)  # shape = (None,2)

很好,因为定义了输入层。

请注意,在您的示例中,out是张量。tf.shape()函数和.shape=(get_shape())之间的区别是:

tf.shape(x)返回表示x的动态形状的一维整数张量。动态形状仅在图执行时才知道。

x.shape返回表示x静态形状的Python元组。在图形定义时已知的静态形状。

在以下网址了解更多关于张量形状的信息:https :
//pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-
static-dynamic/



 类似资料:
  • 出发地:http://www.sitemaps.org/protocol.html: 如果要列出超过50000个URL,必须创建多个站点地图文件 那么是否有可能创建一个3层或更多层的链?例如: //mysite/sitemap.xml是: //mysite/sitemaps/index。xml是: 和//mysite/sitemaps/sitemap lm。xml。gz是一个普通的gzip XML

  • 关于调整图层和填充图层 调整图层可将颜色和色调调整应用于图像,而不会永久更改像素值。例如,您可以创建“色阶”或“曲线”调整图层,而不是直接在图像上调整“色阶”或“曲线”。颜色和色调调整存储在调整图层中并应用于该图层下面的所有图层;您可以通过一次调整来校正多个图层,而不用单独的对每个图层进行调整。您可以随时扔掉更改并恢复原始图像。 填充图层使您可以用纯色、渐变或图案填充图层。与调整图层不同,填充图层

  • 图层是 Sketch 中最基本的构成单位。不同于其他将图层和对象混为一谈的应用,在 Sketch 里每个对象都有自己的图层。所以在这个手册中,我们所说的“图层”和“对象”其实是一样的意思,这两个词是可以相互替换的。 编组和画板能让你在 Sketch 里有效的管理内容,他们也会被视为多个图层的组合。要想添加新的涂层,你可以单击工具栏中的 insert 按钮。 添加图层 添加图层最简单的方式便是直接从

  • 标签 描述 laycount 重新分配layer图层和message层的数目 layopt 设定图层的属性 backlay forelay 把表层复制到里层 把里层复制到表层 copylay 把某一图层复制到目标图层上 laylevel 设定图层的absolute layfront layback 把指定图层移到最前面 指指定图层移到最后面 laycount 说明: (1) 重新分配layers[

  • Cesium支持从几个标准服务绘制和添加高分辨率图像(地图)图层。图层可以按顺序排列,并混合在一起。每一层的亮度、对比度、伽玛、色调和饱和度可以动态地改变。本节教程介绍了图层的概念以及相关的Cesuim APIs。 快速入门 我们暂时忽略细节,直接编写代码来添加一些图像层。在Sandcastle中打开Hello World示例。此示例创建一个Viewer组件,默认情况下,该组件呈现Bing Map

  • 我想有一个传单层控件,在那里我可以选择一个基本层,并使这个基本层本身是一个LayerGroup,从中我可以选择要显示的子层。我正在考虑一个设置,在那里我点击一个单选按钮选择基本层(层组),然后我会看到一个复选框列表,其中的层显示。有没有办法使用库存层控件做到这一点? 我找了一些例子,翻阅了一下传单API,但没有找到类似的东西。