dataloadershuffle的简单介绍
DataLoader的使用
简单来说,DataLoader就是数据加载器,结合了数据集和取样器,并且可以提供多个线程处理数据集。在训练模型时使用到此函数,用来把训练数据分成多个小组,此函数每次抛出一组数据。直至把所有的数据都抛出。就是做一个数据的初始化。
在实践中,数据读取经常是训练的性能瓶颈,特别当模型较简单或者计算硬件性能较高时。Pytorch的Dataloader中一个很方便的功能是允许使用多进程来加速数据读取,我们可以通过num_workers来设置使用几个进程读取数据。
参数解释:
dataset:要取的数据集,一般要返回img和label
batch_size:每次从dataset中取多少数据进行打包
shuffle:是否打乱数据
num_workers:加载数据的时候采用单进程还是多进程,默认设置为0,意为采用主进程进行加载
*注:num_works在windows中会偶尔出现问题,如果遇到workerror可以考虑将num_works设置为0
drop_last:当数据集最后一批小于batch_size时,是否舍去最后一批数据集
结果:
如果增加epoch,并将shuffle设置为False,drop_last设置为True:
将shuffle设置为True后的结果:
参考资料:
1. ;spm_id_from=pageDriver
2.
3.
优化pytorch DataLoader提升数据加载速度
因为pytorch数据加载速度太慢,影响训练速度,实训快速加载数据方式,提前获取要加载的数据,整体速度能快1/6.
操作步骤如下所示:
1、激活自己的torch虚拟环境:
source activate torch
2、安装prefetch_generator包
pip install prefetch_generator
3、定义DataLoaderX,继承torch原有的DataLoaderX的属性
class DataLoaderX(DataLoader):
? ? def __iter__(self):
? ? ? ? return BackgroundGenerator(super().__iter__())
4、使用的时候只需要把DataLoader变成DataLoaderX:
如下所示:
gen= DataLoaderX(train_dataset,shuffle=True,
batch_size=batch_size,
num_workers=4,pin_memory=True,
drop_last=False,
collate_fn=yolo_dataset_collate)
为什么已经训练好的分类器在测试阶段pytorch中dataloader的batchsize和shuffle=T/F会影响分类器的准确率?
shuffle的时候是不是只把特征洗牌了而没有洗y,或者x和y洗的逻辑不一样所以导致y错位了?