基于 LeNet 网络的 MNIST 数据集图像分类
1.LeNet的原始实验数据集MNIST
名称:MNIST手写数字数据集
数据类型:灰度图 (一通道)
图像大小:28*28
类别数:10类(数字0-9)
1.通过torchvision.datasets.MNIST下载并保存到本地为JPEG图片:
下载数据集并保存图片形式(download_mnist.py)
库:sys,os,tqdm
图片命名的格式为:子数据集名_在子数据集中的编号_真实值标签。
图片大小:28*28

2.使用gzip解析MNIST数据集文件parse_mnist.py
MNIST的图片和标签均通过二进制文件进行保存(.gz),无法直接在Windows中查看手写数字的图片和标签,通过gzip解压,转换为numpy数组。
将标签数据转换为one-hot编码:将每个标签转换为一个向量,其中该标签对应的索引位置为 1,其他位置为 0。
one-hot编码
将类别标签转化为一个 长度为类别数的二进制向量,每个类别的位置对应为 1,其它位置为 0。
one-hot编码
将类别标签转化为一个 长度为类别数的二进制向量,每个类别的位置对应为 1,其它位置为 0。
- 数字 0 →
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]- 数字 1 →
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]- 数字 2 →
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
3、预处理数据集(prepare_data.py)
调用parse_mnist函数对原始的mnist数据进行解析,创建数据加载器train_loader
- 归一化:将加载的图像数据除以 255.0,将图像的像素值从 [0, 255] 范围缩放到 [0, 1]。
- 转换为 Tensor:将NumPy 数组转换为 PyTorch 的 Tensor 。
- 重塑图像:将图像数据从 28x28 的二维数组重塑为符合神经网络输入要求的形状 (-1, 1, 28, 28)。
- 创建数据集和数据加载器:
train_dataset = TensorDataset(train_image, train_label)
#TensorDataset:数据集类,将图像和标签数据封装成一个数据集
train_loader=(train_dataset,batch_size=64,shuffle=True)
#DataLoader:数据加载器类,数据集分成小批次,shuffle=True可打乱
2.LeNet神经网络模型
公式
1.N = (W-F+2P)/S+1
卷积后尺寸=(输入-卷积核+加边像素数)/步长 +1
用于计算卷积层/池化层输出的尺寸,参数含义:
N:输出特征图的大小
W:输入特征图的大小
F:卷积核的大小(5*5)
P:填充(padding)的大小,表示在输入的边缘填充多少像素
S: 步长(stride),卷积核每次滑动的步幅
2.输出通道数 = 卷积核组数量
输入通道数=上一层的输出通道数
卷积层通道数逐渐增加
3.输出图像尺度计算
N = (W-F+2P)/S+1
- 第一层:C1卷积层
输入:28*28*1
参数:self.c1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2,stride=1)
输出:28*28*6(padding=2宽高不变,通道数为6)
- 第二层:S2池化层(使图像尺寸减半)
输入:28*28*6
参数:self.s2 = nn.AvgPool2d(kernel_size=2, stride=2,padding=0)
池化核大小默认等于步长,使输出大小是输入大小的一半
输出:14*14*6
- 第三层:C3卷积层
输入:14*14*6
参数:self.c3 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5,padding=0,stride=1)
输出:10*10*16
- 第四层:S4池化层
输入:10*10*16
参数:self.s4 = nn.AvgPool2d(kernel_size=2, stride=2)
输出:5*5*16
- 第五层:C5卷积层
输入:5*5*16
参数self.c5 = nn.Conv2:d(in_channels=16, out_channels=120, kernel_size=5,padding=0,stride=1)
输出:1*1*120
概念
卷积层
卷积核:二维数组
主要功能:对输入数据进行特征提取,卷积操作实质上是把卷积核当滤波器在图像上特征提取。
卷积步骤:
- 卷积窗口从输入数组的最左上方,从左往右、从上到下,依次在输入数组上滑动。
- 窗口中的输入子数组与卷积核按元素相乘并求和,得到输出数组中相应位置的元素。
池化层
基本操作:缩小图片,保留重要特征。不会裁剪删除内容。
池化步骤:
- 池化层对输入数据的局部区域(池化窗口)计算输出,取最大值或平均值,最终降低特征图的尺寸。
最大池化Max Pooling
取局部区域的最大值
作用:保留最明显的特征(边缘、纹理)
平均池化Avg Pooling
取局部区域的平均值
作用:反映特征的整体分布情况。
池化核大小Kernel_size
定义池化窗口的大小
步长stride
控制窗口移动的步长(默认等于池化核大小)
填充padding
在输入特征图的边缘补零:
保持输出大小不变(如 padding=1 可以保持尺寸)。
防止边缘信息丢失
激活函数(非线性函数)
(1)sigmoid函数

输出范围(0,1),适用于输出概率。sigmoid函数清晰地解释神经元激活水平:接近1,更高激活;接近0,较低激活。
应用场景:二分类问题
(2)ReLU激活函数

如果输入x是 正数,ReLU 输出 x本身。
如果输入x是 负数,ReLU 输出 0。
作用:
- 激活函数的作用是让网络学习非线性的特征
- 解决梯度消失问题:Sigmoid 和 Tanh 函数,输入值变的特别大或特别小时,激活函数的梯度接近0.
缺点:
死神经元问题:某些神经元输出 永远是 0 时(也就是当输入总是负数时)。这会导致这些神经元在训练过程中不再被更新
(3)tanh函数


