经典卷积神经网络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等网络,是深度学习发展史上的里程碑。
热门推荐
延迟退休改革的日本样本:成功案例还是潜在问题?
勇士队巴特勒交易大放异彩,库明加复出计划正式启动
刀郎的音乐作品对中国流行音乐有哪些影响?
车辆掉头,需不需要越过斑马线?老司机:这样才正确,安全又合法
《沧浪之水》:官场与人性的深度审视
《楞严经》:理可顿悟,事须渐修
消防安全在身边丨用火、用电、用气安全知识宣传~
探寻绩优股之源:聚焦市场潜力板块与投资策略
OpenCV实战:文本图片去水印并保持文本原始色彩(附源码)
中国重大突破!返老还童或成现实,新发现让衰老细胞成功逆转!
如何补办营业执照?详细流程和所需材料全解析
人民币对日元的波动与经济视角,深度解析与市场展望
吃辣椒除了过瘾居然还有隐藏好处
土地流转的流程是怎样的
如何提升农村消防安全治理水平?昆明市这样做→
肾衰竭引起的高血压如何下降?
便血怎么办?观察要点与应对措施全解析
民事诉讼借钱不还怎么起诉法院
盆景榕树怎么养护和浇水?
用这些行为游戏增进你和宠物的感情(狗狗会爱你入骨,不要错过这些增进感情的方式)
首次交社保需要哪些资料?
如何在水彩画中捕捉四季之美并巧妙展现肤色?
2025厦门有哪些大学?厦门所有大学名单一览表(16所)
践行雷锋精神,徐汇学子做新时代好少年!
大肚子刮油最快的茶
高刷新率显示器升级值吗?用户体验揭秘
“三北”工程筑牢北疆生态屏障
近5年,PANTONE潘通年度色彩应用的斑斓之旅
2035年起禁售燃油车?这里传来最新消息……
不能再多了,减少高考复读生的6条建议