第四章:卷积神经网络(CNN)核心
好,咱们进入正题。这一章讲的是CNN最核心的东西——卷积、池化、感受野,还有几个经典的网络结构。说实话,这部分内容我当年学的时候也觉得有点抽象,但后来在移动端部署模型时才发现,理解这些基础概念有多重要。
4.1 卷积操作原理
卷积操作,说白了就是用一个小的“窗口”在图像上滑动,每次计算窗口内像素的加权和。这个“窗口”我们叫它卷积核(kernel)或滤波器(filter)。
我刚开始接触时有个误区:以为卷积和图像处理里的滤波是一回事。其实本质一样,但CNN里的卷积核参数是学出来的,不是人工设计的。
举个例子,一个3×3的卷积核在5×5的输入上滑动:
输入图像(5×5):
[1, 1, 1, 0, 0]
[0, 1, 1, 1, 0]
[0, 0, 1, 1, 1]
[0, 0, 1, 1, 0]
[0, 1, 1, 0, 0]
卷积核(3×3):
[1, 0, 1]
[0, 1, 0]
[1, 0, 1]
输出特征图(3×3):
第一个位置计算:1*1 + 1*0 + 1*1 + 0*0 + 1*1 + 1*0 + 0*1 + 0*0 + 1*1 = 4
...
关键点:卷积核的每个位置都有一个权重,这些权重就是网络要学习的参数。一个卷积层通常有多个卷积核,每个核提取不同的特征。
嗯,这里要注意:卷积操作后输出的尺寸会变小。计算公式是:
输出尺寸 = (输入尺寸 - 卷积核尺寸 + 2×填充) / 步长 + 1
我在项目中遇到过一个问题:在移动端部署时,卷积核尺寸选大了,导致模型参数爆炸。后来我习惯用3×3的小卷积核堆叠,效果反而更好,参数还少。
4.2 池化层的作用
池化层,说白了就是“下采样”。它把特征图缩小,保留最重要的信息。
最常见的两种池化:
- 最大池化(Max Pooling):取窗口内的最大值。我一般用这个,因为它能保留最显著的特征。
- 平均池化(Average Pooling):取窗口内的平均值。适合需要平滑特征的场景。
举个例子,2×2的最大池化,步长为2:
输入特征图(4×4):
[1, 3, 2, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[13, 14, 15, 16]
输出(2×2):
[6, 8]
[14, 16]
我的经验:池化层有两个好处——减少参数量和防止过拟合。但别用太多,否则信息丢失严重。在移动端模型里,我通常只在前面几层用池化,后面用步长卷积代替。
4.3 感受野与参数共享
这两个概念是CNN的精髓。咱们一个一个说。
感受野:指的是特征图上某个点对应到原始图像上的区域大小。你想想看,浅层的卷积核只能看到局部纹理,深层的卷积核能看到更大的区域。
计算公式:RF_n = RF_{n-1} + (kernel_size - 1) × stride_{n-1}
我曾经在调试一个分类模型时,发现深层特征图的感受野太小,导致模型无法捕捉全局信息。后来加了几个空洞卷积层才解决。
参数共享:同一个卷积核在整个图像上滑动时,权重是共享的。这意味着无论图像多大,卷积层的参数量只跟卷积核大小和数量有关。
为什么重要?假设一张1000×1000的图像,全连接层需要10^12个参数,而卷积层只需要几百个。这就是CNN能处理大图像的原因。
4.4 经典CNN架构
咱们来看看两个里程碑式的网络。说实话,虽然现在有ResNet、MobileNet这些更先进的架构,但LeNet和AlexNet的思想至今仍在影响我们。
4.4.1 LeNet-5
1998年,Yann LeCun提出。用于手写数字识别。结构很简单:
| 层 | 类型 | 核大小 | 输出尺寸 |
|---|---|---|---|
| 输入 | 图像 | - | 32×32×1 |
| C1 | 卷积 | 5×5 | 28×28×6 |
| S2 | 平均池化 | 2×2 | 14×14×6 |
| C3 | 卷积 | 5×5 | 10×10×16 |
| S4 | 平均池化 | 2×2 | 5×5×16 |
| C5 | 卷积 | 5×5 | 1×1×120 |
| F6 | 全连接 | - | 84 |
| 输出 | 全连接 | - | 10 |
我记得第一次用LeNet跑MNIST时,准确率直接到99%以上。当时觉得这玩意儿太神奇了。但现在回头看,它其实很浅,只有5层。
4.4.2 AlexNet
2012年,Alex Krizhevsky提出。在ImageNet上大杀四方,把错误率从26%降到15%。
它的创新点:
- 用了ReLU激活函数,解决了梯度消失问题
- 用了Dropout,防止过拟合
- 用了数据增强,扩大训练集
- 在GPU上训练,用了两块GTX 580
结构上比LeNet深得多:5个卷积层 + 3个全连接层。参数量约6000万。
避坑指南:我曾经在移动端尝试部署AlexNet,结果模型太大,手机根本跑不动。后来才明白,移动端模型需要轻量化设计。AlexNet更适合做学术研究,不适合实际产品。
4.5 本章知识体系
下面这张图展示了本章的核心逻辑关系:
我的建议:学CNN别死记硬背结构图。动手搭一遍,用PyTorch或TensorFlow跑个MNIST分类,比看十遍书都管用。我在教新人时,都是让他们先搭LeNet,再改成AlexNet,感受一下参数量的变化。
好了,这一章的内容就到这儿。卷积、池化、感受野这些概念,你理解了吗?说实话,刚开始觉得抽象很正常,多画几张图,多跑几个实验,慢慢就通了。
可可精品资料库