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个参数。相比之下,全连接层动不动就几十万参数。这就是为什么卷积层这么受欢迎——参数量少,还能提取空间特征。
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万。这就是为什么全连接层特别“吃”参数。
4.4 三层对比总结
我把这三层的核心特点整理成一个表格,方便你对比:
| 层类型 | 是否有参数 | 参数量公式 | 主要作用 | 典型位置 |
|---|---|---|---|---|
| 卷积层 | 是 | (K×K×C_in + 1) × C_out | 提取局部特征 | 网络前半部分 |
| 池化层 | 否 | 0 | 降维、压缩特征 | 卷积层之后 |
| 全连接层 | 是 | (N_in + 1) × N_out | 特征整合、分类 | 网络末尾 |
我个人习惯在设计网络时,先用卷积层堆叠提取特征,中间穿插池化层降维,最后用1-2个全连接层做分类。这样既能保证特征提取的充分性,又能控制参数量不至于爆炸。
嗯,CNN的基础就这些。说白了,卷积层负责“看”,池化层负责“记重点”,全连接层负责“做决定”。搞懂了这三层的计算流程和参数量,你就能看懂大部分经典网络结构了。