【Pytorch】torch.utils.data模块

news2024/11/21 20:27:31

        torch.utils.data模块主要用于进行数据集处理,是常用的一个包。在构建数据集的过程中经常会用到。要使用data函数必须先导入:

from torch.utils import data

       下面介绍几个经常使用到的类。   

torch.utils.data.DataLoader

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None, *, prefetch_factor=2,
           persistent_workers=False)

        DataLoader构造函数最重要的参数是 dataset,它指示要从中加载数据的数据集对象。PyTorch 支持两种不同类型的数据集——映射式数据集和可迭代式数据集。

        映射式数据集是Dataset 子类的实例,它实现了 __getitem__() 和 __len__() 协议,它表示从索引/键值到数据样本的映射。例如,当使用 dataset[idx] 访问此类数据集时,它可以从磁盘上的文件夹中读取第 idx 幅图像及其对应的标签。

        可迭代式数据集是IterableDataset 子类的实例,它实现了 __iter__() 协议,并表示数据样本上的可迭代对象。这种类型的数据集特别适合随机读取代价高昂甚至不可能的情况,以及批大小取决于获取的数据的情况。例如,当调用 iter(dataset) 时,此类数据集可以返回从数据库、远程服务器甚至实时生成的日志中读取的数据流。

torch.utils.data.Dataset

        表示一个Dataset的抽象类。所有表示键到数据样本映射的数据集都应该继承它。所有子类都应该重写__getitem__(),支持为给定键获取数据样本。子类还可以选择性地重写__len__(),许多Sampler实现和DataLoader的默认选项都期望它返回数据集的大小。子类还可以选择性地实现__getitems__(),以加速批量样本加载。此方法接受批量样本索引列表并返回样本列表。

代码运用示例:

import torch
from torch.utils.data import Dataset, DataLoader

# 自定义数据集
class SimpleDataset(Dataset):
    def __init__(self, data, labels):
        """
        Args:
            data (list or tensor): 输入数据
            labels (list or tensor): 数据对应的标签
        """
        self.data = torch.tensor(data, dtype=torch.float32)  # 转为张量
        self.labels = torch.tensor(labels, dtype=torch.long)  # 转为张量

    def __len__(self):
        """返回数据集的大小"""
        return len(self.data)

    def __getitem__(self, idx):
        """根据索引返回一个样本"""
        return self.data[idx], self.labels[idx]

# 创建数据和标签
data = [1, 2, 3, 4, 5]
labels = [0, 1, 0, 1, 0]

# 实例化数据集
dataset = SimpleDataset(data, labels)

# 用 DataLoader 加载数据
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

# 遍历 DataLoader
for batch_data, batch_labels in dataloader:
    print("Data:", batch_data)
    print("Labels:", batch_labels)

运行结果:(顺序会随着Shuffle=True发生变化)

torch.utils.data.IterableDataset

        一个可迭代的数据集。所有表示数据样本可迭代的数据集都应该继承它。当数据来自流时,这种形式的数据集特别有用。所有子类都应该重写__iter__(),它将返回此数据集中样本的迭代器。当子类与DataLoader一起使用时,数据集中的每个项目都将从DataLoader迭代器中产生。当num_workers > 0时,每个工作进程将拥有数据集对象的副本,因此通常希望独立配置每个副本以避免工作进程返回重复的数据。get_worker_info()在工作进程中调用时,返回有关工作进程的信息。它可以在数据集的__iter__()方法或DataLoader的worker_init_fn选项中使用来修改每个副本的行为。

代码运用示例:

import torch
from torch.utils.data import IterableDataset, DataLoader

# 自定义 IterableDataset
class NumberStreamDataset(IterableDataset):
    def __init__(self, start, end):
        """
        Args:
            start (int): 起始值
            end (int): 结束值
        """
        self.start = start
        self.end = end

    def __iter__(self):
        """
        定义数据生成逻辑,返回一个迭代器
        """
        for num in range(self.start, self.end):
            yield num

# 创建一个数据集实例
dataset = NumberStreamDataset(start=0, end=10)

# 用 DataLoader 加载数据
dataloader = DataLoader(dataset, batch_size=3)

# 遍历 DataLoader
for batch in dataloader:
    print(batch)

