我正在尝试编写一个鉴别器来评估图像的局部区域。因此,我从输入中生成32×32的非重叠局部区域,然后在新的轴上将它们连接起来。
我使用时间分布层的原因是,最终鉴别器应该对整个图像进行真假评估。因此,我尝试对每个局部区域单独进行前向传递,然后通过lambda层对所有局部区域的鉴别器输出进行平均:
def my_average(x): x = K.mean(x, axis=1) return xdef 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'
回答:
你需要将裁剪操作放在一个函数中,然后在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)