文章目录

  • 一、DataLoader(数据预处理)
    • 1、DataLoader :(构建可迭代的数据装载器)
    • 2、输出:DataLoader 的输出包含:数据和标签
  • 二、TensorDataset(数据预处理)
  • 三、torch.utils.data.Dataset 介绍与实战
    • 1.前言
    • 2.Dataset (自定义自己读取数据的方法)
    • 3.通过继承 torch.utils.data.Dataset 定义自己的数据集类
    • 4、为什么要定义自己的数据集类?(实现用 pd.read_csv 读取 csv 文件)
    • 5、实战:orch.utils.data.Dataset + Dataloader 实现数据集读取和迭代
      • 实例1:
      • 实例 2:进阶
import torch
from torch.utils.data import Dataset
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader

一、DataLoader(数据预处理)

import torch
import torch.utils.data as Data
torch.manual_seed(1)
BATCH_SIZE = 5x = torch.linspace(1,10,10)
y = torch.linspace(10,1,10)torch_dataset = Data.TensorDataset(x,y) #把数据放在数据库中
loader = Data.DataLoader(# 从dataset数据库中每次抽出batch_size个数据dataset=torch_dataset,batch_size=BATCH_SIZE,shuffle=True,#将数据打乱num_workers=2, #使用两个线程
)

1、DataLoader :(构建可迭代的数据装载器)

torch.utils.data.DataLoader(): 构建可迭代的数据装载器, 我们在训练的时候,每一个for循环,每一次iteration,就是从DataLoader中获取一个batch_size大小的数据的。

ataLoader的参数很多,但我们常用的主要有5个:

  • dataset: Dataset类, 决定数据从哪读取以及如何读取
  • bathsize: 批大小
  • num_works: 是否多进程读取机制
  • shuffle: 每个epoch是否乱序
  • drop_last: 当样本数不能被batchsize整除时, 是否舍弃最后一批数据

要理解这个drop_last, 首先,得先理解Epoch, Iteration和Batchsize的概念:

  • Epoch: 所有训练样本都已输入到模型中,称为一个Epoch
  • Iteration: 一批样本输入到模型中,称为一个Iteration
  • Batchsize: 一批样本的大小, 决定一个Epoch有多少个Iteration

举个例子就Ok了, 假设样本总数80, Batchsize是8, 那么1Epoch=10 Iteration。 假设样本总数是87, Batchsize是8, 如果drop_last=True, 那么1Epoch=10Iteration, 如果等于False, 那么1Epoch=11Iteration, 最后1个Iteration有7个样本。

例子

#分割batch
batchdata = DataLoader(mnist,batch_size=bs, shuffle = True) #总共多少个batch?

2、输出:DataLoader 的输出包含:数据和标签



二、TensorDataset(数据预处理)

import torch
import torch.utils.data as Data
torch.manual_seed(1)
BATCH_SIZE = 5x = torch.linspace(1,10,10)
y = torch.linspace(10,1,10)torch_dataset = Data.TensorDataset(x,y) #把数据放在数据库中
loader = Data.DataLoader(# 从dataset数据库中每次抽出batch_size个数据dataset=torch_dataset,batch_size=BATCH_SIZE,shuffle=True,#将数据打乱num_workers=2, #使用两个线程
)

三、torch.utils.data.Dataset 介绍与实战

1.前言

训练模型一般都是先处理 数据的输入问题预处理问题 。Pytorch提供了几个有用的工具:torch.utils.data.Dataset 类和 torch.utils.data.DataLoader 类 。

流程是先把原始数据转变成 torch.utils.data.Dataset 类,随后再把得到的 torch.utils.data.Dataset 类当作一个参数传递给 torch.utils.data.DataLoader 类,得到一个数据加载器,这个数据加载器每次可以返回一个 Batch 的数据供模型训练使用。

在 pytorch 中,提供了一种十分方便的数据读取机制,即使用 torch.utils.data.Dataset 与 Dataloader 组合得到数据迭代器。在每次训练时,利用这个迭代器输出每一个 batch 数据,并能在输出时对数据进行相应的预处理或数据增广操作。

