卷积神经网络(CNN)学习笔记:从卷积原理到ResNet与迁移学习

一、为什么需要卷积神经网络?

在计算机中,图像本质上是一组按照顺序排列的数字。灰度图像中的像素值通常表示明暗程度,数值范围为 0~255;而更常见的 RGB 彩色图像由红、绿、蓝三个通道组成,因此可以把一张彩色图片理解成一个三维张量。

如果直接使用传统的全连接神经网络处理图像,图片尺寸变大以后,网络需要处理的参数数量会迅速增加,而且很难很好地处理同一个物体出现在不同位置、发生轻微变形等情况。

CNN 的一个重要目标,就是让网络能够从局部区域中自动提取有用特征,并尽可能具备一定的画面不变性。例如,一个物体出现在图片左侧还是右侧,模型都应该尽量识别成同一种物体。

二、CNN 的核心:卷积、池化和全连接

CNN 的基本结构主要包括卷积层、池化层和全连接层。

1. 卷积层

所谓卷积,就是让图像中的一个局部窗口与卷积核进行计算:对应位置的元素相乘,再把结果相加,从而得到新的特征值。卷积核可以看成一组需要学习的权重,也可以理解为一种滤波器。

随着卷积核在图像上不断移动,就能够得到一张新的特征图(Feature Map)。不同的卷积核可以学习不同的特征,例如边缘、纹理以及更加复杂的形状。

卷积过程中有几个重要参数:

  • stride(步长):卷积核每次移动的距离。

  • padding(填充):在图像边缘补充一定数量的 0。

  • 卷积核数量:决定输出特征图的深度。

2. 池化层

池化层主要用于下采样,也就是减小特征图的空间尺寸。这样可以降低参数数量和计算量,并在一定程度上控制过拟合。

常见的池化方式包括最大池化、平均池化、全局平均池化和全局最大池化。其中最大池化比较常见,它会在池化窗口中选择最大的值作为输出。

池化的核心思想可以简单理解为:保留比较重要的信息,同时压缩一些冗余信息。

3. 全连接层

当卷积层和池化层提取到足够多的特征之后,还需要根据这些特征完成分类。通常会先把最后得到的特征图进行 Flatten(展平),再送入全连接层,最终输出各类别的预测结果。

因此,一个典型的 CNN 流程可以概括为:

输入图像 → 卷积 → 激活 → 池化 → 卷积 → 激活 → 池化 → Flatten → 全连接 → 分类结果

三、用 MNIST 实现 CNN 图像识别

掌握基本原理后,PPT 使用 MNIST 数据集作为 CNN 的实践案例。MNIST 是经典的手写数字数据集,每张图片表示一个 0~9 的数字。

在 PyTorch 中,可以使用 datasets.MNIST 下载和读取数据,再通过 DataLoader 按 batch 组织数据。模型部分使用 nn.Conv2d、激活函数、nn.MaxPool2dnn.Flattennn.Linear 等模块组成。

训练过程可以简单概括为:

  1. 准备训练集和测试集;

  2. 使用 DataLoader 按批次读取图片;

  3. 将图片输入 CNN;

  4. 计算预测结果与真实标签之间的损失;

  5. 反向传播并更新网络参数;

  6. 使用测试集检查模型效果。

通过这个过程,可以把前面学习的卷积、池化和全连接真正应用到图像分类任务中。

四、数据增强:让模型见过更多变化

在实际图像任务中,训练数据可能数量有限。如果模型只看到比较固定的图片形式,就可能出现泛化能力不足的问题。

数据增强(Data Augmentation)的目的,就是增加训练数据的多样性,从而提高模型的泛化能力。

数据增强方式包括:

  • 垂直翻转

  • 随机旋转

  • 随机裁剪

  • 颜色变换

例如,同一张图片经过旋转、翻转或者颜色变化后,可以形成不同的训练样本。这样模型在训练过程中能够接触到更多变化,从而减少对某一种固定图片形式的依赖。

五、调整学习率:让训练过程更加稳定

学习率决定了神经网络每次更新参数时的幅度。常用学习率包括 0.1、0.01 和 0.001。

一般来说,希望训练初期的学习率相对较大,让网络快速收敛;到了训练后期,再逐渐降低学习率,使模型更加稳定地接近较优解。

PyTorch 可以通过 torch.optim.lr_scheduler 实现学习率调整。以下介绍了三类方法:

  • 有序调整:StepLR、MultiStepLR、ExponentialLR、CosineAnnealingLR 等;

  • 自适应调整:ReduceLROnPlateau,根据 loss 或 accuracy 等指标变化调整学习率;

  • 自定义调整:LambdaLR,通过自定义函数决定学习率变化。

其中 StepLR 的思路比较直观:每经过指定数量的 epoch,就按照一定比例降低学习率。

六、迁移学习与 ResNet

当数据集规模较小或者从头训练一个深度网络成本较高时,可以使用迁移学习。

迁移学习的基本思想是:先利用已经在大规模数据集上训练好的模型,再把它应用到新的任务中,通过冻结部分参数、增加新的分类层以及进一步微调等方式,使模型适应新的数据集。

PPT 中给出的迁移学习基本步骤是:

  1. 选择预训练模型和合适的层;

  2. 冻结预训练模型参数;

  3. 在新数据集上训练新增层;

  4. 解冻部分网络并进行微调;

  5. 在测试集上评估模型。

其中 ResNet 是非常典型的预训练网络。

传统 CNN 随着网络越来越深,可能出现梯度消失、梯度爆炸以及网络退化等问题。ResNet 通过残差结构引入 shortcut(捷径)连接,让输入 X 可以跨过部分网络层,与变换后的 F(X) 进行相加。

残差结构可以简单表示为:

输出 = F(X) + X

这里要求参与相加的特征矩阵形状一致。这样的结构可以帮助深层网络更容易进行训练。

七、总结

通过这一章的学习,可以把 CNN 的知识串成一条完整的路线:

图像数据 → 卷积提取特征 → 池化压缩信息 → 全连接完成分类 → 数据增强提高泛化能力 → 学习率调整改善训练 → 迁移学习复用已有模型 → ResNet 解决深层网络训练问题。

CNN 不只是几个网络层简单地堆叠,而是一套针对图像数据特点设计的特征提取和分类方法。卷积层负责发现局部特征,池化层负责压缩和保留重要信息,全连接层负责最终分类;当任务更加复杂时,又可以通过数据增强、学习率调整、迁移学习以及 ResNet 等方法进一步提升模型的训练效果。

这次学习也让我对 PyTorch 中的数据集、DataLoader、CNN 模型、训练过程以及预训练模型有了更加完整的认识,为后续进行实际的图像分类项目打下基础。

相关推荐
zx_741484811 小时前
【深度学习入门】PyTorch 食物图像分类三连:CNN 训练、学习率调度与 ResNet18 迁移学习
pytorch·深度学习·cnn·迁移学习
Zguigo10 小时前
【CUDA1】GPUvsCPU,CUDA Kernel
人工智能·pytorch·深度学习
Jared_devin19 小时前
单头、多头 Self-Attention可视化
人工智能·pytorch·深度学习·算法·机器学习·pycharm
昇腾知识体系1 天前
昇腾环境安装 flash_attn:FlashAttnPrefillBackend 报错与替代算子
人工智能·pytorch·华为·知识图谱
维基框架2 天前
PyTorch正在重构开源AI基础设施
人工智能·pytorch·重构
牧羊人.3332 天前
动手学深度学习 04 | Dataset 和 DataLoader、数据增强
人工智能·pytorch·深度学习·算法
陈年老古董3 天前
PyTorch食物图像分类实战:从数据集制作到CNN模型训练全流程详解
pytorch·深度学习·学习·机器学习·分类·cnn
TheBestRucy3 天前
PyTorch 基本使用学习笔记
pytorch·笔记·学习
creator_Li4 天前
深度学习 学习笔记
pytorch·深度学习