深度学习中的卷积神经网络(CNN)原理与应用
1. 从回归到分类:深度学习任务的核心转变
在深度学习的世界里,回归和分类是两种最基础的任务类型。很多初学者都是从回归任务开始入门的,比如预测房价、温度等连续数值。这类任务中,我们使用全连接层(nn.Linear)构建网络,最终输出一个数值。但当我们要处理图像分类问题时,情况就完全不同了。
1.1 回归与分类的本质区别
回归任务和分类任务最根本的区别在于输出形式。回归输出的是一个连续值,比如预测明天温度是23.5度;而分类输出的是离散的类别概率,比如判断一张图片是猫(80%)、狗(15%)还是鸟(5%)。
这种区别直接影响了网络结构的设计:
- 回归任务:最后一层是nn.Linear(?,1),输出单个数值
- 分类任务:最后一层是nn.Linear(?,类别数),输出每个类别的置信度
举个例子,三分类任务(猫/狗/鸟)的网络输出可能是[1.2, 5.8, 0.9],我们通过取最大值下标得到预测类别(这里下标1对应"狗")。
1.2 图像分类的特殊性
图像分类有几个独特之处:
- 输入是高维数据(比如224×224的彩色图有150528个像素)
- 像素间存在空间关系(相邻像素通常相关性高)
- 需要提取局部特征(如边缘、纹理)和全局特征
这些特点使得直接用全连接网络处理图像会面临"维度爆炸"的问题。以224×224的彩色图为例,展平后输入全连接层会产生上亿参数,不仅计算量大,还容易过拟合。
2. 卷积神经网络的核心组件
2.1 图像的张量表示
在PyTorch等框架中,图像通常表示为N×C×H×W的四维张量:
- N:批量大小(一次处理的图片数量)
- C:通道数(灰度图为1,RGB彩色图为3)
- H:高度(像素行数)
- W:宽度(像素列数)
这种表示方式保留了图像的空间结构信息,是卷积操作的基础。
2.2 卷积操作详解
卷积是CNN的核心操作,它通过小型的卷积核(如3×3)在图像上滑动,提取局部特征。每个卷积核都会输出一个特征图(feature map),多个卷积核就能提取多种特征。
卷积的关键参数:
- 卷积核大小(Kernel Size):通常3×3或5×5
- 步长(Stride):卷积核每次滑动的距离
- 填充(Padding):在图像边缘补零的圈数
2.2.1 感受野的概念
感受野(Receptive Field)是指特征图上每个点对应原始图像的区域大小。随着网络加深,感受野会逐渐扩大,使高层特征能够"看到"更大范围的图像内容。
2.3 池化操作
池化(Pooling)是一种下采样操作,主要作用是:
- 降低特征图尺寸,减少计算量
- 扩大感受野
- 增强平移不变性
最常用的是最大池化(Max Pooling),它取局部区域的最大值作为输出,能保留最显著的特征。
3. 卷积网络的设计与计算
3.1 输出尺寸计算
卷积后特征图的尺寸可以通过以下公式计算:
输出尺寸 = (输入尺寸 - 卷积核大小 + 2×填充) / 步长 + 1
例如:
- 输入224×224,3×3卷积,填充1,步长1 → 输出224×224
- 输入224×224,3×3卷积,填充1,步长2 → 输出112×112
3.2 参数量计算
卷积层的参数量主要来自:
- 权重:输出通道数 × 输入通道数 × 卷积核高 × 卷积核宽
- 偏置:输出通道数
例如,输入64通道,输出128通道,3×3卷积核: 参数量 = 128×64×3×3 + 128 = 73856
3.3 经典网络结构示例
一个简单的CNN可能包含以下层:
- 卷积层(提取特征)
- 激活函数(如ReLU,引入非线性)
- 池化层(下采样)
- 重复1-3次
- 全连接层(分类)
4. 从特征到分类
4.1 特征图到向量的转换
经过多次卷积和池化后,我们会得到高维特征图(如1024×7×7)。要用于分类,需要先转换为向量,常用方法有:
- 展平(Flatten):直接拉成一维向量
- 全局平均池化:对每个通道取平均值
4.2 Softmax与交叉熵损失
分类网络的输出需要通过Softmax转换为概率分布:
Softmax(x_i) = exp(x_i) / Σexp(x_j)
然后使用交叉熵损失衡量预测与真实标签的差异:
Loss = -Σ(y_true * log(y_pred))
交叉熵损失会促使网络提高正确类别的预测概率。
5. 实战建议与常见问题
5.1 网络设计技巧
- 卷积核大小:通常使用3×3,深层可用1×1调整通道数
- 步长选择:常用1或2,过大步长会导致信息丢失
- 通道数变化:通常逐层增加,如64→128→256
- 激活函数:ReLU是最常用的选择
5.2 训练技巧
- 数据增强:旋转、翻转等增加数据多样性
- 批归一化(BatchNorm):加速训练,提高稳定性
- 学习率调整:初期可用较大学习率,后期逐渐减小
- 正则化:Dropout、权重衰减防止过拟合
5.3 常见问题解答
Q:为什么卷积比全连接更适合图像? A:卷积利用了图像的局部相关性和平移不变性,参数共享大大减少了参数量。
Q:池化层真的必要吗? A:现代网络趋势是减少池化,用步长卷积代替,但池化在某些场景仍有优势。
Q:如何选择网络深度? A:需要平衡模型容量和训练难度,可以从经典结构(如ResNet18)开始调整。
6. 进阶方向
掌握了基础CNN后,可以进一步学习:
- 残差连接(ResNet):解决深层网络梯度消失
- 注意力机制:让网络关注重要区域
- 轻量化网络:MobileNet、ShuffleNet等
- 自监督学习:利用无标注数据预训练
在实际项目中,通常不会从头设计网络,而是基于预训练模型进行微调(fine-tuning),这能充分利用大规模数据集上学到的特征。
记住,理解原理比记住公式更重要。建议动手实现一个简单的CNN(如LeNet),在MNIST等数据集上实践,逐步深入理解每个组件的作用。