经典卷积神经网络LeNet详解与模型搭建(附源码开源)
创作时间:
作者:
@小白创作中心
经典卷积神经网络LeNet详解与模型搭建(附源码开源)
引用
CSDN
1.
https://m.blog.csdn.net/varda8899/article/details/146183238
LeNet是首个成功应用的卷积神经网络(CNN),由Yann LeCun等人在1998年提出,最初用于解决手写数字识别问题。其设计思想深刻影响了后续的AlexNet、VGG等网络,是深度学习发展史上的里程碑。
LeNet网络结构与介绍
数据集使用的是FashionMNIST,服装分类数据集,源代码中已包含数据集,有训练好的模型best_model.pth,可以直接使用,训练了20轮,准确率87%,最后验证时有点过拟合,但整体比较理想。
以下是Loss值与Acc值训练曲线图
一、背景与历史意义
提出者与时间:LeNet由Yann LeCun、Léon Bottou等人在1998年提出,最初用于解决手写数字识别问题(如邮政编码识别)。
历史地位:
- 是首个成功应用的卷积神经网络(CNN),奠定了现代CNN的基础。
- 推动了深度学习在计算机视觉领域的早期发展,尤其在特征提取和权值共享等概念上具有开创性。
二、网络结构详解(以LeNet-5为例)
LeNet-5是最经典的版本,其结构包含7层(2个卷积层、2个池化层、3个全连接层),输入为32×32的灰度图像,输出为10类数字(0-9)。
以下是逐层解析:
- 输入层(Input Layer)
- 尺寸:32×32像素的灰度图像(单通道)。
- 设计目的:适应当时数据集(如MNIST)的预处理需求(MNIST原始图像为28×28,填充至32×32以保留边缘信息)。
- 卷积层C1(Convolutional Layer)
- 操作:卷积运算提取空间特征。
- 参数:
- 卷积核:6个大小为5×5的滤波器。
- 步长(Stride):1。
- 填充(Padding):无(输出尺寸为28×28)。
- 激活函数:Sigmoid(原始论文使用)。
- 输出:6个28×28的特征图。
- 池化层S2(Subsampling Layer)
- 操作:平均池化(Average Pooling)降低维度。
- 参数:
- 池化窗口:2×2。
- 步长:2。
- 输出:6个14×14的特征图(尺寸缩小为输入的一半)。
- 卷积层C3(Convolutional Layer)
- 操作:进一步提取高阶特征。
- 参数:
- 卷积核:16个5×5的滤波器。
- 步长:1。
- 填充:无(输出尺寸为10×10)。
- 激活函数:Sigmoid。
- 设计细节:滤波器并非全连接,而是通过稀疏连接减少参数量(例如每个滤波器仅连接部分输入特征图)。
- 输出:16个10×10的特征图。
- 池化层S4(Subsampling Layer)
- 参数:与S2相同(2×2平均池化,步长2)。
- 输出:16个5×5的特征图。
- 全连接层C5(Fully Connected Layer)
- 操作:将特征图展平为向量,进行非线性组合。
- 参数:
- 输入维度:16×5×5 = 400。
- 输出维度:120。
- 激活函数:Sigmoid。
- 全连接层F6(Fully Connected Layer)
- 参数:
- 输入维度:120。
- 输出维度:84(设计为与ASCII字符集相关,便于扩展)。
- 激活函数:Sigmoid。
- 输出层(Output Layer)
- 参数:
- 输入维度:84。
- 输出维度:10(对应数字0-9的分类)。
- 激活函数:Gaussian Connection(原始设计)或Softmax(现代实现常用)。
三、核心创新点
- 局部感受野(Local Receptive Fields)
- 卷积核仅覆盖输入图像的局部区域,模拟生物视觉系统的局部感知特性。
- 减少参数量,提升平移不变性。
- 权值共享(Shared Weights)
- 同一卷积核在整张图像上滑动,共享参数,大幅降低计算复杂度。
- 下采样(Subsampling)
- 通过池化逐步降低空间分辨率,保留关键特征的同时减少过拟合。
四、与现代CNN的对比
特性 | LeNet | 现代CNN(如ResNet) |
---|---|---|
深度 | 浅层(5-7层) | 深层(50-100+层) |
激活函数 | Sigmoid/Tanh | ReLU |
池化方式 | 平均池化 | 最大池化 |
正则化 | 无(依赖网络结构设计) | Dropout/Batch Normalization |
应用场景 | 小尺寸图像分类(如MNIST) | 大规模图像识别(如ImageNet) |
五、代码实现(PyTorch示例)
import torch
import torch.nn as nn
class LeNet5(nn.Module):
def __init__(self, num_classes=10):
super(LeNet5, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5), # C1: 1@32x32 → 6@28x28
nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2), # S2: 6@28x28 → 6@14x14
nn.Conv2d(6, 16, kernel_size=5), # C3: 6@14x14 → 16@10x10
nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2), # S4: 16@10x10 → 16@5x5
)
self.classifier = nn.Sequential(
nn.Linear(16*5*5, 120), # C5: 400 → 120
nn.Sigmoid(),
nn.Linear(120, 84), # F6: 120 → 84
nn.Sigmoid(),
nn.Linear(84, num_classes), # Output: 84 → 10
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
# 示例使用
model = LeNet5()
input = torch.randn(1, 1, 32, 32) # 模拟输入(batch=1, channel=1, H=32, W=32)
output = model(input)
print(output.shape) # 输出:torch.Size([1, 10])
六、应用场景与变体
- 经典场景:手写数字识别(MNIST)、邮政编码识别。
- 现代变体:
- 激活函数替换为ReLU以加速训练。
- 使用最大池化(Max Pooling)替代平均池化。
- 添加Dropout或BatchNorm层防止过拟合。
LeNet虽结构简单,但其设计思想深刻影响了后续的AlexNet、VGG等网络,是深度学习发展史上的里程碑。
热门推荐
一吃辣就满头大汗是怎么回事?
传媒类专业就业方向有哪些 毕业就业情况如何
智库报告 | 以更加强烈的创新意识应对传媒产业发展新趋势
看完这篇文章,全面了解“土壤有机质”!
土壤中有机质的来源及其作用是什么?
公积金利率2024下调! 广东广州2024下调个人住房公积金贷款利率最新消息
文学作品人物形象赏析—以诸葛亮为例
宝宝睡觉总哼唧、扭动,要不要干预?
把学生的身心健康贯穿于教育全过程
美国鸡蛋价格暴涨38%,中国市场同步上涨但涨幅温和
是追求梦想的“少年”,也是挑战现实的“雄狮”——电影《雄狮少年》影评
高血压什么时间吃药最好
三角形中线的奇妙旅程:探索几何世界的奥秘
旧电瓶个人修复方法(电瓶没电了怎么激活)
义齿正确的使用方法是什么?活动义齿该如何维护?
如何让脑子变聪明
每天一点心理学:空白效应(下钩子,拿捏人性的法则)
王者荣耀账号价值评估的标准流程
胆囊息肉的形成原因与治疗方法
中国超算:拓展应用场景 澎湃强劲动力
艾草的正确使用方法
现在完成时的基本用法-运用方法-如何运用
如何有力辨别藏红花的真伪
前端常用的几种在线代码编辑器各有什么优势
马铃薯与米饭:哪个含更多热量?
黄蜡石手串盘玩技巧与价格指南
充电时如何避免损坏手机电池
充电桩接触电压和跨步电压防护
康乃馨:象征母爱与美好生活的花卉魅力探讨
二月初九:潮汕传统节日里的民俗文化与祈福愿景