从 Keras 中的输出图层创建"unpooling"蒙版



我正在用TensorFlow后端在Keras中编写CNN。我正在尝试创建一个"不冷冻"掩码(或汇总索引(,如下所述:https://arxiv.org/pdf/1511.00561.pdf

我已经建立了一个没有这种未加油的面膜的CNN,而且效果很好。我以以下方式创建掩码(这只是较大网络的一部分,在每个cons/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)

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

是否有人有不同的解决方案来创建不加油的面罩或知道如何通过多个输入解决问题?

我会将所有操作放入图层中,这是模型所期望的(我认为函数conv_blockdeconv_block完全由层制成,否则,它们也应该进入Lambda层(。

您不需要该处理的X即可作为输入。您可以像以前那样将模型分开,然后再次合并,制作平行的分支。

我无法使用您的数据和您的尺寸进行测试,但是在一个简单的测试中,我在这里进行了有关串联的操作,它有效。(我在Theano进行了测试,因为我没有TensorFlow。我希望一切都可以...但是也许您应该在串联和更大的轴上试验不同的轴(

(
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)

这是我使用MNIST数据进行的简单测试:

inp1 = Input((28,28))
inp2 = Input((28,28))
in1 = Reshape((1,28,28))(inp1)
in2 = Reshape((1,28,28))(inp2)
c = Concatenate(axis =1)([in1,in2])
#here, the lambda expression sums two MNIST images
c = Lambda(lambda x: x[:,0]+x[:,1],output_shape=(28,28))(c)
m = Model([inp1,inp2],c)
res = m.predict([xTraining[:10],xTraining[10:20]])
print(res.shape)
#if you plot the res, you will see the images superposed, which was the expected result.

最新更新