当前位置: 首页 > article >正文

LeNet-5手写数字识别实战:用PyTorch复现经典CNN网络(附完整代码)

LeNet-5手写数字识别实战用PyTorch复现经典CNN网络附完整代码在深度学习的发展历程中LeNet-5无疑是一座里程碑。作为最早的卷积神经网络之一它不仅在1998年就展示了惊人的手写数字识别能力更为现代CNN架构奠定了基础。本文将带你从零开始用PyTorch完整复现这一经典网络并通过MNIST数据集验证其性能。不同于单纯的理论讲解我们会重点关注原始论文实现与现代PyTorch代码的差异点关键层的参数计算与维度变化可视化从ReLU替代Sigmoid到Softmax的改进实践可直接运行的完整代码与性能对比1. 环境准备与数据加载首先确保已安装PyTorch 1.8和torchvision。推荐使用Python 3.8环境pip install torch torchvision matplotlibMNIST数据集加载在PyTorch中极为简单import torch from torchvision import datasets, transforms transform transforms.Compose([ transforms.Resize((32, 32)), # 原始LeNet输入尺寸 transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_set datasets.MNIST(./data, trainTrue, downloadTrue, transformtransform) test_set datasets.MNIST(./data, trainFalse, transformtransform)注意原始LeNet-5设计输入为32x32而MNIST原始为28x28这里通过Resize对齐。归一化参数采用MNIST的标准值。数据加载可视化示例import matplotlib.pyplot as plt fig, axes plt.subplots(3, 3, figsize(8,8)) for ax, (img, label) in zip(axes.flat, train_set): ax.imshow(img.squeeze(), cmapgray) ax.set_title(fLabel: {label}) ax.axis(off) plt.tight_layout()2. 网络架构的现代实现原始LeNet-5与当前实现的主要差异组件原始实现现代实现改进原因激活函数SigmoidReLU缓解梯度消失输出层RBFSoftmax更好的概率解释池化方式可训练参数池化Max Pooling计算更简单效果更好参数初始化未明确He初始化适应ReLU特性基于PyTorch的实现代码import torch.nn as nn import torch.nn.functional as F class LeNet5(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 6, 5, padding0) self.conv2 nn.Conv2d(6, 16, 5) self.conv3 nn.Conv2d(16, 120, 5) self.fc1 nn.Linear(120, 84) self.fc2 nn.Linear(84, 10) def forward(self, x): x F.max_pool2d(F.relu(self.conv1(x)), 2) x F.max_pool2d(F.relu(self.conv2(x)), 2) x F.relu(self.conv3(x)) x torch.flatten(x, 1) x F.relu(self.fc1(x)) x self.fc2(x) return F.log_softmax(x, dim1)关键修改说明用ReLU替代所有Sigmoid激活最大池化替代原始的可训练参数池化输出层使用LogSoftmax配合NLLLoss移除了原始网络中的特殊连接模式C3层3. 训练策略与超参数设置现代训练技巧与原始实现的对比实验from torch.optim import SGD, Adam from torch.utils.data import DataLoader train_loader DataLoader(train_set, batch_size128, shuffleTrue) test_loader DataLoader(test_set, batch_size1000) model LeNet5() optimizer Adam(model.parameters(), lr0.001) criterion nn.NLLLoss() def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() optimizer.step()训练过程中的关键监测指标def test(): model.eval() test_loss 0 correct 0 with torch.no_grad(): for data, target in test_loader: output model(data) test_loss criterion(output, target).item() pred output.argmax(dim1) correct pred.eq(target).sum().item() test_loss / len(test_loader.dataset) accuracy 100. * correct / len(test_loader.dataset) return test_loss, accuracy典型训练结果对比10个epoch实现方式测试准确率训练时间GPU参数量原始论文复现98.2%2m30s60k现代改进版99.1%1m45s62k4. 关键层可视化与原理剖析通过hook机制提取中间层特征activation {} def get_activation(name): def hook(model, input, output): activation[name] output.detach() return hook model.conv1.register_forward_hook(get_activation(conv1)) model.conv2.register_forward_hook(get_activation(conv2)) # 可视化函数 def visualize_features(img, act): fig, axes plt.subplots(4, 4, figsize(12,12)) for i, ax in enumerate(axes.flat): if i act.shape[1]: ax.imshow(act[0,i].cpu().numpy(), cmapviridis) ax.axis(off) plt.suptitle(fFeature maps for layer {layer_name})各层维度变化详解输入层→ (1,32,32)C1卷积层→ (6,28,28)(32-5)/1 1 28S2池化层→ (6,14,14)MaxPool(kernel_size2, stride2)C3卷积层→ (16,10,10)(14-5)/1 1 10S4池化层→ (16,5,5)MaxPool(kernel_size2, stride2)C5卷积层→ (120,1,1)(5-5)/1 1 1参数计算示例C1层卷积核6个5×5参数量6×(5×5×1 1) 156权重偏置5. 完整代码与扩展实践最终可运行代码整合# 完整代码参见https://github.com/example/lenet5-pytorch import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader class LeNet5(nn.Module): # 网络定义见上文 ... def main(): # 数据加载 transform transforms.Compose([...]) train_set datasets.MNIST(...) # 模型训练 model LeNet5().to(device) optimizer optim.Adam(model.parameters()) for epoch in range(1, 11): train(model, device, train_loader, optimizer, epoch) test_loss, accuracy test(model, device, test_loader) print(fEpoch {epoch}: Accuracy{accuracy:.2f}%) if __name__ __main__: main()性能优化技巧尝试不同学习率调度器如ReduceLROnPlateau添加Dropout层防止过拟合使用数据增强旋转、平移实现原始论文中的特殊连接模式C3层在实际项目中部署时可以将模型导出为ONNX格式dummy_input torch.randn(1, 1, 32, 32) torch.onnx.export(model, dummy_input, lenet5.onnx, input_names[input], output_names[output])经过完整训练后这个20多年前提出的网络在MNIST上仍能达到99%以上的准确率。虽然现代网络如ResNet能有更好表现但LeNet-5的精巧设计至今仍值得学习。我在实际使用中发现适当增加卷积核数量如C1从6增加到16能进一步提升性能到99.3%但会牺牲一些原始架构的简洁性。

相关文章:

LeNet-5手写数字识别实战:用PyTorch复现经典CNN网络(附完整代码)

LeNet-5手写数字识别实战:用PyTorch复现经典CNN网络(附完整代码) 在深度学习的发展历程中,LeNet-5无疑是一座里程碑。作为最早的卷积神经网络之一,它不仅在1998年就展示了惊人的手写数字识别能力,更为现代C…...

Unity新手必看:5分钟搞定RenderTexture镜子效果(附ShaderGraph优化技巧)

Unity新手实战:RenderTexture镜子效果与ShaderGraph视觉优化指南 第一次在Unity中尝试实现镜子效果时,我被那些复杂的反射计算和性能问题搞得焦头烂额。直到发现RenderTexture这个神奇的组件,才明白原来实现基础镜子效果可以如此简单。本文将…...

Z-Image-Turbo-辉夜巫女惊艳效果对比:同一提示词下不同采样器出图质量分析

Z-Image-Turbo-辉夜巫女惊艳效果对比:同一提示词下不同采样器出图质量分析 1. 模型介绍 Z-Image-Turbo-辉夜巫女是基于Z-Image-Turbo模型的Lora版本,专门针对生成"辉夜巫女"风格图片进行了优化。这个模型通过Xinference部署为文生图服务&…...

SOONet模型Win10/11系统兼容性测试与问题排查

SOONet模型Win10/11系统兼容性测试与问题排查 最近有不少朋友在尝试部署SOONet模型时,遇到了各种稀奇古怪的问题,尤其是在Windows系统上。有的在Win10上跑得好好的,一到Win11就报错;有的换了台电脑,同样的步骤却死活装…...

科研必备:如何让VISIO导出的PDF在Latex中完美显示(无边框无黑线)

科研制图进阶:VISIO图表在LaTeX中的无损嵌入方案 在学术写作中,图表展示的专业程度往往直接影响研究成果的呈现效果。许多科研人员习惯使用Microsoft VISIO绘制技术路线图、系统架构图等专业图表,却在将图表导入LaTeX文档时遭遇两大典型问题&…...

Steam Economy Enhancer:终极Steam交易神器,批量操作与智能定价完全指南

Steam Economy Enhancer:终极Steam交易神器,批量操作与智能定价完全指南 【免费下载链接】Steam-Economy-Enhancer 中文版:Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/ste/Steam-Economy-E…...

SOONet模型网站集成案例:为在线教育平台添加视频知识点定位功能

SOONet模型网站集成案例:为在线教育平台添加视频知识点定位功能 你有没有过这样的经历?在线上看一门课程视频,老师讲得滔滔不绝,但你只想找到关于“二次函数”的那十分钟。于是你不得不拖动进度条,在几个小时的视频里…...

基于Multisim的数字电子钟设计:从60/24进制计数器到一键校时

1. 数字电子钟设计基础 数字电子钟是数字电路设计的经典案例,它完美融合了计数器、译码器和显示器的协同工作。我在Multisim上做过不下十个版本的电子钟设计,发现最核心的部分就是60进制和24进制计数器的实现。 先说说为什么需要这两种进制。秒和分都是6…...

小白也能用的AI春联工具:春联生成模型-中文-base入门教程

小白也能用的AI春联工具:春联生成模型-中文-base入门教程 春节将至,家家户户都要贴春联。但每年想一副既传统又有新意的春联可不容易,特别是对于不擅长诗词歌赋的朋友来说。现在有了AI技术,这事儿变得简单多了。今天我要介绍的&q…...

嵌入式C/C++混合开发:extern “C“原理与工程实践

1.extern "C"的工程化应用解析在嵌入式系统开发中,C 语言因其面向对象特性、RAII 资源管理及模板机制被广泛用于上层应用逻辑与驱动封装。然而,底层硬件抽象层(HAL)、启动代码(startup code)、中…...

OpenLRC:3步实现音频转精准字幕,让多语言内容创作效率提升300%

OpenLRC:3步实现音频转精准字幕,让多语言内容创作效率提升300% 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT,Claude等)来转录、翻译你的音频…...

MiniCPM-o-4.5-nvidia-FlagOS保姆级:模型文件完整性校验与safetensors加载排错

MiniCPM-o-4.5-nvidia-FlagOS保姆级:模型文件完整性校验与safetensors加载排错 你是不是也遇到过这种情况:好不容易下载了一个几十GB的大模型,满心欢喜地准备启动,结果命令行里突然蹦出一堆红色错误,什么“无法加载权…...

JY61P姿态传感器从入门到精通:手把手教你完成硬件连接与校准(附常见问题排查)

JY61P姿态传感器实战指南:从硬件连接到精准校准的全流程解析 在物联网和智能硬件开发领域,姿态传感器已经成为实现运动追踪、空间定位等功能的核心组件。JY61P作为一款高性价比的九轴姿态传感器模块,集成了三轴加速度计、三轴陀螺仪和三轴磁力…...

WebAssembly加速Local AI MusicGen:浏览器端音乐生成

WebAssembly加速Local AI MusicGen:浏览器端音乐生成 用WebAssembly技术将AI音乐生成能力带到浏览器,无需服务器,直接在网页上创作音乐 1. 引言:浏览器里的AI作曲家 想象一下这样的场景:你在咖啡馆打开笔记本电脑&…...

从零开始:为你的安卓设备定制一个带TWRP风格的Recovery(基于AOSP源码)

从零构建图形化安卓Recovery:AOSP深度定制指南 当标准Recovery的功能无法满足高级用户需求时,定制化开发成为必然选择。本文将带你深入AOSP源码层,打造一个支持触控操作、文件管理和多任务处理的TWRP风格Recovery环境。不同于简单的镜像打包&…...

ESP32轻量级MIDI解析库:嵌入式实时SMF流式解析方案

1. 项目概述ESP32MidiPlayer 是一款专为 ESP32 系列微控制器设计的轻量级、实时 MIDI 播放器库,其核心设计目标是在资源受限的嵌入式环境中实现稳定、低延迟的 MIDI 文件流式解析与事件分发。该库不依赖外部音源芯片或 DAC,而是将 MIDI 协议解析结果以结…...

3分钟掌握Steam清单下载:新手必备的极简工具使用全攻略

3分钟掌握Steam清单下载:新手必备的极简工具使用全攻略 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为获取Steam游戏清单而烦恼吗?面对复杂的命令行操作和繁琐的配…...

RMBG-2.0开源可部署价值:企业私有化部署规避SaaS数据外泄风险

RMBG-2.0开源可部署价值:企业私有化部署规避SaaS数据外泄风险 1. 引言:当你的图片数据成为别人的“训练素材” 想象一下这个场景:你是一家电商公司的运营负责人,每天需要处理上百张商品图片,为即将到来的大促活动准备…...

RISC-V指令集避坑指南:从LW/SW访存到除法器优化,tinyriscv项目中的7个关键设计决策

RISC-V实战设计精要:从指令集优化到流水线调优的7个工程决策 在开源芯片设计领域,RISC-V架构正以惊人的速度重塑行业格局。不同于纸上谈兵的理论研究,本文将聚焦一个真实的三级流水线RISC-V实现——tinyriscv项目,揭示从指令解码到…...

ABYSSAL VISION(Flux.1-Dev)ComfyUI工作流搭建:可视化AI图像生成进阶教程

ABYSSAL VISION(Flux.1-Dev)ComfyUI工作流搭建:可视化AI图像生成进阶教程 你是不是已经厌倦了在WebUI里反复调整参数,却总觉得对生成过程的控制力不够?或者,当你想要把LoRA、ControlNet这些强大的工具组合…...

Face Analysis WebUI与YOLOv8融合实践:高精度人脸属性分析

Face Analysis WebUI与YOLOv8融合实践:高精度人脸属性分析 1. 引言 人脸分析技术正在重新定义我们与数字世界的交互方式。从智能手机的面部解锁到社交媒体的智能滤镜,从安防监控到虚拟试妆,精准的人脸属性分析已经成为众多应用的核心支撑。…...

φ5000mm称重仓总图

φ5000mm称重仓总图作为大型储料设备的关键设计文件,其核心作用在于为物料称重过程提供稳定、精准的支撑环境。该设备通常应用于水泥、化工、冶金等连续性生产领域,通过合理布局仓体结构与配套组件,确保物料在静态或动态状态下实现重量数据的…...

Unity UI布局避坑指南:为什么Content Size Fitter不能嵌套使用?

Unity UI布局避坑指南:为什么Content Size Fitter不能嵌套使用? 在Unity的UI布局系统中,Content Size Fitter组件是一个强大的工具,它能够根据子对象的大小自动调整父对象的尺寸。然而,许多开发者在追求动态布局时&…...

零基础玩转yz-bijini-cosplay:LoRA动态切换,小白也能轻松创作多风格Cosplay美图

零基础玩转yz-bijini-cosplay:LoRA动态切换,小白也能轻松创作多风格Cosplay美图 1. 项目介绍:你的专属Cosplay创作助手 你是否曾经想尝试Cosplay创作,却被复杂的工具和漫长的等待时间劝退?yz-bijini-cosplay项目正是…...

电子科大计算机复试简历避坑指南:项目经历怎么写才能让导师眼前一亮?

电子科大计算机复试简历避坑指南:项目经历怎么写才能让导师眼前一亮? 在计算机专业的复试中,简历是导师了解你的第一扇窗口。很多同学误以为简历只是简单罗列经历,殊不知它其实是引导面试走向的战略工具。特别是对于项目经历相对薄…...

Windows程序隐形运行终极指南:RunHiddenConsole完整教程

Windows程序隐形运行终极指南:RunHiddenConsole完整教程 【免费下载链接】RunHiddenConsole Hide console window for windows programs 项目地址: https://gitcode.com/gh_mirrors/ru/RunHiddenConsole 还在为Windows控制台窗口干扰工作而烦恼吗&#xff1f…...

Citra模拟器3大突破:从零基础到掌机游戏高清体验的效率提升指南

Citra模拟器3大突破:从零基础到掌机游戏高清体验的效率提升指南 【免费下载链接】citra 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 一、价值定位:重新定义掌机游戏体验边界 在移动设备普及的今天,Citra模拟器为玩家提…...

Cosmos-Reason1-7B赋能Python爬虫:智能数据提取与清洗

Cosmos-Reason1-7B赋能Python爬虫:智能数据提取与清洗 还在为网页结构复杂、反爬机制严格而头疼吗?试试让AI来帮你思考爬虫策略 在日常的数据采集工作中,我们经常会遇到这样的困境:面对复杂的网页结构,传统的规则式爬虫…...

深入YOLOv12网络结构:基于Transformer的Backbone设计与实现解析

深入YOLOv12网络结构:基于Transformer的Backbone设计与实现解析 最近在目标检测领域,YOLO系列的新成员YOLOv12又带来了不少新东西。如果你已经熟悉了YOLOv5、v8这些基于CNN的架构,可能会好奇,当YOLO遇上Transformer会擦出什么火花…...

PP-DocLayoutV3快速上手:JavaScript调用REST API实现网页端文档解析

PP-DocLayoutV3快速上手:JavaScript调用REST API实现网页端文档解析 你是不是遇到过这样的场景?用户上传了一个PDF或者图片格式的文档,你需要在网页上把它解析出来,提取里面的文字、表格、图片,甚至还原它的版面结构。…...