在Keras

时间:2017-04-27 12:28:06

标签: python tensorflow keras

我正在使用Tensorflow后端在Keras写CNN。我正在尝试创建一个“unpooling”掩码(或汇集索引),如下所述:https://arxiv.org/pdf/1511.00561.pdf

我已经构建了一个没有这个解开掩码的CNN,它运行正常。我按照以下方式创建掩码(这只是更大网络的一部分,每个conv / maxpooling块都有相同的想法):

img_input = Input(shape=(num_channels, img_h, img_w))
x = conv_block(img_input, kernel, 512)
orig = x #Save output x
x = MaxPooling2D()(x)

x = UpSampling2D()(x)

bool_mask = K.greater_equal(orig, x)
mask = K.cast(bool_mask, dtype='float32')

mask_input = Input(tensor=mask) # Makes the mask to a Keras tensor to use as input
x = keras.layers.multiply([mask_input, x])
x = deconv_block(x, kernel, 512, 512)

x = Reshape((n_labels, img_h * img_w))(x)
x = Permute((2, 1))(x)
main_output = Activation('softmax')(x)

model = Model(inputs=img_input, outputs=main_output)

由于我从其他图层创建“第二个输入”mask_input,我不希望将它作为模型输入。但如果我不这样做,我无法创建模型。如果我将最后一行更改为:

model = Model(inputs=[img_input, mask_input], outputs=main_output)

我现在可以创建模型,但是当我想要使用它时,我需要第二个输入,直到我创建它才会有。

有没有人有一个不同的解决方案来创建一个unpooling-mask或知道如何解决几个输入的问题?

1 个答案:

答案 0 :(得分:3)

我会将所有操作放在图层中,这是模型所期望的(我假设函数conv_blockdeconv_block完全由图层组成,否则,它们应该进入{{1} }层)。

您不需要将已处理的x作为输入。您可以像您一样拆分模型,然后再次合并,制作并行分支。

我无法测试您的数据和维度,但是在一个简单的测试中,我在这里运行了关于连接,它的工作原理。 (我在theano中测试过,因为我没有tensorflow。我希望一切都能正常工作......但是也许你应该在连接和Greater_equal上尝试不同的轴)

Lambda

以下是我使用MNIST数据运行的简单测试:

img_input = Input(shape=(num_channels, img_h, img_w))

x = conv_block(img_input, kernel, 512)

orig = x #Save output x
x = MaxPooling2D()(x)

x = UpSampling2D()(x)

#here we're going to reshape the data for a concatenation:
#xReshaped and origReshaped are now split branches
xReshaped = Reshape((1,channels_after_conv_block, h_after, w_after))(x)
origReshaped = Reshape((1,channels_after_conv_block, h_after, w_after))(orig)

#concatenation - here, you unite both branches again
    #normally you don't need to reshape or use the axis var, 
    #but here we want to keep track of what was x and what was orig.
together = Concatenate(axis=1)([origReshaped,xReshaped])

bool_mask = Lambda(lambda t: K.greater_equal(t[:,0], t[:,1]),
    output_shape=(channels_after_conv_block, h_after, w_after))(together)
mask = Lambda(lambda t: K.cast(t, dtype='float32'))(bool_mask)

x = Multiply()([mask, x])
x = deconv_block(x, kernel, 512, 512)

x = Reshape((n_labels, img_h * img_w))(x)
x = Permute((2, 1))(x)
main_output = Activation('softmax')(x)

model = Model(inputs=img_input, outputs=main_output)