PyTorch框架学习八——PyTorch数据读取机制(简述)

  • 一、数据
  • 二、DataLoader与Dataset
    • 1.torch.utils.data.DataLoader
    • 2.torch.utils.data.Dataset
  • 三、数据读取整体流程

琢磨了一段时间,终于对PyTorch的数据读取机制有了一点理解,并自己实现了简单数据集(猫狗分类数据集)的读入和训练,这里简单写一写自己的理解,以备日后回顾。

一、数据

简单来说,一个机器学习或深度学习问题可以拆解为五个主要的部分:数据、模型、损失函数、优化器和迭代过程,这五部分每个都可以详细展开,都有非常多的知识点,而一切的开始,都源于数据。

一般数据部分可以分为四个主要的内容去学习:

  1. 数据收集:即获取Img和相应的Label。
  2. 数据划分:划分为训练集、验证集和测试集。
  3. 数据读取:DataLoader。
  4. 数据预处理:transforms。

在PyTorch框架的学习中,前两个不是重点,它们是机器学习基础和Python基础的事。而PyTorch的数据预处理transforms方法在前几次笔记进行了很详细地介绍,这次笔记重点是写一点对数据读取机制的理解,这也是最折磨的一部分,经过了很多次的步进演示,终于对整个数据读取过程有了一个较为完整的印象。

总的来说,DataLoader里比较重要的是Sampler和Dataset,前者负责获取要读取的数据的索引,即读哪些数据,后者决定数据从哪里读取以及如何读取。

二、DataLoader与Dataset

1.torch.utils.data.DataLoader

功能:构建可迭代的数据装载器。

torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None, generator=None)

参数比较多,如下所示:

介绍几个主要的:

  1. dataset:Dataset类,决定数据从哪读取以及如何读取。
  2. batch_size:批大小,默认为1。
  3. num_works:是否多进程读取数据。
  4. shuffle:每个epoch是否乱序。
  5. drop_last:当样本数不能被batch_size整除时,是否舍弃最后一批数据。

上面涉及到一个小知识点,顺带介绍一下,即Epoch、Iteration、Batchsize之间的关系:

  1. Epoch:所有训练样本都输入到模型中,称为一个epoch。
  2. Iteration:一个Batch的样本输入到模型中,称为一个Iteration。
  3. Batchsize:批大小,决定一个epoch有多少个iteration。

举个栗子:

若样本总数:80,Batchsize:8,则 1 Epoch = 10 Iterations。
若样本总数:87,Batchsize:8,且 drop_last = True,则1 Epoch = 10 Iterations;而drop_last = False时,1 Epoch = 11 Iterations。

2.torch.utils.data.Dataset

功能:Dataset抽象类,所有自定义的Dataset需要继承它,并且复写__getitem__()函数。
这里__getitem__()函数的功能是:接收一个索引,返回一个样本。

三、数据读取整体流程

经过上面简单的介绍,下面来看一下数据读取的整体流程:

  1. 从DataLoader这个命令开始。
  2. 然后进入到DataLoaderIter里,判断是单进程还是多进程。
  3. 然后进入到Sampler里进行采样,获得一批一批的索引,这些索引就指引了要读取哪些数据。
  4. 然后进入到DatasetFetcher中要依据Sampler获得的Index对数据进行获取。
  5. 在DatasetFetcher调用Dataset类,这里是我们自定义的数据集,数据集一般放在硬盘中,Dataset里面一般都有数据的路径,所以也就能知道了从哪读取数据。
  6. 自定义的Dataset类里再调用__getitem__函数,这里有我们编写的如何读取数据的代码,依据这里的代码读取数据。
  7. 读取出来后可能需要进行图像预处理或数据增强,所以紧接着是transforms方法。
  8. 经过上述的读取,已经得到了图像及其标签,但是还需要将它们组合成batch,就是下面的collate_fn,最后得到了一个batch一个batch的数据。

这个过程中的三个主要问题:

  1. 读哪些数据:Sampler输出要读取的数据的Index。
  2. 从哪读数据:Dataset类中的data_dir,即数据的存放路径。
  3. 怎么读数据:Dataset类中编写的__getitem__()函数。

