一、DataLoader简介

官网地址:

torch.utils.data — PyTorch 2.0 documentation

1. DataLoder类

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=None, 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, *, prefetch_factor=None, persistent_workers=False, pin_memory_device='')

由此可见,DataLoder必须需要输入的参数只有\(dataset\)。

2. 参数说明

  • dataset(Dataset): 数据集的储存的路径位置等信息

  • batch_size(int): 每次取数据的数量,比如batchi_size=2,那么每次取2条数据

  • shuffle(bool): True: 打乱数据(可以理解为打牌中洗牌的过程); False: 不打乱。默认为False

  • num_workers(int): 加载数据的进程,多进程会更快。默认为0,即用主进程进行加载。但在windows系统下,num_workers如果非0,可能会出现 BrokenPipeError[Error 32] 错误

  • drop_last(bool): 比如我们从100条数据中每次取3条,到最后会余下1条,如果drop_last=True,那么这条数据会被舍弃(即只要前面99条数据);如果为False,则保留这条数据

二、DataLoader实操

  • 数据集仍然采用上一篇的CIFAR10数据集

1. DataLoader取数据的逻辑

  • 首先import dataset,dataset会返回一个数据的img和target

  • 然后import dataloder,并设置\(batch\_size\),比如\(batch\_size=4\),那么dataloder会获取这些数据:dataset[0]=img0, target0; dataset[1]=img1, target1; dataset[2]=img2, target2; dataset[3]=img3, target3. 并分别将其中的4个img和4个target进行打包,并返回打包好的imgs和targets

比如下面这串代码:

import torchvision
from torch.utils.data import DataLoader #测试集,并将PIL数据转化为tensor类型
test_data=torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor()) #batch_size=4:每次从test_data中取4个数据集并打包
test_loader=DataLoader(dataset=test_data, batch_size=4, shuffle=True, num_workers=0, drop_last=False)

这里的test_loader会取出test_data[0]、test_data[1]、test_data[2]、test_data[3]的img和target,并分别打包。返回两个参数:打包好的imgs,打包好的taregts

2. 如何取出DataLoader中打包好的img、target数据

(1)输出打包好的img、target

代码示例如下:

import torchvision
from torch.utils.data import DataLoader #测试集,并将PIL数据转化为tensor类型
test_data=torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor()) #batch_size=4:每次从test_data中取4个数据集并打包
test_loader=DataLoader(dataset=test_data, batch_size=4, shuffle=True, num_workers=0, drop_last=False) #测试数据集中第一章图片及target
img, target=test_data[0]
print(img.shape)
print(target) #取出test_loader中的图片
for data in test_loader:
imgs,targets = data
print(imgs.shape) #[Run] torch.Size([4, 3, 32, 32]) 4张图片打包,3通道,32×32
print(targets) #[Run] tensor([3, 5, 2, 7]) 4张图,每张图片对应的标签分别是3,5,2,7(某一次print的举例,每次print结果不太一样)

在11行处debug一下可以发现,test_loader中有个叫sampler的采样器,采取的是随机采样的方式,也就是说这batch_size=4时,每次抓取的4张图片都是随机抓取的。

(2)展示图片

用tensorboard就可以可视化了,具体操作改一下上面代码最后的for循环就好了

from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("dataloder") step=0 #tensorboard步长参数
for data in test_loader:
imgs,targets = data
# print(imgs.shape) #[Run] torch.Size([4, 3, 32, 32]) 4张图片打包,3通道,32×32
# print(targets) #[Run] tensor([3, 5, 2, 7]) 4张图,每张图片对应的标签分别是3,5,2,7(某一次print的举例,每次print结果不太一样)
writer.add_images("test_data",imgs,step) #注意这里是add_images,不是add_image。因为这里是加入了64张图
step=step+1
writer.close()

(3)关于shuffle的理解

  • 可以理解为一个for循环就是打一次牌,打完一轮牌后,若shuffle=False,那么下一轮每一步抓到的牌都会跟上一轮相同;如果shuffle=True,那么就会进行洗牌,打乱牌的顺序后,下一轮每一步跟上一轮的会有不同。

首先将shuffle设置为False:

test_loader=DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)

然后对(2)的代码进行修改,运行代码:

for epoch in range(2):  #假设打两次牌,我们来观察两次牌中间的洗牌情况
step = 0 # tensorboard步长参数
for data in test_loader:
imgs,targets = data
# print(imgs.shape) #[Run] torch.Size([4, 3, 32, 32]) 4张图片打包,3通道,32×32
# print(targets) #[Run] tensor([3, 5, 2, 7]) 4张图,每张图片对应的标签分别是3,5,2,7(某一次print的举例,每次print结果不太一样)
writer.add_images("Epoch: {}".format(epoch),imgs,step) #注意这里是add_images,不是add_image。因为这里是加入了64张图
step=step+1
writer.close()

