1. 概述

本文将介绍如何计算卷积层的输出尺寸。我们会先简要回顾卷积操作和卷积层的基本概念,然后推导出计算输出尺寸的通用公式,并通过一个具体示例加深理解。

2. 卷积操作

卷积是一种数学运算,用于将两个函数(图像和卷积核)结合,生成一个输出函数。在计算机视觉中,图像表示为一个二维矩阵 I,卷积核是一个较小的矩阵 K

卷积过程如下:

  • 卷积核在图像上滑动
  • 每次滑动后,与图像对应区域做逐元素乘法
  • 然后将结果相加,得到输出矩阵的一个元素

举个例子:我们有一个 5×5 的图像 I 和一个 3×3 的卷积核 K。

下图展示了卷积过程中图像中被选中的像素(加粗部分):

1 example 2

以中心像素为例,卷积计算如下:

1 convolution.drawio 3

逐元素相乘并求和:

$$ 2×1 + 4×3 + 6×2 + 24×2 + 5×9 + 13×3 + 1×7 + 6×1 + 8×6 = 129 $$

因此,输出激活图的中心像素值为 129。

3. 卷积层

卷积层是卷积神经网络(CNN)的核心组件。每层包含多个可学习的卷积核(filter),在前向传播时,每个卷积核都会与输入进行卷积操作,生成对应的激活图(activation map)。

卷积核在训练过程中会学习图像中特定特征的响应。例如,下图展示的是一个用于边缘检测的经典卷积核:Prewitt 算子。

1 convolution

4. 超参数

要计算卷积层输出尺寸,必须了解两个关键超参数:

4.1 步长(Stride)

Stride(S) 表示卷积核每次滑动的步长。如果 S=1,卷积核每次移动一个像素;如果 S=2,则移动两个像素,以此类推。

当需要对图像进行下采样时,通常会设置 S > 1。

下图展示了当 S=2 时的卷积过程:

1 stride

4.2 填充(Padding)

图像边缘的像素在卷积中参与的次数远少于中心像素。例如,使用 3×3 的卷积核处理 5×5 的图像时,角点像素只参与一次,而中心像素参与 9 次。

为了解决边缘信息丢失的问题,我们通常在图像边缘添加零填充(zero-padding)

添加 P 层填充后,图像尺寸从 W×H 变为 (W+2P)×(H+2P)。

下图展示了 P=2 时的填充效果:

1 padding

通过填充,我们可以增强边缘像素在训练中的作用。

5. 输出尺寸公式

假设输入图像尺寸为 W_in × H_in,卷积核尺寸为 K × K,步长为 S,填充为 P。

卷积层输出的激活图尺寸为:

$$ W_{out} = \frac{W_{in} - K + 2P}{S} + 1 \ H_{out} = \frac{H_{in} - K + 2P}{S} + 1 $$

⚠️ 如果结果不是整数,说明参数设置不合理,需要调整。

两种常见情况:

  • 无填充(P=0): $$ \left( \frac{W_{in} - K}{S} + 1, \frac{H_{in} - K}{S} + 1 \right) $$
  • 保持输入输出尺寸一致(same padding): $$ W_{out} = W_{in}, \quad H_{out} = H_{in} $$ 当 S=1 时,P 应设为: $$ P = \frac{K - 1}{2} $$

6. 示例

我们以一个具体示例说明公式应用。

输入图像尺寸:125 × 49
卷积核尺寸:5 × 5
填充:P=2
步长:S=2

代入公式得:

$$ W_{out} = \frac{125 - 5 + 2×2}{2} + 1 = \frac{124}{2} + 1 = 62 \ H_{out} = \frac{49 - 5 + 2×2}{2} + 1 = \frac{48}{2} + 1 = 24 $$

✅ 输出激活图尺寸为:62 × 24

7. 小结

本文介绍了:

  • 卷积操作的基本流程
  • 卷积层的作用
  • 关键超参数(Stride、Padding)
  • 输出尺寸计算公式
  • 一个具体示例

掌握这些内容有助于在构建 CNN 网络时更好地控制特征图尺寸,避免维度不匹配导致的错误。


原始标题:Calculate the Output Size of a Convolutional Layer