如何在Keras / Theano中进行反卷积?

时间:2016-11-23 16:16:54

标签: python deep-learning theano keras keras-layer

我正在尝试在Keras中实现反卷积。我的模型定义如下:

model=Sequential()


model.add(Convolution2D(32, 3, 3, border_mode='same',
                        input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3,border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

我想对第一个卷积层convolution2d_1给出的输出执行反卷积或转置卷积。

假设我们在第一个卷积图层之后的特征贴图是X,其为(9, 32, 32, 32),其中9是我通过图层的尺寸32x32的图像的编号。通过Keras的get_weights()函数获得的第一层的权重矩阵。权重矩阵的维数为(32, 3, 3, 2)

我用于执行转置卷积的代码是

 conv_out = K.deconv2d(self.x, W, (9,3,32,32), dim_ordering = "th")
 deconv_func = K.function([self.x, K.learning_phase()], conv_out)
 X_deconv = deconv_func([X, 0 ])

但是得到错误:

 CorrMM shape inconsistency:
  bottom shape: 9 32 34 34
  weight shape: 3 32 3 3
  top shape: 9 32 32 32 (expected 9 3 32 32)

有谁能告诉我哪里出错了?

2 个答案:

答案 0 :(得分:2)

您可以轻松使用Deconvolution2D图层。

以下是您要实现的目标:

batch_sz = 1
output_shape = (batch_sz, ) + X_train.shape[1:]
conv_out = Deconvolution2D(3, 3, 3, output_shape, border_mode='same')(model.layers[0].output)

deconv_func = K.function([model.input, K.learning_phase()], [conv_out])

test_x = np.random.random(output_shape)
X_deconv = deconv_func([test_x, 0 ])

但最好是创建一个有助于培训和预测的功能模型。

batch_sz = 10
output_shape = (batch_sz, ) + X_train.shape[1:]
conv_out = Deconvolution2D(3, 3, 3, output_shape, border_mode='same')(model.layers[0].output)

model2 = Model(model.input, [model.output, conv_out])
model2.summary()
model2.compile(loss=['categorical_crossentropy', 'mse'], optimizer='adam')
model2.fit(X_train, [Y_train, X_train], batch_size=batch_sz)

答案 1 :(得分:0)

在Keras中, Conv2DTranspose 层在其他术语反卷积中执行转置卷积。它支持后端lib,即Theano& Keras。

Keras Documentation说:

  

<强> Conv2DTranspose

     

转置卷积层(有时称为解卷积)。

     

转换卷积的需要通常源于欲望   使用与法线相反方向的转换   卷积,即来自具有输出形状的东西   一些卷积到具有其输入形状的东西   保持与所述兼容的连接模式   卷积。