Pytorch中TensorDataset与DataLoader的使用方式

 更新时间:2023年09月09日 08:50:11   作者:Arxan_hjw  
这篇文章主要介绍了Pytorch中TensorDataset与DataLoader的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

TensorDataset与DataLoader的使用

TensorDataset

TensorDataset本质上与python zip方法类似,对数据进行打包整合。

官方文档说明:

**Dataset wrapping tensors.

Each sample will be retrieved by indexing tensors along the first dimension.*

Parameters:
tensors (Tensor) – tensors that have the same size of the first dimension.

该类通过每一个 tensor 的第一个维度进行索引。

因此,该类中的 tensor 第一维度必须相等。

import torch
from torch.utils.data import TensorDataset
# a的形状为(4*3)
a = torch.tensor([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])
# b的第一维与a相同
b = torch.tensor([1,2,3,4])
train_data = TensorDataset(a,b)
print(train_data[0:4])

输出结果如下:

(tensor([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3],
        [4, 4, 4]]), tensor([1, 2, 3, 4]))

DataLoader

DataLoader本质上就是一个iterable(跟python的内置类型list等一样),并利用多进程来加速batch data的处理,使用yield来使用有限的内存。

import torch
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
a = torch.tensor([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])
b = torch.tensor([1,2,3,4])
train_data = TensorDataset(a,b)
data = DataLoader(train_data, batch_size=2, shuffle=True)
for i, j in enumerate(data):
    x, y = j
    print(' batch:{0} x:{1}  y: {2}'.format(i, x, y))

输出:

 batch:0 x:tensor([[1, 1, 1],
        [2, 2, 2]])  y: tensor([1, 2])
 batch:1 x:tensor([[4, 4, 4],
        [3, 3, 3]])  y: tensor([4, 3])

Pytorch Dataset,TensorDataset,Dataloader,Sampler关系

Dataloader

Dataloader是数据加载器,组合数据集和采样器,并在数据集上提供单线程或多线程的迭代器。

所以Dataloader的参数必然需要指定数据集Dataset和采样器Sampler。

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=<function default_collate>, pin_memory=False, drop_last=False)
  • dataset (Dataset) – 数据集。
  • batch_size (int, optional) – 每个batch加载样本数。
  • shuffle (bool, optional) – True则打乱数据.
  • sampler (Sampler, optional) – 采样器,如指定则忽略shuffle参数。
  • num_workers (int, optional) – 用多少个子进程加载数据。0表示数据将在主进程中加载
  • collate_fn (callable, optional) – 获取batch数据的回调函数,也就是说可以在这个函数中修改batch的形式
  • pin_memory (bool, optional) –
  • drop_last (bool, optional) – 如果数据集大小不能被batch size整除,则设置为True后可删除最后一个不完整的batch。如果设为False并且数据集的大小不能被batch size整除,则最后一个batch将更小。

Dataset和TensorDataset

所有其他数据集都应该进行子类化。所有子类应该override __len__ __getitem__ ,前者提供了数据集的大小,后者支持整数索引,范围从0到len(self)。

TensorDataset是Dataset的子类,已经复写了 __len__ __getitem__ 方法,只要传入张量即可,它通过第一个维度进行索引。

所以TensorDataset说白了就是将输入的tensors捆绑在一起,然后 __len__ 是任何一个tensor的维度, __getitem__ 表示每个tensor取相同的索引,然后将这个结果组成一个元组,源码如下,要好好理解它通过第一个维度进行索引的意思(针对tensors里面的每一个tensor而言)。

class TensorDataset(Dataset):
	def __init__(self,*tensors):
		assert all(tensors[0].size(0)==tensor.size(0) for tensor in tensors)
		self.tensors = tensors
	def __getitem__(self,index):
		return tuple(tensor[index] for tensor in self.tensors)
	def __len__(self):
		return self.tensors[0].size(0)

Sampler和RandomSampler

Sampler与Dataset类似,是采样器的基础类。

每个采样器子类必须提供一个 __iter__ 方法,提供一种迭代数据集元素的索引的方法,以及返回迭代器长度的 __len__ 方法。

所以Sampler必然是关于索引的迭代器,也就是它的输出是索引。

而RandomSampler与TensorDataset类似,RandomSamper已经实现了 __iter__ __len__ 方法,只需要传入数据集即可。

猜想理解RandomSampler的实现方式,考虑到这个类实现需要传入Dataset,所以 __len__ 就是Dataset的 __len__ ,然后 __iter__ 就可以随便搞一个随机函数对range(length)随机即可。

综合示例

结合TensorDataset和RandomSampler使用Dataloader

这里即可理解Dataloader这个数据加载器其实就是组合数据集和采样器的组合。所以那就是先根据Sampler随机拿到一个索引,再用这个索引到Dataset中取tensors里每个tensor对应索引的数据来组成一个元组。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python中执行调用JS的多种实现方法总结

    Python中执行调用JS的多种实现方法总结

    这篇文章主要给大家介绍了关于Python中执行调用JS的多种实现方法,在一些特殊的python应用场景下需要逆向执行javascript代码块或者.js文件,需要的朋友可以参考下
    2023-08-08
  • Django drf请求模块源码解析

    Django drf请求模块源码解析

    APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块,对Django drf请求模块源码相关知识感兴趣的朋友一起看看吧
    2021-06-06
  • Python3标准库总结

    Python3标准库总结

    在本篇内容中我们给大家总结了关于Python3标准库的相关内容,需要的朋友们跟着学习下。
    2019-02-02
  • 通过Python实现电脑定时关机的两种方法

    通过Python实现电脑定时关机的两种方法

    这篇文章主要介绍了分别利用PyQT5和Tkinter实现电脑的定时关机小程序,文中的示例代码讲解详细,对我们学习Python有一定的帮助,快跟随小编一起学习一下吧
    2021-12-12
  • python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单

    python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单

    前几天接到的一个需求,因为学校给的名单是青年大学习已学习的名单,然而要知道未学习的名单只能从所有团员中再排查一次,过程相当麻烦。刚好我也学过一些操作办公软件的基础,再加上最近在学pyqt5,所以我决定用python写个自动操作文件的脚本给她用用。
    2021-05-05
  • python实现书法碑帖图片分割

    python实现书法碑帖图片分割

    这篇文章主要为大家详细介绍了python实现书法碑帖图片分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • python3.6的字符串处理f-string的使用技巧分享

    python3.6的字符串处理f-string的使用技巧分享

    在这篇文章中讲解了F字符串的基础使用,对于F字符串有着很多的使用技巧,在这篇文章中你会见识到更多的F字符串的使用技巧,下面小编将介绍python3.6 的字符串处理f-string的使用技巧,需要的朋友可以参考下
    2024-02-02
  • python 爬虫百度地图的信息界面的实现方法

    python 爬虫百度地图的信息界面的实现方法

    这篇文章主要介绍了python 爬虫百度地图的界面的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • python计算寄送包裹重量的实现过程

    python计算寄送包裹重量的实现过程

    要实现这样一个需求寄送包裹小于5kg,每公斤0.5元,大于等于5kg,超出5公斤部分,按照每公斤0.8元计算,输入重量,输出应付金额,下面小编给大家分享实现代码,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • 使用Python监视指定目录下文件变更的方法

    使用Python监视指定目录下文件变更的方法

    今天小编就为大家分享一篇使用Python监视指定目录下文件变更的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论