《深度学习》PyTorch 手写数字识别 案例解析及实现 <上>

news2024/11/18 7:43:11

目录

一、了解MINIST数据集

1、什么是MINIST

2、查看MINIST由来

二、实操代码

1、下载训练数据集

2、下载测试数据集

运行结果:

3、展示手写数字图片

运行结果:

4、打包图片

运行结果:

5、判断当前pytorch使用的设备

1)torch.cuda.is_available()

2)torch.backends.mps.is_available()

3)MPS

运行结果:


一、了解MINIST数据集

1、什么是MINIST

        MINIST是一种基于神经网络的手写数字识别算法。它是LeCun等人在1998年提出的,是深度学习领域的里程碑之一。MINIST数据集包含了大量的手写数字图片,MINIST算法通过训练神经网络,可以有效地识别这些手写数字。MINIST算法在计算机视觉和模式识别中有广泛的应用,被认为是机器学习领域的经典问题之一。

        MNIST包含70,000张手写数字图像,其中60,000张用于训练,10,000张用于测试

        所有的图像都是灰度的,大小为28x28像素的,并且居中的,以减少预处理和加快运行。

2、查看MINIST由来

        进入下列网页,即可查看

https://yann.lecun.com/exdb/mnist/icon-default.png?t=O83Ahttps://yann.lecun.com/exdb/mnist/        打卡即可得到下列画面:

此时可知道这个MINIST数据集中训练集和测试集所占大小等等:

二、实操代码

1、下载训练数据集

训练数据集包含训练用的手写数字图片及其对应的标签

import torch 
print(torch.__version__)   # 查看torch版本号

from torch import nn  # 导入神经网络模块,提供了构建网络所需的各种层
from torch.utils.data import DataLoader  # 数据包管理工具,打包数据,它可以将数据集封装成适合批处理的数据加载器。
from torchvision import datasets   # 封装了很多与图像相关的模型,数据集
from torchvision.transforms import ToTensor   一个数据转换操作,用于将图片数据转换为PyTorch张量(Tensor)。PyTorch中的模型只能接受张量作为输入。

training_data = datasets.MNIST(   # 跳转到函数的内部源代码,pycharm 按下ctrl +鼠标点击
    root='data',  # 指定数据集下载后储存的根目录
    train=True,  # 表示下载的是训练集,如需下载测试集则更改为False即可
    download=True,   # 表示如果本地没有数据集,则自动下载,有则不再下载
    transform=ToTensor()   # 指定一个数据转换操作,即将下载的图片转换为pytorch张量tensor,因为pytorch模型只能处理张量类型的数据
)

        将代码和下列测试集代码一起运行。

2、下载测试数据集

        只需将训练数据集中的train参数结果更改为False

test_data = datasets.MNIST(
    root='data',
    train=False,
    download=True,
    transform=ToTensor()  
)  # NumPy 数组只能在CPU上运行。Tensor可以在GPU上运行,这在深度学习应用中可以显著提高计算速度。

print(len(training_data))   # 打印训练集数据条数
print(len(test_data))   # 打印测试集数据条数
运行结果:

3、展示手写数字图片

from matplotlib import pyplot as plt   # 导入绘图库
figure = plt.figure()   # 设置一个空白画布
for i in range(9):
    img,label = training_data[i+59000]   # 提取第59000张图片开始,共9张,返回图片及其对应的标签值

    figure.add_subplot(3,3,i+1)   # 在画布创建3行3列的小窗口,通过遍历的值i来确定每个画布展示的图片
    plt.title(label)   # 设置每个窗口的标题,设置标签为上述返回的标签值
    plt.axis('off')   # 取消画布中的坐标轴的图像
    plt.imshow(img.squeeze(),cmap='gray')   # plt.imshow()将NumPy数组data中的数据显示为图像,并在图形窗口中,
    a = img.squeeze()   # img.squeeze()从张量img中去掉维度为1的。如果该维度的大小不为1,则张量不会改变。
plt.show()

        最后一步img.squeeze降低维度是因为遍历出来的图像有一个冗余的维度没有用,如下所示,维度为1,图像大小为28x28像素的。

运行结果:

4、打包图片

train_dataloader = DataLoader(training_data,batch_size=64)  # 调用上述定义的DataLoader打包库,将训练集的图片和标签,64张图片为一个包,
test_dataloader = DataLoader(test_data,batch_size=64)   # 将测试集的图片和标签,每64张打包成一份
for x,y in test_dataloader:
    # x是表示打包好的每一个数据包,其形状为[64,1,28,28],64表示批次大小,1表示通道数为1,即灰度图,28表示图像的宽高像素值
    # y表示每个图片标签
    print(f"shape of x[N,C,H,W]:{x.shape}")   # 打印图片形状
    print(f"shape of y:{y.shape}{y.dtype}")   # 打印标签的形状和数据类型
    break  # 跳出并终止循环,表示只遍历一个包的数据情况
运行结果:

5、判断当前pytorch使用的设备

"""判断当前设备是否支持GPU,其中mps是苹果m系列芯片的GPU"""  # 返回cuda,mps,cpu,
device = "cuda" if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else "cpu"
print(f"Using {device} device")  # 字符串的格式化。CUDA驱动软件的功能:pytorch能够去执行cuda的命令,cuda通过GPU指令集
# 神经网络的模型也需要传入到GPU,1个batchsize的数据集也需要传入到GPU,才可以进行训练。
        1)torch.cuda.is_available()

                 检查CUDA是否在当前系统上可用。CUDA是NVIDIA的并行计算平台和编程模型,它允许软件利用NVIDIA图形处理单元(GPU)进行加速计算。如果CUDA可用,这意味着你的系统有NVIDIA GPU,并且PyTorch已经配置为可以使用CUDA。

        2)torch.backends.mps.is_available()

                检查MPS是否可用。请注意,这个检查通常只在Apple Silicon Macs上返回True

        3)MPS

                MPS是Apple提供的一套高性能图形和计算框架,专门设计用于Apple Silicon Macs上的Metal API。虽然MPS不直接对应于PyTorch的CUDA,但PyTorch从1.8版本开始增加了对Apple Silicon Macs的支持,通过MPS后端进行加速。

        表示如果torch.cuda.is_available()返回的是True则返回cuda,即当前使用的设备是cuda,如果返回False即执行下面的判断语句,即如果torch.backends.mps.is_available()返回的是True则返回mps,即当前使用的是苹果设备的mps,反之则使用的是cpu设备来计算。

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568 外接摄像头预览方向错误

1.测试发现摄像头预览方向被旋转了90度 2.问题原因: device\rockchip\common\external_camera_config.xml 配置文件旋转了90度: 3.解决对策 修改orientation为0度

MultiSnapRecyclerView:让Android RecyclerView的滚动停靠更灵活

在Android应用开发中,RecyclerView是一个强大且灵活的组件,用于展示大量数据集合。然而,标准的RecyclerView只支持单一的滚动停靠点,这在某些场景下可能不够灵活。为了解决这个问题,TakuSemba开发了一个名为MultiSnapR…

Vue3+TS项目给el-button统一封装一个点击后转圈效果的钩子函数按钮防抖

前言 每个按钮都要单独定义一个loading变量,并且在接口请求前修改为true,接口响应后再修改为false,封装后这段重复的逻辑就可以统一管理不用每次都写一遍了。 效果 新建一个公共的src\common.ts import { ref } from "vue"expor…

Apache-wed服务器环境的安装

一。安装httpd并且开启httpd yum install httpd systemctl start httpd 二。关闭防火墙 systemctl stop firewall 三。常规配置wed服务 mkdir /www vim index.html(里面写入自己的内容) chmod 755 index.htm chmod 755 /www vim /etc/httpd/co…

管家婆云辉煌手机端怎么连接蓝牙打印机?

管家婆云辉煌手机端可以连接蓝牙打印机,这样手机可以发送打印任务到蓝牙打印机,完成打印任务。具体的设置步骤如下: 一、首先完成手机和蓝牙打印机配对,打开蓝牙打印机后。手机开启蓝牙和定位服务 点击手机设置,进入手…

价值流案例研究:实战经验与成功实践的深度解析

价值流在实际应用中的强大效益 在全球化和数字化竞争愈加激烈的背景下,企业正面临如何优化内部流程、提升客户体验、减少成本和提高效益的多重挑战。《价值流指南》不仅是一种理论工具,更为企业提供了系统化的实践框架,以实现从理论到实战的…

Threejs之加载3D模型(上)