2.Dataset (自定义自己读取数据的方法)

  • pytorch 提供了一个数据读取的方法,其由两个类构成:torch.utils.data.Dataset 和 DataLoader。
  • 如果我们要自定义自己读取数据的方法,就需要继承类 torch.utils.data.Dataset ,并将其封装到DataLoader 中。
  • torch.utils.data.Dataset 是一个 类 Dataset 。通过重写定义在该类上的方法,我们可以实现多种数据读取及数据预处理方式
class Dataset(object):"""An abstract class representing a Dataset.All other datasets should subclass it. All subclasses should override``__len__``, that provides the size of the dataset, and ``__getitem__``,supporting integer indexing in range from 0 to len(self) exclusive."""def __getitem__(self, index):raise NotImplementedErrordef __len__(self):raise NotImplementedErrordef __add__(self, other):return ConcatDataset([self, other])

3.通过继承 torch.utils.data.Dataset 定义自己的数据集类

torch.utils.data.Dataset 是代表自定义数据集的抽象类,我们可以定义自己的数据类抽象这个类,只需要重写__len__和__getitem__这两个方法就可以。

要自定义自己的 Dataset 类,至少要重载两个方法:_ len _, _ getitem _

  • _ len _ 返回的是数据集的大小
  • _ getitem _ 实现索引数据集中的某一个数据

下面将简单实现一个返回 torch.Tensor 类型的数据集:

from torch.utils.data import Dataset
import torchclass TensorDataset(Dataset):# TensorDataset继承Dataset, 重载了__init__, __getitem__, __len__# 实现将一组Tensor数据对封装成Tensor数据集# 能够通过index得到数据集的数据,能够通过len,得到数据集大小def __init__(self, data_tensor, target_tensor):self.data_tensor = data_tensorself.target_tensor = target_tensordef __getitem__(self, index):return self.data_tensor[index], self.target_tensor[index]def __len__(self):return self.data_tensor.size(0)    # size(0) 返回当前张量维数的第一维# 生成数据
data_tensor = torch.randn(4, 3)   # 4 行 3 列,服从正态分布的张量
print(data_tensor)
target_tensor = torch.rand(4)     # 4 个元素,服从均匀分布的张量
print(target_tensor)# 将数据封装成 Dataset (用 TensorDataset 类)
tensor_dataset = TensorDataset(data_tensor, target_tensor)# 可使用索引调用数据
print('tensor_data[0]: ', tensor_dataset[0])# 可返回数据len
print('len os tensor_dataset: ', len(tensor_dataset))

输出结果:

tensor([[ 0.8618,  0.4644, -0.5929],[ 0.9566, -0.9067,  1.5781],[ 0.3943, -0.7775,  2.0366],[-1.2570, -0.3859, -0.3542]])
tensor([0.1363, 0.6545, 0.4345, 0.9928])
tensor_data[0]:  (tensor([ 0.8618,  0.4644, -0.5929]), tensor(0.1363))
len os tensor_dataset:  4

4、为什么要定义自己的数据集类?(实现用 pd.read_csv 读取 csv 文件)

因为我们可以通过定义自己的数据集类并重写该类上的方法 实现多种多样的(自定义的)数据读取方式。

比如,我们重写 _ init_ 实现用 pd.read_csv 读取 csv 文件:

from torch.utils.data import Dataset
import pandas as pd  # 这个包用来读取CSV数据# 继承Dataset,定义自己的数据集类 mydataset
class mydataset(Dataset):def __init__(self, csv_file):   # self 参数必须,其他参数及其形式随程序需要而不同,比如(self,*inputs)self.csv_data = pd.read_csv(csv_file)def __len__(self):return len(self.csv_data)def __getitem__(self, idx):data = self.csv_data.values[idx]return datadata = mydataset('spambase.csv')
print(data[3])
print(len(data))
[0.000e+00 0.000e+00 0.000e+00 0.000e+00 6.300e-01 0.000e+00 3.100e-016.300e-01 3.100e-01 6.300e-01 3.100e-01 3.100e-01 3.100e-01 0.000e+000.000e+00 3.100e-01 0.000e+00 0.000e+00 3.180e+00 0.000e+00 3.100e-010.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+000.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+000.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+000.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+001.370e-01 0.000e+00 1.370e-01 0.000e+00 0.000e+00 3.537e+00 4.000e+011.910e+02 1.000e+00]
4601

