经典卷积神经网络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等网络,是深度学习发展史上的里程碑。
热门推荐
非正式沟通的重要性与技巧解析
欧空局新一代卫星技术让北极的寒冷真相更加清晰
长期频繁使用漱口水靠谱吗?
可乐成分与人体健康关系研究
可乐生产工艺及质量控制要点探讨
社保公积金缴纳比例 缴纳的重要性
仙人球浇水全攻略:频率、方法与注意事项详解
SpaceX突发,载人飞船取消发射!
汽车驾驶训练模拟器的详细说明
科普|“考前心语”:科学应对考试焦虑的策略
汽车轮胎速度等级如何划分?
春季二三月份,适合种植哪些蔬菜?早春种菜有哪些注意事项?
全谷物食物有哪些?它们对健康有哪些益处?
解锁龟苓膏:儿童食用全攻略
单推拉门和双推拉门的筛选条件
失业保证金是什么?申请条件、领取流程及金额计算方式全解析
教师职业道德与法律责任
卡罗拉CVT变速箱油的更换周期是多久?
干货!师大附中学区房深度解读
MySQL不使用子查询的原因及优化案例
中医辨证:感冒有5种,用药需对证,别等感冒时,“病急乱投医”
有效调节心理情绪 让你在考试中超常发挥
乳化沥青独特的优势在道路建设与维护领域发挥着重要作用
薪资调整申请书的格式有哪些要求?
中医专长医师资格证报考流程及合格标准详解
时速250公里!合池高铁环评公示了
离合器踩不好怎么办?如何提升离合器控制技巧?
剖腹产选竖切横切学问多,安全与美观如何权衡
当交通事故中“次道德”遇上“不道德”,责任如何担?
农村宅基地买卖后如何更名