从零开始学习大模型(十二):CNN 如何通过卷积提取图像特征?
图像的相邻像素通常具有空间关联。若直接展平成向量并连接到大规模全连接层,参数数量可能很高,也没有明确利用局部邻接结构。卷积神经网络(CNN)通过局部连接与权重共享引入适合图像的结构偏好。
这种偏好并不保证适用于所有数据,但能帮助模型在不同空间位置复用相同的特征检测规则。
1. 卷积核在局部窗口计算什么
一个二维核覆盖输入的小区域,将对应位置相乘求和,再移动到下一个位置。深度学习中常称为“卷积”的操作,通常实际采用不翻转核的互相关;本文按这一常见约定计算。
输入与核为:
输入:1 2 3 核:1 0
4 5 6 0 -1
7 8 9
步幅为 1、无填充时,左上位置结果为 1×1 + 2×0 + 4×0 + 5×(−1) = −4。其他三个位置也为 −4,输出为一个 2 × 2 矩阵。

图 1:同一卷积核用于不同位置。图示不意味着训练得到的每个核都能被解释为固定的人类概念。
2. 如何计算输出大小
对单个空间轴,输出长度为:
out = floor((in + 2p − d(k − 1) − 1) / s + 1)
其中 k 为核大小、p 为对称填充、s 为步幅、d 为膨胀率。常见 d=1 时可简化为 floor((in + 2p − k)/s + 1)。
| 设置 | 本例取值 | 影响 |
|---|---|---|
| 输入边长 | 3 | 局部窗口的移动范围 |
| 核边长 | 2 | 每次聚合的局部范围 |
| 步幅 | 1 | 控制窗口间距 |
| 填充 | 0 | 不额外扩展边界 |
| 输出边长 | 2 | 由形状公式计算 |
“same”填充的实际规则取决于框架和步幅,不能不加条件地理解成任何配置都保持输入大小。
3. 多通道与参数共享
彩色图像通常有多个输入通道。普通卷积的每个输出通道会对所有输入通道进行局部计算并求和,使用独立的一组核参数,再加一个偏置。
不使用分组卷积时,参数数量为 C_out × (C_in × k_h × k_w + 1),其中最后的 1 对应可选偏置。
例如输入 3 通道、输出 8 通道、核为 3 × 3,带偏置时共有 8×(3×3×3+1)=224 个参数。参数数量不直接随图像宽高增加,因为不同位置共享同一组权重。
| 概念 | 含义 | 常见误解 |
|---|---|---|
| 通道 | 同一空间位置的不同特征分量 | 不限于原始 RGB |
| 特征图 | 卷积输出的空间响应 | 不自动等于物体分割图 |
| 池化 | 聚合局部响应、可能降低分辨率 | 最大池化通常没有可训练参数 |
| 感受野 | 输出可能受影响的输入区域 | 理论范围不等于实际影响均匀 |
4. 用代码核对局部计算
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
k = [[1, 0], [0, -1]]
output = [
[sum(x[i + a][j + b] * k[a][b]
for a in range(2) for b in range(2))
for j in range(2)]
for i in range(2)
]
assert output == [[-4, -4], [-4, -4]]
assert 8 * (3 * 3 * 3 + 1) == 224
print(output)
这是单通道、无偏置、无填充的最小互相关示例,没有训练过程。实际框架通常按批次计算,并可能采用不同的张量通道布局。
5. 堆叠卷积与池化会带来什么
多层局部操作能够扩大理论感受野,组合更复杂的特征。步幅或池化可降低空间分辨率、减少后续计算,但同时可能丢失细节,密集预测任务尤其需要权衡。
卷积在适当边界条件下具有平移等变性:输入平移会引起输出相应平移。这不同于严格的平移不变性。填充、下采样与有限图像边界也会影响这一性质。
训练仍然需要合适的数据划分和损失。数据增强应尽量保持标签语义,例如在方向敏感的识别任务中,任意翻转未必合理。
6. 小结
CNN 的关键是局部连接、权重共享与多层特征组合。先核对输入输出形状和参数量,可以避免把通道数、空间分辨率与模型容量混为一谈。
下一篇比较经典 CNN 与残差网络,并说明迁移学习如何复用已有表示。卷积定义与实现可参考 PyTorch:Conv2d。