PyTorch中定义自己的数据集

news2024/11/16 13:52:16

文章目录

    • 1. 简介
    • 2. 查看PyTorch自带的数据集(可视化)
    • 3. 准备材料
      • 3.1 图片数据
      • 3.2 标签数据
    • 4. 方法

1. 简介

尽管PyTorch提供了许多自带的数据集,如MNIST、CIFAR-10、ImageNet等,但它们对于没有经验的用户来说,理解数据加载器的工作原理以及如何正确地配置数据加载器可能会有一定难度。 用户需要了解所使用的数据集,包括数据集的内容、结构、标签等信息。对于一些复杂的数据集,用户可能需要理解数据集的结构和标签的含义。通过定义自己的数据集类,您可以更好地控制数据的加载和处理过程,提高代码的灵活性、可读性和可维护性,同时更好地满足模型训练的需求。

2. 查看PyTorch自带的数据集(可视化)

为了更好的定义自己的数据集,我们首先查看PyTorch自带的数据集的内容,代码如下

# 导入所需的库
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于可视化
import torch  # 导入PyTorch库
from torchvision.datasets import MNIST  # 从torchvision中导入MNIST数据集
from torchvision import transforms  # 导入transforms模块,用于数据预处理
import numpy as np  # 导入NumPy库

# 加载MNIST数据集
train_mnist_data = MNIST(root='./data',  # 数据集存储路径
                         train=True,  # 加载训练集
                         transform=transforms.Compose([transforms.Resize(size=(28, 28)), transforms.ToTensor()]),  # 数据预处理操作
                         download=True)  # 如果数据集不存在,则自动下载

# 设置要显示的样本数量
num_samples = 10

# 创建包含多个子图的大图窗口
fig, axes = plt.subplots(1, num_samples, figsize=(10, 6))

# 遍历选择要显示的样本
for i in range(num_samples):
    # 从数据集中获取图像数据和标签
    image, label = train_mnist_data[i]
    
    # 在子图中显示图像
    axes[i].imshow(image.squeeze().numpy(), cmap='gray')  # 使用imshow函数显示图像,将张量转换为NumPy数组
    axes[i].set_title(f"Label: {label}")  # 设置子图标题,显示图像对应的标签
    axes[i].axis('off')  # 关闭坐标轴显示
    
    # 将图像保存为PNG格式的图片文件,文件名以图像的标签命名
    plt.imsave(f"./data/mnist_images/{label}.png", image.squeeze().numpy(), cmap='gray')

# 显示图形窗口
plt.show()

这里,我们使用MNIST类加载MNIST数据集。在加载数据集时,通过transform参数指定了数据预处理操作,包括将图像大小调整为28x28像素,并将图像转换为张量。train=True表示加载训练集,download=True表示如果数据集不存在则自动下载到指定的路径。

接下来,我们选择一些样本进行可视化。我们在一个子图中显示了10个样本,每个样本对应一个数字图像和其对应的标签。通过循环遍历这些样本,从数据集中获取图像数据和标签,并使用Matplotlib的imshow()函数将图像显示在子图中。
在这里插入图片描述

同时,使用imsave()函数将每个图像保存为PNG格式的图片文件,文件名以标签命名。最后,使用plt.show()显示图形窗口,显示图像的同时也会将图像保存到指定的路径中。这段代码的执行结果是显示10张MNIST数据集中的数字图像,并将这些图像保存到指定路径下。保存的图片如下所示

在这里插入图片描述

通过上面程序可以看到,数据集主要是由图片数据和对应的标签构成,那么我们就可以用这两个主要构成成分来构建自己的数据集。

3. 准备材料

3.1 图片数据

这里我们就用刚才保存的十张图片,即

在这里插入图片描述

当然,你也可以准备其它的图片,并给图片分别命名为“0.png, 1.png, …”。

这里,十张图片的相对路径为

imgs_path = "./data/mnist_images"

注:你们要根据自己存储的路径来给定。

3.2 标签数据

创建一个txt文件,为每一幅图片指定标签数据,如下所示

在这里插入图片描述

这里,txt文件的相对路径为

labels_path = "labels.txt"

4. 方法

在PyTorch中,您可以通过创建一个自定义的数据集类来定义自己的数据集。这个自定义类需要继承自torch.utils.data.Dataset类,并且实现两个主要的方法:__len____getitem____len__方法应该返回数据集的长度,而__getitem__方法则根据给定的索引返回数据集中的样本。

下面我们展示如何创建一个自定义的数据集类:

