LeNet-5

auther: abinng date: 2025-12-15 15:41

背景

本篇将介绍LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。这个模型是由AT&T贝尔实验室的研究员Yann LeCun1989年提出的(并以其命名),目的是识别图像中的手写数字。 当时,Yann LeCun发表了第一篇通过反向传播成功训练卷积神经网络的研究,这项工作代表了十多年来神经网络研究开发的成果。

结构

LeNet-5有5层,分为两部分:

  • 特征提取部分:两个卷积层,两个平均池化层
    • 为什么池化层(汇聚层)不算呢,因为这里说的5层,是带参数的层,池化/汇聚操作仅仅是一个运算,不带参数
  • 全连接层:三个全连接层,其中120、84、10代表该层的神经元个数

每个卷积块中的基本单元:一个卷积层,一个sigmoid激活函数,一个平均池化层

数据的传输:

  • 卷积层输入为四维数据 (Batch, Channel, High, Width)
  • 卷积层输出为四维数据 (Batch, FN, OH, OW)
  • 全连接层输入为二维数据 (Batch, Length)
  • 全连接层输出为二维数据 (Batch, FLength)

参数计算:

运用了公式:

第一个卷积层有6个输出通道,第二个卷积层有16个输出通道,每个 池化层由于步幅stride为2,将空间减少4倍,之后为了将输出传递给全连接层,需要将样本展平为 的长方形,三个全连接层分别有120、84和10个输出,因为手写数字是10种维度的输出结果,所以最后一层是10个输出

下面利用PyTorch,进行LeNet-5的实操

实操

在我浅学了一遍之后 总体流程:

  • 搭建模型model.py(把层拼接起来就好)
  • 训练模型model_train.py(先处理数据,训练模型就是一行代码的事)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1. 数据集划分
加载数据集->划分数据集->通过数据加载器对数据预处理(如分批次)
2. 训练过程
创建优化器、损失函数
将模型放到GPU上
准备一些参数(best_model_wts、loss、acc...)
循环num_epochs轮次
循环取出训练数据每批次的数据
将数据放到GPU上
设置为训练模式,传入数据进行前向传播
取出结果中最大概率的预测值、计算损失值
将优化器中所有参数的梯度清零
反向传播、根据反向传播更新模型参数(optimizer.step())
累计损失值、预测正确的样本数量、计算样本的总数量
循环取出验证数据每批次的数据
将数据放到GPU上
设置为评估模式,传入数据进行前向传播
取出结果中最大概率的预测值、计算损失值
将优化器中所有参数的梯度清零
反向传播、根据反向传播更新模型参数(optimizer.step())
累计损失值、预测正确的样本数量、计算样本的总数量
计算当前epoch的训练和验证的平均损失和准确率
输出显示训练和验证的结果
判断当前epoch的验证准确率是否为迄今为止最高的
是:通过deepcopy更新模型参数best_model_wts
计算并输出显示当前epoch为止的训练和验证总耗时
模型训练结束之后将最佳模型参数加载进模型并保存模型
将过程中的各项指标整理成一个Pandas DataFrame(如epoch、train/val_loss_all、train/val_acc_all)
3. 绘图
接收上面的Pandas DataFrame并绘制损失曲线和准确率曲线(两个子图)
绘制好后保存图片plt.savefig("xxxx.png")
4. 主函数
实例化AlexNet模型
划分数据集
模型训练
绘图
  • 测试模型model_test.py(只需要前向传播)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 处理测试数据集
同上,但是只需要测试数据集就好了,不用划分成训练数据集和验证数据集
2. 模型测试
将模型放到GPU上
准备一些参数(test_corrects、test_num...)
循环取出验证数据每批次的数据
将数据放到GPU上
设置为评估模式,传入数据进行前向传播
取出结果中最大概率的预测值、计算损失值
累计损失值、预测正确的样本数量、计算样本的总数量
计算并输出显示测试集的整体准确率
3. 主函数
实例化AlexNet模型
加载预训练模型的参数(model.load_state_dict(torch.load('best_model.pth')))
处理测试数据集
模型测试
(可选)取出前几个批次的数据进行映射并输出预测值与真实值

代码

Blog-code/科研/PYTORCH/LeNet-5 at main · abinng/Blog-code