Mnist手写体数字数据集介绍与在Pytorch中使用

news2024/12/23 9:32:55

1.介绍

        MNIST(Modified National Institute of Standards and Technology)数据集是一个广泛用于机器学习和计算机视觉研究的常用数据集之一。它由手写数字图像组成,包括0到9的数字,每张图像都是28x28像素的灰度图像,图片和标签均采用二进制编码,共70000张图像,其中包括60000张训练集和10000测试集。每张图像都对应一个one-hot标签,表示图像中显示的是哪个数字

        这个数据集因其相对较小的规模和简单的图像内容也成为了许多机器学习入门教程和示例的标准数据集,因为它的简单性和普遍性,使得学习者能够快速开始构建和训练模型,从而更好地理解机器学习的基本概念和流程,可以说它就是计算机视觉的“Hello World”。

        官网地址https://yann.lecun.com/exdb/mnist/

2.在Pytorch中使用Mnist

        Pytorch的torchvision中的datasets自带下载与读取Mnist数据集的函数,可以很方便的使用

1.导入所需库

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt

 2.下载Mnist数据集

# 定义数据转换
transform = transforms.Compose([
    transforms.ToTensor()  # 将图像转换为 PyTorch 张量
])

# 下载并加载 MNIST 训练和测试数据集
train_dataset = datasets.MNIST(root='./dataset', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./dataset', train=False, download=True, transform=transform)
  • root为数据集保存的位置
  • train为是否为训练集
  • download为是否自动下载该数据集,如果数据集已经下载过,即使设置为True也没关系,他会自动检测
  • transform为数据转换的操作,ToTensor()是必须的

        这里如果不使用科学上网可能无法下载,或者下载有点慢。而直接去官网的话又需要登陆

                        

        这里另外一个介绍使用迅雷下载数据集的方法,不止适用于这个数据集,我们复制好链接后打开迅雷就会自动弹出下载界面

数据集文件名下载地址
训练集图像train-images-idx3-ubyte.gzhttp://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
训练集标签train-labels-idx1-ubyte.gzhttp://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz

测试集图像

t10k-images-idx3-ubyte.gzhttp://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
测试集标签t10k-labels-idx1-ubyte.gzhttp://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

                        

         没有弹出的话就把链接复制到搜索框

        下载好后,在root参数指定的位置下新建一个MNIST文件夹,再在MNIST中新建一个raw文件夹,对于其他数据集不知道如何建文件夹可以先尝试自动下载,他会建好文件夹,然后把下载好的四个压缩包直接放进去就可以

        

接着我们再运行一次上面的代码,他会检测到数据集已存在,然后自动解压缩,这样就完成了

 3.读取数据集与展示

        使用dataloader将数据分为一个个批量大小的数据,生成一个迭代器,shuffle为是否洗牌

# 创建数据加载器以批量加载数据
batch_size = 128
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# 输出训练集和测试集的长度
train_length = len(train_dataset)
test_length = len(test_dataset)
print(f"训练集的长度:{train_length}")
print(f"测试集的长度:{test_length}")

# 创建一个字典以存储类别索引及其对应的图像
images_by_class = {}

# 填充字典,每个类别只保留几张图像
num_images_per_class = 5

# 循环遍历训练集中的每个图像和对应的标签
for image, label in train_dataset:
    # 如果当前标签不在字典中,为该标签创建一个空列表
    if label not in images_by_class:
        images_by_class[label] = []
    # 如果当前类别的图像数量未达到指定的数量(num_images_per_class),则将当前图像添加到对应类别的列表中
    if len(images_by_class[label]) < num_images_per_class:
        images_by_class[label].append(image)

# 显示每个类别的图像
for label, images in images_by_class.items():
    print(f"Class {label}:")
    # 创建一个新的图像窗口,并设置大小
    plt.figure(figsize=(num_images_per_class * 2, 2))
    # 遍历每个类别的图像列表并显示
    for i in range(num_images_per_class):
        plt.subplot(1, num_images_per_class, i + 1)
        # 显示图像,并使用灰度颜色图
        plt.imshow(images[i].squeeze(), cmap='gray')
        plt.axis('off')  # 不显示坐标轴
    plt.show()  # 显示图像

        然后使用for循环就可以一次读取一个批量的数据,进行后面的一系列任务,这里只是展示一个批次数据

# 读取一个批次的数据
for i, (images, labels) in enumerate(train_loader):
    print("第{}批次".format(i+1))
    print(images.shape)  # 图像批次的形状 (batch_size, 通道数, 高度, 宽度)
    print(labels.shape)  # 标签批次的形状 (batch_size,)
    break   

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

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

相关文章

IO模型及高性能网络架构分析

IO调用 操作系统一次IO过程&#xff1a; 应用程序发起的一次IO操作包含两个阶段&#xff1a; IO调用&#xff1a;应用程序进程向操作系统内核发起调用。 IO执行&#xff1a;操作系统内核完成IO操作。 操作系统内核完成IO操作还包括两个过程&#xff1a; 准备数据阶段&#…

2023年终总结---做一个有生活的人

2023总结 【工作】2023一整年都在阿里淘天集团工作。作为工作的第二年&#xff0c;学习到很多知识和设计方法&#xff0c;从而某个中心的左膀右臂。敢在需求评审中说不&#xff0c;说话变的有底气。中间经历了组织架构的一次一次调整&#xff0c;当时面试自己的一个师兄因家庭原…

CSS-4

平面转换 整体认识 div {margin: 100px 0;width: 100px;height: 100px;background-color: pink;/* 过渡效果 */transition: all 1s;}/* 当鼠标悬停到div时&#xff0c;进行平面转换 */div:hover {transform: translate(800px) rotate(360deg) scale(2) skew(180deg);}作用&…

Python爬虫——使用代理IP池维护虚拟用户

目录 前言 一、什么是代理IP池&#xff1f; 二、爬取代理IP 三、验证代理IP的可用性 四、维护代理IP池 五、使用代理IP池进行爬取 六、总结 前言 在进行Web爬取时&#xff0c;使用代理IP是一种常见的策略&#xff0c;它可以帮助我们隐藏真实IP地址&#xff0c;绕过网站…

PyQT 多进程

在PyQt中&#xff0c;图形化界面&#xff08;GUI&#xff09;是运行在主线程中的&#xff0c;而多进程是在独立的进程中执行的。默认情况下&#xff0c;多进程之间是无法直接共享图形化界面的。 然而&#xff0c;有几种方法可以在多进程中与PyQt的图形化界面进行通信&#xff…

Wnmp本地部署结合内网穿透实现任意浏览器远程访问本地服务

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1…

Linux驱动开发学习笔记7《并发与竞争》

目录 一、并发与竞争 1、并发与竞争简介 2、保护内容是什么 二、原子操作 1、 原子操作简介 2、原子整形操作API 函数 3、原子位操作API 函数 4、实验 &#xff08;1&#xff09; 修改设备树文件 &#xff08;2&#xff09; LED 驱动修改 &#xff08;3&#xff09;…

2023年度总结———豫见及遇见

目录 一.AI 人工智能方向 二.华为数通网络方向 三.腾讯云AI绘画方向 四.年度心得总结板块 博主C站主页&#xff1a;知孤云出岫_网络,计算机,计算机网络教案-CSDN博客 博主腾讯云主页&#xff1a; 知孤云出岫 - 个人中心 - 腾讯云开发者社区-腾讯云 2023年年度词&#xff1a…

集合高级知识点

集合高级 1. HashSet 底层原理 HashSet 的特点&#xff1a; HashSet 实现了 Set 接口HashSet 底层实质上是 HashMap可以存放 null 值&#xff0c;但是只能有一个 nullHashSet 不保证元素是有序的&#xff0c;取决于 hash 后&#xff0c;再确定索引的结果&#xff0c;即不保证…

Python 从入门到精通之通俗易懂学闭包

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合&#xff08;List列表、Tuple元组、Dict字典、Set&#xff09;-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

单片机原理及应用:计数按键控制数码管显示

承接上文&#xff0c;我们来介绍一下按键和数码管的配合工作&#xff0c;由于数码管显示的字符和位数多种多样&#xff0c;无法做到一个字符对应一个按键&#xff0c;所以程序主要记录按键的使用次数来切换数码管的显示。 #include <reg52.h> //包含reg52.h头…

如何使用SeaFile搭建本地私有云盘并结合cpolar实现远程访问

文章目录 1. 前言2. SeaFile云盘设置2.1 SeaFile的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c;…

2024洗地机哪家强?口碑洗地机推荐

现如今&#xff0c;智能家电在人们生活中变得越来越受欢迎&#xff0c;例如智能洗地机的出现&#xff0c;不仅省时省力&#xff0c;还实现了家务清洁的自由。在家庭中&#xff0c;地面清洁一直是一个令人头疼的问题&#xff0c;各种智能家居品牌通过开发各种智能家电产品来解决…

【工具】vscode搜索结果及工程目录的文件夹、文件的排除

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

【模拟电路】NE555-电子琴应用原理

一、声音和频率 二、振荡周期和占空比 三、NE555电子琴案例 四、NE555内部和方波发生器 一、声音和频率 声音和频率的关系确实是密切相关的。 在声学中&#xff0c;声音的频率被定义为声波的震动次数&#xff0c;通常以赫兹&#xff08;Hz&#xff09;为单位。频率越高&#x…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备&#xff0c;发现设备有时加密出来的数据&#xff0c;再解密时与明文对不上&#xff0c;怀疑是通信问题。因此&#xff0c;急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉&#xff0c;所以随便选了个log4cplus软件集成到现有工具…

leetcode2975. 移除栅栏得到的正方形田地的最大面积

题目 有一个大型的 (m - 1) x (n - 1) 矩形田地&#xff0c;其两个对角分别是 (1, 1) 和 (m, n) &#xff0c;田地内部有一些水平栅栏和垂直栅栏&#xff0c;分别由数组 hFences 和 vFences 给出。 水平栅栏为坐标 (hFences[i], 1) 到 (hFences[i], n)&#xff0c;垂直栅栏为…

STM32L4

STM32L4系列超低功耗微控制器 意法半导体通过构建新型芯片架构实现了同类产品中最佳的超低功耗及性能&#xff0c;这得益于应用设计上的高度灵活性。 STM32L4系列可以根据微处理器运行时不同的应用需求来适时调整电压从而实现功耗的动态平衡。 该系列包含不同的产品线&#…

(15)Linux 进程创建与终止函数forkslab 分派器

前言&#xff1a;本章我们主要讲解进程的创建与终止&#xff0c;最后简单介绍一下 slab 分派器。 一、进程创建&#xff08;Process creation&#xff09; 1、分叉函数 fork 在 中&#xff0c; fork 函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新的进程。 …

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…