尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

15.dataloader的使用

15.dataloader的使用 dataset vs dataloaderDataset概念定义数据集位置和索引映射关系类比扑克牌堆一摞扑克牌是数据集每张是我们的数据我们知道第一张牌长什么样。DataLoader功能是加载器把我们的数据加载到一个神经网络当中。我们的手就可以当成一个神经网络。dataloader所做的事情就是每次从dataset中去取数据每次取多少怎么取是由dataloader当中的参数进行设置的。比如我们可以控制每次从dataset当中取四张牌,或者我们取的过程中是用一只手去抓牌还是两只手去抓牌。dataloader文档dataloader是批量数据加载器控制取样方式/批量大小/是否打乱。我们在pytorch官网搜索dataloader即可查看torch.utils.data.DataLoader的文档。核心参数:dataset: 必需参数指定自定义数据集功能定义数据集位置、数据索引方式、数据总量其他参数: 大多有默认值实际使用只需设置少量参数典型用法data_loadertorch.utils.data.DataLoader(dataset)forepochinrange(10):forbatchindata_loader:train_batch()参数介绍batch_size定义表示每次从数据集中加载的样本数量功能控制每次迭代返回的数据量大小示例当batch_size2时每次会从数据集中抓取2个样本默认值默认为1即每次加载单个样本shuffle定义控制是否在每个epoch开始时打乱数据顺序功能True每次epoch数据顺序不同类似洗牌效果False保持数据原始顺序默认值默认为False实际应用通常建议设置为True以获得更好的训练效果类比类似打牌时的洗牌过程True表示每局牌的顺序都不同num_workers定义控制数据加载使用的子进程数量功能值为0表示在主进程加载数据默认注意事项在Windows系统下可能出现问题BrokenPipeError遇到错误时可尝试设置为0来解决默认值默认为0性能影响数值越大通常加载速度越快但需考虑系统兼容性drop_last功能控制当数据集大小不能被batch_size整除时是否舍弃最后不完整的批次取值True舍弃最后不足一个batch的数据False默认保留最后不完整的batch示例100张图片batch_size3时100÷333余1drop_lastTrue只取前99张33个完整batchdrop_lastFalse取全部100张33个完整batch1个不完整batch注意如何查看test_data返回的数据格式我们按住command键鼠标点击在CIRAR10上查看其getItem定义的返回格式。我们可以看到返回的 是一个元祖有img和target.batchsize为4那么dataloader会将4个样本的img打包成imgs,target打包成targets.如下遍历test_loader时是每四个样本图片进行打包输出的。torch.Size([3,32,32]). 3是3个通道32和32是图片尺寸3232这个是只有1张图片。torch.Size([4,3,32,32]) 4是4张图片的意思。3是3个通道。32和32是图片尺寸为3232的含义。tensor([2,3,6,8])是这四张图片每张图片的target值。如下我们可以看到test_loader中有采样器sample,randomsampler代表随机采样也就是每次都是随机采样4个样本执行如下代码然后在终端输入 tensorboard --logdir‘src/dataloader’importtorchvision# 准备的测试数据集fromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriter test_datatorchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor())test_loaderDataLoader(datasettest_data,batch_size64,shuffleTrue,num_workers0,drop_lastTrue)# 测试数据集中第一张图片及targetimg,targettest_data[0]print(img.shape)print(target)writerSummaryWriter(dataloader)forepochinrange(2):step0fordataintest_loader:imgs,targetsdata# print(imgs.shape)# print(targets)writer.add_images(Epoch: {}.format(epoch),imgs,step)stepstep1writer.close()我们可以在tensorboard查看结果发现图片被每8*864张作为一批放置在各个step中。drop_last Trueimporttorchvision# 准备的测试数据集fromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriter test_datatorchvision.datasets.CIFAR10(./dataset,trainFalse,transformtorchvision.transforms.ToTensor())test_loaderDataLoader(datasettest_data,batch_size64,shuffleTrue,num_workers0,drop_lastFalse)# 测试数据集中第一张图片及targetimg,targettest_data[0]print(img.shape)print(target)writerSummaryWriter(dataloader)forepochinrange(2):step0fordataintest_loader:imgs,targetsdata# print(imgs.shape)# print(targets)writer.add_images(Epoch: {}.format(epoch),imgs,step)stepstep1writer.close()执行如下代码然后在终端输入 tensorboard --logdir‘src/dataloader’可以看到最后一个step下不是8*864张图片了。drop_lastFalse保留最后不完整的batchshuffleshuffle参数作用功能控制不同epoch间数据顺序是否变化取值True每轮epoch重新打乱数据顺序推荐False保持相同顺序执行如下代码然后在终端输入 tensorboard --logdir‘src/dataloader’我们发现两轮的图片都是一致的。实际应用建议常规设置shuffleTrue避免模型学习到数据顺序特征drop_lastTrue保证每批数据量一致便于计算特殊情况小数据集可设drop_lastFalse充分利用所有数据测试阶段通常设shuffleFalse保证结果可复现总结
返回列表