5、实战:orch.utils.data.Dataset + Dataloader 实现数据集读取和迭代

实例1:

数据集 spambase.csv 用的是 UCI 机器学习存储库里的垃圾邮件数据集,它一条数据有57个特征和1个标签。

import torch.utils.data as Data
import pandas as pd  # 这个包用来读取CSV数据
import torch# 继承Dataset,定义自己的数据集类 mydataset
class mydataset(Data.Dataset):def __init__(self, csv_file):   # self 参数必须,其他参数及其形式随程序需要而不同,比如(self,*inputs)data_csv = pd.DataFrame(pd.read_csv(csv_file))   # 读数据self.csv_data = data_csv.drop(axis=1, columns='58', inplace=False)  # 删除最后一列标签def __len__(self):return len(self.csv_data)def __getitem__(self, idx):data = self.csv_data.values[idx]return datadata = mydataset('spambase.csv')
x = torch.tensor(data[:5])         # 前五个数据
y = torch.tensor([1, 1, 1, 1, 1])  # 标签torch_dataset = Data.TensorDataset(x, y)  # 对给定的 tensor 数据,将他们包装成 datasetloader = Data.DataLoader(# 从数据库中每次抽出batch size个样本dataset = torch_dataset,       # torch TensorDataset formatbatch_size = 2,                # mini batch sizeshuffle=True,                  # 要不要打乱数据 (打乱比较好)num_workers=2,                 # 多线程来读数据
)def show_batch():for step, (batch_x, batch_y) in enumerate(loader):print("steop:{}, batch_x:{}, batch_y:{}".format(step, batch_x, batch_y))show_batch()
steop:0, batch_x:tensor([[0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 6.3000e-01, 0.0000e+00,3.1000e-01, 6.3000e-01, 3.1000e-01, 6.3000e-01, 3.1000e-01, 3.1000e-01,3.1000e-01, 0.0000e+00, 0.0000e+00, 3.1000e-01, 0.0000e+00, 0.0000e+00,3.1800e+00, 0.0000e+00, 3.1000e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 1.3500e-01, 0.0000e+00, 1.3500e-01, 0.0000e+00, 0.0000e+00,3.5370e+00, 4.0000e+01, 1.9100e+02],[0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 6.3000e-01, 0.0000e+00,3.1000e-01, 6.3000e-01, 3.1000e-01, 6.3000e-01, 3.1000e-01, 3.1000e-01,3.1000e-01, 0.0000e+00, 0.0000e+00, 3.1000e-01, 0.0000e+00, 0.0000e+00,3.1800e+00, 0.0000e+00, 3.1000e-01, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 1.3700e-01, 0.0000e+00, 1.3700e-01, 0.0000e+00, 0.0000e+00,3.5370e+00, 4.0000e+01, 1.9100e+02]], dtype=torch.float64), batch_y:tensor([1, 1])
steop:1, batch_x:tensor([[2.1000e-01, 2.8000e-01, 5.0000e-01, 0.0000e+00, 1.4000e-01, 2.8000e-01,2.1000e-01, 7.0000e-02, 0.0000e+00, 9.4000e-01, 2.1000e-01, 7.9000e-01,6.5000e-01, 2.1000e-01, 1.4000e-01, 1.4000e-01, 7.0000e-02, 2.8000e-01,3.4700e+00, 0.0000e+00, 1.5900e+00, 0.0000e+00, 4.3000e-01, 4.3000e-01,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,7.0000e-02, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 1.3200e-01, 0.0000e+00, 3.7200e-01, 1.8000e-01, 4.8000e-02,5.1140e+00, 1.0100e+02, 1.0280e+03],[6.0000e-02, 0.0000e+00, 7.1000e-01, 0.0000e+00, 1.2300e+00, 1.9000e-01,1.9000e-01, 1.2000e-01, 6.4000e-01, 2.5000e-01, 3.8000e-01, 4.5000e-01,1.2000e-01, 0.0000e+00, 1.7500e+00, 6.0000e-02, 6.0000e-02, 1.0300e+00,1.3600e+00, 3.2000e-01, 5.1000e-01, 0.0000e+00, 1.1600e+00, 6.0000e-02,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00,0.0000e+00, 0.0000e+00, 0.0000e+00, 6.0000e-02, 0.0000e+00, 0.0000e+00,1.2000e-01, 0.0000e+00, 6.0000e-02, 6.0000e-02, 0.0000e+00, 0.0000e+00,1.0000e-02, 1.4300e-01, 0.0000e+00, 2.7600e-01, 1.8400e-01, 1.0000e-02,9.8210e+00, 4.8500e+02, 2.2590e+03]], dtype=torch.float64), batch_y:tensor([1, 1])
steop:2, batch_x:tensor([[  0.0000,   0.6400,   0.6400,   0.0000,   0.3200,   0.0000,   0.0000,0.0000,   0.0000,   0.0000,   0.0000,   0.6400,   0.0000,   0.0000,0.0000,   0.3200,   0.0000,   1.2900,   1.9300,   0.0000,   0.9600,0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,   0.0000,0.0000,   0.0000,   0.7780,   0.0000,   0.0000,   3.7560,  61.0000,278.0000]], dtype=torch.float64), batch_y:tensor([1])

