13.DataLoader 的使用

news2024/9/27 12:11:24

DataLoader 的使用

  • dataset:告诉程序中数据集的位置,数据集中索引,数据集中有多少数据(想象成一叠扑克牌)
  • dataloader:加载器,将数据加载到神经网络中,每次从dataset中取数据,通过dataloader中的参数可以设置如何取数据(想象成抓的一组牌)

torch.utils.data

参数介绍

参数如下(大部分有默认值,实际中只需要设置少量的参数即可):

  • dataset:只有dataset没有默认值,只需要将之前自定义的dataset实例化,再放到dataloader中即可
  • batch_size:每次抓牌抓几张
  • shuffle:打乱与否,值为True的话两次打牌时牌的顺序是不一样。默认为False,但一般用True
  • num_workers:加载数据时采用单个进程还是多个进程,多进程的话速度相对较快,默认为0(主进程加载)。Windows系统下该值>0会有问题(报错提示:BrokenPipeError)
  • drop_last:100张牌每次取3张,最后会余下1张,这时剩下的这张牌是舍去还是不舍去。值为True代表舍去这张牌、不取出,False代表要取出该张牌

image-20240718181740205

示例
import torchvision
from torch.utils.data import DataLoader

# 准备的测试数据集
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())
#加载测试数据集,batch_size=4即每次取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)

image-20240720154545533

输出结果:

torch.Size([3, 32, 32])   #三通道,32×32大小
3   #类别为3

image-20240720154614241

测试数据集CIFAR10中getitem返回的数据类型为img,target

image-20240720154909056

image-20240720155510287

dataset

__getitem()__:return img,target

dataloader(batch_size=4):从dataset中取4个数据

img0,target0 = dataset[0]
img1,target1 = dataset[1]
img2,target2 = dataset[2]
img3,target3 = dataset[3]

把 img 0-3 进行打包,记为imgs;target 0-3 进行打包,记为targets;作为dataloader中的返回

for data in test_loader:
    imgs,targets = data
    print(imgs.shape)
    print(targets)

image-20240720155804688

输出:

torch.Size([4, 3, 32, 32])   #4张图片,三通道,32×32
tensor([1, 1, 7, 3])  #4个target进行一个打包

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据是随机取的(断点debug一下,可以看到采样器sampler是随机采样的),所以两次的 target 0 并不一样

batch_size

# 用上节课torchvision提供的自定义的数据集
# CIFAR10原本是PIL Image,需要转换成tensor
 
import torchvision.datasets
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
 
# 准备的测试数据集
test_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor())
 
# 加载测试集
test_loader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=False)
#batch_size=4,意味着每次从test_data中取4个数据进行打包
 
writer = SummaryWriter("dataloader")
step=0
for data in test_loader:
    imgs,targets = data  #imgs是tensor数据类型
    writer.add_images("test_data",imgs,step)
    step=step+1
 
writer.close()

image-20240722014509468

运行后在 terminal 里输入:

 tensorboard --logdir="dataloader"

运行结果如图,滑动滑块即是每一次取数据时的batch_size张图片:

image-20240722014641511

由于 drop_last 设置为 False,所以最后16张图片(没有凑齐64张)显示如下:

image-20240722014707142

drop_last

若将 drop_last 设置为 True,最后16张图片(step 156)会被舍去,结果如图:

image-20240722014853921

shuffle

shuffle的作用:一个 for data in test_loader 循环,就意味着打完一轮牌(抓完一轮数据),在下一轮再进行抓取时,第二次数据是否与第一次数据一样。值为True的话,会重新洗牌(一般都设置为True)

shuffle为False的话两轮取的图片是一样的

在外面再套一层 for epoch in range(2) 的循环来验证一下

# shuffle为True
for epoch in range(2):
    step=0
    for data in test_loader:
        imgs,targets = data  #imgs是tensor数据类型
        writer.add_images("Epoch:{}".format(epoch),imgs,step)
        step=step+1

image-20240722015501306

shuffle为False结果如下:

可以看出两次 step 155 的图片一样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

shuffle为True结果如下:

可以看出即使是同样的 step 155,两轮抓取的图片不一样

image-20240722015848282
出两次 step 155 的图片一样

[外链图片转存中…(img-F8G96Zxa-1724861448845)]

shuffle为True结果如下:

可以看出即使是同样的 step 155,两轮抓取的图片不一样

[外链图片转存中…(img-Aru5xvXY-1724861448846)]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA中的线程池说明二

目录 1.引入 2.参数解释 3.标准库中提供的四个拒绝策略 1.引入 java.util.concurrent 这个包里面放的很多类都是和并发编程(多线程编程)密切相关,这个包简称JUC;今天我们主要来了解Java线程池的相关知识。 2.参数解释 在这里,我们主要讲…

无痛除毛,告别异味,希喂、有哈、小米宠物空气净化器真实测评

养宠在年轻人生活中逐渐成为一种新的潮流,越来越多的人加入到铲屎官的队伍。其中,养宠最多的品类非猫咪莫属,凭借自身可爱的外表收获人们的芳心。同时猫咪也是宠物中掉毛最严重的,漫天的浮毛在家中不断飘散,带来无尽的…

