pytorch入门级项目--基于卷积神经网络的数字识别
文章目录
- 前言
- 1.数据集的介绍
- 2.数据集的准备
- 3.数据集的加载
- 4.自定义网络模型
- 4.1卷积操作
- 4.2池化操作
- 4.3模型搭建
- 5.模型训练
- 5.1选择损失函数和优化器
- 5.2训练
- 6.模型的保存
- 7.模型的验证
- 结语
前言
本篇博客主要针对pytorch入门级的教程,实现了一个基于卷积神经网络(CNN)架构的数字识别,带你了解由数据集到模型验证的全过程。
1.数据集的介绍
MNIST数据集是一个广泛用于机器学习和计算机视觉领域的手写数字图像数据集。它是深度学习入门的经典数据集,常用于图像识别任务,特别是手写数字识别。该数据集分为训练集和测试集:
- 训练集:包含60,000张手写数字图像,用于模型的训练。
- 测试集:包含10,000张手写数字图像,用于模型的评估。
2.数据集的准备
Torchvision在torchvision. datasets
模块中提供了许多内置数据集,其中便包含了MNIST数据集,因此可以直接通过torchvision. datasets
直接下载。
root
代表存储路径,此处采用的是相对路径,保存在当前文件所在文件夹的data文件夹下train
用来区分训练集和测试集download
用来表示是否下载数据集
同时我们可以查看其中一条数据,看看该数据及具体形式
import torchvision
trainset=torchvision.datasets.MNIST(root='./data',train=True,download=True)
testset=torchvision.datasets.MNIST(root='./data',train=False,download=True)
trainset[0]
这里我的数据集已经下载好了,所以很快执行好了
(<PIL.Image.Image image mode=L size=28x28>, 5)
通过输出我们可以发现,第一条数据是一个元组,第一个元素表示data(灰度图,大小28*28),第二个元素表示label,指的是该图片的类别,下面我们可以查看每个类别的含义
因此我们可以看到第一张图片表示的就是手写数字5,也可以通过trainset[0][0].show()
进行显示
在进行后续操作前,需要将图片格式由PIL
调整为tensor
类型。
import torchvision
trainset=torchvision.datasets.MNIST(root='./data',train=True,download=True,transform=torchvision.transforms.ToTensor())
testset=torchvision.datasets.MNIST(root='./data',train=False,download=True,transform=torchvision.transforms.ToTensor())
trainset[0][0].shape
至此,数据集准备阶段就算完成了。
3.数据集的加载
在训练深度学习模型时,通常不会一次性将整个数据集输入到模型中,而是将数据集分成多个小批量(mini-batches)进行训练。
import torchtrainloader=torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2)
testloader=torch.utils.data.DataLoader(testset,batch_size=64,shuffle=False)
type(trainloader),len(trainloader),len(trainset)
- batch_size:表示批量大小
- shuffle:表示是否打乱,一般训练集打乱,测试集打乱不打乱都可以
- num_workers:表示多个进程,windows系统可能报错
这里提供解决windows系统中多进程报错的可能解决方案:
加上if __name__ == '__main__':
即可,如果你是用的是jupyter,不用此操作
此时,我们取出一条数据查看类型:
此时我们可以看到,一条数据为torch.Size([64, 1, 28, 28])
,64表示批量大小,1表示该图像单通道,即为灰度图,28*28表示图像大小
我们可以通过tensorboard,查看当前批量的图片
from torch.utils.tensorboard import SummaryWriterwriter=SummaryWriter("./logs")
steps=0
for data in trainloader:# print(data[0].shape)# breakimages,labels=datawriter.add_images('mnist_images',images,steps)steps+=1
writer.close()
此处在环境中需要装tensorboard
conda install tensorboard
或者
pip install tensorboard
然后在终端执行
tensorboard --logdir=logs
即可
4.自定义网络模型
这里我们随便选了一张网络结构图,也可以自行设计
来源:图片来源
4.1卷积操作
这里简单介绍一下卷积的运算方式
4.2池化操作
池化层是子采样的一种具体实现方式,这里我们介绍最大池化
4.3模型搭建
- 由图可知,第一层卷积,输入通道数为1(原始图像为灰度图),输出通道数为6,因为图像大小未发生改变,所以padding=2
- 第二层池化,本文使用的是最大池化
- 第三层卷积,输入通道数为6(上一层卷积的输出),输出通道数为16(由图),因为图像大小未发生改变,所以padding=2
- 第四层池化,使用最大池化
- 全连接层,图示定义了两层
- 定义前向传播函数
- 输出网络结构
class Net(torch.nn.Module):def __init__(self):super(Net,self).__init__()# 第一层卷积层self.conv1=torch.nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5,padding=2)# 第一层池化层self.pool1=torch.nn.MaxPool2d(kernel_size=2,stride=2)# 第二层卷积层self.conv2=torch.nn.Conv2d(in_channels=6,out_channels=16,kernel_size=5,padding=2)# 第二层池化层self.pool2=torch.nn.MaxPool2d(kernel_size=2,stride=2)# 全连接层self.fc1=torch.nn.Linear(in_features=16*7*7,out_features=84)self.fc2=torch.nn.Linear(in_features=84,out_features=10)def forward(self,x):x=self.pool1(torch.nn.functional.relu(self.conv1(x)))x=self.pool2(torch.nn.functional.relu(self.conv2(x)))x=x.view(-1,16*7*7)x=torch.nn.functional.relu(self.fc1(x))x=self.fc2(x)return x
net=Net()
net
5.模型训练
5.1选择损失函数和优化器
对于分类问题,一般选用交叉熵损失CrossEntropyLoss()
,优化器此处我们选用随机梯度下降SGD
5.2训练
我们先对训练集进行一轮训练
running_loss=0
for i,data in enumerate(trainloader,1):inputs,labels=dataoutputs=net(inputs)loss=criterion(outputs,labels)running_loss+=lossoptimizer.zero_grad()loss.backward()optimizer.step()if i%100==0:print('epoch:{} loss:{}'.format(i,running_loss/100))running_loss=0
我们发现loss持续下降,我们训练十轮
running_loss=0
for epoch in range(10):for i,data in enumerate(trainloader,1):inputs,labels=dataoutputs=net(inputs)loss=criterion(outputs,labels)running_loss+=lossoptimizer.zero_grad()loss.backward()optimizer.step()if i%100==0:print('[%d,%5d] loss:%.3f'%(epoch+1,i,running_loss/100))running_loss=0.0
print('Finished Training')
6.模型的保存
7.模型的验证
此处我们选择test数据集一个批次验证
计算整体上的正确率
correct=0
total=0
with torch.no_grad():for data in testloader:images,labels=dataoutputs=net2(images)_,predicted=torch.max(outputs.data,1)total+=labels.size(0)correct+=(predicted==labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
结语
本篇博客通过训练卷积神经网络CNN模型,实现了对数字的识别,希望对你有所帮助
相关文章:
pytorch入门级项目--基于卷积神经网络的数字识别
文章目录 前言1.数据集的介绍2.数据集的准备3.数据集的加载4.自定义网络模型4.1卷积操作4.2池化操作4.3模型搭建 5.模型训练5.1选择损失函数和优化器5.2训练 6.模型的保存7.模型的验证结语 前言 本篇博客主要针对pytorch入门级的教程,实现了一个基于卷积神经网络&a…...
【Java】求绝对值
目录 引言基础方法Math.abs()适用类型与语法代码示例 特殊数值处理复数绝对值(模)大整数与高精度小数 底层实现与性能优化位运算技巧(仅限int类型)最小值溢出与 Math.absExact()解决方案1:手动判断解决方案2࿰…...
简单爬虫:东方财富网股票数据爬取(20231230)
目标网站:https://quote.eastmoney.com/center/gridlist.html#hs_a_board 需求:将东方财富网行情中心不同板块的股票数据爬取下来 目标是将各个选项卡的股票数据全部爬取并以excel文件保存在本地。 查看网页源代码发现并没有目标数据,因此需…...
Vue学习教程-14内置指令
文章目录 前言一、v-text指令二、v-html指令三、v-cloak指令四、v-once指令五、v-pre指令六、其他指令 前言 Vue.js 提供了许多内置指令(Directives),这些指令用于在模板中添加特殊功能。内置指令以 v- 前缀开始。 v-text : 更新元素的 tex…...
Java——抽象类
在Java中,抽象类(Abstract Class) 是一种特殊的类,用于定义部分实现的类结构,同时允许子类提供具体的实现。抽象类通常用于定义通用的行为或属性,而将具体的实现细节留给子类。 1. 抽象类的定义 语法&…...
js数据类型检测
JavaScript的数据类型检测 typeof操作符 适用场景 基本数据类型快速判断:适用于快速判断变量是否为number、string、boolean、undefined、function等基本数据类型。比如在函数参数检查中,若要求传入数字参数,可用typeof来初步判断。函数类型…...
Maven+SSM+SpringBoot+Mybatis-Plus
SSM技术栈:spring6、springmvc、mybatis、springboot3、mybatis-plus、druid; 前端: node、npm、vue 快速掌握:全新SSMSpring BootMyBatis-Plus实战精讲...
【爬虫】request库
文章目录 发送请求响应对象响应数据的方式中文乱码问题响应对象的其他属性或方法 发送带参数的请求headers和查询参数 Requests——发送http请求,获取响应数据 首先,请确保: 已安装 RequestsRequests 是最新的 让我们从一些简单的示例开始…...
Docker内存芭蕾:优雅调整容器内存的极限艺术
title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “🩰💥📊” 当你的容器变成内存吸血鬼时… 🚀 完美内存编排示范 📜 智能内存管家脚本…...
云手机如何进行经纬度修改
云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异,以下是综合多个来源的常用方法及注意事项: 通过ADB命令注入GPS数据(适用于技术用户) 1.连接云手机 使用ADB工具连接云手机服务器,…...
力扣-贪心-53 最大子数组和
思路 先把每一个值都加到当前集合中,记录当前的和,直到当前记录和小于0了,再重置改记录,再次尝试累加 代码 class Solution { public:int maxSubArray(vector<int>& nums) {int res INT32_MIN;int curSum 0;for(in…...
【c语言】函数_作业详解
前言: 对应鹏哥专升本c语言,51集 内容: 找出10个数值中的最大值, #include <stdio.h> //求10个整数中的最大值 int main() {//准备10个整数 //int arr[10] {1,2,3,4,13,6,7,8,9,-2};//用于循环10次int i 0;//也可以自…...
超详细:数据库的基本架构
MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图,可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分,一个是server层,另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...
PCL 边界体积层次结构(Boundary Volume Hierarchy, BVH)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 边界体积层次结构(Boundary Volume Hierarchy, BVH) 是一种高效的空间数据结构,广泛应用于计算机图形学、计算机视觉、机器人学、物理仿真等领域。它的核心思想是通过将空间递归地划分为层次化的包围体(通常是轴…...
【微服务】深入解析spring aop原理
目录 一、前言 二、AOP 概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk动态代理模拟实现 3.2 CGLIB 代理…...
Python爬虫系统搭建教程,从0开始搭建爬虫系统(附安装包)
文章目录 前言一、Python环境搭建1.Python安装2.选择Python开发环境3. 安装必要库 二、基础爬虫构建1. 发送请求获取网页2. 解析网页提取数据 三、使用 Scrapy 框架搭建系统1. 创建 Scrapy 项目2. 生成爬虫3. 编写爬虫代码4. 运行爬虫 四、应对反爬虫机制1. 常见反爬虫手段2. 解…...
linux -对文件描述符的操作dup、fcntl有五种
dup #include<unistd.h> int dup(int oldfd);作用:复制一个新的文件描述符fd 3, int fd1 dup(fd);f指向的是a.txt,fd1指向的也是a.txt从空闲的文件描述符表中找一个最小的作为新的拷贝的文件描述符返回:成功返回新的文件描述符,失败…...
人工智能(AI)的不同维度分类
人工智能(AI)的分类 对机器学习进行分类的方式多种多样,可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的: 1、按数据模态不同:图像,文本,语音,多态等 2、按目标函数不同:判别式模型…...
MySQL的Union和OR查询
这里写目录标题 **1. 创建表和索引****2. 编写 UNION 查询****3. 使用 EXPLAIN 分析查询****4. 分析 EXPLAIN 结果****可能的结果分析**: **5. 验证索引合并****总结****1. UNION 操作的分析****为什么使用临时表?** 2. OR 条件的分析为什么使用索引合并…...
金融业的AI革命——量化交易与智能风控(五)
第五章 AI驱动的智能投顾与普惠金融服务体系 一、智能投顾技术架构的范式革新 1. 技术演进三阶段 阶段核心技术典型应用局限性规则引擎(2015-2020)决策树、专家系统银行理财风险评估自动化(覆盖率98%)无法应对黑天鹅事件机器学习(2020-2023)…...
机动车授权签字人考试题库及答案
一、单选题 11、 资质认定,是指( )以上质量技术监督部门依据有关法律法规和标准、技术规范的规定,对检验检测机构的基本条件和技术能力是否符合法定要求实施的评价许可。资质认定包括检验检测机构计量认证。 A、县级 B、市级 C、地区 D、省级 答案࿱…...
Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因
Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因 一、背景二、查看topic日志信息三、结论四、解决方法一、背景 源头数据库在很短的时间内刷了大量的数据,部分数据在hdfs丢失了 理论上debezium数据采集不会丢失,就需要排查数据链路某个节点是否有数据丢失。 数据…...
鸿蒙学习-
鸿蒙数据传值 //* 传值 //* State /**State创建一个响应式的数据,但不是所有的更改都会引起刷新,只有被框架观察到的修改才会被刷新UI* 1. 基本数据类型如 number string boolean等值的变化修改* 2. Object类型,只会观察到第一层的数据变化或…...
【多模态处理篇五】【DeepSeek文档解析:PDF/Word智能处理引擎】
你知道吗?全球每天产生的PDF文档超过10亿份,但90%的上班族还在用复制粘贴的笨办法处理文档!DeepSeek文档解析引擎就像给你的电脑装上了"文档翻译官",能把PDF/Word里的文字、表格、公式甚至排版样式都变成AI能理解的"语言"。举个真实场景:法务小姐姐用…...
WPS中如何批量上下居中对齐word表格中的所有文字
大家好,我是小鱼。 在日常制作Word表格时,经常需要对表格中的内容进行排版。经常会把文字设置成左对齐、居中对齐或者是右对齐,这些对齐方式都比较好设置,有时我们制作的表格需要把文字批量上下居中对齐,那么怎么操作…...
【LLM】增强大模型推理能力的四种范式
note 增强大模型推理能力的四种范式:推理时间扩展、纯强化学习(RL)、SFTRL、蒸馏(distillation) 。其实这几种方法本质就是SFTRL: 低成本做事就直接推理时间扩展稍微肯付出成本就蒸馏SFT,顺便搞点高质量COT SFT数据高级点就先用GRPO等RL学习…...
2025年华为手机解锁BL的方法
注:本文是我用老机型测试的,新机型可能不适用 背景 华为官方已经在2018年关闭了申请BL解锁码的通道,所以华为手机已经无法通过官方获取解锁码。最近翻出了一部家里的老手机华为畅玩5X,想着能不能刷个系统玩玩,但是卡…...
鸿蒙状态管理概述 v2
状态管理v2 概述状态管理之v2ObservedV2 和 Trace状态管理V1版本对嵌套类对象属性变化直接观测的局限性ObservedV2 和 Trace 使用场景 Local状态管理V1版本State装饰器的局限性 Param状态管理V1版本接受外部传入的装饰器的局限性 OnceEventComputedComputed 使用场景 TypePersi…...
阿里云上的网站配置HTTPS
1. 获取SSL证书 创建证书 下载证书 下载 上传 .key .pem 文件 到 阿里云服务器 /etc/nginx/ssl nginx.conf 配置 server { listen 443 ssl; server_name yuming; ssl_certificate /etc/nginx/ssl/*.pem; ssl_certificate_key /etc/nginx/ssl/*.key;...
【部署优化篇十四】【十万字全景拆解:GitHub Actions自动化流水线设计圣经(DeepSeek工业级实践大公开)】
一、从手工作坊到智能工厂:CI/CD的革命之路 想象一下,你所在的公司每天要手工组装1000台手机,每个环节都靠老师傅肉眼检查——这就是没有CI/CD的软件开发现状。GitHub Actions的出现,就像给软件交付装上了特斯拉的超级工厂流水线。 DeepSeek的CI/CD演进史就是一部血泪史:…...
Golang | 每日一练 (3)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Golang | 每日一练 (3)题目参考答案map 实现原理hmapb…...
Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当今社会,随着人们生活水平的不断提高和健康意识的日益增强,健…...
深入解析Textual库:打造现代化的终端用户界面(TUI)
深入解析Textual库:打造现代化的终端用户界面(TUI) 在终端应用程序的世界里,过去的交互方式通常是简单的命令行输入和文本输出。然而,随着开发者对更高可用性和更友好界面的追求,现代终端用户界面…...
基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)
在我们的项目中,OpenGL ES 扮演着至关重要的角色,其主要功能是获取图像数据,经过一系列修饰后将处理结果展示到屏幕上,以此实现各种丰富多样的视觉效果。为了让大家更好地理解后续知识,本文将详细介绍 OpenGL 相关代码。需要注意的是,当前方案将对 OpenGL 的所有操作都集…...
加班限制了进步
今天周六,大家都在加班吗? 做个统计。 最近面试了很多硬件工程师,还没有找到如意的。 这些面试者都很会解决问题,但是不会闭环问题。 EMC不过,加个磁环就过了。为什么加磁环就过了,底层原理不清楚。 改…...
容器化部署tomcat
容器化部署tomcat 需求在docker容器中部署tomcat,并通过外部机器访问tomcat部署的项目 容器化部署要先装好docker容器(docker安装配置) 实现步骤: 拉取tomcat docker pull tomcat用于列出本地Docker主机上存储的所有镜像 docker images在root目录里面创建tomc…...
【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!
命令模式:封装请求,轻松实现解耦! 大家好!今天我们来聊聊设计模式中的命令模式(Command Pattern)。如果你曾经需要将请求封装成对象,或者希望实现请求的撤销、重做等功能,那么命令模…...
尚硅谷爬虫note009
一、jsonpath 1.安装 pip install jsonpath 2.使用 只能解析本地文件 .json文件 {"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century&qu…...
C语言(11)------------->while循环
一、if与while的区别 在C语言中,有三大结构,分别是顺序、选择和循环。在前面的博客文章中,我们解释了if语句的用法,可以参考:C语言(7)------------>if语句-CSDN博客 从文章中&…...
Unity 全局屏幕点击特效
思路: 1、生成一个点击特效实例,每点击屏幕,就调整特效实例的位置并控制特效的显隐状态即可。 2、需要注意要保证在编辑器开发时或手机上运行时都要显示点击效果。 方案一 (推荐) using UnityEngine; using UnityEn…...
【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...
【小白学HTML5】盒模型(一文讲清margin、padding)_第三讲
根据第一讲的内容,我们知道margin是外边距、padding是内边距,那么内外边距该怎么设置呢? 1、margin:外边距 第一种情况:比如设置外边距为上10px、右20px、下30px、左40px 外边距可以分别设置为:margin-t…...
PLC数据采集网关(三格电子)
产品概述 PLC转Modbus网关型号SG-PLC-Private(PLC私有协议网关),是三格电子推出的工业级网关(以下简称网关),主要用于在不需要对PLC编程的情况下将PLC数据映射到Modbus TCP(映射的方式符合PLC工程师使用习惯…...
基于图扑 HT 可视化实现智慧地下采矿可视化
在前端开发领域,不断涌现的新技术为各行业带来了创新变革的可能。今天,让我们聚焦于图扑软件自研的 HT for Web 产品,看看它如何在前端 2D、3D 渲染方面发力,为智慧地下采矿可视化打造令人惊叹的解决方案,为开发者开启…...
【网络】高级IO(2)
或者在某些情况下,它可能是: typedef unsigned int nfds_t; 前言 由于select函数有下面几个特别明显的缺点,就推演出了改进版本——poll函数 比如select监视的fd是有上限的,我的云服务器内核版本下最大上限是1024个fd…...
论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 个人信息 作者:赵晗,浙江大学-西湖大学联合培养博士生 内容简介 近年来,在各个领域应用多模态大语言模型(MLLMs&…...
区块链共识机制详解
区块链共识机制详解 🤝 1. 什么是共识机制? 共识机制是区块链网络中,所有节点就某个状态(如交易的有效性)达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…...
Unity游戏制作中的C#基础(1)界面操作基础
1.脚本有关注意事项 (1).进入项目之后,一般创建一个文件夹Scripts用来存放c#脚本; (2).在Scripts中创建脚本,双击脚本,进入VS编辑器,有如下结构: start&#…...
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件(openpyxl库)三、 处理 Word 文件(python-docx库)四、 处理 PPT 文件(python-pptx库)五、 自动发送邮件(smtplib和…...
欢乐力扣:同构字符串
文章目录 1、题目描述2、 代码 1、题目描述 同构字符串。给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符…...