深入理解卷积神经网络中的卷积计算和 Padding

卷积计算的数学模型

基本符号定义

设:

  • 输入特征图尺寸:( H_{in} )(高度)× ( W_{in} )(宽度)
  • 卷积核大小:( K \times K )
  • 步长:( S )
  • 填充:( P )
输出尺寸计算公式
  • 输出特征图的高度
    [
    H_{out} = \text{floor} \left( \frac{H_{in} + 2P - K}{S} \right) + 1
    ]
  • 输出特征图的宽度
    [
    W_{out} = \text{floor} \left( \frac{W_{in} + 2P - K}{S} \right) + 1
    ]

Same Padding 的数学推导

保持尺寸不变的条件

要使输出尺寸与输入尺寸相同,需要满足:
[
H_{out} = H_{in} \quad \text{且} \quad W_{out} = W_{in}
]

推导过程

将输出尺寸公式代入相等条件:
[
H_{in} = \text{floor} \left( \frac{H_{in} + 2P - K}{S} \right) + 1
]

对于步长 ( S = 1 ) 的情况,公式化简为:
[
H_{in} = H_{in} + 2P - K + 1
]
解得:
[
P = \frac{K - 1}{2}
]

示例推导
  1. 3 × 3 卷积核,步长为 1 的情况

    • ( K = 3, S = 1 )
    • 解得 ( P = \frac{3 - 1}{2} = 1 )
  2. 5 × 5 卷积核,步长为 1 的情况

    • ( K = 5, S = 1 )
    • 解得 ( P = \frac{5 - 1}{2} = 2 )
一般性公式

对于任意步长 ( S ) 和卷积核大小 ( K ),计算 Padding ( P ) 的公式为:

  • 单侧填充:
    [
    P = \frac{(K - 1)}{2}
    ]
    (仅适用于 ( K ) 为奇数的情况)

实际案例分析

  1. 示例 1:224 × 224 输入,3 × 3 卷积核

    • 输入尺寸:( H_{in} = 224 )
    • 卷积核大小:( K = 3 )
    • 步长:( S = 1 )
    • 计算 Padding:
      [
      P = \frac{3 - 1}{2} = 1
      ]
    • 验证输出尺寸:
      [
      H_{out} = \text{floor} \left( \frac{224 + 2(1) - 3}{1} \right) + 1 = 224
      ]
  2. 示例 2:112 × 112 输入,5 × 5 卷积核

    • 输入尺寸:( H_{in} = 112 )
    • 卷积核大小:( K = 5 )
    • 步长:( S = 1 )
    • 计算 Padding:
      [
      P = \frac{5 - 1}{2} = 2
      ]
    • 验证输出尺寸:
      [
      H_{out} = \text{floor} \left( \frac{112 + 2(2) - 5}{1} \right) + 1 = 112
      ]

关键 Insights

  1. Padding 的作用

    • Padding 不仅仅是为了填充边界,还可以保持特征图尺寸,避免信息丢失。
  2. Same Padding 的精确性

    • 对于奇数大小的卷积核,公式 ( P = \frac{K - 1}{2} ) 能直接计算单侧填充值。
    • 对于偶数大小的卷积核,框架可能采用不对称填充方式(如 TensorFlow 的 tf.pad 或 PyTorch 的 F.pad)。
  3. 步长的影响

    • 当 ( S > 1 ) 时,输出尺寸公式会发生变化,Padding 的计算需要重新推导。

结论

通过数学推导,我们可以精确计算保持特征图尺寸不变所需的 Padding 值。这种方法为卷积神经网络的设计提供了理论基础,使得我们能够精确控制特征提取过程中的空间信息。