深度学习入门笔记——DataLoader的使用

news/2024/10/29 19:27:14/文章来源:https://www.cnblogs.com/cyMessi/p/18514212

如何使用数据集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():                  #定义类Fibdef __init__(self,start=0,step=1):self.step=stepdef __getitem__(self, key): #定性__getitem__函数,key为类Fib的键a = key+self.stepreturn a          #当按照键取值时,返回的值为as=Fib()
s[1]  #返回2 ,因为类有 __getitem__方法,所以可以直接通过键来取对应的值

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

class Fib():                  #定义类Fibdef __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): IndexReturns: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 Imageimg = 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=datawriter.add_images("test_03",images,step)step=step+1
writer.close()

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/823819.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机中的计算摄影:超广角畸变校正

广角镜头,甚至超广角镜头已经成为了现在手机的标配,这样的手机能够拍摄出宽广的视角,还能够在合拍时拍下更多的人物。比如最新的iPhone13 Pro就有一颗26mm焦距的广角镜头,还有一颗13mm焦距的超广角镜头。事实上,自2019年起,很多手机摄像头的FOV就已经超过100度了 然而,广…

GitHub Star 数量前 5 的开源应用程序生成器

发现 GitHub 上最受欢迎的开源应用程序生成器。欢迎来的 GitHub Star 数量排名系列文章的第 7 篇——最受欢迎的应用程序生成器。 之前我们已经详细探讨过:在 GitHub 上最受欢迎的——无代码工具、低代码项目、内部工具、CRUD项目、自部署项目和 Airtable 开源替代品。累计超过…

ddl和dml的区别

数据库管理系统中,DDL(Data Definition Language)和DML(Data Manipulation Language)是两种不同的SQL语言类型,用于执行不同的任务。本文将深入探讨DDL和DML之间的区别,包括定义、功能、用途以及示例,以帮助读者更好地理解它们在数据库操作中的作用。定义 DDL:DDL是用…

叶涛铭的第二次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/zjlg/rjjc/ 这个作业的目标:写一个计算字符数,单词数,句子数的程序。 姓名-学号:叶涛铭 2022329301159 码云地址:https://gitee.com/ye-taoming/ye-taomings-second-homework/tree/master/ 这是一个计算字符数的程序…

什么是区块链即服务BaaS

区块链即服务(BaaS)是一种允许用户在云基础设施上创建,部署和管理自己的区块链应用和智能合约的服务。BaaS供应商负责维护区块链的基础设施,提供必要的操作和维护服务,使企业和开发者可以专注于业务应用的开发和运营。BaaS提供者为用户创建和部署专属的区块链网络,包括节点…

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第6周学习总结

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第6周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 (如2024-2025-1计算机基础与程序设计第六周作业这个作业的目标 <参考上面的学习总结模板,把学习过程通过博客(随…

全连接层的作用是什么

全连接层的作用有:一、特征组合与转换;二、参数学习;三、特征映射;四、非线性变换;五、信息传递;六、适用于多种任务;七、参数量控制。特征组合与转换是指,全连接层在神经网络中起着关键作用,它将上一层的所有神经元与当前层的所有神经元进行全连接。一、特征组合与转…

阿里云轻量应用服务器和ECS云服务器有什么不同

阿里云轻量应用服务器和ECS云服务器,两者均是阿里云提供的服务器服务,它们的主要差别可以从以下几个方面进行概述:1、定位与使用场景;2、价格;3、性能与资源;4、操作和管理。轻量应用服务器的主要定位是为了满足中小型企业或个人开发者的需求,简化了服务器购买和管理的流…

明星人脸识别基于VGG、MTCNN、RESNET深度学习卷积神经网络应用|附数据代码

全文链接:https://tecdat.cn/?p=38046 原文出处:拓端数据部落公众号 分析师:Xinzu Du人脸识别技术作为生物特征识别技术的重要组成部分,在近三十年里得到了广泛的关注和研究,已经成为计算机视觉、模式识别领域的研究热点。然而由于存在光线、背景、人脸遮挡等问题,如何准…

Paper Reading: Random Balance ensembles for multiclass imbalance learning

本文将 RandBal 方法从二分类扩展到多分类,提出了两种集成策略。第一种方法称为多重随机平衡 MultiRandBal,该方法同时处理所有类,每个基分类器的训练数据都是随机抽样的。第二种方法是将多分类问题按照 OVO 或 OVA 的分解为两分类问题,并构建 RandBal 集成学习器,这两个版…