精力有限,就不在这里写一个具体读取数据的代码了,这里有很多有价值的课程和资料可以学习:深度之眼PyTorch框架

PyTorch框架学习八——PyTorch数据读取机制(简述)相关推荐

  1. PyTorch框架学习一——PyTorch的安装(CPU版本)

    PyTorch框架学习一--PyTorch的安装(CPU版本) PyTorch简介 PyTorch的安装(CPU版) 机器学习/深度学习领域的学习都是需要理论和实践相结合的,而它们的实践都需要借助于一 ...

  2. PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization

    PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...

  3. PyTorch框架学习四——计算图与动态图机制

    PyTorch框架学习四--计算图与动态图机制 一.计算图 二.动态图与静态图 三.torch.autograd 1.torch.autograd.backward() 2.torch.autogra ...

  4. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

  5. PyTorch框架学习七——自定义transforms方法

    PyTorch框架学习七--自定义transforms方法 一.自定义transforms注意要素 二.自定义transforms步骤 三.自定义transforms实例:椒盐噪声 虽然前面的笔记介绍 ...

  6. PyTorch框架学习十九——模型加载与保存

    PyTorch框架学习十九--模型加载与保存 一.序列化与反序列化 二.PyTorch中的序列化与反序列化 1.torch.save 2.torch.load 三.模型的保存 1.方法一:保存整个Mo ...

  7. PyTorch框架学习九——网络模型的构建

    PyTorch框架学习九--网络模型的构建 一.概述 二.nn.Module 三.模型容器Container 1.nn.Sequential 2.nn.ModuleList 3.nn.ModuleDi ...

  8. PyTorch框架学习五——图像预处理transforms(一)

    PyTorch框架学习五--图像预处理transforms(一) 一.transforms运行机制 二.transforms的具体方法 1.裁剪 (1)随机裁剪:transforms.RandomCr ...

  9. PyTorch框架学习二——基本数据结构(张量)

    PyTorch框架学习二--基本数据结构(张量) 一.什么是张量? 二.Tensor与Variable(PyTorch中) 1.Variable 2.Tensor 三.Tensor的创建 1.直接创建 ...

最新文章

  1. SpringBoot实现微信点餐
  2. android思维导图github,2020年GitHub 上那些优秀Android开源库,这里是Top10!
  3. MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器
  4. linux centos 查看桌面环境
  5. Boost库之circular_buffer
  6. [转]在ASP.NET中如何用C#.NET实现基于表单的验证(二)
  7. 一阶电路误差分析_读图学电路原理为什么交流调理电路会产生滞后,直流偏置又是什么...
  8. [BUUCTF-pwn]——ciscn_2019_es_2(内涵peak小知识)
  9. ES6箭头函数和模板字符串
  10. Android之android.system.ErrnoException: open failed: ENOENT (No such file or directory)
  11. React开发(122):动态表头核心配置 外层绑定key
  12. 这套网红试卷火了!数学老师您应该是文案出身吧?
  13. python如何循环使用input_python基础知识input到while循环
  14. 阿里日马云开启直播首秀,谈年轻人压力大:一句话给“骂”醒了!
  15. Unity中国张俊波:Unity的国际化、本土化、全球化 | 2019WISE超级进化者大会
  16. 开源大数据:Apache Pulsar
  17. Mysql入门经典.pdf下载
  18. icode青少年编程比赛网站学生刷题进度爬虫
  19. Android中访问assets本地json文件
  20. 华为云计算08—灾备

热门文章

  1. c语言基本数据类型常量,C语言基础学习基本数据类型-变量和常量
  2. 应广单片机adc_应广PMC232系列单片机 12位ADC PWM LCD 双核心8位MCU
  3. CV和NLP中的无监督预训练(生成式BERT/iGPT和判别式SimCLR/SimCSE)
  4. Spring Boot中使用log4j实现http请求日志入mongodb
  5. 论文浅尝 | Open world Knowledge Graph Completion
  6. 【HTML/CSS】单位小结
  7. 自然语言处理的未来之路(周明老师,CCF-GRIR,笔记)
  8. 第七章 二叉搜索树(b3)BST:删除
  9. KnockoutJS-与服务端交互
  10. 潭州Java中级班(day_05)