import os  # 导入os模块,用于操作文件路径
from PIL import Image  # 导入PIL库中的Image模块,用于图像处理
import torch  # 导入PyTorch库
from torch.utils.data import Dataset  # 从torch.utils.data模块导入Dataset类,用于定义自定义数据集
from torchvision import transforms  # 导入transforms模块,用于数据预处理
import numpy as np  # 导入NumPy库,用于数值处理
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于可视化


class CustomDataset(Dataset):
    def __init__(self, image_dir, label_file, transform=None):
        super().__init__()  # 调用父类的构造函数
        self.image_dir = image_dir  # 图像数据的路径
        self.label_file = label_file  # 标签文本的路径
        self.transform = transform  # 数据预处理操作
        self.samples = self._load_samples()  # 加载数据集样本信息

    def _load_samples(self):
        samples = []  # 存储样本信息的列表
        with open(self.label_file, 'r') as f:  # 打开标签文本文件
            for line in f:  # 逐行读取标签文本文件中的内容
                image_name, label = line.strip().split(',')  # 根据逗号分隔每行内容,获取图像文件名和标签
                image_path = os.path.join(self.image_dir, image_name)  # 拼接图像文件的完整路径
                samples.append((image_path, int(label)))  # 将图像路径和标签组成元组,加入样本列表
        return samples  # 返回样本列表

    def __len__(self):
        return len(self.samples)  # 返回数据集样本的数量

    def __getitem__(self, index):
        image_path, label = self.samples[index]  # 获取指定索引处的图像路径和标签
        image = Image.open(image_path).convert('L')  # 打开图像文件并将其转换为灰度图像
        if self.transform:  # 如果定义了数据预处理操作
            image = self.transform(image)  # 对图像进行预处理操作
        return image, label  # 返回预处理后的图像和标签


# 设置图片数据路径和标签文本路径
image_dir = './data/mnist_images'  # 图像数据的路径
label_file = 'labels.txt'  # 标签文本的路径

# 定义数据预处理操作,根据需要添加其他预处理操作
transform = transforms.Compose([
    transforms.Resize((28, 28)),  # 调整图像大小
    transforms.ToTensor(),  # 将图像转换为张量
])

# 创建自定义数据集实例
custom_dataset = CustomDataset(image_dir, label_file, transform=transform)

# 创建数据加载器
data_loader = torch.utils.data.DataLoader(custom_dataset, batch_size=1, shuffle=False)

# 遍历数据加载器中的每个批次数据
for batch_images, batch_labels in data_loader:
    # 使用squeeze()函数去除图像张量中的单维度,将图像数据转换为NumPy数组,并存储在变量image中
    image = batch_images.squeeze().numpy()

    # 使用imshow()函数显示图像,cmap='gray'指定使用灰度色彩映射
    plt.imshow(image, cmap='gray')

    # 设置图像标题,显示图像对应的标签,使用f-string格式化字符串,将batch_labels转换为Python标量并获取其值
    plt.title(f"Label: {batch_labels.item()}")

    # 关闭坐标轴显示,即不显示坐标轴
    plt.axis('off')

    # 显示图形窗口
    plt.show()


这段代码实现了加载自定义数据集,并使用 PyTorch 的 DataLoader 将数据加载成批次,然后逐批次地展示图像。

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

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

相关文章

品牌舆情监测工作要怎么做?

一个负面舆论的传播,可能在短时间内对企业品牌形象造成巨大损害,甚至引发舆情危机。因此,如何有效地进行品牌舆情监测,成为企业不可忽视的问题。伯乐网络传媒多年网络公关、舆情监测经验,今天就来给大家分享一下。 一、…

wsl2安装rancher及导入k3s集群

环境准备 安装wsl2点击此文]ubuntu20.04安装docker 点击此文,安装完成后docker镜像仓库改成阿里云镜像加速地址.如果不熟请点击此文 docker 安装rancher 启动wsl,根据官方文档以root身份执行 sudo docker run -d --restartunless-stopped -p 80:80 -p 443:443 --privileged …

Redis 支持的 Java 客户端都有哪些?

Redis 是一种高性能的键值存储系统,它以其快速、灵活和可扩展的特性而闻名。在 Java 开发中,与 Redis 交互的方式通常是通过使用 Redis 的 Java 客户端。 这些客户端提供了访问 Redis 数据库的接口,使开发人员能够在 Java 应用程序中轻松地使…

软件设计师(案例分析)

软件设计师 数据流图总结 数据库总结 面向对象分析 数据流图 做题方法: 第一题:找外部实体,这个实体可以是系统也可以是人,比如客户中介等。 第二题:数据存储,这个比较简单,根据加工就可以看出来…

硬件知识积累 音频插座的了解,看音频插座的原理图来了解音频插座的引脚。

