【问题标题】:Deconvolution layers in keraskeras 中的反卷积层
【发布时间】:2018-05-29 10:20:10
【问题描述】:

我正在尝试在 keras python 中设计一个 CNN 架构。我想(对于我的解码器)将反卷积层 5(滤波器大小为 4x4 的 512 个滤波器)转换到下一层(使用 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

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

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

但是,最后的结果还是一样的(128,8,8),而不是(128, 7, 7)

【问题讨论】:

    标签: python numpy keras


    【解决方案1】:

    在第一种情况下,问题在于您对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)
    

    【讨论】:

    • 我认为问题是使用 Convolution2D 而不是 Conv2D,当我更改它时它工作正常。即使您有 filter_size =(2, 2),Convolution2D 也不会做我想做的事。
    最近更新 更多