注:本文源码基于PyTorch1.0,目前在PyTorch0.4下没有发现错误。
PyTorch中的Dataset是一个抽象类,我们可以通过继承Dataset来将数据集的源文件、规模和其他非必要的功能打包,从而供DataLoader使用。无论是官方给出的数据集如torchvision.datasets.MNIST等,还是我们在做实验时需要使用自己的数据集,都要继承Dataset类,在继承过程中,须重载的函数包括:
- __init__():构造函数,略过不说。
- __getitem__():_DataLoaderIter()类中有调用:
# https://pytorch.org/docs/stable/_modules/torch/utils/data/dataloader.html
batch = self.collate_fn([self.dataset[i] for i in indices])
- __len__():sampler(如SequentialSampler()类)中有调用len()函数:
# https://pytorch.org/docs/stable/_modules/torch/utils/data/sampler.html
class SequentialSampler(Sampler):
"""Samples elements sequentially, always in the same order.
Arguments:
data_source (Dataset): dataset to sample from
"""
def __init__(self, data_source):
self.data_source = data_source
def __iter__(self):
return iter(range(len(self.data_source)))
def __len__(self):
return len(self.data_source)
这三个类是继承时必须重载的函数,我们也可以加入self.loader和self.transform等变量以方便后续处理。需要注意的是,Dataset类只相当于一个打包工具,包含了数据的地址。真正把数据读入内存的过程是由Dataloader进行批迭代输入的时候进行的。