一共 5 条数据,batch_size 设为 2 ,则数据被分为三组,每组的数据量为:2,2,1。

实例 2:进阶

import torch.utils.data as Data
import pandas as pd  # 这个包用来读取CSV数据
import numpy as np# 继承Dataset,定义自己的数据集类 mydataset
class mydataset(Data.Dataset):def __init__(self, csv_file):   # self 参数必须,其他参数及其形式随程序需要而不同,比如(self,*inputs)# 读取数据frame = pd.DataFrame(pd.read_csv('spambase.csv'))spam = frame[frame['58'] == 1]ham = frame[frame['58'] == 0]SpamNew = spam.drop(axis=1, columns='58', inplace=False)  # 删除第58列,inplace=False不改变原数据,返回一个新dataframeHamNew = ham.drop(axis=1, columns='58', inplace=False)# 数据self.csv_data = np.vstack([np.array(SpamNew), np.array(HamNew)])  # 将两个N维数组进行连接,形成X# 标签self.Label = np.array([1] * len(spam) + [0] * len(ham))  # 形成标签值列表ydef __len__(self):return len(self.csv_data)def __getitem__(self, idx):data = self.csv_data[idx]label = self.Label[idx]return data, labeldata = mydataset('spambase.csv')
print(len(data))loader = Data.DataLoader(# 从数据库中每次抽出batch size个样本dataset = data,       # torch TensorDataset formatbatch_size = 460,                # mini batch sizeshuffle=True,                  # 要不要打乱数据 (打乱比较好)num_workers=2,                 # 多线程来读数据
)def show_batch():for step, (batch_x, batch_y) in enumerate(loader):print("steop:{}, batch_x:{}, batch_y:{}".format(step, batch_x, batch_y))show_batch()

一共 4601 条数据,按 batch_size = 460 来分:能划分为 11 组,前 10 组的数据量为 460,最后一组的数据量为 1 。