1. 音频接口 音频插座是一种用于连接音频信号线路的电子元件,常见于音频设备(如音响、耳机、话筒等)中。它的主要作用是将电子信号转化为声音信号,以满足人们对于音乐、电影、游戏等方面的需求。 根据插头形状的不同,音…

通过编写dockerfile部署python项目

docker命令总览 docker通过dockerfile构建镜像常用命令 # 创建镜像(进入dockerfile所在的路径) docker build -t my_image:1.0 .# 查看镜像 docker images# 创建容器 docker run -dit --restartalways -p 9700:9700 --name my_container my_image:1.0 #…

跟随Facebook的足迹:社交媒体背后的探索之旅

在当今数字化时代,社交媒体已经成为了人们日常生活中不可或缺的一部分。而在这庞大的社交媒体网络中,Facebook作为其中的巨头,一直在引领着潮流。从创立之初的一个大学社交网络到如今的全球性平台,Facebook的发展历程承载了无数故…

【LeetCode】链表oj专题

前言 经过前面的学习,咋们已经学完了链表相关知识,这时候不妨来几道链表算法题来巩固一下吧! 如果有不懂的可翻阅之前文章哦! 个人主页:小八哥向前冲~-CSDN博客 数据结构专栏:数据结构【c语言版】_小八哥…

初学者必知:ARM与单片机的区别

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!ARM和单片机之间有许多区别&#…

使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画 引言准备工作效果展示代码结构代码解析第一部分:导入库和设置基本参数第二部分:流体类定义MyFluidDataConfig 类详解MyFluidData 类详解my_update 方法详解流体类定义完整代码 第三部分:太…

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件,位于应用与操作系统、数据库之间,主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题,是分布式环境下支撑应用开发、运…

深圳CPDA|如何利用数据分析改进业务流程,提高效率?

在当今数字化时代,数据已经成为企业决策和优化的关键资源。通过有效地收集、分析和应用数据,企业可以深入了解其业务流程中的瓶颈和问题,从而改进流程,提高效率。本文将探讨如何利用数据分析改进业务流程,并提高效率。…

FebHost:什么是.ME域名?

.ME域名是一个独一无二且被广泛接受的顶级域名(TLD),在近年来逐渐受到了大众的喜爱。最初,它被设定为黑山的国家/地区代码顶级域名(ccTLD)。但现在,.ME已经发展成为一个全球公认的顶级域名&…

Python应用:让生活更智能

随着科技的进步,Python已成为一种非常受欢迎的编程语言,它在数据分析、人工智能、Web开发等领域有着广泛的应用。今天,我们将探讨一个Python应用的例子,这个应用将帮助我们更智能地管理日常生活。 应用名称:智能生活助…

鸿蒙开发接口Ability框架:【@ohos.application.StartOptions (StartOptions)】

StartOptions StartOptions模块对系统的基本通信组件进行查询和设置的能力。 说明: 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下使用。 开发前请熟悉鸿蒙开发指导文档…

CentOS 重启网络失败service network restart

命令 service network restart 提示 Job for network.service failed because the control process exited with error code. See “systemctl status network.service” and “journalctl -xe” for details. 原因分析 使用journalctl -xe命令查看日志后的具体错误 -- Un…

STM32单片机实战开发笔记-PWM波输出频率及占空比配置【wulianjishu666】

单片机物联网开发资料: 链接:https://pan.baidu.com/s/1XzodQuML7CqZ4ZKinDGKkg?pwdbgep 提取码:bgep PWM模块测试 功能描述 脉冲宽度调制模式: PWM边沿对齐模式: 向上计数配置 当TIMX_CR1寄存器中的DIR为低的时…

AD3552/AD3551驱动开发

开发环境:Vivado2021.2 ; Windows with Cygwin HDL版本:hdl_2021_r2 GitHub - analogdevicesinc/hdl at hdl_2021_r2 no-OS版本:no_OS-2021_R2 GitHub - analogdevicesinc/no-OS at 2021_R2 1.创建hdl 详细步骤参见参考链接1&#xf…

基于PHP高考志愿填报系统搭建私有化部署源码

金秋志愿高考志愿填报系统是一款为高中毕业生提供志愿填报服务的在线平台。该系统旨在帮助学生更加科学、合理地选择自己的大学专业和学校,从而为未来的职业发展打下坚实的基础。 该系统的主要功能包括:报考信息查询、志愿填报数据指导、专业信息查询、院校信息查询…

Allegro如何输出器件坐标文件

如何输出器件坐标文件 1、选择菜单栏File(文件)→Placement…(放置) 2、跳出下面的对话框,选择原点位置在Body Center(几何中心),然后选择Export(导出)&…