经典卷积神经网络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等网络,是深度学习发展史上的里程碑。
热门推荐
最好养的室内盆栽植物有哪些
跪趴着对患有腰椎间盘突出的效果如何
精神病鉴定程序详解:从基础到司法应用
财务会计部门的OKR案例:从预算编制到审计的实践指南
DirectX是什么?DirectX的作用和功能详解
自然分娩三部曲——了解产程 顺利分娩
大模型训练之训练数据准备,即怎么准备高质量的训练数据集?
周易运势测算方法有哪些
去华山旅游要花多少钱?全面费用解析
傻瓜式四季色彩自测:来判断你穿什么颜色最好看
当实习任务过于繁重时,如何合理安排时间和提高效率
如果在实习中遇到工作压力过大的情况,有哪些缓解方法
吸引贵人的三个秘诀:善念、修炼与突破
多晶硅和单晶硅全面解析:晶体特性解密,技术路线对比
杭州一小区房价暴跌近半,专家预测未来10年楼市分化加剧
千余块民房拆下来的长城砖“回家”,将“再塑”将军关
银行的个人货币市场账户是什么?
仓鼠怀孕时需要用到的药品有哪些?
这段温情的医患故事,由两位崇明人共同书写
氟斑牙怎么治疗要花多少钱
人际交往重在真诚
三月三节的起源:从上巳节到春浴日
职业病三级防控措施:守护员工健康的有效途径
慢性肾功能衰竭的临床症状和表现有哪些
形容爱而不得的诗句(“爱而不得”用诗词怎么表达,句句催泪)
一曲《碎心恋》,唱尽爱情的苦涩与无奈
CPO薪资倒挂CEO,创业公司薪酬情况大起底
志愿者团队如何起名
查询自己的医疗保险:了解保障范围与权益
成长的伙伴:如何与孩子一起享受学习和成长的乐趣