Java——断点调试

一、断点调试简介 Java的断点调试是程序开发中非常重要的一个技术,它允许开发者在程序执行时暂停执行,以便检查变量的状态、观察程序的流程、并定位错误。 1、断点(Breakpoint): 在代码的某一行指定的暂停点。当程序…

个人旅游网(1)——数据库表详解

文章目录 一、数据库表详情1.1 tab_category 表1.2、tab_route 表1.3、tab_route_img 表1.4、tab_user 表1.5、tab_favorite 表1.6、tab_address 表1.7、tab_seller 表1.8、tab_order 表1.9、tab_orderItem 表 一、数据库表详情 该网站是一个旅游网站,为具有出游的需…

C程序设计(潭浩强教授版)精选程序题

目录 (一)顺序程序设计部分 (二)选择程序设计部分 (三)循环程序设计部分 (四)数组处理数据部分 (一)顺序程序设计部分 1. 使用getchar读入两个字符&#xf…

对比 PDAF、CDAF 和 LAAF 自动对焦技术

深入解析相位检测自动对焦(PDAF) 相位检测自动对焦(PDAF,Phase Detection Auto Focus)是一种高效的自动对焦技术,广泛应用于现代数码相机、无反相机和智能手机摄像头中。为了更好地理解 PDAF,我…

C++11中的lambda匿名函数

一、引言 C11中引入的lambda表达式(也称为匿名函数或lambda函数)提供了一种方便且灵活的方式来定义和使用小的匿名函数对象。这些lambda表达式在编写回调函数、操作容器的算法中、或者在需要快速定义和传递一个函数逻辑给另一个函数时特别有用。 二、基…

行得稳,跑得远,美团如何做到长期主义持续发力?

在今天这样一个充满不确定性的时代,最能确定的是什么呢?我们这一代人,有幸成为诸多历史性时刻的亲历者和见证者。在此背景下,越来越多的企业家和经营者开始关注回归经营的本质和实现稳健经营的问题。 企业的稳健经营贯穿于企业的…

联华证券-掌握尾盘买入法的多种策略与实用技巧

尾盘买入法的常见方法与具体技巧 尾盘买入法是指在股票交易日的尾盘时段(通常指收盘前的15-30分钟)进行买入操作的策略。由于尾盘时段能够反映市场全天的交易情况以及主力资金的意图,尾盘买入法在捕捉短线机会方面具有一定的优势。以下是尾盘…

Python编码—掌握Python与Kubernetes:构建高效微服务架构

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

涨粉20w!AI真人视频转动漫,太好涨粉了,3步学会AI视频转绘!

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 这类视频,流量超大。从去年一直火到了现在。 前有…

dubbo:巧用dubbo的SPI机制实现各类定制功能(六)

文章目录 0. 引言1. dubbo SPI机制1.1 什么是SPI1.2 java的SPI机制1.3 dubbo的SPI机制1.4 dubbo的SPI使用 2. 基于SPI实现定制功能2.1 dubbo的上下文参数2.2 实现权限校验、参数日志等功能2.3 dubbo spi条件激活机制Activate 3. dubbo的SPI与java的SPI有什么区别4. 总结 0. 引言…

机器学习:词向量转换及代码实现

CountVectorizer 是 scikit-learn 库中的一个文本向量化工具,它将文本数据转换为词频特征矩阵。以下是 CountVectorizer 的算法原理和步骤: 原理 文本预处理: 分词:将文本分割成单词或短语(tokens)。小写化…

mysql配置与日常使用

mysql配置 1.从官网下载zip文件并解压,解压的路径中最好不要有中文 2.添加环境变量 这一步的作用是可以在任意文件夹下操作mysql指令 操作步骤:环境变量 ->用户变量Path -> 添加mysql的bin目录 V 3. 在mysql解压路径下添加配置文件my.ini …

力扣刷题第二阶段Days35(javascript)

1,题目描述 -- 和为K的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2,代码详解 哈希+前缀和 /*** param {number[]} nums* param {number} k* ret…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…

MIT 6.5840(6.824) Lab 4:Fault-tolerant Key/Value Service 设计实现

1 实验要求 本实验旨在利用lab 3中的Raft库,构建一个具备容错能力的键值存储服务。服务将作为一个复制状态机,由多个服务器组成,各服务器通过Raft协议同步数据库状态。即使在部分故障或网络隔离的情况下,只要大多数服务器正常&am…

通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题

组合优化问题:图着色问题 通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题 1. 背景知识 1.1. 组合优化问题 在之前发布的《组合优化问题:装箱问题》中,我们讲解了什么是组合优化(Combinatorial Optimi…

【练习1】数字统计

题目: 分析: 枚举法数字拆分(tmp % 10,tmp / 10) 代码实现: public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int l in.nextInt(), r in.nextInt();…

【2024 CCF编程能力等级认证(GESP)Python 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 编程规范3.3 基础语法3.4 数据类型3.5 三大基本结构3.6 运算符3.7 模块导入与输入输出3.8 Turtle绘图4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…