[英]Create an “unpooling” mask from output layers in Keras
I'm writing a CNN in Keras with Tensorflow backend. 我正在使用Tensorflow后端在Keras写CNN。 I'm trying to create an "unpooling" mask (or pooling indices's) like described here: https://arxiv.org/pdf/1511.00561.pdf
我正在尝试创建一个“unpooling”掩码(或汇集索引),如下所述: https ://arxiv.org/pdf/1511.00561.pdf
I've built a CNN without this unpooling mask and it works fine. 我已经建立了一个没有这个解开掩码的CNN,它工作正常。 I create the mask the following way (this is just a part of the bigger net, the same idea at every conv/maxpooling block):
我按照以下方式创建掩码(这只是更大网络的一部分,每个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)
Since I create the "second input" mask_input from other layers I don't want to have it as a model input. 由于我从其他图层创建“第二个输入”mask_input,我不想将它作为模型输入。 But if I don't I can't create the model.
但如果我不这样做,我无法创建模型。 If I change the last row to:
如果我将最后一行更改为:
model = Model(inputs=[img_input, mask_input], outputs=main_output)
I can now create the model but when I want to use it I need a second input which I don't have until I've created it. 我现在可以创建模型,但是当我想要使用它时,我需要第二个输入,直到我创建它才会有。
Does anyone have a different solution to create a unpooling-mask or know how to work around the problem with several inputs? 有没有人有一个不同的解决方案来创建一个unpooling-mask或知道如何解决几个输入的问题?
I would put all operations inside layers, which is what the model expects (I assumed the functions conv_block
and deconv_block
are entirely made of layers, otherwise, they should go into a Lambda
layer as well). 我会将所有操作放在图层中,这是模型所期望的(我假设函数
conv_block
和deconv_block
完全由图层组成,否则,它们也应该进入Lambda
图层)。
You don't need that processed x to be an input. 您不需要将已处理的x作为输入。 You can split your model as you did, and then merge it again, making parallel branches.
您可以像您一样拆分模型,然后再次合并,制作并行分支。
I couldn't test with your data and your dimensions, but on a simple test I ran here about the concatenation, it works. 我无法使用您的数据和维度进行测试,但是在一个简单的测试中,我在这里运行了关于连接的工作。 (I tested in theano, since I don't have tensorflow. I hope everything will work ok... but perhaps you should experiment different axes on concatenation and greater_equal)
(我在theano中测试过,因为我没有tensorflow。我希望一切都能正常工作......但也许你应该在连接和greater_equal上尝试不同的轴)
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)
Here is the simple test I ran with MNIST data: 这是我用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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.