运行结果:

torch.utils.data.TensorDataset(*tensors)

        包装张量的数据集。每个样本将通过沿第一个维度索引张量来检索。参数*tensors (张量)表示第一个维度大小相同的张量。

代码运用示例:

import torch
from torch.utils.data import TensorDataset, DataLoader

# 创建输入张量和标签张量
data = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])
labels = torch.tensor([0, 1, 0, 1])

# 使用 TensorDataset 封装数据
dataset = TensorDataset(data, labels)

# 使用 DataLoader 加载数据
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

# 遍历 DataLoader
for batch_data, batch_labels in dataloader:
    print("Batch data:", batch_data)
    print("Batch labels:", batch_labels)

运行结果:(顺序会随着shuffle=True而发生变化)

torch.utils.data.ConcatDataset(datasets)

        将多个数据集连接起来的数据集。此类用于组装不同的现有数据集。参数datasets (序列) 表示要连接的数据集列表

代码运用示例:

import torch
from torch.utils.data import TensorDataset, ConcatDataset, DataLoader

# 创建两个数据集
data1 = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
labels1 = torch.tensor([0, 1])
dataset1 = TensorDataset(data1, labels1)

data2 = torch.tensor([[5.0, 6.0], [7.0, 8.0]])
labels2 = torch.tensor([1, 0])
dataset2 = TensorDataset(data2, labels2)

# 使用 ConcatDataset 拼接两个数据集
concat_dataset = ConcatDataset([dataset1, dataset2])

# 用 DataLoader 加载数据
dataloader = DataLoader(concat_dataset, batch_size=2, shuffle=True)

# 遍历 DataLoader
for batch_data, batch_labels in dataloader:
    print("Batch data:", batch_data)
    print("Batch labels:", batch_labels)

运行结果:

torch.utils.data.Subset(datasetindices)

        指定索引处数据集的子集。参数dataset (Dataset)表示整个数据集,indices (序列) – 为子集选择的整个集合中的索引。

代码运用示例:

import torch
from torch.utils.data import TensorDataset, Subset, DataLoader

# 创建一个原始数据集
data = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])
labels = torch.tensor([0, 1, 0, 1])
dataset = TensorDataset(data, labels)

# 使用 Subset 提取索引为 [1, 3] 的样本
indices = [1, 3]
subset = Subset(dataset, indices)

# 用 DataLoader 加载子集
dataloader = DataLoader(subset, batch_size=1)

# 遍历 DataLoader
for batch_data, batch_labels in dataloader:
    print("Batch data:", batch_data)
    print("Batch labels:", batch_labels)

运行结果:

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

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

相关文章

XGBOOST、LightGBM、CATBoost

本文介绍几种不同的 GBDT 优化算法: XGBoost XGBoost 对损失函数展开二阶导,使得提升树能逼近真是损失,增加正则项防止过拟合,XGBoost 公式: L( y i y_i yi​, y ^ i \hat{y}_i y^​i​): 损失函数 Ω ( f k ) \Ome…

论文阅读 SimpleNet: A Simple Network for Image Anomaly Detection and Localization

SimpleNet: A Simple Network for Image Anomaly Detection and Localization 摘要: 该论文提出了一个简单且应用友好的网络(称为 SimpleNet)来检测和定位异常。SimpleNet 由四个组件组成:(1)一个预先训练的…

多线程4:线程池、并发、并行、综合案例-抢红包游戏

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

Java数据库连接(Java Database Connectivity,JDBC)

1.JDBC介绍 Java数据库连接(Java Database Connectivity,JDBC)是SUN公司为了简化、统一对数据库的操作,定义的一套Java操作数据库的规范(接口)。这套接口由数据库厂商去实现,这样,开…

高亮变色显示文本中的关键字

