第4章:卷积神经网络(CNN)
4.1 卷积运算与池化
4.1.1 卷积运算基础
定义
卷积运算(Convolution Operation)是CNN的核心操作,通过滑动窗口(卷积核)在输入数据(如图像)上局部提取特征。其数学表达式为:
其中,为输入数据,为卷积核。
关键概念
- 卷积核(Kernel):可学习的权重矩阵,尺寸通常为3×3或5×5。
- 步长(Stride):卷积核滑动的像素间隔,影响输出尺寸。
- 填充(Padding):在输入边缘补零以控制输出尺寸(如
same或valid模式)。
示例
一个3×3卷积核在5×5输入上的运算过程(步长1,无填充):
Input: Kernel: Output:
[[1, 1, 1, 0, 0], [[1, 0, 1], [[4, 3, 4],
[0, 1, 1, 1, 0], [0, 1, 0], [2, 4, 3],
[0, 0, 1, 1, 1], [1, 0, 1]] [2, 3, 4]]
[0, 0, 1, 1, 0],
[0, 1, 1, 0, 0]]
4.1.2 池化操作
目的
降低特征图的空间维度,增强平移不变性并减少计算量。
常见类型
- 最大池化(Max Pooling):取窗口内最大值,保留显著特征。
Input: [[1, 2, 3, 4], Output (2×2 max pooling): [[2, 4], [5, 6, 7, 8], [6, 8]] [9, 10,11,12], [13,14,15,16]] - 平均池化(Average Pooling):计算窗口内均值,平滑特征。
参数
- 池化窗口大小:通常为2×2。
- 步长:常与窗口大小一致(如步长2)。
4.1.3 卷积与池化的作用
| 操作 | 功能 | 典型参数 |
|---|---|---|
| 卷积 | 提取局部特征(如边缘、纹理) | 3×3核,步长1 |
| 池化 | 降维、防止过拟合、提升模型鲁棒性 | 2×2窗口,步长2 |
可视化对比
- 卷积前:原始图像细节丰富但冗余。
- 卷积后:特征图突出关键模式(如垂直边缘)。
- 池化后:特征图尺寸减半,保留主要特征。
4.1.4 代码实现示例(PyTorch)
import torch.nn as nn
# 定义卷积层 + 池化层
model = nn.Sequential(
nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(16, 32, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
# 输入: (batch_size, 3, 32, 32)
# 输出: (batch_size, 32, 8, 8)
4.1.5 常见问题
- 边界信息丢失:通过调整
padding解决。 - 计算效率:使用分离卷积(Depthwise Separable Conv)优化。
- 池化替代方案:步长大于1的卷积可直接降维(如ResNet)。