本文目录 前言一、模型类型1.1 支持的模型类型1.2 模型加载器 二、常用模型加载器2.1 代码示例2.1.1 GLTFLoader2.1.1.1 代码2.1.1.2 效果 前言 Three.js 是一个基于 WebGL 的 JavaScript 3D 库,它提供了丰富的 API 来在网页上创建和显示 3D 图形。加载 3D 模型到 T…

(学习总结16)C++模版2

C模版2 一、非类型模板参数二、模板的特化1. 概念2. 函数模板特化3. 类模板特化全特化偏特化类模板特化应用示例 三、模板分离编译1. 什么是分离编译2. 模板的分离编译3. 解决方法 模板总结 以下代码环境为 VS2022 C。 一、非类型模板参数 模板参数分为类型形参与非类型形参。…

硬件实用技巧:螺丝M标准、螺丝长度以及螺帽M直径

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142205318 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

[LWIP] 如何实现LWIP热插拔功能

LWIP 1.4.1 硬件stm32f429 HAL 1.8.1 UCOSIII 步骤如下 1、在lwip的opt.h中使能宏定义LWIP_NETIF_LINK_CALLBACK 链接发生变化时调用回调函数 2、在初始化结束后调用函数netif_set_link_callback,为网卡设置一个回调函数,回调参考代码如下 /*** bri…

【诉讼流程-健身房-违约-私教课-多次沟通无效-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(1)】

【诉讼流程-健身房-违约-私教课-多次沟通无效-前期法律流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(1)】 (1)前言说明1、目的2、说明1- 本章你将会看到的内容2 - 健身房其中一些套路1、先给予体验课。2、合同里的文字陷阱3、…

【DOA估计】一种基于高阶广义奇异值分解的多声源方向估计方法【附MATLAB代码】

微信公众号:EW Frontier QQ交流群:554073254 摘要 一种基于高阶广义奇异值分解的多声源方位估计方法本文提出了一种有效的宽带声源波达方向(DOA)估计方法。所提出的框架提供了一种有效的方法来构建一个宽带互相关矩阵从多个窄带互…

压测服务器并使用 Grafana 进行可视化

简介 仓库代码 GitCode - 全球开发者的开源社区,开源代码托管平台 参考 Welcome! - The Apache HTTP Server Project Grafana | 查询、可视化、警报观测平台 https://prometheus.io/docs/introduction/overview/

html+css+js网页设计 旅游 厦门旅游网10个页面

htmlcssjs网页设计 旅游 厦门旅游网10个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&am…

基于vue框架的宠物寄养系统3d388(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,宠物信息,宠物分类,寄养店,宠物寄养,宠物领养,家庭环境,用户宠物 开题报告内容 基于Vue框架的宠物寄养系统开题报告 一、引言 随着人们生活水平的提高和宠物文化的普及,宠物已成为许多家庭不可或缺的一员。因此&…

windows和linux安装mysql5.7.31保姆级教程

一,资源如下,里面有windows和linux版的安装软件,内含Visual C2013中文版windows系统插件 windows资源地址:https://download.csdn.net/download/l1o3v1e4ding/89725150 linux(centos)资源地址:…

线性基大发现

一.构造方法 1.贪心法(每一个数往里插入即可) /*贪心法构造线性基的特点: 1.从小到大排列 2.各个基的高位可能存在重复的1 2.线性基不是唯一的,与原集合的元素顺序有关*/ void insert(int x){//贪心法for(int i63;i>0;i--){i…

“百度热搜”揭示月饼遇冷背后:如何在经济下行中理性消费 + 应对风险?

中秋将至,月饼本该成为节日的主角。然而,令人惊讶的是,近期的“百度热搜”显示月饼销售出现了前所未有的冷遇。这背后的原因是什么?在经济下行的背景下,人们的消费观念正悄然转变。今天,我们就来聊聊如何在这样的经济环境中保持理性消费,并应对潜在的经济风险。 经济下行…

数组去重、数组扁平化

数组去重 排序然后for循环判断相邻的两个是否一样 定义新数组,for循环新数组中没有这个元素就添加 利用对象的键,需要新建对象和数组 利用双重for循环判断 利用for循环和indexOf判断是否存在 利用newSet构造函数不接受重复数据 数组扁平化

visual studio code下载教程(手把手)

今天我来给大家介绍一下visual studio code (VScode)的下载 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。 二、官方下载…