效果 第一步:按如下所示代码创建一个用来高亮显示文本的工具类: public class KeywordUtil {/*** 单个关键字高亮变色* param color 变化的色值* param text 文字* param keyword 文字中的关键字* return*/public static SpannableString highLigh…

2024强化学习的结构化剪枝模型RL-Pruner原理及实践

[2024] RL-Pruner: Structured Pruning Using Reinforcement Learning for CNN Compression and Acceleration 目录 [2024] RL-Pruner: Structured Pruning Using Reinforcement Learning for CNN Compression and Acceleration一、论文说明二、原理三、实验与分析1、环境配置在…

电脑超频是什么意思?超频的好处和坏处

嗨,亲爱的小伙伴!你是否曾经听说过电脑超频?在电脑爱好者的圈子里,这个词似乎非常熟悉,但对很多普通用户来说,它可能还是一个神秘而陌生的存在。 今天,我将带你揭开超频的神秘面纱,…

uniapp: vite配置rollup-plugin-visualizer进行小程序依赖可视化分析减少vender.js大小

一、前言 在之前文章《uniapp: 微信小程序包体积超过2M的优化方法(主包从2.7M优化到1.5M以内)》中,提到了6种优化小程序包体积的方法,但并没有涉及如何分析common/vender.js这个文件的优化,而这个文件的大小通常情况下…

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 (一)启用 TCP/IP 协议 操作入口 首先,我们要找到 SQL Server 配置管理器,操作路径为:通过 “此电脑” 右键选择 “管理”,在弹出的 “计算机管理” 窗口中,找到 “服务和应用程…

STM32F103系统时钟配置

时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定CPU速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令&#x…

鸿蒙进阶篇-Math、Date

“在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

RAID存储技术 详解

RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种将多个物理硬盘组合为一个逻辑存储单元的技术。它通过分布数据、冗余校验和容错能力,提高存储系统的性能、可靠性和容量利用率。 以下从底层原理和源代码层面…

MTK主板定制_联发科主板_MTK8766/MTK8768/MTK8788安卓主板方案

主流市场上的MTK主板通常采用联发科的多种芯片平台,如MT8766、MT6765、MT6762、MT8768和MT8788等。这些芯片基于64位Cortex-A73/A53架构,提供四核或八核配置,主频可达2.1GHz,赋予设备卓越的计算与处理能力。芯片采用12纳米制程工艺…

免费微调自己的大模型(llama-factory微调llama3.1-8b)

目录 1. 名词/工具解释2. 微调过程3. 总结 本文主要介绍通过llama-factory框架,使用Lora微调方法,微调meta开源的llama3.1-8b模型,平台使用的是趋动云GPU算力资源。 微调已经经过预训练的大模型目的是,通过调整模型参数和不断优化…

MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

MySQL中的InnoDB存储引擎支持四种事务隔离级别,这些级别定义了事务在并发环境中的行为和相互之间的可见性。以下是这四种隔离级别的名称以及它们之间的区别: 读未提交(Read Uncommitted) 特点:这是最低的隔离级别&…

【YOLOv10改进[注意力]】引入并行分块注意力PPA(2024.3.16) + 适于微小目标

本文将进行在YOLOv10中引入并行分块注意力PPA魔改v10 的实践,文中含全部代码、详细修改方式。助您轻松理解改进的方法。 一 HCF 论文题目:Hierarchica

共建智能软件开发联合实验室,怿星科技助力东风柳汽加速智能化技术创新

11月14日,以“奋进70载,智创新纪元”为主题的2024东风柳汽第二届科技周在柳州盛大开幕,吸引了来自全国的汽车行业嘉宾、技术专家齐聚一堂,共襄盛举,一同探寻如何凭借 “新技术、新实力” 这一关键契机,为新…

在ubuntu下,使用Python画图,无法显示中文怎么解决

1.首先需要下载中文字体,推荐simsun,即宋体,地址如下 https://www.freefonts.io/download/simsun/ 2.下载完要把字体文件放进字体目录,具体方法如下; a.创建字体目录:sudo mkdir -p /usr/share/fonts/truet…

鸿蒙实战:使用显式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建SecondAbility2.4 创建Second.ets 3. 测试效果4. 实战总结5. 拓展练习 - 启动文件管理器5.1 创建鸿蒙应用项目5.2 修改Index.ets代码5.3 测试应用运行效果 1. 实战概述 本实战详细阐述了在 …

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情,将它与表白结合在一起,会创造出别具一格的惊喜效果。使用Python的turtle模块,我们可以轻松绘制出动态的烟花特效,再配合文字表白,打造一段专属的浪漫体验。 接下来,让…