语言:
🇨🇳
🇺🇸
««MPDataset»实现了一个全新的用于大规模数据加载的Iterable数据类
文件夹mp/
提供了一个简易实现,相关测试代码参看test/
。
完整的MPDataset
类已经集成到zcls。具体路径位于mp_dataset.py和MPDataset
下面是基于cifar100
的训练结果:
arch | dataset | shuffle | gpu | top1 | top5 |
---|---|---|---|---|---|
sfv1_3g1x | CIFAR100 | no | 1 | 69.470 | 91.350 |
sfv1_3g1x | MPDataset | no | 1 | 67.340 | 89.560 |
sfv1_3g1x | GeneralDataset | no | 1 | 1.010 | 4.960 |
sfv1_3g1x | CIFAR100 | yes | 1 | 70.350 | 91.040 |
sfv1_3g1x | MPDataset | yes | 1 | 68.000 | 90.030 |
sfv1_3g1x | GeneralDataset | yes | 1 | 68.680 | 90.660 |
sfv1_3g1x | CIFAR100 | no | 3 | 69.716 | 91.112 |
sfv1_3g1x | MPDataset | no | 3 | 67.367 | 89.652 |
sfv1_3g1x | GeneralDataset | no | 3 | 1.420 | 5.879 |
sfv1_3g1x | CIFAR100 | yes | 3 | 70.756 | 91.972 |
sfv1_3g1x | MPDataset | yes | 3 | 68.806 | 90.252 |
sfv1_3g1x | GeneralDataset | yes | 3 | 68.656 | 90.472 |
对于dataset
字段表示含义,参见Dataset
CIFAR100
:Pytorch
提供的数据类;MPDataset
: 自定义的基于Iterable
类型的数据类;GeneralDataset
: 一个包装类,内部使用ImageFolder
。- 完整配置文件位于
configs/
从训练结果来看,对于MPDataset
和GeneralDataset
而言并没有明显差异,甚至MPDataset
能够得到更好的结果(因为基于原始数据加载顺序,已经进行了一次打乱操作)。
上面也出现了一个很奇怪的现象,就是官方提供的cifar
文件能够得到更好的效果,在网上也找到一些相关链接,有人也遇到了这个问题
- Why is the accuracy difference so much when I use the image data set and pytorch’s own data set directly?
- Why is the accuracy difference so much when I use the image data set and pytorch's own data set directly?
基于当前大数据训练需求(几千万甚至上亿训练数据),有必要进一步优化训练环境。在Pytorch
实现中,可以通过多进程同步加载的方式来预处理更多的数据。然而,每个进程都保留了全部数据的副本,尽管它们只需要其中的一部分。
对于传统的基于Map
类型的数据类而言,DataLoader
会在主进程中使用采样器,为子进程数据类分配相应的数据索引集合。从v1.2
开始,Pytorch
提供了一种新的基于Iterable
样式的数据类 - IterableDataset
,它可以在每个进程中定义和使用采样器。本仓库为实现大规模数据加载定义了一个基于Iterable
类型的数据集类MPDataset
,可以确保每个进程只保留它所需要的部分数据。
- zhujian - Initial work - zjykzj
欢迎任何人的参与!打开issue或提交合并请求。
注意:
GIT
提交,请遵守Conventional Commits规范- 语义版本化,请遵守Semantic Versioning 2.0.0规范
README
编写,请遵守standard-readme规范
Apache License 2.0 © 2021 zjykzj