卷积神经网络
卷积神经网络 (CNN)
卷积神经网络(Convolutional Neural Network, CNN)是一类特殊的深度神经网络,专为处理具有网格结构的数据而设计,特别是图像数据。自从2012年AlexNet在ImageNet竞赛中取得突破性成功以来,CNN已成为计算机视觉领域的主导技术。
1. CNN的基本原理
卷积神经网络的核心思想是通过卷积操作自动学习空间层次特征。与传统的多层感知机(MLP)不同,CNN具有以下特点:
- 局部连接:每个神经元只与输入数据的一个局部区域连接
- 权值共享:同一特征图中的神经元共享相同的权重
- 空间下采样:通过池化操作减少数据维度并提高鲁棒性
这些特性使CNN在保留空间信息的同时大幅减少了参数数量,提高了计算效率和泛化能力。
2. CNN的基本组成部分
2.1 卷积层(Convolutional Layer)
卷积层是CNN最重要的组成部分,主要通过卷积操作提取输入数据的特征。
卷积操作过程如下:
1 |
|
卷积过程示意:
1 |
|
卷积过程计算示例(左上角):
1 |
|
卷积核在原始图像上滑动,每个位置执行”乘积求和”操作。卷积过程自动提取特征,如边缘、纹理和形状。不同的卷积核可以检测不同的特征模式,通过学习这些卷积核的权重,CNN能够适应各种视觉识别任务。
卷积的数学表示:
$$F(i,j) = \sum_{m=0}^{k_h-1} \sum_{n=0}^{k_w-1} I(i+m, j+n) \cdot K(m,n)$$
其中$F$是输出特征图,$I$是输入图像,$K$是卷积核。
2.2 激活函数层
卷积层之后通常跟随一个非线性激活函数,常用的有:
- ReLU (Rectified Linear Unit): $f(x) = \max(0, x)$
- Leaky ReLU: $f(x) = \max(0.01x, x)$
- ELU (Exponential Linear Unit): $f(x) = \begin{cases} x, & \text{if } x > 0 \ \alpha(e^x - 1), & \text{if } x \leq 0 \end{cases}$
激活函数的引入为网络带来非线性,提高了模型的表达能力。
2.3 池化层(Pooling Layer)
池化层的主要功能是减少特征图的空间尺寸,降低计算复杂度,同时提高一定的位移不变性。常见的池化操作有:
- 最大池化(Max Pooling): 取窗口内的最大值
- 平均池化(Average Pooling): 计算窗口内像素的平均值
2.4 全连接层(Fully Connected Layer)
在经过多个卷积和池化层后,特征图被展平为一维向量,然后通过全连接层进行分类或回归。这与传统神经网络的操作类似,每个神经元与前一层的所有神经元相连。
3. 经典CNN架构
3.1 LeNet-5
由Yann LeCun在1998年提出,是最早的CNN架构之一,用于手写数字识别。
结构:
- 输入: 32×32 灰度图像
- 两个卷积层和池化层的组合
- 三个全连接层
3.2 AlexNet
2012年ImageNet竞赛冠军,标志着深度学习时代的到来。
主要创新:
- 使用ReLU激活函数
- 使用Dropout防止过拟合
- 使用数据增强技术
- 在GPU上进行训练
3.3 VGG
由牛津大学提出,以简洁的网络结构著称。
特点:
- 使用3×3的小卷积核
- 网络深度达到16-19层
- 结构规整,便于理解与修改
3.4 GoogLeNet(Inception)
谷歌提出的网络架构,引入了Inception模块。
特点:
- 使用1×1卷积减少计算量
- 并行使用多种尺寸的卷积核
- 中间层添加辅助分类器
3.5 ResNet
微软研究院提出的残差网络,通过残差连接解决了深层网络的梯度消失问题。
残差块结构:
1 |
|
4. CNN的简单实现
下面是一个使用PyTorch实现的简单卷积神经网络示例:
1 |
|
这个简单的CNN实现可用于MNIST手写数字识别,包含了两个卷积层、两个池化层和两个全连接层。模型结构简洁,易于理解,是入门CNN的理想示例。