LeNet5模型原理讲解-手写代码解析LeNet5模型

PyTorch实战MNIST手写数字识别:LeNet-5模型详解 卷积神经网络(CNN)作为计算机视觉的核心技术,通过局部连接和权值共享显著提升了图像识别效率。LeNet-5作为最早的CNN架构之一,其包含的卷积层、池化层和全连接层构成了经典特征提取范式。在PyTorch框架下实现时,动态计算图机制使得模型调试更加直观,配合Torchvision提供的数据预处理管道能快速构建端到端训练流程。针对MNIST这类标准数据集,合理运用数据增强和学习率调度等技巧,即使使用基础GPU设备也能在10个epoch内达到98%以上的识别准确率。该案例不仅适用于入门深度学习,也为后续迁移学 阅读详情

LeNet-5 是由 Yann LeCun 于 1998 年提出的经典卷积神经网络(CNN),被视为深度学习卷积网络的开山鼻祖,主要用于手写数字识别(MNIST 数据集)。MNIST 准确率:约 99.2%。第一个成功商用的 CNN(银行手写支票识别),后续 AlexNet、VGG、GoogLeNet、ResNet 均沿用其核心范式

核心创新

  1. 局部连接:只连接局部感受野,而非全局全连接
  2. 权值共享:同一卷积核在整张图复用,大幅减少参数
  3. 池化(下采样):降维、保留特征、增强平移不变性
  4. 多层卷积-池化堆叠:分层提取简单→复杂特征

整体结构

LeNet-5 中的 5表示 卷积和全连接的个数, 没有池化一毛儿钱的关系:
输入层 → C1(卷积)→ 池化→ C2(卷积)→池化→ C3(卷积)→ F4(全连接)→F5 输出层

letnet5

C1 卷积层
  • 卷积核:6 个 5×5 卷积核,步长 1,无填充
  • 输出:28×28×6(32−5+1=28)
  • 激活:Tanh
  • 参数量:6×(5×5+1) = 156
池化层(下采样)
  • 池化:2×2 平均池化,步长 2
  • 输出:14×14×6(28/2=14)
  • 参数量:6×(1+1) = 12
C2 卷积层(关键:稀疏连接)
  • 卷积核:16 个 5×5,步长 1,无填充
  • 输出:10×10×16(14−5+1=10)
  • 参数量:约 1516
池化层
  • 池化:2×2 平均池化,步长 2
  • 输出:5×5×16(10/2=5)
  • 参数量:16×2 = 32
C3 卷积层
  • 卷积核:120 个 5×5,步长 1,无填充
  • 输出:1×1×120(输入 5×5,卷积后变成 1×1)
  • 本质:等价于 全连接层
  • 参数量:120×(5×5×16+1) = 48120
F4 全连接层
  • 神经元:84 个
  • 输入:120 维 → 全连接 → 84 维
  • 激活:Tanh
  • 参数量:120×84+84 = 10164
F5 输出层(Output)
  • 神经元:10 个(对应 0–9)
  • 原始:RBF(径向基函数)
  • 现代:Softmax 输出概率

论文代码复现

B站硬核手写letnet5模型

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt

class LeNet5(nn.Module):
    def __init__(self, num_classes=65):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1, padding=0)
        self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1, padding=0)
        self.pool2 = nn.AvgPool2d(kernel_size=2, stride=2)
        self.conv3 = nn.Conv2d(16, 120, kernel_size=5, stride=1, padding=0)
        self.fc4 = nn.Linear(120, 84)
        self.fc5 = nn.Linear(84, num_classes)

    def forward(self, x):
        x = self.pool1(torch.tanh(self.conv1(x)))
        x = self.pool2(torch.tanh(self.conv2(x)))
        x = torch.tanh(self.conv3(x))
        x = x.view(x.size(0), -1)
        x = torch.tanh(self.fc4(x))
        x = self.fc5(x)
        return x

if __name__ == '__main__':
    model = LeNet5(num_classes=65)
    # 1张图片  1个通道  高32,宽32
    test_input = torch.randn(1, 1, 32, 32)
    output = model(test_input)
    print("input:", test_input.shape)
    print("output:", output.shape)

现代常用变体

  • 把 平均池化 → 最大池化
  • 激活函数用 ReLU 替代 Tanh
  • 输出层用 Softmax + CrossEntropyLoss

实战练习

import torch
import torch.nn as nn
import torch.optim as optim  # 优化算法
import torchvision.transforms as transforms
from torchvision.datasets import MNIST
# 数据集
import torch.utils.data as data




plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 选择是显卡还是cpu
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("using {} device.".format(device))


