5 torch.utils.data (Dataset,TensorDataset,DataLoader)
文章目录
- 一、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)相关推荐
- 【PyTorch】torch.utils.data.Dataset 介绍与实战
文章目录 一.前言 二.torch.utils.data.Dataset 是什么 1. 干什么用的? 2. 长什么样子? 三.通过继承 torch.utils.data.Dataset 定义自己的数据 ...
- 阅读源码-理解torch.utils.data、torch.utils.data.Dataset、torch.utils.data.DataLoader的工作方式
文章目录 目标 Dataset DataLoader 应用 Dataset DataLoader 测试 知识点 Python splitlines()方法 python filter()函数 暂时先写 ...
- pytorch torch.utils.data.Dataset
应用 from torch.utils.data import DataLoader, Dataset import torchclass TensorDataset(Dataset):# Tenso ...
- PyTorch—torch.utils.data.DataLoader 数据加载类
文章目录 DataLoader(object)类: _DataLoaderIter(object)类 __next__函数 pin_memory_batch() _get_batch函数 _proce ...
- Pytorch 中的数据类型 torch.utils.data.DataLoader 参数详解
DataLoader是PyTorch中的一种数据类型,它定义了如何读取数据方式.详情也可参考本博主的另一篇关于torch.utils.data.DataLoader(https://blog.csdn ...
- pytorch源码解析2——数据处理torch.utils.data
迭代器 理解 Python 的迭代器是解读 PyTorch 中 torch.utils.data 模块的关键. 在 Dataset, Sampler 和 DataLoader 这三个类中都会用到 py ...
- PyTorch 源码解读之 torch.utils.data:解析数据处理全流程
目录 0 前言 1 Dataset 1.1 Map-style dataset 1.2 Iterable-style dataset 1.3 其他 dataset 2 Sampler 3 DataLo ...
- PyTorch 1.0 中文文档:torch.utils.data
译者:BXuan694 class torch.utils.data.Dataset 表示数据集的抽象类. 所有用到的数据集都必须是其子类.这些子类都必须重写以下方法:__len__:定义了数据集的规 ...
- torch.utils.data.DataLoader()的使用
数据加载器,结合了数据集和取样器,并且可以提供多个线程处理数据集.在训练模型时使用到此函数,用来把训练数据分成多个小组,此函数每次抛出一组数据.直至把所有的数据都抛出.就是做一个数据的初始化. 官网上 ...
最新文章
- 每年“骗”马云10亿,被骂大忽悠,他却当选中国工程院院士?
- 硬链接与软链接的区别有哪些?
- python爬虫教程下载-Python爬虫视频教程全集下载
- SOA的缺陷及其与微服务的关系
- js实现向上滚动效果
- mysql time类型转换_mysql8 参考手册--Date日期和Time时间类型之间的转换
- 系统调用被信号打断的例子
- Lubuntu 18.10仍有可能支持32位PC
- postman 字符串中有冒号_【接口测试】Postman入门09 Postman获取HTTP请求
- 全国计算机软考程序员考试大纲(2012)
- Java深圳工作面试经历(真实经历)!!!
- 服务器pe安装win7系统安装教程,pe安装win7原版镜像系统教程
- 第三代酷睿i3处理器_轻薄本CPU谁更强?英特尔21款低功耗处理器大排行!
- 社会意识的独立性原理
- 苹果手机相册怎么分类_电子相册怎么做?用手机app可以剪辑电子相册视频吗?...
- spring的 init-method和 destory-method方法
- 资产盘点帐实相符的条码录入Excel方法
- 什么是以太网变压器?常用产品有哪些?百兆千兆万兆网络变压器产品图电路图原理图
- 基于高速51单片机的模拟USB接口设计
- 申请HTTPS需要哪些条件?如何申请?
热门文章
- cesium CLAMP_TO_GROUND 报错 Cannot read property ‘globe‘ of undefined
- menu.ctrl.php,对pyqt5之menu和action的使用详解
- iOS POS之3DES加密
- Docker 常见使用
- java实现微博网站设计_基于jsp的微博网站-JavaEE实现微博网站 - java项目源码
- 百度/Google等搜索引擎的信息检索搜索技巧总结
- 关于使用datagrip连接postgresql不显示数据库问题解决
- 10.[保护模式]长调用与短调用
- 理想低通滤波器、Butterworth滤波器和高斯滤波器
- 第7课 微信小程序实现图片搜索器案例: