我正在尝试在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)
答案 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)