pytorch初学笔记(六):DataLoader的使用
创始人
2025-01-10 18:03:41
0

目录

一、DataLoader介绍

1. DataLoader作用

2. 常用参数介绍 

二、DataLoader的使用

1. 导入并实例化DataLoader

2. 具体使用

2.1 数据集中数据的读取

2.2 DataLoader中数据的读取

3. 使用tensorboard可视化效果

3.1 改变batchsize 

3.2 改变drop_last

3.3 改变shuffle


一、DataLoader介绍

1. DataLoader作用

        DataLoader是一个可迭代的数据装载器,组合了数据集和采样器,并在给定数据集上提供可迭代对象。可以完成对数据集中多个对象的集成。

 

2. 常用参数介绍 

torch.utils.data — PyTorch 1.13 documentation

CLASS  DataLoader

torch.utils.data.DataLoader(datasetbatch_size=1shuffle=Nonesampler=None

batch_sampler=Nonenum_workers=0collate_fn=Nonepin_memory=False

drop_last=Falsetimeout=0worker_init_fn=Nonemultiprocessing_context=None

generator=None*prefetch_factor=2persistent_workers=Falsepin_memory_device=''

先导概念介绍:

  • Epoch: 所有训练样本都已输入到模型中,称为一个epoch
  • Iteration: 一批样本(batch_size)输入到模型中,称为一个Iteration,
  • Batchsize: 一批样本的大小, 决定一个epoch有多少个Iteration

常用的主要有以下五个参数:

  • dataset(数据集):需要提取数据的数据集,Dataset对象
  • batch_size(批大小):每一次装载样本的个数,int型
  •  shuffle(洗牌):进行新一轮epoch时是否要重新洗牌,Boolean型
  • num_workers:是否多进程读取机制
  • drop_last:当样本数不能被batchsize整除时, 是否舍弃最后一批数据

 

二、DataLoader的使用

        我们使用CIFAR10的测试数据集来完成DataLoader的使用。

1. 导入并实例化DataLoader

        创建一个dataloader,设置批大小为4,每一个epoch重新洗牌,不进行多进程读取机制,不舍弃不能被整除的批次。

#导入数据集的包 import torchvision.datasets #导入dataloader的包 from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter  #创建测试数据集 test_dataset = torchvision.datasets.CIFAR10(root="./CIRFA10",train=False,transform=torchvision.transforms.ToTensor()) #创建一个dataloader,设置批大小为4,每一个epoch重新洗牌,不进行多进程读取机制,不舍弃不能被整除的批次 test_dataloader = DataLoader(dataset=test_dataset,batch_size=4,shuffle=True,num_workers=0,drop_last=False)

2. 具体使用

2.1 数据集中数据的读取

        由于数据集中的数据已经被我们转换成了tensor型,我们用dataset[0]输出第一张图片,使用shape属性输出tensor类型的大小,target代表图片的标签。 

img,target = test_dataset[0] print(img.shape,target)

        可以看到图片有RGB3个通道,大小为32*32,target为3。

 

2.2 DataLoader中数据的读取

        在dataset中,每一个对象元组由一张图片对象img和一个标签target组成;

        而dataloader中会分别对一个批次中的图片和标签进行打包,因此dataloader中,每一个对象由元组由batchsize张图片对象imgs和batchsize个标签targets组成。

  • 对一个批次中的所有图片对象进行打包,形成一个对象,我们叫它imgs
  • 对一个批次中所有的标签进行打包,形成一个对象,我们叫它targets

 

        我们需要通过for循环来取出loader中的对象,loader中的对象个数=数据集中对象个数/batch_size,故应为10000/4=2500个对象。

        核心代码:

for data in test_dataloader:     imgs,targets = data     print(imgs.shape)     print(targets) 
#导入数据集的包 import torchvision.datasets #导入dataloader的包 from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter  #创建测试数据集 test_dataset = torchvision.datasets.CIFAR10(root="./CIRFA10",train=False,transform=torchvision.transforms.ToTensor()) #创建一个dataloader,设置批大小为4,每一个epoch重新洗牌,不进行多进程读取机制,不舍弃不能被整除的批次 test_dataloader = DataLoader(dataset=test_dataset,batch_size=4,shuffle=True,num_workers=0,drop_last=False)  #测试数据集中第一张图片对象 img,target = test_dataset[0] print(img.shape,target)  #打印数据集中图片数量 print(len(test_dataset))  #loader中对象 for data in test_dataloader:     imgs,targets = data     print(imgs.shape)     print(targets)  #dataloader中对象个数 print(len(test_dataloader))

 

        loader中的对象格式:

  • imgs的维度变成了4*3*32*32,即四张图片,每张图片3个通道,每张图片大小为32*32。
  • targets里有4个target,分别是四张图片的target。

       loader中的对象个数:

        2500个,数据集中图片个数为10000,10000/4=2500,验证正确。说明loader中数据按4个一组打包。 

 

3. 使用tensorboard可视化效果

3.1 改变batchsize 

        修改数据集的batchsize为64,writer中调用的方法为add_images(),因为需要读取的图片有多张。

#导入数据集的包 import torchvision.datasets #导入dataloader的包 from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter  #创建测试数据集 test_dataset = torchvision.datasets.CIFAR10(root="./CIRFA10",train=False,transform=torchvision.transforms.ToTensor()) #创建一个dataloader,设置批大小为64,每一个epoch重新洗牌,不进行多进程读取机制,不舍弃不能被整除的批次 test_dataloader = DataLoader(dataset=test_dataset,batch_size=64,shuffle=True,num_workers=0,drop_last=False)  writer = SummaryWriter("log")  #loader中对象 step = 0 for data in test_dataloader:     imgs,targets = data     writer.add_images("loader",imgs,step)     step+=1  writer.close()

结果如下所示,可以看到一个step中有64张图片。

        但是我们发现step156时只取了16张图片,是因为10000张图片每次取64张是不能整除的,因此最后剩下了16张,单独放在最后一个step中,对最后剩余数量的图片进行保留是因为我们设置的drop_last=False。

 

 

3.2 改变drop_last

        如果我们改变drop_last=True,则不会保留最后的16张图片,会被舍弃,只保留能被整除的批次。

 

        结果如下所示,可以看到最后一步为155步,没了最后的16张图片,只保留了所有能整除的64的step。 

 

3.3 改变shuffle

        每一轮epoch之后就是分配完了一次数据,而shuffle决定了是否在新一轮epoch开始时打乱所有图片的属性进行分配。

        在代码中epoch就是最外层的循环,假设我们的epoch=2,即需要分配两次数据:

  • shuffle=TRUE代表第一轮循环结束后会打乱数据集中所有图片的顺序重新进行分配。
  • shuffle=FALSE代表第一轮循环结束后不打乱数据集中所有图片的顺序,还是按原顺序进行分配。

       

3.3.1 shuffle=False时

#导入数据集的包 import torchvision.datasets #导入dataloader的包 from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter  #创建测试数据集 test_dataset = torchvision.datasets.CIFAR10(root="./CIRFA10",train=False,transform=torchvision.transforms.ToTensor()) #创建一个dataloader,设置批大小为64,每一个epoch重新洗牌,不进行多进程读取机制,不舍弃不能被整除的批次 test_dataloader = DataLoader(dataset=test_dataset,batch_size=64,shuffle=False,num_workers=0,drop_last=True)  writer = SummaryWriter("log")  #loader中对象  for epoch in range(2):     step = 0     for data in test_dataloader:         imgs, targets = data         writer.add_images("Epoch:{}".format(epoch), imgs, step)         step += 1   writer.close()

        可以看到epoch=0和epoch=1的每一个step中的图片都是分配的相同的,说明每一轮大循环开始前没有在数据集中重新打乱顺序。

 

3.3.2 shuffle=True时

       可以看到epoch=0和epoch=1的每一个step中的图片不同了,说明每一轮大循环开始前都在数据集中重新打乱了顺序。

 

参考资料 

系统学习Pytorch笔记三:Pytorch数据读取机制(DataLoader)与图像预处理模块(transforms)_翻滚的小@强的博客-CSDN博客_dataloader读取顺序

DataLoader的使用_哔哩哔哩_bilibili 

相关内容

热门资讯

第3个揭秘(epoker)软件... 您好,epoker这款游戏可以开挂的,确实是有挂的,需要了解加微【439369440】很多玩家在这款...
今日重大通报《Wepoke打法... 今日重大通报《Wepoke打法》软件透明挂!(辅助挂)透明挂软件渠道(2021已更新)(哔哩哔哩);...
发现玩家《Wepoke打法》软... 发现玩家《Wepoke打法》软件透明挂!(辅助挂)外挂透明挂插件(2022已更新)(哔哩哔哩)发现玩...
玩家必备科技wpk俱乐部外挂(... 玩家必备科技wpk俱乐部外挂(辅助挂)软件透明挂(2023已更新)(哔哩哔哩);wpk软件透明挂更新...
第三方配件也能适配苹果了,iO... 苹果公司以其对用户体验的不懈追求和对创新技术的不断探索而闻名。随着iOS 18和iPadOS 18的...
2024版教程(德州线上扑克)... 自定义新版德州线上扑克系统规律,只需要输入自己想要的开挂功能,一键便可以生成出德州线上扑克专用辅助器...
黑科技辅助《Wepoke安卓版... 黑科技辅助《Wepoke安卓版》软件透明挂!(辅助挂)透明挂软件科技(2023已更新)(哔哩哔哩);...
一分钟揭秘(wpk德州)软件透... 一分钟揭秘(wpk德州)软件透明挂(辅助挂)太坑了其实是有挂的(2020已更新)(哔哩哔哩)一分钟揭...
必知教程《Wepoke德州》软... 必知教程《Wepoke德州》软件透明挂!(软件)透明挂插件(2023已更新)(哔哩哔哩);软件透明挂...
一文通透位置编码:从标准位置编... 前言关于位置编码和RoPE 应用广泛,是很多大模型使用的一种位置编码方式,...