Dataloader与Dataset:
DataLoader 是一个迭代器,最基本的使用方法就是传入一个 Dataset 对象,它会根据参数 batch_size 的值生成一个 batch 的数据,节省内存的同时,它还可以实现多进程、数据打乱等处理。
Dataset是用来解决数据从哪里读取以及如何读取的问题。
DataLoader的功能是构建可迭代的数据装载器,在训练的时候,每一个for循环,每一次Iteration,就是从DataLoader中获取一个batch_size大小的数据。
Dataloader常用参数:
-
dataset表示Dataset类,它决定了数据从哪读取以及如何读取;
-
batch_size表示批大小;
-
num_works表示是否多进程读取数据,0表示只有主进程;
-
shuffle表示每个epoch是否乱序;
-
drop_last表示当样本数不能被batch_size整除时,是否舍弃最后一批数据;
这里提到了epoch,所有训练样本都已输入到模型之中,称为一个Epoch,也就说将样本都训练一遍,称为一个Epoch。一批样输入到模型中,这样称为一个Iteration。决定一个Epoch有多少个Iteration,为批次大小Batchsize。
举个例子,假如样本总数为80,设置的Batchsize为8,那么输入模型一次就输入8个样本,1 Epoch = 10 Iteration(或者是step),这是正好可以整除的例子。假如样本总数为87,设置的Batchsize为8,那么是有10个Iteration还是11个Iteration?这就需要看drop_last参数了,如果设置为True,那就是10个Iteration,相当于舍弃了7个样本,如果设置为False,那就是11个Iteration,最后一个Iteration比前面的Iteration样本个数要少。
DataLoader的数据读取机制:
首先,在for循环中使用了DataLoader,进入DataLoader后,首先根据是否使用多进程DataLoaderIter,做出判断之后单线程还是多线程,接着使用Sampler得索引Index,然后将索引给到DatasetFetcher,在这里面调用Dataset,根据索引,通过getitem得到实际的数据和标签,得到一个batch size大小的数据后,通过collate_fn函数整理成一个Batch Data的形式输入到模型去训练。