CNN中卷积和池化操作后的特征图大小计算方法

  • 一、卷积操作
  • 二、池化操作
  • 三、实战
  • 3.1.卷积计算例1
  • 3.2.卷积计算例2
  • 3.3.池化操作例1



特别的:


当计算尺寸不被整除时,卷积向下取整,池化向上取整。(只在GoogLeNet中遇到过。)


一般的:


卷积池化均向下取整

一、卷积操作

假设:
设输入图像尺寸为WxW,卷积核尺寸为FxF,步幅为S,填充为P,经过该卷积层后输出的图像尺寸为NxN,计算公式为:
CNN 特征图 python cnn特征图尺寸计算_CNN 特征图 python
设输入图像尺寸为WxH,卷积核的尺寸为FxF,步幅为S,图像深度(通道数)为C,填充为P,则:
CNN 特征图 python cnn特征图尺寸计算_pytorch_02
CNN 特征图 python cnn特征图尺寸计算_深度学习_03
如果无填充,公式可以简化为“
WxW:
CNN 特征图 python cnn特征图尺寸计算_CNN 特征图 python_04
WxH:
CNN 特征图 python cnn特征图尺寸计算_深度学习_05
CNN 特征图 python cnn特征图尺寸计算_pytorch_06
也可使用以下公式计算:

CNN 特征图 python cnn特征图尺寸计算_CNN 特征图 python_07

二、池化操作

设输入图像尺寸为WxH,其中W:图像宽,H:图像高,卷积核的尺寸为FxF,S:步长,当计算池化操作时,参数量为0,且由于没有padding操作:

池化后输出图像大小:
WxW:
CNN 特征图 python cnn特征图尺寸计算_CNN 特征图 python_04
WxH:
CNN 特征图 python cnn特征图尺寸计算_深度学习_05
CNN 特征图 python cnn特征图尺寸计算_pytorch_06

三、实战

3.1.卷积计算例1

假设我们有如下一个3x3的input,Kernel大小为2x2,其中stride为1,padding为0,卷积后的大小和结果如output

CNN 特征图 python cnn特征图尺寸计算_CNN 特征图 python_11


现在我们来看卷积操作是如何得到这个结果的:

1.计算卷积后输出特征图的大小:

将W=2,F=2,P=0,S=1带入如下公式

CNN 特征图 python cnn特征图尺寸计算_cnn_12

由于N=2,故而我们的输出将会是一个2x2的矩阵。

2.计算矩阵的值。

在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。 在如上例子中,输出张量的四个元素由二维互相关运算得到,这个输出高度为 2 、宽度为 2 ,如下所示:

CNN 特征图 python cnn特征图尺寸计算_cnn_13

用代码实现的话,如下:

def corr2d(X, K):  #@save
    """计算二维互相关运算。"""
    h, w = K.shape
     
     #设置输出矩阵的大小
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1)) 

    #卷积核移动求值
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    return Y

3.2.卷积计算例2

如例1的3x3的input,Kernel大小为2x2,其中宽度方向stride为2,高度方向的stride为3,padding为1,卷积后的大小和结果如output。

CNN 特征图 python cnn特征图尺寸计算_卷积_14


现在我们来看卷积操作是如何得到这个结果的:

1.计算卷积后输出特征图的大小:

将W=3,F=2,P=1,S_W=2,S_H=3带入如下公式

CNN 特征图 python cnn特征图尺寸计算_pytorch_15

其中,我们向下取整得W=2,且H=2,故而我们的输出仍然将会是一个2x2的矩阵。

2.计算矩阵的值。

在二维互相关运算中,卷积窗口从输入张量的左上角开始,从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时,包含在该窗口中的部分张量与卷积核张量进行按元素相乘,得到的张量再求和得到一个单一的标量值,由此我们得出了这一位置的输出张量值。 在如上例子中,输出张量的四个元素由二维互相关运算得到,这个输出高度为 2 、宽度为 2 ,如下所示:

CNN 特征图 python cnn特征图尺寸计算_卷积_16

3.3.池化操作例1

与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为 池化窗口*)遍历的每个位置计算一个输出。 然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。 相反,池运算符是确定性的,我们通常计算池化窗口中所有元素的最大值或平均值。这些操作分别称为 *最大汇聚层 (maximum pooling)和 平均汇聚层 (average pooling)。

在这两种情况下,与互相关运算符一样,池化窗口从输入张量的左上角开始,从左到右、从上到下的在输入张量内滑动。在池化窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值,具体取决于是使用了最大汇聚层还是平均汇聚层。

我们只讲一下最大pooling操作,其操作是选取窗口中值最大的单元。

CNN 特征图 python cnn特征图尺寸计算_cnn_17


1.计算池化后输出特征图的大小:

将W=3,F=2,S=1,带入如下公式

CNN 特征图 python cnn特征图尺寸计算_深度学习_18

故而我们的输出将会是一个2x2的矩阵。

2.计算矩阵的值。

CNN 特征图 python cnn特征图尺寸计算_pytorch_19
参考:
图像卷积和池化操作后的特征图大小计算方法