【Pytorch】加载数据

2024-09-07 01:04
文章标签 数据 加载 pytorch

本文主要是介绍【Pytorch】加载数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据集获取:链接: https://pan.baidu.com/s/1jZoTmoFzaTLWh4lKBHVbEA 密码: 5suq

本文基于P5. PyTorch加载数据初认识_哔哩哔哩_bilibili 

dataset:提供一种方式去获取数据及其label值,解释:Pytorch中的dataset类——创建适应任意模型的数据集接口_datasetpath-CSDN博客

dataloader:为网络提供不同的数据形式

首先新建一个python文件:read_data

把数据集文件与代码文件放在同一目录下

找到图片,复制路径。

read_data文件代码:

from torch.utils.data import Dataset
# 读取图片
from PIL import Image
import os# Dataset 是 PyTorch 的数据集基类。
# Image 用于打开和处理图片。
# os 用于处理文件路径。# MyData 类继承自 PyTorch 的 Dataset 类,需要实现三个方法:__init__()、__getitem__() 和 __len__()。
class MyData(Dataset):# 初始化sdef __init__(self, root_dir, label_dir):# self.root_dir和self.label_dir分别保存图像数据的根目录和标签目录。# self.path是root_dir 和 label_dir的连接路径。# self.img_path是指定目录下所有文件的列表,即图像文件的名称。# 路径self.root_dir = root_dir# 标签名self.label_dir = label_dir# 拼接成路径名self.path = os.path.join(self.root_dir, self.label_dir)# 获取所有图片的编号self.img_path = os.listdir(self.path)# 传编号def __getitem__(self, idx):# idx是数据集中的索引。# img_name是根据索引获取的图像文件名称。# img_item_path是图像的完整路径。# Image.open(img_item_path)用于打开图像文件。# label是图像的标签(在这个例子中,标签是目录名)。# return img, label返回图像和标签的元组。# 当前图片的名字img_name = self.img_path[idx]# 当前图片的地址img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)# 打开图片# Image.open()返回值是PIL类型格式,可以直接图片展示img = Image.open(img_item_path)label = self.label_dir# 返回样本对{x:y}return img, labeldef __len__(self):# 返回数据集中图像的数量,即img_path列表的长度。# 返回长度return len(self.img_path)# root_dir 是数据的根目录。
# ants_label_dir 和 bees_label_dir 是两个标签目录,分别代表蚂蚁和蜜蜂的图像数据。
# ants_dataset 和 bees_dataset 分别是两个 MyData 实例,表示蚂蚁和蜜蜂的图像数据集。
root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)train_dataset = ants_dataset + bees_dataset

进阶版:

from torch.utils.data import Dataset, DataLoader
from torch.utils.data import ConcatDataset
import numpy as np
from PIL import Image
import os
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
from torchvision.utils import make_grid# Dataset 和 DataLoader 用于创建和加载数据集。
# ConcatDataset 用于合并多个数据集。
# Image 用于打开和处理图像。
# os 用于处理文件路径。
# transforms 用于图像预处理。
# SummaryWriter 用于 TensorBoard 日志记录。
# make_grid 用于将多个图像合并成一个网格图像。writer = SummaryWriter("logs")class MyData(Dataset):def __init__(self, root_dir, image_dir, label_dir, transform):self.root_dir = root_dirself.image_dir = image_dirself.label_dir = label_dirself.label_path = os.path.join(self.root_dir, self.label_dir)self.image_path = os.path.join(self.root_dir, self.image_dir)self.image_list = os.listdir(self.image_path)self.label_list = os.listdir(self.label_path)# 应用于图像的转换操作(如调整大小和转换为 Tensor)self.transform = transform# 因为label 和 Image文件名相同,进行一样的排序,可以保证取出的数据和label是一一对应的self.image_list.sort()self.label_list.sort()def __getitem__(self, idx):# 根据索引idx获取图像和标签。# img_item_path和label_item_path是图像和标签的完整路径。# Image.open(img_item_path)# 打开图像文件。img_name = self.image_list[idx]label_name = self.label_list[idx]img_item_path = os.path.join(self.root_dir, self.image_dir, img_name)label_item_path = os.path.join(self.root_dir, self.label_dir, label_name)#获取图片文件img = Image.open(img_item_path)# 读取标签文件的内容。with open(label_item_path, 'r') as f:label = f.readline()# 应用转换操作self.transform。img = self.transform(img)# 返回一个字典,包含图像和标签。sample = {'img': img, 'label': label}return sampledef __len__(self):# 确保图像和标签的数量相同。# 返回数据集中图像的数量。assert len(self.image_list) == len(self.label_list)return len(self.image_list)if __name__ == '__main__':# transform定义了图像预处理操作。transform = transforms.Compose([transforms.Resize((256, 256)), transforms.ToTensor()])root_dir = "dataset/train"image_ants = "ants_image"label_ants = "ants_label"ants_dataset = MyData(root_dir, image_ants, label_ants, transform)image_bees = "bees_image"label_bees = "bees_label"bees_dataset = MyData(root_dir, image_bees, label_bees, transform)train_dataset = ants_dataset + bees_dataset# 使用DataLoader创建一个数据加载器,batch_size = 1和num_workers = 2。dataloader = DataLoader(train_dataset, batch_size=1, num_workers=2)# 使用SummaryWriter将索引为119的图像写入TensorBoard。writer.add_image('error', train_dataset[119]['img'])writer.close()

这篇关于【Pytorch】加载数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143615

相关文章

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名