🐸 青蛙编程网
首页 / AI / 图像识别 / 2. 卷积神经网络入门

卷积神经网络入门: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

  • 图像分类(猫/狗、病灶/正常、缺陷/良品)
  • 物体检测(图里有什么,在哪里)
  • 图像分割(哪些像素属于猫)
  • 任何"图像输入"的深度学习任务

📝 本章小结

  • 不拍扁图片,用小窗(卷积核)在图上扫,得到特征图
  • 卷积核是可学习的参数,不同核识别不同特征(边缘、纹理、形状)
  • 池化做缩略图,减小数据量、保留关键信息
  • 层层堆叠:浅层认线条,中层认零件,深层认物体
  • 记忆口诀:卷积扫图找特征,池化缩图留重点;层层堆叠,从线到零件再到猫。

动手改

  1. 数一数:5×5 的图用 3×3 卷积核扫一遍(不补边),输出特征图是几乘几?
  2. 把上面 4×4 输入的最后一行改成 2 8 6 0,重新手算最大池化的输出
  3. 用一句话向朋友解释:为什么 CNN 比拍扁的全连接网络更适合看图?

下一章:用预训练模型识别图像,站在巨人的肩膀上认出 1000 种物体 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。