什么是 CNN?

卷积神经网络(Convolutional Neural Network, CNN) 是专门「看图」的神经网络——它能自动从图片中发现边缘、纹理、形状等特征。

生活类比:用放大镜找线索

想象你是一个侦探,拿着放大镜在一张大照片上寻找线索。你不会一眼看完整张照片,而是用放大镜一小块一小块地扫描:先找到边缘线条,再识别形状轮廓,最后判断「这是一只猫」。CNN 就是这样工作的——卷积核就是那个放大镜,从局部特征到全局理解,逐层提取越来越复杂的模式。

逐步理解:

  • 第一步:卷积层——小窗口(卷积核)在图像上滑动,每到一个位置就计算「这里是否有某种特征」(如竖线、横线)
  • 第二步:多个卷积核——不同的卷积核寻找不同的特征,一个找横线、一个找竖线、一个找曲线……
  • 第三步:池化层——把特征图「缩小」,只保留最重要的信息(像把照片缩略图化,主体还在但细节减少)
  • 第四步:全连接层——把所有发现的特征汇总,做最终判断「这张图是猫/狗/车」

🎯 适用场景

  • 图像分类: 识别图片中的物体类别(如猫、狗、汽车)
  • 目标检测: 定位并识别图像中的多个物体
  • 医学影像分析: CT、MRI 图像中的病灶检测
  • 自动驾驶: 道路场景理解、行人检测
  • 人脸识别: 身份验证、表情分析

💡 经典应用: ImageNet 图像分类竞赛推动了 CNN 的快速发展,ResNet、VGG 等经典网络均由此诞生

📜 历史渊源

问题背景:1960年代,Hubel 和 Wiesel 发现猫的视觉皮层中,不同神经元只对视野中特定区域的特定方向做出响应——这就是"感受野"。全连接网络处理图像时,把每个像素当作独立特征,完全忽略了空间结构,参数量也爆炸式增长。

关键突破:1998年,Yann LeCun 受感受野启发,提出了 LeNet-5:用小的卷积核在图像上滑动,每个神经元只"看"局部区域,通过权值共享大幅减少参数。LeNet-5 成功用于美国邮政系统的手写邮编识别。但此后十多年,CNN 因计算力不足而沉寂。直到2012年,Krizhevsky 用 GPU 训练的 AlexNet 在 ImageNet 上将错误率从26%降到16%,震惊了整个计算机视觉界。

深远影响:AlexNet 的成功引爆了深度学习革命——VGG、GoogLeNet、ResNet 接踵而至,CNN 在图像分类、目标检测、语义分割等任务上全面超越传统方法。"卷积+池化"的局部特征提取思想至今仍是视觉模型的核心。

趣闻:LeCun 在1990年代就证明了 CNN 的有效性,但学术界不买账——NIPS 审稿人甚至建议他"别再做神经网络了"。LeCun 后来说:"如果你相信一个想法,就坚持下去,即使所有人都说你错了。"他与 Hinton、Bengio 一起获得了2018年图灵奖。

⚠️ 局限性

  • 数据需求大: 需要大量标注数据才能达到良好性能
  • 对变换敏感: 对旋转、缩放、翻转等变换不够鲁棒
  • 计算资源需求高: 训练深层网络需要大量 GPU 资源
  • 缺乏空间推理: 难以理解物体之间的空间关系

🏢 工业界地位

核心基础技术

CNN 是计算机视觉领域的基石,几乎所有视觉任务都在使用。从手机相机的人脸识别到自动驾驶汽车的环境感知,CNN 无处不在。

主要应用公司:Google (图像搜索)、Meta (人脸识别)、特斯拉 (自动驾驶)、医疗影像公司等。

交互式可视化

点击网格单元格模拟卷积操作,观察特征图如何生成

0
试一试:
  • 点击「单步执行」,观察卷积核如何在输入图像上逐格滑动,每一步计算一个输出值
  • 切换到「边缘检测」图案,观察卷积核如何找到边缘——特征图中亮的地方就是检测到边缘的位置
  • 改变「卷积核大小」为 5x5,观察特征图变小了——更大的卷积核看到更大的区域

输入图像 (5x5)

卷积核

输出特征图

计算说明:

卷积 = 输入区域与卷积核的逐元素相乘,然后求和

点击"单步执行"开始演示

数学原理

直觉引入:人眼识别物体时不会逐像素扫描,而是先看局部特征(边缘、纹理),再组合成整体。CNN 模仿这个过程:用小窗口(卷积核)在图像上滑动,提取局部特征。

卷积运算:

$$Y[i,j] = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} X[i+m, j+n] \cdot K[m,n] + b$$

符号解释:

  • $X$:输入图像(或上一层的特征图)
  • $K$:卷积核($M \times N$ 的可学习权重矩阵)
  • $Y[i,j]$:输出特征图在位置 $(i,j)$ 的值
  • $b$:偏置项
3×3 边缘检测实例:

输入(5×5):   卷积核(3×3):
0 0 0 0 0    -1 -1 -1
0 1 1 1 0     0  0  0
0 1 1 1 0     1  1  1
0 1 1 1 0
0 0 0 0 0

左上角输出:$(-1)(0)+(-1)(0)+(-1)(0)+(0)(0)+(0)(1)+(0)(1)+(1)(0)+(1)(1)+(1)(1) = 2$
这个核检测的是水平边缘。

输出尺寸计算:

$$O = \frac{W - K + 2P}{S} + 1$$

$W$=输入宽度,$K$=核大小,$P$=填充(padding),$S$=步幅(stride)

池化层(下采样):取局部区域的最大值(Max Pooling)或平均值,减小特征图尺寸,增加平移不变性。