【问题标题】:keras 'NoneType' object has no attribute '_inbound_nodes'keras 'NoneType' 对象没有属性 '_inbound_nodes'
【发布时间】:2018-08-22 09:07:27
【问题描述】:

我正在尝试编写一个判别器来评估图像的补丁。 因此,我从输入生成 32x32 不重叠的补丁,然后将它们连接到一个新的轴上。

我使用时间分布层的原因是最后,鉴别器应该评估整个图像是真还是假。因此,我试图单独对每个补丁执行前向传递,然后通过 lambda 层对补丁的判别器输出进行平均:

def my_average(x):
    x = K.mean(x, axis=1)
    return x

def my_average_shape(input_shape):
    shape = list(input_shape)
    del shape[1]
    return tuple(shape)


def defineD(input_shape):
    a = Input(shape=(256, 256, 1))

    cropping_list = []

    n_patches = 256/32
    for x in range(256/32):
        for y in  range(256/32):

            cropping_list += [
             K.expand_dims(
                Cropping2D((( x * 32,  256 - (x+1) * 32), ( y * 32,  256 - (y+1) * 32)))(a)
                , axis=1)
            ]

    x = Concatenate(1)(cropping_list)

    x = TimeDistributed(Conv2D(4 * 8, 3, padding='same'))(x) # 
    x = TimeDistributed(MaxPooling2D())(x)
    x = TimeDistributed(LeakyReLU())(x)                  # 16

    x = TimeDistributed(Conv2D(4 * 16, 3, padding='same'))(x)
    x = TimeDistributed(MaxPooling2D())(x)
    x = TimeDistributed(LeakyReLU())(x)                  # 8

    x = TimeDistributed(Conv2D(4 * 32, 3, padding='same'))(x)
    x = TimeDistributed(MaxPooling2D())(x)
    x = TimeDistributed(LeakyReLU())(x)                  # 4


    x = TimeDistributed(Flatten())(x)
    x = TimeDistributed(Dense(2, activation='sigmoid'))(x)
    x = Lambda(my_average, my_average_shape)(x)

    return keras.models.Model(inputs=a, outputs=x)

由于某种原因,我收到以下错误:

File "testing.py", line 41, in <module>
    defineD((256,256,1) )
  File "testing.py", line 38, in defineD
    return keras.models.Model(inputs=a, outputs=x)
  File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 93, in __init__
    self._init_graph_network(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 237, in _init_graph_network
    self.inputs, self.outputs)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1353, in _map_graph_network
    tensor_index=tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1340, in build_map
    node_index, tensor_index)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/network.py", line 1312, in build_map
    node = layer._inbound_nodes[node_index]
AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

【问题讨论】:

  • 你能包含完整的错误堆栈跟踪吗?
  • @sdcbr 已添加完整错误

标签: python machine-learning keras deep-learning conv-neural-network


【解决方案1】:

您需要将裁剪操作放在一个函数中,然后在Lambda 层中使用该函数:

def my_cropping(a):
    cropping_list = []
    n_patches = 256/32
    for x in range(256//32):
        for y in  range(256//32):

            cropping_list += [
             K.expand_dims(
                Cropping2D((( x * 32,  256 - (x+1) * 32), ( y * 32,  256 - (y+1) * 32)))(a)
                , axis=1)
            ]
    return cropping_list

使用它:

cropping_list = Lambda(my_cropping)(a)

【讨论】:

  • 它工作了,为什么这会有所不同,最后你仍然像我以前一样返回一个列表?
  • @KarimMohamedHasebou 我不知道为什么,但我想这与 Keras 层的输出张量以某种方式增强并且具有或多或少特定于 Keras 的属性的事实有关;虽然,正如我所检查的,在这两种方法中,输出张量的类型都是tf.Tensor。或者这可能是由于在 Keras 的有效工作流程之外构建张量(即使用层)。这是一个猜测,因为我对 Keras 的低级内部结构不是很熟悉。
【解决方案2】:

我遇到了同样的问题,它确实通过在张量周围包裹一个 Lambda 层来解决,就像@today 提议的那样。

感谢您的提示,它为我指明了正确的方向。我想把一个向量变成一个对角矩阵来

我想将向量与正方形图像连接起来,并将向量转换为 diag 矩阵。它适用于以下 sn-p:

def diagonalize(vector):
  diagonalized = tf.matrix_diag(vector) # make diagonal matrix from vector
  out_singlechan = tf.expand_dims(diagonalized, -1) # append 1 channel to get compatible to the multichannel image dim
  return out_singlechan

lstm_out = Lambda(diagonalize, output_shape=(self.img_shape[0],self.img_shape[1],1))(lstm_out)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 2019-04-25
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2019-01-01
    • 2020-08-26
    相关资源
    最近更新 更多