auther: abinng date: 2025-12-15 15:41
背景
本篇将介绍LeNet,它是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。这个模型是由AT&T贝尔实验室的研究员Yann
LeCun在1989年提出的(并以其命名),目的是识别图像中的手写数字。
当时,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