卷积层
把卷积运算包装为可训练的神经网络层,理解多通道、多卷积核与权重张量形状。
让卷积核"长出"可训练参数
上一节我们看到,卷积运算本身固定不变,但 卷积核里的数字决定它能识别什么特征 —— 而这些数字此前都是人手工设计的。 这一节做一件最自然的事: 把卷积核里的数字也当作神经网络的可训练参数 , 让网络针对任务自己学,而不再依赖专家经验。 这就是 卷积层 (convolutional layer)。
卷积层 = 可学习卷积核 + 偏置 + 激活函数
一个卷积层在数学上做这样三件事:
其中:
- 是 可学习的卷积核 (也叫 weight),尺寸 ;
- 是一个标量 偏置 (bias),加到 的每个元素上;
- 是 激活函数 (如 ReLU),与 MLP 章节同一回事,本节默认使用 ReLU。
与全连接层做对比:
每个输出神经元 与所有输入像素都相连 , 参数量 = 输入像素数 × 输出神经元数 ,会随图像尺寸而增长。
每个参数只服务于一个固定的输入位置—— 同一种特征出现在图中不同位置时,需要由完全不同的参数各学一遍。
每个输出像素 只与输入的一个局部窗口相连 , 单个卷积核的参数量 = , 与图像尺寸无关。
而且同一组参数在所有输入位置上滑动复用(参数共享)—— 同一种特征出现在图中不同位置时,只需学一次便能识别。
注: 这里 FC 与 Conv 都只统计"单个输出通道"的参数—— FC 侧是 一个输出神经元 所连接的全部参数,Conv 侧是 一个卷积核 的参数。 后面我们会把"多个输出通道"也并进来,得到卷积层完整参数量 。
参数共享是卷积层的"魔法所在":上一节讨论的 MLP 的两大问题—— 参数爆炸 和 位置敏感 —— 都因此一并缓解。
多通道:卷积核也是有"厚度"的
在《认识图像数据》一节我们提到,彩色图像有 RGB 三个通道 。 但上一节《卷积运算》中演示的卷积只对一张单通道矩阵生效—— 遇到多通道输入怎么办?
多通道卷积分两步进行:
- 每个通道 独立做 2D 卷积 ——得到 张中间特征图,每张尺寸相同。
- 把这 张中间特征图 按对应位置直接相加 ,合并为 一张单通道 输出特征图。
- 如果该输出通道带偏置,再在这张输出特征图的 每一个像素上 统一加上同一个标量 ( 每个输出通道一个 ,因此偏置是长度为 的向量,而不是与特征图同形状的矩阵)。
手算示例:建议你拿纸笔,用一个 的小输入 加一个 的小卷积核, 亲自走一遍"按通道卷 → 通道相加"的流程。这是本节最容易混淆的一步。
多个卷积核 → 多张输出特征图
一个卷积核只能识别一种特征。要识别多种特征(垂直边、水平边、斜线……), 就需要 多个不同的卷积核 同时作用在输入上—— 每个核独立完成上述"分通道卷 → 通道相加"流程,分别产生一张输出特征图。 个卷积核会产生 张输出特征图。
因此,一个卷积层的 权重张量形状 是:
可以理解为: 把 个三维卷积核堆叠起来多出一维 , 最外层维度表示"第几个卷积核"。 对应的偏置则是长度为 的向量,每个输出通道一个标量偏置。
鼠标悬浮某个卷积核或其结果矩阵,两侧会同时高亮——直观体现 「第 i 个卷积核 ↦ 输出的第 i 个通道」 的一一对应关系。 注意:输入侧通道数 = 3(固定,由图像决定),输出侧通道数 = (由卷积核数量决定)—— 二者是两个独立维度,不要混淆。
PyTorch 中的 nn.Conv2d
在 PyTorch 里,一个卷积层就是 nn.Conv2d 。 最常用的几个参数: in_channels 、 out_channels 、 kernel_size 来自本节讨论的 通道数 与 核尺寸 , stride 、 padding 则是上一节《卷积运算》介绍过的 步长 与 填充 ——这里只是把它们组合到同一个层里使用。
回应上一节的术语问题
上一节末尾我们提到,本节做的运算严格意义上叫 互相关 , 数学定义的卷积要求先把核翻转再滑动。 现在卷积核已经变成 可学习参数 —— 即便先翻转一次再学习,网络依然能学到等价的功能(只是学到的是"翻转后的核")。 所以是否翻转 不影响最终表达能力 , 业界统一把这种运算称为"卷积",PyTorch / TensorFlow 都遵循这一惯例。 这个差别只在术语溯源时有意义,对实际使用没有影响。