第四章:卷积神经网络(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×528×28×6
S2平均池化2×214×14×6
C3卷积5×510×10×16
S4平均池化2×25×5×16
C5卷积5×51×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核心知识体系 卷积操作 滑动窗口计算 参数可学习 多核提取多特征 池化层 下采样降维 最大/平均池化 减少参数量 核心机制 感受野逐层增大 参数全局共享 平移不变性 经典CNN架构 LeNet-5(1998)→ AlexNet(2012) 从5层到8层,从手写数字到ImageNet 核心思想 局部连接 + 参数共享 + 层次化特征提取

我的建议:学CNN别死记硬背结构图。动手搭一遍,用PyTorch或TensorFlow跑个MNIST分类,比看十遍书都管用。我在教新人时,都是让他们先搭LeNet,再改成AlexNet,感受一下参数量的变化。

好了,这一章的内容就到这儿。卷积、池化、感受野这些概念,你理解了吗?说实话,刚开始觉得抽象很正常,多画几张图,多跑几个实验,慢慢就通了。

可可精品资料库