pytorch中的DataLoader

通常在训练时我们会将数据集分成若干小的、随机的批(batch),这个操作当然可以手动操作,但是pytorch里面为我们提供了API让我们方便地从dataset中获得batch,DataLoader就是来解决这个问题的。

DataLoader的本质是一个可迭代对象,即经过DataLoader的返回值为一个可迭代的对象,一般的操作是:1、创建一个 dataset 对象;2、创建一个DataLoader对象;3、遍历这个DataLoader对象,将data, label加载到模型中进行训练。

torch.utils.data.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, multiprocessing_context=None)
  • dataset:官方文档给出的解释是 “ 从中加载数据的数据集 ” 。

  • batch_size(int,可选):每个批次要加载的样本数(默认值:1)。

  • shuffle(bool,可选):设置为“True”可在每个epoch重新排列数据(默认值:“False”)。一个epoch表示数据集的数据全部使用一遍。

  • sampler(sampler,可选):定义从数据集中提取样本的策略。如果指定,“shuffle”必须为False。batch_sampler 类似,表示一次返回一个batch的索引。

  • num_workers(int,可选):用于数据加载的子进程数,0 表示将在主进程中加载数据。(默认值:0)。换句话说,num_workers = 0 表示在主进程中加载数据而不使用任何额外的子进程;若大于0,表示开启多个进程。进程越多,处理数据的速度越快,但会使电脑性能下降,占用更多的内存。

  • collate_fn(可调用,可选):表示合并样本列表以形成小批量的Tensor对象。

  • pin_memory(bool,可选):表示要将load进来的数据是否要拷贝到pin_memory区中,其表示生成的Tensor数据是属于内存中的锁页内存区,这样将Tensor数据转义到GPU中速度就会快一些,默认为False。如果为“True”,数据加载程序将在返回张量之前将张量复制到CUDA固定内存中。通常情况下,数据在内存中要么以锁页的方式存在,要么保存在虚拟内存(磁盘)中,pin_memory设置为True后,数据直接保存在锁页内存中,后续直接传入CUDA;否则需要先从虚拟内存中传入锁页内存中,再传入CUDA,这样就比较耗时了。

  • drop_last(bool,可选):当整个数据长度不能够整除batch_size,选择是否要丢弃最后一个不完整的batch,默认为False。设置为“True”时可以删除最后一个不完整的批次(batch)。

1 处理数据集

在许多情况下,在众所周知的数据集(如 MNIST 或 CIFAR)上训练神经网络,可以实现预测的准确率超过 90%。原因是,这些数据集组织整齐且易于预处理。但是,当处理自己的数据集时,要实现高精度非常棘手且具有挑战性。

我们将快速浏览一下 PyTorch 库中包含的数据集。PyTorch 带有几个内置的数据集,所有这些都预加载在torch.datasets类中。torchtorchvision,该torch包实现神经网络所需的所有核心类和方法,torchvision包含流行的数据集、模型架构和计算机视觉的常见图像转换。

1.1 Torchvision 中的数据集

MNIST: 经过标准化和中心裁剪的手写图像数据集。它有超过 60,000 张训练图像和 10,000 张测试图像。这是用于学习和实验的最常用的数据集之一。使用以下语法导入torchvision要加载和使用的数据集。

  • torchvision.datasets.MNIST()

Fashion MNIST:该数据集与 MNIST 类似,但该数据集不是手写数字,而是 T 恤、裤子、包等服装项目。训练和测试样本的数量分别为 60,000 和 10,000。

  • torchvision.datasets.FashionMNIST()

CIFAR: CIFAR 数据集有两个版本,CIFAR10 和 CIFAR100。CIFAR10 由 10 个不同标签的图像组成,而 CIFAR100 有 100 个不同的类别。其中包括卡车、青蛙、船、汽车、鹿等常见图像。

  • torchvision.datasets.CIFAR10()
  • torchvision.datasets.CIFAR100()

COCO:这个数据集有超过 100,000 个日常物品,如人、瓶子、文具、书籍等。这个图像数据集广泛用于对象检测和图像描述。

  • torchvision.datasets.CocoCaptions()
Pytorch中的DataLoader一个方便的数据加载器,它可以批量地加载数据,并在训练神经网络时提供数据DataLoader的主要作用是将数据集分成批次,并且在每个epoch中对数据进行随机化,以避免模型过度拟合。 在使用DataLoader之前,需要先定义一个数据集,并将其传递给DataLoader数据集需要实现__getitem__和__len__方法,以便DataLoader可以获取每个样本以及数据集的大小。 例如,一个简单的数据集可以如下所示: ```python class MyDataset(Dataset): def __init__(self, data): self.data = data def __getitem__(self, idx): return self.data[idx] def __len__(self): return len(self.data) ``` 然后,可以使用DataLoader数据集进行批处理: ```python dataset = MyDataset(data) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) ``` 在上面的代码中,batch_size参数指定了每个批次中的样本数量,shuffle参数指定是否对数据进行随机化。 一旦创建了DataLoader,就可以通过迭代器访问数据中的批次。例如: ```python for batch in dataloader: # 处理当前批次的数据 ``` 需要注意的是,每个批次返回的是一个tensor的列表,而不是单个tensor。这是因为在训练神经网络时,通常需要对输入数据和标签进行分离处理。因此,每个批次包含输入数据和对应的标签。可以使用torch.Tensor.split()方法将tensor列表分离成输入和标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源启智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值