网站运营及推广,好看的个人工作室源码,设计网校,响应式网站建设报价单PyTorch框架学习八——PyTorch数据读取机制#xff08;简述#xff09;一、数据二、DataLoader与Dataset1.torch.utils.data.DataLoader2.torch.utils.data.Dataset三、数据读取整体流程琢磨了一段时间#xff0c;终于对PyTorch的数据读取机制有了一点理解#xff0c;并自己…
PyTorch框架学习八——PyTorch数据读取机制简述一、数据二、DataLoader与Dataset1.torch.utils.data.DataLoader2.torch.utils.data.Dataset三、数据读取整体流程琢磨了一段时间终于对PyTorch的数据读取机制有了一点理解并自己实现了简单数据集猫狗分类数据集的读入和训练这里简单写一写自己的理解以备日后回顾。
一、数据
简单来说一个机器学习或深度学习问题可以拆解为五个主要的部分数据、模型、损失函数、优化器和迭代过程这五部分每个都可以详细展开都有非常多的知识点而一切的开始都源于数据。
一般数据部分可以分为四个主要的内容去学习
数据收集即获取Img和相应的Label。数据划分划分为训练集、验证集和测试集。数据读取DataLoader。数据预处理transforms。
在PyTorch框架的学习中前两个不是重点它们是机器学习基础和Python基础的事。而PyTorch的数据预处理transforms方法在前几次笔记进行了很详细地介绍这次笔记重点是写一点对数据读取机制的理解这也是最折磨的一部分经过了很多次的步进演示终于对整个数据读取过程有了一个较为完整的印象。
总的来说DataLoader里比较重要的是Sampler和Dataset前者负责获取要读取的数据的索引即读哪些数据后者决定数据从哪里读取以及如何读取。
二、DataLoader与Dataset
1.torch.utils.data.DataLoader
功能构建可迭代的数据装载器。
torch.utils.data.DataLoader(dataset, batch_size1, shuffleFalse, samplerNone, batch_samplerNone, num_workers0, collate_fnNone, pin_memoryFalse, drop_lastFalse, timeout0, worker_init_fnNone, multiprocessing_contextNone, generatorNone)参数比较多如下所示 介绍几个主要的
datasetDataset类决定数据从哪读取以及如何读取。batch_size批大小默认为1。num_works是否多进程读取数据。shuffle每个epoch是否乱序。drop_last当样本数不能被batch_size整除时是否舍弃最后一批数据。
上面涉及到一个小知识点顺带介绍一下即Epoch、Iteration、Batchsize之间的关系
Epoch所有训练样本都输入到模型中称为一个epoch。Iteration一个Batch的样本输入到模型中称为一个Iteration。Batchsize批大小决定一个epoch有多少个iteration。
举个栗子
若样本总数80Batchsize8则 1 Epoch 10 Iterations。 若样本总数87Batchsize8且 drop_last True则1 Epoch 10 Iterations而drop_last False时1 Epoch 11 Iterations。
2.torch.utils.data.Dataset
功能Dataset抽象类所有自定义的Dataset需要继承它并且复写__getitem__()函数。 这里__getitem__()函数的功能是接收一个索引返回一个样本。
三、数据读取整体流程
经过上面简单的介绍下面来看一下数据读取的整体流程
从DataLoader这个命令开始。然后进入到DataLoaderIter里判断是单进程还是多进程。然后进入到Sampler里进行采样获得一批一批的索引这些索引就指引了要读取哪些数据。然后进入到DatasetFetcher中要依据Sampler获得的Index对数据进行获取。在DatasetFetcher调用Dataset类这里是我们自定义的数据集数据集一般放在硬盘中Dataset里面一般都有数据的路径所以也就能知道了从哪读取数据。自定义的Dataset类里再调用__getitem__函数这里有我们编写的如何读取数据的代码依据这里的代码读取数据。读取出来后可能需要进行图像预处理或数据增强所以紧接着是transforms方法。经过上述的读取已经得到了图像及其标签但是还需要将它们组合成batch就是下面的collate_fn最后得到了一个batch一个batch的数据。
这个过程中的三个主要问题
读哪些数据Sampler输出要读取的数据的Index。从哪读数据Dataset类中的data_dir即数据的存放路径。怎么读数据Dataset类中编写的__getitem__()函数。
精力有限就不在这里写一个具体读取数据的代码了这里有很多有价值的课程和资料可以学习深度之眼PyTorch框架