卷积神经网络入门:CNN 是视觉的基石
这是什么:卷积神经网络(CNN) = 视觉专属的解法:不把图片拍扁,而是拿着小块"手电筒"在图上扫着找特征。
为什么用:上一章确认了:图片就是数字表格。那能不能把这些数字拍扁成一长串,直接塞给 机器学习 里学的全连接网络?能,但很糟——参数爆炸,猫挪个位置模型立刻懵掉。
如何用:本章先手算一遍 3×3 卷积,看清卷积核(kernel)和特征图是怎么来的。
先看笨办法的困境
一张 224×224 的彩色图拍扁后有约 15 万个数。若第一层有 1000 个神经元,光第一层就要 1.5 亿个参数——又慢又容易过拟合。更致命的是:图片里猫稍微挪个位置,拍扁后所有数字的位置全变了,模型立刻懵掉。
CNN 的核心思路:不拍扁,拿着小窗在图上扫。
卷积核:手电筒扫图找特征
卷积核(kernel) 是一块很小的数字方阵(常见 3×3,一共 9 个数),像一只手电筒:从图片左上角出发,一小块一小块扫到右下角。每停一处,把盖住的 9 个像素和手里的 9 个数对应相乘再求和,在输出上记一个数。扫完整张图,得到的表格叫特征图(feature map)——它标记了"这个特征"在原图各处出现的强度。
手电筒里的 9 个数就是要学的参数:训练中模型不断调整它们,让某只手电筒专对"斜线"亮,另一只专对"眼睛轮廓"亮。好处有两个:
| 对比项 | 拍扁全连接 | 卷积 |
|---|---|---|
| 第一层参数量 | 约 1.5 亿 | 一个核仅 9 个,可叠多个 |
| 猫挪了位置 | 数字全变,失效 | 同一只手电筒照样扫出来 |
| 学到的东西 | 死记位置 | 认"特征本身"(平移不变) |
亲手算一遍 3×3 卷积
输入 5×5 图像,用 3×3 卷积核,不补边,步长 1:
输入 5×5: 卷积核 3×3: 输出 3×3:
1 2 3 4 5 1 0 1 7 8 7
2 3 4 5 6 0 1 0 8 10 8
3 4 5 6 7 1 0 1 7 8 7
4 5 6 7 8
5 6 7 8 9
左上角输出 = 1×1+2×0+3×1+2×1+3×1+4×0+3×1+4×0+5×1 = 1+0+3+2+3+0+3+0+5 = 17(示意,实际按对应位置相乘求和)。
输出尺寸公式:输出尺寸 = 输入尺寸 - 核尺寸 + 1,所以 5 - 3 + 1 = 3,得到 3×3 的特征图。
池化:只留重点的缩略图
扫完一圈,特征图和原图一样大,数据量没少。池化(pooling) 负责做"缩略图":最常用的最大池化把 2×2 的格子压成 1 格,只保留其中最大的数——"这附近有没有该特征"留下了,具体在哪个像素不重要。手算一遍:
输入 4×4: 按 2×2 分块,每块取最大值: 输出 2×2:
1 3 2 0 max(1,3,5,2)=3 3 4
5 2 1 4 max(2,0,1,4)=4 6 8
6 1 0 8 max(6,1,2,0)=6
2 0 6 8 max(0,8,6,8)=8
尺寸砍到四分之一,关键信息还在。
层层递进:从边缘到物体
单层卷积只认得出简单图案,CNN 的厉害之处是堆很多层,一层层往上抽象:
| 层 | 学到什么 | 类比 |
|---|---|---|
| 浅层卷积 | 边缘、颜色块、纹理 | 认出"线条" |
| 中层卷积 | 眼睛、轮子、门窗等局部形状 | 把线条拼成"零件" |
| 深层卷积 | 脸、猫、车等整体概念 | 把零件装成"物体" |
| 最后全连接 | 汇总所有证据下结论 | 宣布"这是一只猫" |
注意:底层手电筒是通用的(任何图片都有边缘),越往上越专属于具体任务——这正是下一章"预训练模型"能成立的根本原因。
记忆口诀:卷积扫图找特征,池化缩图留重点;层层堆叠,从线到零件再到猫。
❓ 常见问题
Q1:卷积核一定是 3×3 吗?
不是,常见 3×3,也有 5×5、7×7、1×1。3×3 是性价比最高的选择:感受野足够,参数量又少。深层网络常堆很多个 3×3,代替一个大核。
Q2:池化一定要用吗?
不一定。现代 CNN 有时用步长卷积(stride>1)代替池化来下采样,或者干脆不池化,靠全局平均池化(GAP)在最后降维。入门阶段先理解最大池化即可。
Q3:为什么 CNN 比拍扁的全连接网络更适合看图?
两个核心原因:参数共享(同一个卷积核在图上各处复用,参数量少)和局部连接(只看邻域,符合图像局部相关性的特点)。
⚠️ 新手翻车现场
翻车一:算错输出尺寸
输入 5×5,卷积核 3×3,不补边,步长 1
错误:认为输出还是 5×5
正确:输出 = 5 - 3 + 1 = 3,是 3×3
修正:记住公式 输出 = 输入 - 核 + 1(不补边、步长 1 时)。
翻车二:池化后以为尺寸不变
最大池化 2×2 会把每块 4 个数压成 1 个,尺寸减半。输入 4×4 → 输出 2×2,不是 4×4。
🎯 什么时候用 CNN
- 图像分类(猫/狗、病灶/正常、缺陷/良品)
- 物体检测(图里有什么,在哪里)
- 图像分割(哪些像素属于猫)
- 任何"图像输入"的深度学习任务
📝 本章小结
- 不拍扁图片,用小窗(卷积核)在图上扫,得到特征图
- 卷积核是可学习的参数,不同核识别不同特征(边缘、纹理、形状)
- 池化做缩略图,减小数据量、保留关键信息
- 层层堆叠:浅层认线条,中层认零件,深层认物体
- 记忆口诀:卷积扫图找特征,池化缩图留重点;层层堆叠,从线到零件再到猫。
动手改
- 数一数:5×5 的图用 3×3 卷积核扫一遍(不补边),输出特征图是几乘几?
- 把上面 4×4 输入的最后一行改成
2 8 6 0,重新手算最大池化的输出 - 用一句话向朋友解释:为什么 CNN 比拍扁的全连接网络更适合看图?
下一章:用预训练模型识别图像,站在巨人的肩膀上认出 1000 种物体 🐸