5 torch.utils.data (Dataset,TensorDataset,DataLoader)相关推荐

  1. 【PyTorch】torch.utils.data.Dataset 介绍与实战

    文章目录 一.前言 二.torch.utils.data.Dataset 是什么 1. 干什么用的? 2. 长什么样子? 三.通过继承 torch.utils.data.Dataset 定义自己的数据 ...

  2. 阅读源码-理解torch.utils.data、torch.utils.data.Dataset、torch.utils.data.DataLoader的工作方式

    文章目录 目标 Dataset DataLoader 应用 Dataset DataLoader 测试 知识点 Python splitlines()方法 python filter()函数 暂时先写 ...

  3. pytorch torch.utils.data.Dataset

    应用 from torch.utils.data import DataLoader, Dataset import torchclass TensorDataset(Dataset):# Tenso ...

  4. PyTorch—torch.utils.data.DataLoader 数据加载类

    文章目录 DataLoader(object)类: _DataLoaderIter(object)类 __next__函数 pin_memory_batch() _get_batch函数 _proce ...

  5. Pytorch 中的数据类型 torch.utils.data.DataLoader 参数详解

    DataLoader是PyTorch中的一种数据类型,它定义了如何读取数据方式.详情也可参考本博主的另一篇关于torch.utils.data.DataLoader(https://blog.csdn ...

  6. pytorch源码解析2——数据处理torch.utils.data

    迭代器 理解 Python 的迭代器是解读 PyTorch 中 torch.utils.data 模块的关键. 在 Dataset, Sampler 和 DataLoader 这三个类中都会用到 py ...

  7. PyTorch 源码解读之 torch.utils.data:解析数据处理全流程

    目录 0 前言 1 Dataset 1.1 Map-style dataset 1.2 Iterable-style dataset 1.3 其他 dataset 2 Sampler 3 DataLo ...

  8. PyTorch 1.0 中文文档:torch.utils.data

    译者:BXuan694 class torch.utils.data.Dataset 表示数据集的抽象类. 所有用到的数据集都必须是其子类.这些子类都必须重写以下方法:__len__:定义了数据集的规 ...

  9. torch.utils.data.DataLoader()的使用

    数据加载器,结合了数据集和取样器,并且可以提供多个线程处理数据集.在训练模型时使用到此函数,用来把训练数据分成多个小组,此函数每次抛出一组数据.直至把所有的数据都抛出.就是做一个数据的初始化. 官网上 ...

最新文章

  1. 每年“骗”马云10亿,被骂大忽悠,他却当选中国工程院院士?
  2. 硬链接与软链接的区别有哪些?
  3. python爬虫教程下载-Python爬虫视频教程全集下载
  4. SOA的缺陷及其与微服务的关系
  5. js实现向上滚动效果
  6. mysql time类型转换_mysql8 参考手册--Date日期和Time时间类型之间的转换
  7. 系统调用被信号打断的例子
  8. Lubuntu 18.10仍有可能支持32位PC
  9. postman 字符串中有冒号_【接口测试】Postman入门09 Postman获取HTTP请求
  10. 全国计算机软考程序员考试大纲(2012)
  11. Java深圳工作面试经历(真实经历)!!!
  12. 服务器pe安装win7系统安装教程,pe安装win7原版镜像系统教程
  13. 第三代酷睿i3处理器_轻薄本CPU谁更强?英特尔21款低功耗处理器大排行!
  14. 社会意识的独立性原理
  15. 苹果手机相册怎么分类_电子相册怎么做?用手机app可以剪辑电子相册视频吗?...
  16. spring的 init-method和 destory-method方法
  17. 资产盘点帐实相符的条码录入Excel方法
  18. 什么是以太网变压器?常用产品有哪些?百兆千兆万兆网络变压器产品图电路图原理图
  19. 基于高速51单片机的模拟USB接口设计
  20. 申请HTTPS需要哪些条件?如何申请?

热门文章

  1. cesium CLAMP_TO_GROUND 报错 Cannot read property ‘globe‘ of undefined
  2. menu.ctrl.php,对pyqt5之menu和action的使用详解
  3. iOS POS之3DES加密
  4. Docker 常见使用
  5. java实现微博网站设计_基于jsp的微博网站-JavaEE实现微博网站 - java项目源码
  6. 百度/Google等搜索引擎的信息检索搜索技巧总结
  7. 关于使用datagrip连接postgresql不显示数据库问题解决
  8. 10.[保护模式]长调用与短调用
  9. 理想低通滤波器、Butterworth滤波器和高斯滤波器
  10. 第7课 微信小程序实现图片搜索器案例: