如何使用数据集DataSet?

在介绍DataLoader之前,需要先了解数据集DataSet的使用。Pytorch中集成了很多已经处理好的数据集,在pytorch的torchvision、torchtext等模块有一些典型的数据集,可以通过配置来下载使用。

以CIFAR10 数据集为例,文档已经描述的很清晰了,其中要注意的就是transform这个参数,可以用来将图像转换为所需要的格式,就比如这样,将PIL格式的图像转化为tensor格式的图像:

# 准备的测试数据集
test_data=torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)

DataLoader是什么?

我们可以这样理解:如果Dataset数据集是一个存储所有数据(图像、音频)的容器,那么DataLoader就是另一个具有更好收纳功能的容器,其中分隔开来很多小隔间,可以自己设定一个小隔间有多少个数据集的数据来组成,每次将数据放进收纳小隔间的时候要不要把源数据集打乱再进行收纳等等

也就是说,给定了一个数据集,我们可以决定如何从数据集里面拿取数据来进行训练,比如一次拿取多少数据作为一个对象来对数据集进行分割,对数据集进行分割之前要不要打乱数据集等等。DataLoader的结果就是一个对数据集进行分割的大字典列表,列表中的每个对象都是由设置的多少个数据集的对象组合而成的

如何使用DataLoader?

__getitem__方法

首先需要先理解__getitem__方法,__getitem__被称为魔法方法,在python中定义一个类的时候,如果想要通过键来得到类的输出值,就需要__getitem__方法。所以__getitem__方法的作用就是在调用类的时候自动的运行__getitem__方法的内容,得结果并返回

class Fib():                  #定义类Fib
def __init__(self,start=0,step=1):
self.step=step
def __getitem__(self, key): #定性__getitem__函数,key为类Fib的键
a = key+self.step
return a #当按照键取值时,返回的值为a s=Fib()
s[1] #返回2 ,因为类有 __getitem__方法,所以可以直接通过键来取对应的值

如果没有__getitem__方法,那么就无法通过键来得到返回值

class Fib():                  #定义类Fib
def __init__(self,start=0,step=1):
self.step=step
s=Fib()
s[1]
返回:TypeError: 'Fib' object does not support indexing

以Pytorch中的CIFAR10数据集为例,可以看到源码中的__getitem__方法是这样的:

    def __getitem__(self, index: int) -> Tuple[Any, Any]:
"""
Args:
index (int): Index Returns:
tuple: (image, target) where target is index of the target class.
"""
img, target = self.data[index], self.targets[index] # doing this so that it is consistent with all other datasets
# to return a PIL Image
img = Image.fromarray(img) if self.transform is not None:
img = self.transform(img) if self.target_transform is not None:
target = self.target_transform(target) return img, target

可以理解为在调用类的时候如果输入index,也就是这个类中的索引/键,那么就可以自动调用__getitem__方法得到返回值image和target,其中image就是数据集中的图像,target是标签类class中的索引,用来指示label是什么

DataLoader语法

可以在Pytorch的Documents文档中查看DataLoader的使用方法,一部分截图如下所示

这里介绍几个比较常用的:

  • dataset:就是我们的数据集,我们构建好数据集对象之后传入即可

  • batch_size:也就是在数据集容器中一次拿取多少数据,然后这一次拿取的数据就作为一个Dataloader中的一个对象。如果还是不太理解,可以看下面的示例:

    第一张图片是我设置batch_size=4的时候给出的DataLoader中的一个对象,第二张图片是batch_size=64的时候给出的DataLoader中的一个对象,这样就好理解了~





    在这里也可以很清楚的看出来,数据集是10000张图像/对象,设置batch_size=4之后DataLoader中就是2500个对象了

  • shuffle:是否在每次操作的时候打乱数据集,一般选择为True。更好的理解就是,如果设置为true,那么第一次创建DataLoader对象中的每个小对象和第二次DataLoader对象中的小对象是不相同的,因为在每次创建DataLoader的时候就会先把数据集打乱,自然得到的DataLoader也就不一样

  • num_workers:多线程进行拿取数据操作,0表示只在主线程中操作,一般来讲windows系统下用多线程会报错,设置为0即可

  • drop_last:如果拿取数据有余数,是否保留最后剩下的部分。如果为True的话,最后剩下的部分被丢弃,为false的话最后剩下的部分不会被丢弃

例如在后面的代码中,如果我设置drop_last=False,那么一共有156次数据拿取,并且最后一次剩余的部分不会被丢弃



如果设置drop_last=True,那么最后剩余的部分被丢弃,并且拿取次数也少了一次

使用DataLoader

初步使用的代码如下:

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter # 准备的测试数据集
test_data=torchvision.datasets.CIFAR10("dataset",train=False,transform=torchvision.transforms.ToTensor())
# 加载Dataloader
test_dataloader=DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=0,drop_last=True)
# 加载tensorboard
writer=SummaryWriter("logs")
# tensorboard中的图片序号
step=0
for data in test_dataloader:
images,targets=data
writer.add_images("test_03",images,step)
step=step+1
writer.close()

然后配合使用tensorboard就可以直观体会到它的使用方法了~

深度学习入门笔记——DataLoader的使用的更多相关文章

  1. PyTorch深度学习入门笔记(一)PyTorch环境配置及安装

    @ 目录 一.工具安装 1.1 Anaconda 安装 1.2 Pytorch安装 二.编辑器安装 2.1 Pycharm安装 2.2 Jupyter安装 OS: ubuntu 20.04(虚拟机) ...

  2. 深度学习课程笔记(一)CNN 卷积神经网络

    深度学习课程笔记(一)CNN 解析篇 相关资料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html 首先提到 Why CNN for I ...

  3. 深度学习入门者的Python快速教程 - 基础篇

      5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明 ...

  4. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  5. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  6. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...

  7. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  8. 深度学习入门实战(二)-用TensorFlow训练线性回归

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :董超 上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能 ...

  9. (转)深度学习word2vec笔记之基础篇

    深度学习word2vec笔记之基础篇 声明: 1)该博文是多位博主以及多位文档资料的主人所无私奉献的论文资料整理的.具体引用的资料请看参考文献.具体的版本声明也参考原文献 2)本文仅供学术交流,非商用 ...

  10. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

随机推荐

  1. 在lcd屏幕上的任意位置显示任意大小的图片

    /************************************************* * * file name:ShowBmp2.c * author :momolyl@126.co ...

  2. NVIDIA vGPU vApps/vWS/vCS适配GPU版本介绍

    NVIDIA vGPU 12.0版本-vGPU版本名称变化 - 注: 2021年1月生效 最新名称 NVIDIA Virtual PC (vPC) -曾用名称 NVIDIA GRID Virtual ...

  3. SMU Spring 2023 Trial Contest Round 1

    A. Prepend and Append 用ans记录n的值,然后双指针从前后判断是否一个为0一个为1,是的话则ans-2,否则退出循环即可. #include<bits/stdc++.h&g ...

  4. 从头搭建一个嵌入式web服务器-boa服务器

    一.什么是boa? BOA是一款非常小巧的Web服务器,源代码开放.性能优秀.支持CGI通用网关接口技术,特别适合应用在嵌入式系统中. BOA服务器主要功能是在互联嵌入式设备之间进行信息交互,达到通过 ...

  5. zabbix基本概念

    Zabbix是一个企业级的.开源的.分布式监控解决方案. Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送基于Email的告警. 这样可以保证快速的对问题 ...

  6. spring boot使用多数据源体验

    小白是一名.net程序员,之前小白介绍了过了自己的博客系统http://www.ttblog.site/,用.net写厌了,所以想学下java尝尝鲜,于是小白准备用spring boot来实现一个博客 ...

  7. ThinkPHP 6 + PHP7.4.3nts +nginx 使用mysql和oracle数据库

    ThinkPHP 6 + PHP7.4.3nts +nginx 使用mysql和oracle数据库. 前言 业务需求,之前使用的php 7.3.4nts ,mysql自己写的代码,需要对接第三方系统, ...

  8. 使用 nuxi build 命令构建你的 Nuxt 应用程序

    title: 使用 nuxi build 命令构建你的 Nuxt 应用程序 date: 2024/8/30 updated: 2024/8/30 author: cmdragon excerpt: n ...

  9. 微信小程序之无需服务端支持实现内容安全检查

    微信小程序之无需服务端支持实现内容安全检查 微信小程序审核未通过,原因如下: 为避免您的小程序被滥用,请你完善内容审核机制,如调用小程序内容安全API,或使用其他技术.人工审核手段,过滤色情.违法等有 ...

  10. Redis实战之session共享

    当线上集群时候,会出现session共享问题. 虽然Tomcat提供了session copy的功能,但是缺点比较明显: 1:当Tomcat多的时候,session需要大量同步到多台集群上,占用内网宽 ...