1. 先前处理数据集的代码经常比较混乱并且难以维护

2. 数据集处理代码应该和训练代码解耦合,从而达到模块化和更好的可读性

因此,pytorch提出了两个数据处理类:DataLoader与Dataset

from torch.utils.data import Dataset, DataLoaderclass SimpleDataset(Dataset):def __init__(self, size):self.x = [i for i in range(size)]def __getitem__(self, index):return self.x[index]def __len__(self):return len(self.x)dataset = SimpleDataset(322)
# 将dataset对象传入DataLoader类
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, drop_last=False)
# 此处不执行,生成器for idx, data in enumerate(dataloader):print(idx)print(len(data))

当处理自己的数据时,需要继承Dataset类,重写__init__, __len__, __getitem__函数。

__init__:读取数据集

__len__:获取整个数据集的样本个数

__getitem__:获取样本中的第index个样本

当你需要加载数据时,将dataset对象传入DataLoader类

batch_size:将数据集分成大小为batch_size的序列

shuffle:是否打乱数据。如果打乱,获取样本并不是按照顺序的,多次执行dataloader获取的数据内容也不一样的

drop_last:将数据集按照batch_size大小分批,如果有剩余,是否丢掉剩余的

上面每条样本只有一个数据,当一条样本对应于多个数据时,需要用到字典:

from torch.utils.data import Dataset, DataLoaderclass SimpleDataset(Dataset):def __init__(self, size):self.x = [i for i in range(size)]self.y = [i + 1 for i in range(size)]def __getitem__(self, index):sample = {"x": self.x[index], "y": self.y[index]}return sampledef __len__(self):return len(self.x)dataset = SimpleDataset(322)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, drop_last=False)for idx, data in enumerate(dataloader):print(idx)print(len(data))

对于非向量化的数据同样可处理:

from torch.utils.data import Dataset, DataLoaderclass SimpleDataset(Dataset):def __init__(self, size):self.x = ["I love you" for i in range(size // 2)] + ["I love you very much" for i in range(size // 2, size)]self.y = [i + 1 for i in range(size)]def __getitem__(self, index):sample = {"x": self.x[index], "y": self.y[index]}return sampledef __len__(self):return len(self.x)dataset = SimpleDataset(322)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, drop_last=False)for idx, data in enumerate(dataloader):print(idx)print(len(data))

读取文本后再向量化有一个好处,就是进行padding时,只需要考虑当前batch中最大长度,而不需要考虑整个数据集的最大长度。

并且如果数据集太大,无法在SimpleDataset的__init__函数中全部向量化,则可以只读原始数据,通过dataloader分批之后再向量化。

但是以下处理是错误的:

from torch.utils.data import Dataset, DataLoaderclass SimpleDataset(Dataset):def __init__(self, size):self.x = ["I love you".split() for i in range(size // 2)] + \["I love you very much".split() for i in range(size // 2, size)]# self.x 里面的元素为列表,自动解析成每个样本对应的多个元素;# 但是因为列表的长度不一致,后面列表中的very,much取不到,因为有的样本不包含这两个元素self.y = [i + 1 for i in range(size)]def __getitem__(self, index):sample = {"x": self.x[index], "y": self.y[index]}return sampledef __len__(self):return len(self.x)dataset = SimpleDataset(322)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, drop_last=False)for idx, data in enumerate(dataloader):print(idx)print(len(data))

pytorch数据读取之Dataset与DataLoader相关推荐

  1. 编写transformers的自定义pytorch训练循环(Dataset和DataLoader解析和实例代码)

    文章目录 一.Dataset和DataLoader加载数据集 1.torch.utils.data 2. 加载数据流程 3. Dataset 4. dataloader类及其参数 5. dataloa ...

  2. PyTorch框架学习八——PyTorch数据读取机制(简述)

    PyTorch框架学习八--PyTorch数据读取机制(简述) 一.数据 二.DataLoader与Dataset 1.torch.utils.data.DataLoader 2.torch.util ...

  3. 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络

    使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络 本文例程部分主要参考官方文档. JAX简介 JAX 的前身是 Autograd ,也就是说 JAX 是 Autograd 升级版本 ...

  4. PyTorch系列 (二): pytorch数据读取自制数据集并

    PyTorch系列 (二): pytorch数据读取 PyTorch 1: How to use data in pytorch Posted by WangW on February 1, 2019 ...

  5. Pytorch数据读取(Dataset, DataLoader, DataLoaderIter)

    Pytorch的数据读取主要包含三个类: Dataset DataLoader DataLoaderIter 这三者是一个依次封装的关系: 1.被装进2., 2.被装进3. Dataset类 Pyto ...

  6. 速成pytorch学习——6天Dataset和DataLoader

    Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道. Dataset定义了数据集的内容,它相当于一个类似列表的数据结构,具有确定的长度,能够用索引获取数据集中的元素. ...

  7. 《Pytorch学习指南》- Dataset和Dataloader用法详解

    目录 前言 DataSet DataLoader 数据构建 1. 创建Dataset 类 :sparkles: 2. 读取数据 :ambulance: 3. 返回数据 :zap: 读取数据 :art: ...

  8. 系统学习Pytorch笔记三:Pytorch数据读取机制(DataLoader)与图像预处理模块(transforms)

    Pytorch官方英文文档:https://pytorch.org/docs/stable/torch.html? Pytorch中文文档:https://pytorch-cn.readthedocs ...

  9. Pytorch数据读取加速方法

    1. 方法一:使用prefetcher class data_prefetcher():def __init__(self, loader):self.loader = iter(loader)sel ...

最新文章

  1. 设计模式——单例模式(Singleton)
  2. python编写用户输入的是q么代码_Python课 #01号作业
  3. 【Java】LeetCode 876 获取链表中间节点
  4. 估价范围还没有生产式的物料帐薄
  5. rhel 6下配置网络yum源(虚拟机环境下)
  6. Js+DVML:很酷实用的右键弹出菜单
  7. 关于低代码真实技术趋势,听低代码巨头 Mendix 怎么说
  8. VMware Workstation 11网络桥接可以通,NAT不能与主机通信解决办法
  9. [Linux] 头文件加载顺序
  10. SQL Server2014安装流程及注意事项
  11. 锂电池电量百分比计算_锂电池充放电理论及电量计算方法设计
  12. android购物车栏,Android怎么实现二级列表购物车功能
  13. 敏捷思维-架构设计中的方法学(11)精化和合并
  14. 安徽省计算机二级水平考试试卷,安徽省计算机二级考试理论试题(附答案)
  15. C# 将PDF文档转换成图片
  16. PS——规定尺寸的证件照的制作
  17. Java How to Program练习题_第六章_深入理解方法(Methods: A Deeper Look)
  18. 人活一辈子到底为了啥?(人生苦短 我要学人工智能)一万年太久,只争朝夕。
  19. 再见了,少年——转自有意思吧
  20. linux性能监控工具perf,Linux性能分析中常用的工具perf介绍

热门文章

  1. 汶川地震《生死不离》歌词
  2. 诸葛亮的十堂课:在变局中安身立命,在逆境中找到力量
  3. java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...
  4. mysql 什么时候用内连接_mysql显示内连接和隐式内连接的区别,什么时候非要用到显示内连接。...
  5. 差分隐私 机器学习_微软发布多个建置可信AI的问责机器学习工具
  6. 251f与ips屏显示器对比_8百左右预算,2020年PS平面设计/摄影后期显示器推荐/选购指南(全高清+高色域屏)...
  7. php 置多条cookie,php 在cookie存储多个的简单示例
  8. 酒店前台html,酒店前台常用英语单词
  9. 互联网行业不需要中年人,那些35岁离开BAT的人都去哪了?
  10. 面试被问:Selenium元素定位不到问题,如何回答?