深度时代,数据为王。
PyTorch为我们提供的两个Dataset和DataLoader类分别负责可被Pytorhc使用的数据集的创建以及向训练传递数据的任务。如果想个性化自己的数据集或者数据传递方式,也可以自己重写子类。
Dataset是DataLoader实例化的一个参数,所以这篇文章会先从Dataset的源代码讲起,然后下一篇讲到DataLoader,关注主要函数,少细枝末节,目的是使大家学会自定义自己的数据集。
ps: 本文搬运自作者的博客 陈亮的博客 | Liang's Blog,里面有一些完成/待完成的文章,欢迎大家一起交流,转载请注明。
Dataset
什么时候使用Dataset
CIFAR10是CV训练中经常使用到的一个数据集,在PyTorch中CIFAR10是一个写好的Dataset,我们使用时只需以下代码:
data
datasets.CIFAR10就是一个Datasets子类,data是这个类的一个实例。
我们有的时候需要用自己在一个文件夹中的数据作为数据集,这个时候,我们可以使用ImageFolder这个方便的API。
FaceDataset
如何自定义一个数据集
torch.utils.data.Dataset 是一个表示数据集的抽象类。任何自定义的数据集都需要继承这个类并覆写相关方法。
所谓数据集,其实就是一个负责处理索引(index)到样本(sample)映射的一个类(class)。
Pytorch提供两种数据集: Map式数据集 Iterable式数据集
Map式数据集
一个Map式的数据集必须要重写getitem(self, index),len(self) 两个内建方法,用来表示从索引到样本的映射(Map).
这样一个数据集dataset,举个例子,当使用dataset[idx]命令时,可以在你的硬盘中读取你的数据集中第idx张图片以及其标签(如果有的话);len(dataset)则会返回这个数据集的容量。
自定义类大致是这样的:
class
例子-1: 自己实验中写的一个例子:这里我们的图片文件储存在“./data/faces/”文件夹下,图片的名字并不是从1开始,而是从final_train_tag_dict.txt这个文件保存的字典中读取,label信息也是用这个文件中读取。大家可以照着上面的注释阅读这段代码。
from
下面我们看一下官方MNIST数据集的例子
class
Iterable式数据集
一个Iterable(迭代)式数据集是抽象类data.IterableDataset的子类,并且覆写了iter方法成为一个迭代器。这种数据集主要用于数据大小未知,或者以流的形式的输入,本地文件不固定的情况,需要以迭代的方式来获取样本索引。
关于迭代器与生成器的知识可以参见博主的另一篇文章Python迭代器与生成器介绍及在Pytorch源码中应用。
这一块先mark着,因为还没有使用过。
DataLoader
Data loader. Combines a dataset and a sampler, and provides an iterable over the given dataset. --PyTorch Documents