在看 MLSys 相关的东西的时候,经常能看到准对卷积操作做的优化,但是我总是忘卷积操作具体是怎么做的,在这里记一下。

标准卷积计算过程

  1. 输入图片的维度:
    • 一张彩色图片通常有三个维度:高度 (H) x 宽度 (W) x 输入通道数 (C_in)。对于 RGB 图片,C_in 通常是 3。
  2. 单个卷积核的维度:
    • 一个卷积核(或称为滤波器)的完整形状是 核高 (K_H) x 核宽 (K_W) x 输入通道数 (C_in)
    • 例如,如果输入图片有 3 个通道(RGB),并且你使用 3×3 的卷积核,那么一个卷积核的实际形状是 3×3×3。它包含了对应每个输入通道的 3×3 切片。
  3. 卷积操作的内部过程:
    • 当一个卷积核在输入图片的某个局部区域滑动时,它会进行以下操作:
      • 逐通道相乘: 卷积核的每个切片会与输入图片对应通道的局部区域进行逐元素的乘法。
      • 求和: 将所有通道上(例如 RGB 三个通道)的逐元素乘法结果立即相加,生成一个单一的数值
    • 这个单一的数值就是输出特征图在当前滑动位置的一个像素值。
  4. 输出特征图的生成:
    • 卷积核会以一定的步长在输入图片上滑动。每滑动到一个新位置,就重复上述的“逐通道相乘并求和”操作,得到一个新的输出像素值。
    • 所有这些输出像素值组合起来,就形成了一个二维的输出特征图
  5. 多个卷积核与输出通道:
    • 如果一个卷积层需要生成多个输出通道 (Output Channels),那么它就需要对应数量的独立的卷积核
    • 有多少个输出通道,就对应有多少个独立的卷积核。
    • 每个独立的卷积核都会按照上述方式,生成一个二维的输出特征图。
    • 最后,这些独立的二维输出特征图会沿通道维度堆叠起来,形成最终的输出张量,其形状为 输出高 (H') x 输出宽 (W') x 输出通道数 (C_out)

核心总结

  • 一个卷积核处理所有输入通道,并产生一个输出通道
  • 如果需要多个输出通道,就需要相应数量的独立卷积核