不使用pytorch中的Dataloader,如何加载一个数据集(例如cifar10)?

不使用pytorch中的Dataloader,如何加载一个图像数据集(例如cifar10)?

可以尝试去看一下cifar10的可视化,然后自己实现一下dataloader改写

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7702110
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:pytorch加载训练数据集dataloader操作耗费时间太久,该如何解决?
  • 除此之外, 这篇博客: 解决pytorch中Dataloader读取数据太慢的问题中的 二、查找不匹配的原因 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    本人使用的GPU为RTX3060,数据集为cifar10,使用的模型为VGG,显然这张显卡对于这个任务来说是绰绰有余的,无论是显存还是算力。
    但是几经测试发现,数据从内存送到GPU的速度实在是太慢了,去百度了很久都没有很好的解决。那回到这个问题的本身,既然是数据加载导致的性能差,那问题就出在pytorch的datasetdataloader中。

    在dataset中,会将数据从磁盘读入内存中,如果启用了dataloader中的pin_memory,就会让数据常驻内存,同时设置num_workers还能实现多进程读取数据,但即使设置了这些,数据加载速度依然没有质的提升。

    博主发现,dataset中的transform是导致性能慢的一个原因,dataset中有个函数为__getitem__,每获取一个数据就会让这个数据过一次transform。相信大家都写过如下的代码:

    transform = transforms.Compose([
    	transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.4914, 0.4822, 0.4465], [0.5, 0.5, 0.5])
    ])
    

    但是这里的ToTensor和Normalize完全没必要没读一次数据都处理一次,可以在数据加载到内存的时候就直接全部处理完,这样每个数据只需要经历一次ToTensor和Normalize,这会大大提高数据读取速度,大家可以自行测试一次ToTensor和Normalize所需要的时间,还是非常大的。

    在训练的过程中,相信大家也写过如下代码:

    for x, y in dataloader:
    	x, y = x.cuda(), y.cuda()
    

    经过博主测试,将数据发送到GPU也是非常耗时的,那为什么不一次性全部加载到GPU里面呢?当然前提是你的GPU显存够大。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^