卷积神经网络(Convolutional Neural Network, CNN)是一种专为处理网格状数据(如图像、音频、视频)设计的深度学习模型,尤其在计算机视觉领域表现卓越。
一、CNN的核心思想
-
局部感受野(Local Receptive Fields)
传统全连接网络将每个像素视为独立输入,而CNN通过滤波器(Filter/Kernel) 在局部区域(如3×3或5×5)滑动,捕捉局部特征(如边缘、纹理)。 -
参数共享(Parameter Sharing)
同一滤波器在整个输入上滑动,共享参数,大幅减少参数量,同时保证对平移、旋转等变化的鲁棒性。 -
层次化特征提取
底层卷积层提取简单特征(边缘、颜色),深层网络组合这些特征得到复杂模式(物体部件、整体对象)。
如图是全连接,局部连接和卷积层的连接情况。
二、CNN的核心组件
1. 卷积层(Convolutional Layer)
- 操作:滤波器与输入局部区域进行点乘求和,生成特征图(Feature Map)。
- 关键参数:
- 滤波器大小(如3×3、5×5):决定感受野大小。
- 步长(Stride):滤波器滑动间隔。步长越大,特征图尺寸越小。
- 填充(Padding):在输入边缘补零,控制输出尺寸(如
padding='same'
保持尺寸不变)。
- 多通道处理:彩色图像有RGB三通道,滤波器深度需与输入通道数一致。
2. 激活函数(Activation Function)
- 引入非线性,常见选择:
- ReLU(Rectified Linear Unit):
f(x)=max(0,x)
,解决梯度消失,计算高效。 - Leaky ReLU/Swish:针对ReLU的改进,缓解神经元“死亡”问题。
- ReLU(Rectified Linear Unit):
3. 池化层(Pooling Layer)
- 目的:降维、减少计算量、增强平移不变性。
- 常用方式:
- 最大池化(Max Pooling):取局部区域最大值,保留显著特征。
- 平均池化(Average Pooling):取局部区域均值,平滑特征。
- 参数:池化窗口大小(如2×2)和步长(通常等于窗口大小)。
4. 全连接层(Fully Connected Layer)
- 位于网络末端,将特征图展平为一维向量,进行全局推理(如分类)。
- 现代网络(如ResNet)常用全局平均池化(Global Average Pooling) 替代全连接层,减少参数量。
5.归一化
目的:
- 加速模型收敛:优化算法(如梯度下降)在归一化后的数据上更易找到最优解。
- 稳定训练过程:减少梯度爆炸/消失问题,尤其在深层网络中。
- 提升模型泛化性:防止某些特征因数值过大主导模型学习。
常见归一化方法:
- 批量归一化(Batch Normalization, BN)
- 操作:对每个小批量(mini-batch) 的数据进行归一化:
x ^ = x − μ batch σ batch 2 + ϵ , y = γ x ^ + β \hat{x} = \frac{x - \mu_{\text{batch}}}{\sqrt{\sigma_{\text{batch}}^2 + \epsilon}}, \quad y = \gamma \hat{x} + \beta x^=σbatch2+ϵx−μbatch,y=γx^+β
其中 γ \gamma γ 和 β \beta β 是可学习的缩放和平移参数。 - 位置:通常放在卷积层/全连接层后,激活函数前。
- 优点:加速训练,允许更大的学习率;轻微正则化效果。
- 局限:依赖批量大小,小批量时效果不稳定(如批量大小=1时失效)。
- 层归一化(Layer Normalization, LN)
- 操作:对单个样本的所有神经元输出进行归一化。
- 适用场景:RNN、Transformer等序列模型,或批量大小不固定的情况。
- 实例归一化(Instance Normalization, IN)
- 操作:对每个样本的每个通道 归一化。
- 适用场景:风格迁移、生成对抗网络(GAN)。
三、经典CNN结构
- LeNet-5(1998)
- 首个成功应用于手写数字识别的CNN,包含卷积层、池化层和全连接层。
- AlexNet(2012)
- 引入ReLU、Dropout和数据增强,在ImageNet竞赛中突破性表现。
- VGGNet(2014)
- 通过堆叠3×3小滤波器构建深层网络,结构简洁有效。
- ResNet(2015)
- 提出残差连接(Residual Block),解决深层网络梯度消失问题,可训练上千层网络。
四、CNN的优势
- 高效性:参数共享大幅减少参数量。
- 空间不变性:通过池化和滑动窗口适应输入对象的平移、缩放。
- 自动特征学习:无需手工设计特征,直接从数据中学习层次化表示。
五、应用场景
- 图像分类(如ResNet、EfficientNet)
- 目标检测(如YOLO、Faster R-CNN)
- 语义分割(如U-Net)
- 人脸识别、医学影像分析等。
六、代码示例(Python + Keras)
from tensorflow.keras import layers, models
model = models.Sequential()
# 卷积层 + ReLU
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))
# 最大池化
model.add(layers.MaxPooling2D((2,2)))
# 展平后接全连接层
model.add(layers.Flatten())
model.add(layers.Dense(10, activation='softmax'))
model.summary()
通过结合局部感知、参数共享和层次化学习,CNN成为处理图像等结构化数据的强大工具。理解其核心组件和设计思想,是掌握现代深度学习模型的基础。