【问题标题】:How does SAME padding work in convolution neural networks, when stride is greater than 1?当步幅大于 1 时,SAME 填充如何在卷积神经网络中工作?
【发布时间】:2020-07-12 10:02:29
【问题描述】:

我正在尝试在 python 中实现二维卷积。 我有一组尺寸的输入图像(m、64、64、3),其中 m 是图像的数量。 我想对高度和宽度使用过滤器大小 f=8 和 stride=8,并使用相同的填充,以便保留输入宽度和高度 (64, 64)。

使用公式 [n' = floor((n-f+2*pad)/stride + 1)] 并将 n'=64, n=64, stride=8, f =8,我得到 pad=224,它太大了。

比如我取m的时候,图片数量为1080,估计是内存出错,系统崩溃了。

但是当我使用 Keras 库和以下代码时,它运行良好。

X = keras.layers.Conv2D(filters=32, kernel_size=(8, 8), strides=(8, 8), padding='same')(X)

这是我在 python 中的 Conv2D 实现:

import numpy as np

# A.shape = (1080, 64, 64, 3)
# W.shape = (8, 8, 3, 32)
# b.shape = (32,)

def conv_fwd(A, W, b, pad=0, stride=1):
    pad_A = np.pad(A, ((0, 0), (pad, pad), (pad, pad), (0, 0)), mode='constant')
    (m, w, h, nc) = A.shape
    (fw, fh, ncc, ncn) = W.shape

    if nc != ncc:
        raise Exception('Number of channels in kernel and input do not match')

    wn = int((w-fw+2*pad)/stride + 1)
    hn = int((h-fh+2*pad)/stride + 1)
    A_n = np.zeros((m, wn, hn, ncn))
    W = W.reshape(fw*fh*ncc, ncn)

    for i in range(wn):
        for j in range(hn):
            A_n[:, i, j] = pad_A[:, i*stride:i*stride+fw, j*stride:j*stride+fh].reshape(m, fw*fh*nc).dot(W) + b
    return A_n

所以我假设在 keras 中计算填充有不同的过程。我试图寻找源代码,但找不到它。它是如何工作的?

【问题讨论】:

    标签: python tensorflow keras conv-neural-network zero-padding


    【解决方案1】:

    在公式中,n' = floor((n-f+2*pad)/stride + 1 你取了n' == n == 64

    这是不正确的。 n' is equal to n 仅当 Stride is equal to 1 的值但在这里,Stride 大于 1 (8)。

    这就是Padding 价值非常高的原因。

    现在,由于您的目标是找到 Padding 的值,我有一个解决方案/解决方法(可能不是很优化)。

    最初,使用Padding = Same构建模型,如下所示:

    import tensorflow as tf
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Conv2D(filters = 64, strides = (2,2), kernel_size = (3,3), 
    input_shape = (64,64,3), padding = 'same'))
    print(model.summary())
    

    Padding = Same 的模型总结如下:

    Model: "sequential_12"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d_25 (Conv2D)           (None, 32, 32, 64)        1792      
    =================================================================
    Total params: 1,792
    Trainable params: 1,792
    Non-trainable params: 0
    

    如果我们观察ImageShape,即使Padding == Same,它也会从(64,64) 减少到(32,32)

    现在,使用Padding = Valid 构建模型,如下所示:

    import tensorflow as tf
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Conv2D(filters = 64, strides = (2,2), kernel_size = (3,3), 
    input_shape = (64,64,3), padding = 'valid'))
    print(model.summary())
    

    上述模型的总结如下:

    Model: "sequential_11"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d_24 (Conv2D)           (None, 31, 31, 64)        1792      
    =================================================================
    Total params: 1,792
    Trainable params: 1,792
    Non-trainable params: 0
    

    如果我们观察,Convolutional LayerShape(None,31,31,64)

    现在,Padding可以通过公式得到,

    Height with SAME Padding - Height with VALID Padding
    

    Width with SAME Padding - Width with VALID Padding
    

    32 - 31 = 1

    Padding 在你的情况下,Input Shape = (64, 64,3), Filter Size = 8, Strides = 81 即,

    Input 用 1 行 1 列零填充

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多