代码之家  ›  专栏  ›  技术社区  ›  konstantin

喀拉斯的反褶积层

  •  2
  • konstantin  · 技术社区  · 7 年前

    我正在尝试在Keraspython中设计CNN架构。我想(为我的解码器)将反褶积层5(512个过滤器,过滤器大小为4x4)转换为下一层(使用反褶积2d),并转到反褶积层6 128个过滤器,过滤器大小为 7x7 . 我该怎么做反褶积呢?我尝试的是:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Daniel Möller    7 年前

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

    subsample=(2,2) ,您将必须是图像大小的一半,因此反卷积将必然是图像大小的两倍。除非您开始使用8x8或删除 子样本 . (如果您开始对内核大小、边框模式和子样本的组合进行过多的处理,您可能会获得7 x 7,但除了是一个令人困惑的数学运算之外,它还可能创建一个不平衡的图像,例如更多的是向左或向右。当您的图像太小时,这可能会影响结果)

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


    我建议你搬到喀拉斯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)