输出范围:(-1,1)
优化算法
ADM算法
AGD随机梯度下降
相关文章:
基于 LeNet 网络的 MNIST 数据集图像分类
1.LeNet的原始实验数据集MNIST 名称:MNIST手写数字数据集 数据类型:灰度图 (一通道) 图像大小:28*28 类别数:10类(数字0-9) 1.通过torchvision.datasets.MNIST下载并保存到本地…...
win11编译llama_cpp_python cuda128 RTX30/40/50版本
Geforce 50xx系显卡最低支持cuda128,llama_cpp_python官方源只有cpu版本,没有cuda版本,所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…...
Spring Boot静态资源访问顺序
在 Spring Boot 中,static 和 public 目录都用于存放静态资源(如 HTML、CSS、JavaScript、图片等文件),但它们在使用上有一些细微的区别。以下是它们的详细对比: 1. 默认优先级 Spring Boot 会按照以下优先级加载静态…...
电脑总显示串口正在被占用处理方法
1.现象 在嵌入式开发过程中,有很多情况下要使用串口调试,其中485/422/232转usb串口是非常常见的做法。 根据协议,接口芯片不同,需要安装对应的驱动程序,比如ch340,cp2102,CDM212364等驱动。可…...
工具介绍《HACKBAR V2》
HackBar V2 是一款功能强大的浏览器渗透测试工具,主要用于测试 SQL 注入、XSS 漏洞、POST 传参等安全场景。以下是其核心功能、用法及实际案例操作的综合介绍: 一、核心功能与用法详解 1. 基础操作 Load URL 功能:将当前浏览器地址栏的 URL …...
Java算法语法学习 美丽子集的数目 - 力扣 Map接口
文章目录 题目解题思路题解统计数组中每个数字按模k分组的出现次数,并保持数值有序作用 **merge(x, 1, Integer::sum)**解释**检查键是否存在**:**合并现有值**: 示例在代码中的应用**计算余数**:**存储余数及其出现次数**: merge 的常见用法统计频率合并字符串合并…...
Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)
1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…...
梯度本质论:从黎曼流形到神经网络的拓扑寻优
一、微分几何框架下的梯度再诠释 在标准数学分析中,梯度被定义为标量场 f : R n → R f:\mathbb{R}^n→\mathbb{R} f:Rn→R的导数张量 ∇ f ( ∂ f ∂ x 1 , . . . , ∂ f ∂ x n ) \nabla f(\frac{\partial f}{\partial x_1},...,\frac{\partial f}{\partial x_n…...
计算机毕业设计SpringBoot+Vue.js网络海鲜市场系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
一文对比RAGFLOW和Open WebUI【使用场景参考】
一、RAGFLOW与Open WebUI RAGFLOW是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不…...
2025年03月07日Github流行趋势
项目名称:ai-hedge-fund 项目地址url:https://github.com/virattt/ai-hedge-fund项目语言:Python历史star数:12788今日star数:975项目维护者:virattt, seungwonme, KittatamSaisaard, andorsk, arsaboo项目…...
实训任务2.2 使用Wireshark捕获数据包并分析
目录 【实训目标】 【实训环境】 【实训内容】 【实训步骤】 1.启动WireShark 2. 使用Wireshark捕获数据包 (1)选择网络接口 (2)捕获数据包 (1)设置Wireshark过滤器并捕获数据包 (2&…...
C# Lambda 表达式 详解
总目录 前言 在C#编程中,Lambda表达式是一种简洁而强大的语法特性,它提供了一种更加灵活和直观的方式来编写匿名函数。无论是在LINQ查询、事件处理还是异步编程中,Lambda表达式都扮演着重要角色。本文将详细介绍Lambda,帮助您更好…...
wordpress自定the_category的输出结构
通过WordPress的过滤器the_category来自定义输出内容。方法很简单,但是很实用。以下是一个示例代码: function custom_the_category($thelist, $separator , $parents ) {// 获取当前文章的所有分类$categories get_the_category();if (empty($categ…...
HTML前端手册
HTML前端手册 记录前端框架在使用过程中遇到的各种问题和解决方案,供后续快速进行手册翻阅使用 文章目录 HTML前端手册1-前端框架1-TypeScript框架2-CSS框架 2-前端Demo1-Html常用代码 2-知云接力3-Live2D平面动画 3-前端运维1-NPM版本管理 1-前端框架 1-TypeScrip…...
vscode mac版本 配置git
首先使用 type -a git查看git的安装目录 然后在vscode中找到settings配置文件,修改git.path...
爬虫Incapsula reese84加密案例:Etihad航空
声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…...
【C#】async与await介绍
1. 实例1 1.1 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {class Program{static void Main(string[] args){Method1();Method2();Console.ReadKey();}public static…...
【银河麒麟高级服务器操作系统实例】虚拟机桥接网络问题分析及处理
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
Vue3路由组件和一般组件 切换路由时组件挂载和卸载 路由的工作模式
路由组件和一般组件 路由组件 一般放到pages或view目录 一般组件 一般放到component目录 切换路由 切换路由时,组件和执行挂载和卸载 路由的工作模式 Hash模式 缺点 1.不美观,路径带#号 优点 1.兼容性好 一般适用于管理系统 History模式 缺点…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
