4、CNN基础回顾:卷积层、池化层、全连接层的计算流程与参数量分析

好,咱们今天聊聊CNN里最核心的三个组件:卷积层、池化层、全连接层。说实话,很多同学一开始觉得CNN很玄乎,其实拆开来看,就是这三兄弟在干活。我当年刚入行时,也是先把这三层的计算流程和参数量搞得明明白白,后面做模型设计才不至于抓瞎。

4.1 卷积层:特征提取的主力军

卷积层是CNN的绝对核心。它的任务说白了就是:用一个小窗口(卷积核)在输入图像上滑动,每次做一次点积运算,提取局部特征。

4.1.1 计算流程

假设输入是一张单通道的灰度图,尺寸是 \( H \times W \)。我们用一个 \( K \times K \) 的卷积核去扫它。每次卷积核覆盖的区域,和核做逐元素相乘再求和,得到一个输出值。

嗯,这里要注意几个关键参数:

  • 卷积核大小(Kernel Size):常见的有3×3、5×5、7×7。我个人习惯用3×3,因为参数量小,堆叠多层还能获得更大的感受野。
  • 步长(Stride):每次滑动的像素数。步长为1时,输出尺寸几乎不变;步长为2时,尺寸直接减半。
  • 填充(Padding):在输入边缘补零,用来控制输出尺寸。我常用的是“same”填充,保证输出和输入尺寸一致。

输出特征图的尺寸计算公式是:

输出高度 = (输入高度 - 卷积核高度 + 2 × 填充) / 步长 + 1
输出宽度 = (输入宽度 - 卷积核宽度 + 2 × 填充) / 步长 + 1

举个例子:输入是32×32,用3×3卷积核,步长1,填充1,那么输出还是32×32。如果步长变成2,输出就变成16×16。

4.1.2 参数量分析

卷积层的参数量,主要来自卷积核和偏置。公式很简单:

参数量 = (卷积核高度 × 卷积核宽度 × 输入通道数 + 1) × 输出通道数

那个“+1”是偏置项。我见过不少新手把偏置忘了,结果算出来的参数量对不上。

举个例子:输入是3通道的RGB图像,输出64个通道,用3×3卷积核。那么参数量就是:

(3 × 3 × 3 + 1) × 64 = (27 + 1) × 64 = 1792

你看,才1792个参数。相比之下,全连接层动不动就几十万参数。这就是为什么卷积层这么受欢迎——参数量少,还能提取空间特征。

我的经验: 我在做轻量化模型时,经常用1×1卷积来调整通道数。它几乎没有空间信息,但能高效地改变通道维度,参数量只有 (输入通道数 + 1) × 输出通道数,非常划算。

4.2 池化层:降维与特征压缩

池化层的作用,说白了就是“浓缩精华”。它没有可学习的参数,只是对特征图做下采样。

4.2.1 计算流程

最常见的两种池化方式:

  • 最大池化(Max Pooling):取窗口内的最大值。我一般用它来保留最显著的特征,比如边缘、纹理。
  • 平均池化(Average Pooling):取窗口内的平均值。它更平滑,适合在网络的最后阶段使用。

池化层的计算和卷积类似,也是滑动窗口。但池化没有权重,只是做简单的统计操作。比如一个2×2的最大池化,步长为2,会把输入尺寸直接减半。

举个例子:输入是4×4的特征图,用2×2池化,步长2,输出就是2×2。每个输出值对应输入中2×2区域的最大值或平均值。

4.2.2 参数量分析

池化层的参数量是 0。没错,一个参数都没有。它只是一个固定的操作,不参与训练。

我曾经在项目里看到有人试图给池化层加可学习的参数,结果效果反而变差了。池化层就是用来做降维的,别给它加戏。

避坑指南: 我曾经在做一个图像分类任务时,把池化层放在卷积层之前,结果特征图被压缩得太厉害,丢失了大量细节。后来我调整了顺序——先卷积提取特征,再池化降维,效果明显好了很多。

4.3 全连接层:特征整合与分类

全连接层通常放在网络的最后几层。它的任务是把前面提取到的特征“摊平”,然后映射到最终的输出空间,比如分类的类别数。

4.3.1 计算流程

全连接层的计算就是矩阵乘法加偏置。假设输入是一个长度为 \( N \) 的向量,输出是一个长度为 \( M \) 的向量,那么:

输出 = 输入 × 权重矩阵 + 偏置

这里的权重矩阵尺寸是 \( N \times M \)。每个输出神经元都和所有输入神经元相连,所以叫“全连接”。

举个例子:输入是1024维的特征向量,输出是10个类别(比如手写数字0-9)。那么权重矩阵就是1024×10,偏置是10维向量。

4.3.2 参数量分析

全连接层的参数量公式:

参数量 = (输入维度 + 1) × 输出维度

还是刚才的例子:输入1024,输出10,参数量就是 (1024 + 1) × 10 = 10250。

你想想看,这还只是一个小网络。如果输入是4096维,输出是1000类,参数量直接飙到 (4096 + 1) × 1000 ≈ 409.7万。这就是为什么全连接层特别“吃”参数。

关键对比: 卷积层的参数量只和卷积核大小、通道数有关,和输入尺寸无关。而全连接层的参数量和输入尺寸直接挂钩。所以现代CNN倾向于用全局平均池化代替全连接层,能大幅减少参数量。

4.4 三层对比总结

我把这三层的核心特点整理成一个表格,方便你对比:

层类型 是否有参数 参数量公式 主要作用 典型位置
卷积层 (K×K×C_in + 1) × C_out 提取局部特征 网络前半部分
池化层 0 降维、压缩特征 卷积层之后
全连接层 (N_in + 1) × N_out 特征整合、分类 网络末尾

我个人习惯在设计网络时,先用卷积层堆叠提取特征,中间穿插池化层降维,最后用1-2个全连接层做分类。这样既能保证特征提取的充分性,又能控制参数量不至于爆炸。

嗯,CNN的基础就这些。说白了,卷积层负责“看”,池化层负责“记重点”,全连接层负责“做决定”。搞懂了这三层的计算流程和参数量,你就能看懂大部分经典网络结构了。