Pytorch数据载入函数介绍_torchvision.transforms.functional.erase()-程序员宅基地

技术标签: Pytorch  人工智能  pytorch  

Pytorch02——数据载入

参考:https://pytorch.org/docs/stable/data.html

本文主要是对Pytorch数据载入方式的官方文档翻译,以及梳理和总结。有错误的地方请诸位大佬指正!转载请注明来源!

主要涉及Python API中的torch.utils.data,Libraries库中的torchvision.datasets及torchvision.transforms。

目录

Pytorch02——数据载入

torch.utils.data.DataLoader

torchvision.datasets

torchvision.transforms

总结


torch.utils.data.DataLoader

torch.utils.data.DataLoader作为Pytorch数据载入工具的核心,代表了一种使用python迭代式载入数据的方式,并支持:

  1. 映射式和迭代式的数据集
  2. 自定义数据载入顺序
  3. 自动批处理
  4. 单线程或多线程的数据加载
  5. 自动内存锁页

这些选项可由DataLoader构造器的参数指定:

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None, *, prefetch_factor=2,
           persistent_workers=False)

下面详细描述这些参数的使用方法和效果。

  • Dataset Types(数据集类型)

dataset是DataLoader最重要的参数,制定了要加载的数据集对象类型。Pytorch支持两种不同类型的数据集:映射式数据集(map-style)、迭代式数据集(iterable-style)。

映射式数据集包含了__getitem__()和__len__()方法,使用了类似于字典格式的键值对映射关系,将索引(可能是非整型数据)映射到数据样本。比如通过dataset[idx]可以访问到第idx个图像以及其对应的标签。更多介绍在torch.utils.data.Dataset。

迭代式数据集是IterableDataset的一个实例,包含了__iter__()方法,类似于数据集的迭代器。适用于随机读取成本高甚至不可能的情况(内存很小),一个批处理的大小(batch size)取决于能够获取的数据。比如,以数据流的形式从远程服务器读取数据集,或者实时写入事件日志。更多介绍在torch.utils.data.IterableDataset。

注意,当使用IterableDataset进行多线程数据载入时,每个线程载入的数据集对象是相同的,会造成数据集重复,必须进行不同的配置。配置方法见IterableDataset文档。

  • Data Loading Order and Sampler(数据集载入顺序及采样)

对于迭代式的数据集,数据载入顺序完全由用户定义的迭代器控制,可以轻松实现块读取和动态设置批处理大小(使用yield语句控制一个batch size)。

对于映射式的数据集,torch.utils.data.Sampler可以用于指定数据集索引的顺序,是数据集索引的迭代器。比如,使用随机梯度下降(SGD),Sampler可以随机的置换数据集索引列表,并且使用yield语句每次输出一个索引,或者使用yield语句每次输出一小批索引用于实现min-batach SGD。

shuffle参数的值,可以控制顺序载入数据(False),还是随机载入数据(True)。此外,用户也可以使用sampler参数指明自定义的Sampler对象,该对象每次都会产生要提取的下一个索引。

自定义的Sampler每次产生的索引列表可以传递到batch_sampler参数,自动批处理也可以通过设置batch_size及drop_last开启。

注意:sampler和batch_sampler都和迭代式的数据集不兼容,因为迭代式的数据集没有索引。

  • Loading Batched and Non-Batched Data(载入批处理和非批处理的数据集)

通过batch_size,drop_last,batch_sampler三个参数的指定,DataLoader可以自动将独立获取的数据样本整理成批处理格式。

默认自动批处理,因为这是最常见的方式,一般批处理后向量的第一维是批处理序号。batch_size默认为1,而不是None,batch_size和drop_last参数可以用户指定如何获取一个批处理中的数据集索引。对于映射式的数据集,用户可以选择指定batch_sampler,每次产生一个数据集索引列表。

注意,batch_size,drop_last本质上是用于从sampler构建一个batch_sampler。对于映射式的数据集,sampler由用户构建或者基于shuffle参数构建。对于迭代式数据集,sampler是一个虚拟的无限数据集。当使用多线程载入迭代式的数据集时,drop_last参数可以丢弃每个线程最后一个非完整批次。

当使用sampler得到样本的索引列表后,collate_fn参数将索引对应的数据整理为一个批次。这种情况下,从映射式的数据集载入可以表示为:

for indices in batch_sampler:
    yield collate_fn([dataset[i] for i in indices])

从迭代式的数据集载入可以表示为:

dataset_iter = iter(dataset)
for indices in batch_sampler:
    yield collate_fn([next(dataset_iter) for _ in indices])

自定义的collate_fn可以用于自定义数据集整理,比如批次不完整时,自动复制补全。

禁用自动批处理,在某些情况下,用户可能希望手动进行批处理,或仅加载单个样本。例如,直接加载批处理过的数据&

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/godblesstao/article/details/110194949

智能推荐

进入 Tomcat 应用程序管理界面和部署Web应用_应用管理中心web页面-程序员宅基地

文章浏览阅读3.6k次,点赞2次,收藏9次。1 前言apache-tomcat-9.0.35我们都知道 Tomcat 可以部署 war包和静态资源,一般都是放在webapps下面;但是我们还应该知道,有个界面会帮我们去完成这个操作的,当然这个界面一般是不开放的,自己用的时候可以开放出来。开启 Tomcat服务(直接到tomcat服务器的bin目录下运行startup.sh脚本);浏览器访问 http://localhost:8080 ,如图:上述就是Tomcat的三个控制台界面的入口按钮,分别是Server Status控_应用管理中心web页面

hive详解(一)_desc extended table_name; 解析-程序员宅基地

文章浏览阅读1.3k次。1、Hive简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并提供类SQL查询功能。Hive是由Facebook开源用于解决海量结构化日志的数据统计的工具。 在Hadoop生态系统中,HDFS用于存储数据,Yarn用于资源管理,MapReduce用于数据处理,而Hive是构建在Hadoop之上的数据仓库,包括以下方面: (1)使用HQL作..._desc extended table_name; 解析

愿码(ChainDesk.CN):EOS钱包开发 五使用cleos工具管理账号权限_账户权重之和须大于等于阀值-程序员宅基地

文章浏览阅读262次。在上一篇文章中,我们创建了一个新钱包并导入了一对公私钥,但是该钱包中并没有账号,在EOS区块链中创建账号是很扯蛋的事,必须使用已有的EOS账号才能创建新的EOS账号,使创建账号的时候便于扣费,因为创建的账号数据会占用区块链生产节点的内存资源,所以每创建一个EOS新账号都需要其他EOS账号消耗一定量的EOS来帮忙创建。那么我们找谁来创建呢?谁又有EOS账号呢?EOS主网中,最初始的EOS账号由E..._账户权重之和须大于等于阀值

python装饰器函数执行后日志_你必须学写 Python 装饰器的五个理由-程序员宅基地

文章浏览阅读42次。原标题:你必须学写 Python 装饰器的五个理由来源:Python程序员ID:pythonbuluo你必须学写Python装饰器的五个理由----装饰器能对你所写的代码产生极大的正面作用作者:Aaron Maxwell,2016年5月5日Python装饰器是很容易使用的。任何一个会写Python函数的人都能够学会使用装饰器,比如下面这个:@somedecoratordefsome_functio..._写一个类装饰器每次调对象就写入日志

户外汽车充电站的限流保护-程序员宅基地

文章浏览阅读489次,点赞9次,收藏7次。ASCP系列电气防火限流式保护器是安科瑞专门为了保护低压配电线路中短路、过载等问题研发,可以有效克服传统断路器、空气开关和监控设备存在的短路电流大、切断短路电流时间长、短路时产生的电弧火花大,以及使用寿命短等弊端,当发生短路故障时,能以微秒级速度快速限制短路电流以实现灭弧保护,从而能显著减少电气火灾事故,保障使用场所人员和财产的安全。交流充电桩采用符合国标的交流充电模式,输出功率高 7kW,一般车辆电池从 0 到充满需要 5~8 小时,具体情况视不同车型动力电池容量及实际充电功率而定。

MFC基本控件使用——按钮(Button)_mfc button enable-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏12次。昨天写了一个常用的控件Static静态文本框,今天再写一个同样常用的控件——Button按钮。其实,按钮的使用没什么说的,因为实在是太简单了。。。无非就是双击按钮,添加一个click事件,然后在OnClick( )函数内就可以为所欲为啦~~~但是!!!这样一来,写这篇文章就没有意义了,对吧?这里呢,我就说说一个我在用按钮控件最不爽的一个地方,那就是在按钮上使用图片。为了界面的美观,我们往往会用..._mfc button enable

随便推点

倒置函数reverse的用法_完成函数reverse-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏2次。倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置,如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321,程序如下:#include#includevoid reverse(char s[]){ int c,j,i; for(i=0,j=strlen(s)-1;i { c=s[i]; s[i]=s[j];_完成函数reverse

Git详解之一 Git起步-程序员宅基地

文章浏览阅读3.9k次,点赞4次,收藏5次。起步本章介绍开始使用 Git 前的相关知识。我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作。读完本章,你就会明白为什么 Git 会如此流行,为什么你应该立即开始使用它。 1.1 关于版本控制什么是版本控制?我真的需要吗?版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。在本书_git详解之一 git起步

IAR超过32KB之后代码编译出错问题解决办法之一_error[lp011]-程序员宅基地

文章浏览阅读1.1k次。信息栏显示 Error[Lp011]:解决办法:更改项目配置,General Options->Target中的Code改为Mediue或者LargeCode的small是64K byte寻址范围,medium是16M byte范围,但函数不允许跨越64K byte边界, large模式下是16M byte寻址范围,函数不存在跨界限制,随便放Date的small是256 byte寻址..._error[lp011]

VC++ 调节系统音量(与任务栏音量同步)源代码_c++获取系统音量-程序员宅基地

文章浏览阅读1.5k次,点赞5次,收藏4次。源代码demo已上传到百度网盘:永久生效 实现功能, 能够获取与调节系统音量,与任务栏音量同步,软件更改了系统音量,任务栏音量也会同步变化!如看效果:上代码,添加封装好的类到项目中,如图然后我们再来看代码头文件class SystemVolumeHelp{public: static int GetVolumeLevel(); static bool SetVolumeLevel(int level);};封装了两个静态函数,我们..._c++获取系统音量

软件项目管理-敏捷先锋朱少民-程序员宅基地

文章浏览阅读1.7k次。前言软件项目管理相关内容第一章:概述项目管理的生命周期项目管理的生命周期——“启动、计划、执行、控制、结束”演进顺序项目的概念项目是为完成某个独特的产品或服务所做的一次性任务: 目标性,其结果只可能是一种期望的产品或服务。 独特性,每一个项目都是唯一的。 一次性,有确定的起点和终点。 约束性,每一个项目的资源、成本和时间都是有限的。 ..._软件项目管理演进

关于JUnit中的assertThat的部分问题_assertthat haskey没有-程序员宅基地

文章浏览阅读4k次,点赞5次,收藏5次。关于JUnit中的assertThat的部分问题写在最前面如果大家需要使用下面几个函数之一 assertThat( mapObject, hasKey ( "key" ) ); assertThat( mapObject, hasEntry( "key", "value" ) ); assertThat( mapObject, hasValue ( &_assertthat haskey没有

推荐文章

热门文章

相关标签