# 下载数据集,需要数据的,因为下载过了
train_datasets = MNIST('data', train=True, transform=transforms.ToTensor(), download=True)
test_datasets = MNIST('../data', train=False, transform=transform)

# 数据集加载
train_loader = data.DataLoader(train_datasets, batch_size=32, shuffle=False)
test_loader = data.DataLoader(test_datasets, batch_size=32, shuffle=False)

class LeNet5(nn.Module):
    def __init__(self):
        super().__init__()
        # - **输入**:**32×32×1**(灰度图,单通道)
        # MNIST 原图是 28×28, padding=2 论文中填充为 32×32 以保留更多边界特征。
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        # 第二次卷积
        self.conv2 = nn.Sequential(
            nn.Conv2d(6, 16, 5),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
		# 第三层使用的 全连接没有 使用论文的卷积
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    # 定义前向传播,输入为x
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = torch.flatten(x, 1)   # 展开(flatten) 变成全连接网络需要的输入,可以使用view改变张量维度        # 全连接 然后激活
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x


# 创建模型net
net = LeNet5()
# 交叉损失函数
loss_function = nn.CrossEntropyLoss()
# Adam优化器 学习率0.01
optimizer = optim.Adam(net.parameters(), lr=0.001)

# 开始训练 0-10 循环每次
# 定义模型保存路径和文件名
model_path = 'LeNet5.pth'
arr_loss = []
# 训练模型
def train_Model(net, train_loader):
    net.train()
    for epoch in range(5):
        for i, (images, labels) in enumerate(train_loader):
            outputs = net.forward(images)
            # 获取损失函数
            loss = loss_function(outputs, labels)
            # 反向更新
            loss.backward()
            # 更新参数
            optimizer.step()
            # 梯度清零
            optimizer.zero_grad()
            arr_loss.append(loss.item())
            if (i+1) % 200 == 0 or i==0:
                print('[%d, %5d] loss函数->: %.3f' % (epoch + 1, i + 1, loss.item()))
#     保存模型
torch.save(net.state_dict(), model_path)


# 测试模型
def test_Model(net, test_loader):
    # # 把模型从训练模式,设置为测试模式
    net.eval()
    # 模型不可能100% 准确,
    # 使用测试集,计算准确率
    # 默认准确度是0
    correct = 0
    with torch.no_grad():
        # 把测试集,一个一个的取出来,计算准确度
        for i, (img, labels) in enumerate(test_loader):
            outputs = net.forward(img)
            # 找到最大可能性的索引
            pred = torch.argmax(outputs, dim=1)
            correct = correct + torch.sum(torch.eq(pred, labels)).numpy()
        print(correct / len(test_datasets))
        # 测试样例
    examples = iter(test_loader)
    # 显示真实数据的结果  32,1,28,28
    imgs, labels = next(examples)
    py = net.forward(imgs)
    out = torch.argmax(py, dim=1).numpy()
    fig = plt.figure()
    for i in range(16):
        plt.subplot(4, 4, i + 1)
        plt.tight_layout()
        plt.imshow(imgs[i][0], cmap='gray', interpolation='none')
        plt.title("Prediction: {}".format(out[i]))
        plt.xticks([])
        plt.yticks([])
    plt.show()
    print('Finished Training')
    plt.show()

# 存在,直接加载模型
if os.path.exists(model_path):
    # 加载已经训练好的模型 文件地址
    net.load_state_dict(torch.load(model_path))
    # 测试已经训练好的模型
    test_Model(net, test_loader)
else:
    # 训练模型,保存模型
    train_Model(net, train_loader)


卷积神经网络的开端:LeNet−5 LeNet-5是最早的卷积神经网络之一,由Yann LeCun于1998年提出用于手写数字识别。文章首先介绍了全连接神经网络的原理及其计算量大的缺陷,然后详细阐述了卷积神经网络如何通过局部连接和权值共享显著减少参数数量。LeNet-5采用"卷积-池化"交替结构:第一层使用6个5×5卷积核提取特征,第二层进行2×2平均池化降维,第三层再用16个5×5卷积核提取更复杂特征,最后通过全连接层输出分类结果。这种架构既保留了图像空间结构,又通过池化获得平移不变性,为后续深度学习模型奠定了基础。 阅读详情

相关推荐

LeNet-5手写字体识别-Keras序贯模型完整代码

LeNet-5手写字体识别-Keras序贯模型完整代码,可到网址:https://www.cnblogs.com/ailex/p/9605395.html 直接查看

【深度学习】LeNet-5简介及代码实现(PyTorch)

LeNet代码复现,MNIST数据集,pytorch

fzyz123的博客 4043

tensorflow实现LeNet-5的卷积神经网络

里面包含mnist数据集,不用再去下载,程序直接能用。由于model文件夹里有训练好的模型,可以直接跑测试,由于只跑了6000轮训练,不到完整的3W轮,所以只达到了98.8%,你们可以自己训练完一整套,能达到99.*%的准确率。若不满意,那自己调超参数 (初试的指数衰减率 和 每次衰减比率),好了,下次上传迁移学习的代码,下回见,

1.Pytorch实现LeNet-5

Pytorch实现LeNet-5,各层详解

m0_51941269的博客 1991

从零构建腾讯滑块验证码破解引擎:逆向工程与实战对抗

本文深入解析腾讯滑块验证码(原天御验证码)的防护机制,包括环境感知层、行为分析层和验证决策层的核心技术。通过JSVMP虚拟机保护、轨迹验证算法和动态加密体系,腾讯验证码实现了高效的人机识别。文章还提供了安全研究实践指南,涵盖环境模拟和验证码识别方案,并探讨了防御对抗的演进趋势与合规研究建议。

rl6adventurer的博客 831

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

深度学习---卷积神经网络之LeNet5(TensorFlow 代码实现)

深度学习---卷积神经网络之LeNet5(TensorFlow 代码实现)

weixin_44042453的博客 3588

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1227

PyTorch实现LeNet-5网络模型

PyTorch实现LeNet-5网络模型

IT菜鸟 746

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 337

Claude Code vs Codex实战对比:哪个更适合你的Next.js项目?(含真实案例)

本文通过两个真实的Next.js项目案例,深度对比了Claude Code与Codex在UI实现和业务逻辑构建中的表现。Claude Code在代码质量、设计还原度和架构完整性方面优势明显,适合对可维护性要求高的生产级项目;而Codex则以快速响应和低成本见长,更适合原型开发或内部工具。文章提供了基于项目类型、团队能力和成本效益的详细选择策略。

weixin_29201859的博客 811

卷积神经网络:LeNet网络手写数字识别代码实践

介绍LeNet网络,Mnisit数据集训练,并在手机拍摄的数字进行识别

qq_45161895的博客 1376

Python 爬虫实战:Boss直聘 Python 岗位招聘数据爬取

本文介绍了一个Python爬虫项目,用于抓取Boss直聘平台的Python岗位招聘数据并进行可视化分析。项目采用requests库发送POST请求,通过抓包分析获取JSON接口,绕过HTML解析直接获取结构化数据。主要内容包括: 接口分析:找到关键POST接口,解析请求头和JSON参数格式 环境准备:安装requests/pandas/matplotlib/pyecharts等依赖库 核心实现: 手动获取登录Cookie 构建请求头和城市代码映射 实现分页抓取职位列表数据 项目特色在于直接解析JSON接口而

u014481728的博客 298

LeNet-5详解

一、前言 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 本文将从卷积神经网络结构的基础说起,详细地讲解每个网络层。 论文下载:请到文章结尾处下载。 二、卷积神经网络(Convolutional Neural Network, CNN) 在讲解LeNet-5之前,让我们先看下CNN。卷积神经网络能够很好的利用图像的结构信息。LeNet-5是一个较简单的卷积神经网

ac540101928的专栏 5652

AI Agent开发第84课-paddleocr-vl全网唯一最全本地化布署教程

本文详解 PaddleOCR-VL 本地化布署全过程,指出为何在真实生产环境中 PaddleOCR-VL 更稳定、更易部署、更贴近工程落地。同时还会详细比较与 DeepSeek-OCR 的核心差异,为全网独家介绍paddleocr-vl的本地部署实战指南。

打造全国最全的AI Agent开发知识领域的博客 5969

基于LUT表对鱼眼图像进行畸变校正

当然也可以进行图像的畸变校正操作,已知相机的焦距为fx/fy,光心为cx/cy,像素大小为p(单位mm/pixel)对于畸变校正结果图中像素点(u,v),其对应的原图中的像素坐标(u',v')的计算流程描述如下。1)假设无畸变相机成像模型的焦距和光心与原相机相同,计算得到无畸变相机成像模型中归一化平面坐标(X,Y,Z),其中X=(u-cx)/fx,Y=(v-cy)/fy,Z=1。这里x'/y'的单位为像素。

