问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

经典卷积神经网络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)

以下是逐层解析:

  1. 输入层(Input Layer)
  • 尺寸:32×32像素的灰度图像(单通道)。
  • 设计目的:适应当时数据集(如MNIST)的预处理需求(MNIST原始图像为28×28,填充至32×32以保留边缘信息)。
  1. 卷积层C1(Convolutional Layer)
  • 操作:卷积运算提取空间特征。
  • 参数
  • 卷积核:6个大小为5×5的滤波器。
  • 步长(Stride):1。
  • 填充(Padding):无(输出尺寸为28×28)。
  • 激活函数:Sigmoid(原始论文使用)。
  • 输出:6个28×28的特征图。
  1. 池化层S2(Subsampling Layer)
  • 操作:平均池化(Average Pooling)降低维度。
  • 参数
  • 池化窗口:2×2。
  • 步长:2。
  • 输出:6个14×14的特征图(尺寸缩小为输入的一半)。
  1. 卷积层C3(Convolutional Layer)
  • 操作:进一步提取高阶特征。
  • 参数
  • 卷积核:16个5×5的滤波器。
  • 步长:1。
  • 填充:无(输出尺寸为10×10)。
  • 激活函数:Sigmoid。
  • 设计细节:滤波器并非全连接,而是通过稀疏连接减少参数量(例如每个滤波器仅连接部分输入特征图)。
  • 输出:16个10×10的特征图。
  1. 池化层S4(Subsampling Layer)
  • 参数:与S2相同(2×2平均池化,步长2)。
  • 输出:16个5×5的特征图。
  1. 全连接层C5(Fully Connected Layer)
  • 操作:将特征图展平为向量,进行非线性组合。
  • 参数
  • 输入维度:16×5×5 = 400。
  • 输出维度:120。
  • 激活函数:Sigmoid。
  1. 全连接层F6(Fully Connected Layer)
  • 参数
  • 输入维度:120。
  • 输出维度:84(设计为与ASCII字符集相关,便于扩展)。
  • 激活函数:Sigmoid。
  1. 输出层(Output Layer)
  • 参数
  • 输入维度:84。
  • 输出维度:10(对应数字0-9的分类)。
  • 激活函数:Gaussian Connection(原始设计)或Softmax(现代实现常用)。

三、核心创新点

  1. 局部感受野(Local Receptive Fields)
  • 卷积核仅覆盖输入图像的局部区域,模拟生物视觉系统的局部感知特性。
  • 减少参数量,提升平移不变性。
  1. 权值共享(Shared Weights)
  • 同一卷积核在整张图像上滑动,共享参数,大幅降低计算复杂度。
  1. 下采样(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等网络,是深度学习发展史上的里程碑。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号