卷积神经网络 CNN 详解
CNN 是计算机视觉的核心架构,通过卷积操作高效提取空间特征。
卷积层(Convolutional Layer)
卷积层是 CNN 的核心构建块,通过卷积核(kernel)在输入特征图上滑动并计算点积,从而提取局部特征。
卷积操作
- 卷积核在输入上按步长(stride)滑动,每次计算覆盖区域与卷积核的逐元素乘积之和
- 输出特征图大小由输入尺寸、kernel_size、stride、padding、dilation 共同决定
关键参数
| 参数 | 说明 | 作用 |
|---|---|---|
| kernel_size | 卷积核尺寸(如 3×3、5×5) | 决定局部感受野范围 |
| stride | 滑动步长 | 控制输出尺寸下采样倍数 |
| padding | 边界填充(通常补 0) | 保持空间尺寸,防止边缘信息丢失 |
| dilation | 空洞率 | 扩大感受野而不增加参数量 |
核心特性
- 权值共享(Weight Sharing):同一个卷积核在整个输入上共享参数,参数量远少于全连接层
- 局部连接(Local Connectivity):每个神经元只连接输入的一小片局部区域,符合视觉神经元的局部感知特性
- 等变表示(Equivariant Representation):平移输入会导致输出特征图相应平移
输入输出关系
给定输入尺寸 $H_{in} \times W_{in}$,输出尺寸为:
$$H_{out} = \left\lfloor \frac{H_{in} + 2p - d \times (k-1) - 1}{s} + 1 \right\rfloor$$
其中 $k$ 为 kernel_size,$s$ 为 stride,$p$ 为 padding,$d$ 为 dilation。
池化层(Pooling Layer)
池化层对特征图进行下采样,降低空间维度。
常见类型
- 最大池化(Max Pooling):取池化窗口内的最大值,保留最显著的特征响应
- 平均池化(Average Pooling):取池化窗口内的平均值,保留整体分布信息
- 全局平均池化(Global Average Pooling, GAP):对整个特征图做平均池化,直接输出通道数个值,可替代全连接层
作用
- 降采样:减少特征图尺寸,降低计算量
- 降低参数量:减小后续层的输入维度
- 提供平移不变性:微小平移不影响池化结果
- 防止过拟合:减少了特征维度,起到正则化作用
全连接层(Fully Connected Layer)
全连接层将前一层所有神经元与当前层每个神经元一一连接。
- 作用:将卷积层提取的分布式特征表示映射到样本标记空间,通常用于分类/回归的最终输出
- 特点:参数量占比极大(卷积层参数的数十倍),现代 CNN 倾向于使用全局平均池化替代全连接层以减少参数量
- 结构:通常位于网络末端,配合 Softmax(分类)或线性输出(回归)
经典架构
LeNet-5(1998)
由 Yann LeCun 提出,是 CNN 的开山之作。
- 结构:2 × Conv + 2 × Subsampling(平均池化)+ 3 × FC
- 激活函数:Sigmoid / Tanh
- 应用:手写数字识别 MNIST,识别准确率领先传统方法
- 意义:奠定了 CNN 基础架构范式(卷积 → 池化 → 全连接)
AlexNet(2012)
由 Alex Krizhevsky 提出,在 ImageNet 竞赛中以大幅优势夺冠,掀起了深度学习热潮。
- 结构:5 × Conv + 3 × FC
- 创新点:
- ReLU 激活函数:解决 Sigmoid 的梯度饱和问题,加速训练
- Local Response Normalization(LRN):对局部神经元活动做归一化(后续被 BN 取代)
- Dropout:在全连接层后随机丢弃神经元,有效防止过拟合
- 数据增强:随机裁剪、翻转、色彩抖动等,大幅扩充训练数据
- 双 GPU 训练:模型分布在两块 GPU 上并行计算
VGGNet(2014)
由牛津大学 Visual Geometry Group 提出,强调简洁和深度。
- 结构特点:全部使用小卷积核(3×3),通过堆叠加深网络
- 两个变体:
- VGG16:13 个卷积层 + 3 个全连接层,共 16 层
- VGG19:16 个卷积层 + 3 个全连接层,共 19 层
- 设计理念:统一简洁的架构设计——所有卷积层使用相同配置(3×3 卷积、2×2 最大池化)
- 优缺点:结构规整、易于理解和迁移;但参数量大(~138M),计算开销高
GoogLeNet / Inception(2014)
由 Google 提出,在 ILSVRC 2014 夺冠。
- Inception 模块:在同一层并行使用 1×1、3×3、5×5 卷积和 3×3 最大池化,再将结果沿通道拼接
- 1×1 卷积降维:在 3×3 和 5×5 卷积前用 1×1 卷积减少输入通道数,大幅降低计算量
- 辅助分类器:中间层添加两个辅助分类器,反向传播额外梯度信号,缓解梯度消失
- 全局平均池化:替代全连接层,参数量锐减
ResNet(2015)
由何恺明等提出,ILSVRC 2015 夺冠,解决了极深网络的训练难题。
- 退化问题:实验发现,网络加深到一定程度后,更深网络的训练误差反而更大——这不是过拟合,而是优化困难
- 残差学习(Residual Learning):让网络学习残差映射 $F(x) = H(x) - x$ 而非直接学习 $H(x)$
残差块结构
输入 x
↓
Conv → BN → ReLU → Conv → BN
↓ |
F(x) Identity(捷径连接)
↓ |
└──────── + ────────────┘
↓
ReLU
↓
输出 H(x) = F(x) + x- 捷径连接(Shortcut Connection):跳过一个或多个层,执行恒等映射(identity mapping),使梯度可以直接回传
- 瓶颈结构(Bottleneck):对深层 ResNet(50+ 层)使用 1×1 → 3×3 → 1×1 的瓶颈设计,先降维再升维,减少计算量
- 预激活残差块(Pre-activation):将 BN 和 ReLU 放在卷积之前($BN \to ReLU \to Conv$),进一步改善梯度流动
ResNet 系列
| 变体 | 层数 | 特点 |
|---|---|---|
| ResNet-18 | 18 | 基本残差块,适合小数据集 |
| ResNet-34 | 34 | 基本残差块 |
| ResNet-50 | 50 | 瓶颈残差块 |
| ResNet-101 | 101 | 瓶颈残差块,更深 |
| ResNet-152 | 152 | 最深版本 |
- 意义:残差学习使得训练 100+ 层甚至 1000+ 层网络成为可能
后续发展
| 架构 | 年份 | 核心创新 |
|---|---|---|
| DenseNet | 2017 | 密集连接:每层与之前所有层直接相连,特征复用、缓解梯度消失 |
| SENet | 2018 | Squeeze-and-Excitation:通道注意力机制,自适应调整各通道权重 |
| EfficientNet | 2019 | 神经架构搜索(NAS)同时均衡缩放深度、宽度、分辨率三维度 |
| MobileNet | 2017 | 深度可分离卷积(Depthwise Separable Convolution),轻量高效适合移动端 |
感受野(Receptive Field)
定义
感受野是指卷积神经网络中,某层特征图上的一个点对应输入图像的区域大小。
计算公式
递推公式: $$r^{[l]} = r^{[l-1]} + (k^{[l]} - 1) \times \prod_{i=1}^{l-1} s^{[i]}$$
其中:
- $r^{[l]}$:第 $l$ 层的感受野大小
- $k^{[l]}$:第 $l$ 层的卷积核大小
- $s^{[i]}$:第 $i$ 层的步长(stride)
特性
- 大感受野:捕获全局语义特征(如物体整体轮廓)
- 小感受野:捕获局部细节特征(如边缘、纹理)
- 堆叠小卷积核(如 3×3)可以在保持较小参数量的同时获得较大感受野
参数计算
卷积层参数量
$$\text{Params} = k_h \times k_w \times C_{in} \times C_{out} + C_{out}$$
- $k_h, k_w$:卷积核高和宽
- $C_{in}$:输入通道数
- $C_{out}$:输出通道数(卷积核个数)
- $+ C_{out}$:bias 参数
示例:输入 3 通道,64 个 3×3 卷积核 $$\text{Params} = 3 \times 3 \times 3 \times 64 + 64 = 1792$$
全连接层参数量
$$\text{Params} = N_{in} \times N_{out} + N_{out}$$
- $N_{in}$:输入神经元数
- $N_{out}$:输出神经元数
参数量对比
以 AlexNet 为例:
- 卷积层总参数量:约 2.3M
- 全连接层总参数量:约 58.6M(占总参数量 96%)
- 可见全连接层在参数量上占绝对主导地位
代码示例:PyTorch 实现简单 CNN
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
# Conv Block 1: 3 → 16
nn.Conv2d(3, 16, kernel_size=3, padding=1),
nn.BatchNorm2d(16),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2), # 32×32 → 16×16
# Conv Block 2: 16 → 32
nn.Conv2d(16, 32, kernel_size=3, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2), # 16×16 → 8×8
# Conv Block 3: 32 → 64
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2), # 8×8 → 4×4
)
self.classifier = nn.Sequential(
nn.AdaptiveAvgPool2d((1, 1)), # GAP: 4×4 → 1×1
nn.Flatten(),
nn.Linear(64, num_classes),
)
def forward(self, x):
x = self.features(x)
x = self.classifier(x)
return x
# 模型实例化
model = SimpleCNN(num_classes=10)
print(model)
# 前向传播测试
dummy = torch.randn(4, 3, 32, 32)
output = model(dummy)
print(f"输入形状: {dummy.shape}")
print(f"输出形状: {output.shape}")关键点说明
nn.Conv2d:2D 卷积层,需指定输入通道、输出通道、卷积核大小nn.BatchNorm2d:批归一化,加速收敛、稳定训练nn.ReLU:激活函数,引入非线性nn.MaxPool2d:最大池化,降采样nn.AdaptiveAvgPool2d:自适应全局平均池化,输出指定尺寸(此处 1×1),替代 Flatten + FC 的中间层nn.Flatten:将多维特征展平为一维向量
各种池化 / 卷积的对比
| 操作类型 | 核心思想 | 特点 | 典型应用 |
|---|---|---|---|
| 标准卷积 | 卷积核在输入上滑动,计算逐元素点积 | 参数量 = $k_h \times k_w \times C_{in} \times C_{out}$,计算量大 | 所有 CNN 架构的基础 |
| 深度可分离卷积 | Depthwise Conv + Pointwise Conv(1×1) | 参数量 ≈ $k_h \times k_w \times C_{in} + C_{in} \times C_{out}$,极大降低计算量 | MobileNet、轻量模型 |
| 空洞卷积(Dilated Conv) | 卷积核元素之间插入空洞 | 扩大感受野而不增加参数量,不损失分辨率 | 语义分割(DeepLab 系列) |
| 转置卷积(Transposed Conv) | 上采样操作,可学习的反卷积 | 恢复特征图空间尺寸,可包含重叠求和 | 图像分割、生成模型(GAN) |
| 最大池化 | 窗口内取最大值 | 保留最强响应,提供少量平移不变性 | 经典 CNN(LeNet/AlexNet/VGG) |
| 平均池化 | 窗口内取平均值 | 保留整体分布,更平滑 | GoogLeNet(GAP 替代 FC) |
| 全局平均池化 | 全图取平均 → 一个通道一个值 | 无参数,天然适合替代全连接,防过拟合 | ResNet、GoogLeNet |
总结
- 卷积神经网络通过局部连接和权值共享两大核心特性,在图像任务中以远少于全连接网络的参数量实现了高效的特征提取
- 从 LeNet 到 AlexNet,网络深度从 5 层跃升至 8 层,ReLU、Dropout、数据增强等技巧使深度 CNN 变得可训练
- VGG 证明了堆叠小卷积核的有效性,GoogLeNet 引入了 Inception 多尺度并行结构,ResNet 通过残差连接突破了深度瓶颈
- 后续发展主线包括:更高效的连接方式(DenseNet)、注意力机制(SENet)、神经网络架构搜索(EfficientNet)、移动端轻量化(MobileNet)
- 感受野和参数计算是理解 CNN 设计的两大核心工具——感受野决定了网络能看到的范围,参数量影响了计算效率和过拟合风险
- 现代 CNN 设计趋势:深度加深、全连接层减少、全局平均池化替代 FC、深度可分离卷积减少计算量、以及结合注意力机制提升表征能力