On my way 639

【deeplearning】Pytorch实战1:卷积神经网络(LeNet-5)手写数字识别 (MNIST数据集)

吴恩达机器学习课程笔记 机器学习定义 监督学习和无监督学习 单变量线性回归 模型表示(model representation) 代价函数 梯度下降 线性回归中的梯度下降 凸函数(convex function) 多变量线性回归 特征缩放(feature scaling) 学习率(learning rate) 特征和多项式回归 正规方程(normal equation) 逻辑回归(logistic...

k的博客 3828

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

PyTorch入门实战|LeNet5手写数字识别

本文介绍了使用PyTorch实现LeNet5模型进行MNIST手写数字识别的完整流程。主要内容包括:1) 解析卷积层和全连接层的关键参数;2) 详细讲解LeNet5模型搭建过程,包含5层网络结构;3) 演示MNIST数据集的加载和预处理方法;4) 实现模型训练和评估的核心代码,涵盖梯度计算、损失函数和优化器使用。通过该实战项目,读者可以掌握PyTorch基础操作和CNN模型的实现原理,最终完成一个准确率较高的手写数字识别系统。

Friend__AA的博客 1009

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

caffe模型(1):LeNet模型讲解

引言: LeNet作为入门级caffe网络模型,是用来识别手写数字的最经典的卷积神经网络,Yann LeCun于1998年设计提出,手写数字识别系统LeNet-5在20世纪90年代广泛应用于银行手写数字识别。 1.模型简介 如图所示,LeNet-5卷积神经网络整体框架较小,包含了卷积层、池化层、全连接层。包含输入输出层在内一共8层,每一层包含多个参数(权重),C层为卷积层...

