在keras中解卷积层

时间:2018-05-29 10:20:10

标签: python numpy keras

我正在尝试在keras python中设计CNN架构。我想转换(对于我的解码器)从去卷积层5(512个过滤器大小为4x4的过滤器)到下一层(使用deconvolution2D)并转到具有过滤器大小7x7的去卷积层6 128过滤器。我该如何进行反卷积?我尝试的是以下内容:

d6 = Deconvolution2D(128, 5, 5, subsample=(2,2),  activation='relu',init='uniform', output_shape=(None, 128, 7, 7), border_mode='same')(d6)

但是,此操作会导致128个大小为8x8的过滤器。我怎样才能7x7

我还试图通过选择过滤器大小(8x8)和相同数量的过滤器,使用简单的卷积从(7x7)转到(3x3)

d6 = Convolution2D(128, 3, 3,   activation='relu', border_mode='same')(d6)

但是,最终的结果是(128,8,8)而不是(128, 7, 7)

1 个答案:

答案 0 :(得分:2)

在第一种情况下,问题是你使用subsample的偶数(当前是“步幅”)和图像大小的奇数。

使用subsample=(2,2),您的图像大小必须是图像的一半,因此反向卷积必然会使图像的大小加倍。除非您开始使用8x8或删除subsample,否则您无法在此处执行任何操作。 (如果你开始使用内核大小,边框模式和子样本的组合来玩太多,你可能会达到7 x 7,但除了令人困惑的数学之外,它还可能会创建一个不平衡的图像,更多的是左边或更多的右边例如,当图像很小时,这可能会影响结果。

在第二种情况下,结果是相同的,因为您使用的是border_mode='same'。但如果你删除它,你的尺寸将从8x8到6x6。您需要一个(2,2)的过滤器大小才能丢失一个像素。

我建议你搬到Keras 2.

示例:

#but I suggest you remove the strides
d6 = Conv2DTranspose(128, (5,5), strides = (2,2), activation = 'relu', padding='same', kernel_initializer='uniform')

#'valid' is the default value, but I wrote it so you see the new name of "border_mode"
d6 = Conv2D(128,(3,3), activation='relu', padding='valid')(d6)