首页 > 其他分享 >深度学习入门笔记——DataLoader的使用

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

时间:2024-10-29 19:21:08浏览次数:5  
标签:__ 入门 self DataLoader 笔记 step getitem 数据

如何使用数据集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就可以直观体会到它的使用方法了~

标签:__,入门,self,DataLoader,笔记,step,getitem,数据
From: https://www.cnblogs.com/cyMessi/p/18514212

相关文章

  • 16.网工入门篇--------介绍下网络服务及应用
    一、网络服务的概念网络服务是指通过网络提供的软件功能或设施,它允许不同的设备和用户在网络环境中进行信息交换、资源共享和协作。这些服务基于各种网络协议,以实现高效、可靠的通信。二、常见网络服务类型(一)文件传输服务FTP(文件传输协议)原理:FTP是一种用于在网络上进......
  • 十月二十九日总结(读书笔记三)
    在阅读《程序员修炼之道:从小工到专家》的第七和第八章时,我感受到了程序员职业生涯中更为深刻的内涵。这两章主要探讨了“代码的重构”和“团队协作”的重要性,强调了优秀程序员不仅要具备扎实的技术能力,还需要培养良好的团队协作能力和对代码质量的高度重视。这些内容对我的职业发......
  • Python小白学习教程从入门到入坑------第十八课 异常模块与包【下】(语法基础)
    一、内置全局变量__name__在Python中,有一些内置的全局变量和特殊变量,它们是由Python解释器预定义的,可以在代码的任何地方直接使用。这些变量通常用于提供关于当前解释器状态的信息,或者用于控制解释器的行为在Python中,__name__是一个内置的特殊变量,也被称为“魔法变量”或“......
  • 阅读笔记2
    团队合作与沟通——编程的艺术在编程的世界里,团队合作是必不可少的。《程序员修炼之道》让我深刻认识到,有效的沟通和协作是项目成功的关键。书中提到了代码审查的重要性。这不仅仅是为了找出代码中的错误,更是为了促进团队成员之间的知识共享和相互学习。我开始积极参与团队的代......
  • HTML学习笔记三
    系列笔记目录第一章HTML的概述第二章URL简介第三章网页元素的属性网页元素的属性系列笔记目录前言一、简介二、全局属性1.id2.class3.title4.tabindex5.accesskey6.style7.hidden8.lang,dir9.contenteditable10.spellcheck11.data-属性12.事件处理属......
  • 1035-入门-级数求和
    一、问题重述:已知:Sn=1+1/2+1/3+…+1/n。显然对于任意一个整数 k,当 n 足够大的时候,Sn​>k。现给出一个整数 k,要求计算出一个最小的 n,使得 Sn​>k。1.1、输入格式一个正整数 k。1.2、输出格式一个正整数 n。输入输出样例输入 1输出 2说明/提示【数据范......
  • Vue学习笔记(十)
    5模板字符串ES6支持模板字符串,使得字符串的拼接更加的简洁、直观。不使用模板字符串:在ES5中字符串拼接通过【+】实现letfirst="张";letlast="四";letname='Yournameis'+first+''+last+'.''使用模板字符串:ES6中使用反引号【``】来拼接字符串,......
  • Vue学习笔记(九)
    1let与const、块级作用域在ES6之前JS是没有块级作用域的,const与let填补了这方面的空白,分别使用let、const声明变量和常量,const与let都是块级作用域。使用var定义的变量为函数级作用域:使用let与const定义的变量为块级作用域{vari=0;vari=1;letj=0;constk......
  • 【医学统计学从入门到精通】书评推荐
    文章目录前言一、关键点二、内容简介作者简介购书链接前言从零开始,全面精通医学统计学:从基础概念到高级应用,融合SPSS与PASS等,结合医学情境案例,逐步解析统计奥秘,助力医学探索者构建坚实统计基础,精准把握数据背后的价值。一、关键点1.强调统计思想:本书注重培养......
  • 队列与树 数据结构复习笔记
    2.3队列队列(Queue),它是一种运算受限的线性表,先进先出(FIFOFirstInFirstOut)队列是一种受限的线性结构受限之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作Python标准库中的queue模块提供了多种队列实现,包括普通队列、双端队列、优先队......