qq_39501363的博客 683

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LeNet-5

LeNet-5前言一 卷积神经网络(Convolutional Neural Network, CNN)1 卷积层2 池化层二 LeNet-51 INPUT层-输入层2 C1层-卷积层3 S2层-池化层(下采样层)4 C3层-卷积层5 S4层-池化层(下采样层)6 C5层-卷积层7 F6层-全连接层8 Output层-全连接层总结 前言 LeNet-5 出自论文 Gradient-Based L...

Joanna的博客 914

PyTorch实战:LeNet-5手写数字识别

LeNet-5:3 卷积 + 2 全连接,手写数字识别经典模型Conv2d:提取图像特征,控制通道与尺寸Linear:分类输出,映射为 10 个数字类别训练流程:数据加载 → 前向传播 → 计算损失 → 反向更新 → 评估效果:MNIST 上轻松达到 98%+ 准确率。

cy2656557959的博客 639

卷积池化与LeNet5网络模型

1 前言 经过前面三篇文章的介绍,我们已经知道了卷积的原理、卷积的计算过程以及池化的原理和过程等。在接下来的这篇文章中,笔者将开始介绍如何通过Pytorch这一深度学习框架来实现卷积和池化的操作,以及各个API的使用介绍和说明。最后,笔者还会介绍卷积神经网络的入门级网络结构LeNet5,我们也将会通过LeNet5这个网络来完成fashion mnist数据集的分类任务。 2 API接口介绍 在Pytorch中,对于网络中的一些基本功能函数(例如:卷积、池化、激活函数等)都被放在了torch.nn.funct

空字符 1896

学习LeNet(网络讲解+代码)

阅读LeNet论文 LeNet原论文地址 原论文共分了11个部分,我们所听说的LeNet-5是在Section II第二部分讲解的,其他部分可以自行阅读论文。 不算输入层,LeNet-5一共有7层网络

codeswarrior的博客 725

Lenet -5 神经网络详解

网络解析(一):LeNet-5详解 5 2,211 °CA+所属分类:深度学习摘要LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。一、前言LeNet-5出自论文Gradient-Based Learning Applied to Document Recognit...

hellocsz的博客 8960

LeNet-5深度学习详解:从手写数字识别到代码实战

LeNet-5是由Yann LeCun等人在1998年提出的卷积神经网络(CNN),专门用于手写数字识别。它不仅是第一个成功应用于商业系统的卷积神经网络,更是现代深度学习计算机视觉的"开山鼻祖"。附带完整代码。

weixin_43360025的博客 237

经典卷积神经网络——LeNet-5

原理: LeNet-5[LeCun et al., 1998] 虽然提出的时间比较早,但是是一个非常成功的神经网络模型。基于LeNet-5的手写数字识别系统在90年代被美国很多银行使用,用来识别支票上面的手写数字体。LeNet-5的网络结构图如图: 图片来源于Paper[LeCun et al., 1998] 该图片根据LeNet-5绘制 不计输入层,LeNet-5共有7层,每一层的结构为:...

Soar_Sir的博客 1151
上一篇: LSTM 原理详解手动编写LSTM模型代码
下一篇: Git 提交规范
王_teacher
博客等级 码龄9年 118粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值