结果显示,未洗牌时运行的结果是一样的:

  • 将shuffle设置为True,再次运行,可以发现两次结果还是不一样的:

深度学习(五)——DatadLoader的使用的更多相关文章

  1. go微服务框架go-micro深度学习(五) stream 调用过程详解

        上一篇写了一下rpc调用过程的实现方式,简单来说就是服务端把实现了接口的结构体对象进行反射,抽取方法,签名,保存,客户端调用的时候go-micro封请求数据,服务端接收到请求时,找到需要调用调 ...

  2. 深度学习菜鸟的信仰地︱Supervessel超能云服务器、深度学习环境全配置

    并非广告~实在是太良心了,所以费时间给他们点赞一下~ SuperVessel云平台是IBM中国研究院和中国系统与技术中心基于POWER架构和OpenStack技术共同构建的, 支持开发者远程开发的免费 ...

  3. go微服务框架go-micro深度学习-目录

    go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go ...

  4. 推荐系统遇上深度学习(十)--GBDT+LR融合方案实战

    推荐系统遇上深度学习(十)--GBDT+LR融合方案实战 0.8012018.05.19 16:17:18字数 2068阅读 22568 推荐系统遇上深度学习系列:推荐系统遇上深度学习(一)--FM模 ...

  5. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  6. 深度学习课程笔记(十五)Recurrent Neural Network

    深度学习课程笔记(十五)Recurrent Neural Network 2018-08-07 18:55:12 This video tutorial can be found from: Yout ...

  7. 深度学习课程笔记(五)Ensemble

    深度学习课程笔记(五)Ensemble  2017.10.06 材料来自: 首先提到的是 Bagging 的方法: 我们可以利用这里的 Bagging 的方法,结合多个强分类器,来提升总的结果.例如: ...

  8. 深度学习(五)基于tensorflow实现简单卷积神经网络Lenet5

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8954892.html 参考博客:https://blog.csdn.net/u01287127 ...

  9. UFLDL深度学习笔记 (五)自编码线性解码器

    UFLDL深度学习笔记 (五)自编码线性解码器 1. 基本问题 在第一篇 UFLDL深度学习笔记 (一)基本知识与稀疏自编码中讨论了激活函数为\(sigmoid\)函数的系数自编码网络,本文要讨论&q ...

  10. 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition

    论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch   Richard Zemel Rusla ...

随机推荐

  1. Auto-GPT测评:自信、努力、不合格

    这两天,Auto-GPT 爆火 https://github.com/Torantulino/Auto-GPT 它是一款让最强语言模型GPT-4能够自主完成任务的模型,让整个AI圈疯了.它的嘴大突破是 ...

  2. Nuget 多项目复合打包

    问题描述 我这里有个进程间通信组件,用于提供多应用间通信的解决方案. 进程间通信,分为客户端和服务端,俩端肯定会有些共性代码,所以加了个H3C.Channel.Core项目 因为之前还不太了解nuge ...

  3. web 页面/内容 触摸/点击滑动

    监听标签的触摸/鼠标滑动事件,添加元素的切换动画,效果如下: 事件监听 鼠标事件和触摸事件监听: 1 componentDidMount() { 2 var teachingReportDiv = d ...

  4. 解密Prompt系列6. lora指令微调扣细节-请冷静,1个小时真不够~

    上一章介绍了如何基于APE+SELF自动化构建指令微调样本.这一章咱就把微调跑起来,主要介绍以Lora为首的低参数微调原理,环境配置,微调代码,以及大模型训练中显存和耗时优化的相关技术细节 标题这样写 ...

  5. Hugging News #0428: HuggingChat 来啦

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  6. LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手. 往期周赛回 ...

  7. 2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow

    2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow ...

  8. 2021-08-12:约瑟夫环问题。给定一个链表头节点head,和一个正数m,从头开始,每次数到m就杀死当前节点 ,然后被杀节点的下一个节点从1开始重新数, 周而复始直到只剩一个节点,返回最后的节点。

    2021-08-12:约瑟夫环问题.给定一个链表头节点head,和一个正数m,从头开始,每次数到m就杀死当前节点 ,然后被杀节点的下一个节点从1开始重新数, 周而复始直到只剩一个节点,返回最后的节点. ...

  9. 2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案

    2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案, ...

  10. 源端为备库的场景下Duplicate失败问题

    环境: Oracle 11.2.0.3 + OEL 7.9 A -> B -> C 级联ADG环境:db11g -> db11gadg -> db11gcas 之前测试提到,从 ...