DataLoader,DataSet和Sampler
创始人
2024-04-19 12:56:11
0

DataLoader、DataSet和Sampler之间的关系

Sample和DataSet是DataLoader的两个子模块。Sampler的功能主要是生成索引。也就是样本的序号
DatasetDatasetDataset是根据索引去读取数据以及对应的标签。DataLoader负责以特定的方式从数据集中迭代的产生一个一个batchbatchbatch集合。其中。DataLoader和Dataset是pytorch中数据读取的核心
(以特定的方式从数据集中迭代产生一个一个的batch集合》

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)

实例化一个DataLoader所需参数如上所示:其中:

  • dataset: 定义好的MapMapMap式,或者lterablelterablelterable式数据集。
  • batch_size: 一个batch中的样本个数,默认为1.
  • shuffle: 每一个epoch的batch样本是相同还是随机的。
  • sampler: 数据集中的采样方法,如果有,则shuffle参数必须为false。
  • batch_sampler和sampler类似,但是一次返回的是一个batch内所有样本的index。
  • num_workers: 多少个子进程同时工作来获取数据,多线程。
  • collate_fn: 合并样本列表以形成小批量。
  • pin_menory: 如果为True,数据加载器在返回前将张量复制到CUDA固定内存中。
  • drop_last:如果数据集大小不能被batch_size整除,设置为True,可能删除最后一个不完整的批处理。如果设为False。并且数据集大小不能被batch_size整除,则最后一个batch将更小。
  • timeout:如果是正数,表明等待从worker进程中收集一个batch等待时间,若超出设定时间还没有收集到,那就不收集这个内容了,numeric应总是大于等于0.

Dataset

Dataset就是一个负责处理索引(index)到样本(sample)映射的一个类(class).

index→sampleindex \rightarrow sampleindex→sample
torch.utils.data.Datasettorch.utils.data.Datasettorch.utils.data.Dataset 是一个表示数据集的抽象的类,任何自定义的数据集都需要继承这个类并腹泻相关方法

pytorch:提供两种数据集:Map式数据集Map式数据集Map式数据集、lterable式数据集lterable式数据集lterable式数据集。

Map 数据集

一个Map式的数据集必须要重写getitem(self, index),len(self) 两个内建方法,用来表示从索引到样本的映射(Map)
getitem(self,index),len(self)getitem(self, index),len(self) getitem(self,index),len(self)两个内建方法。

用来表示从索引到样本的映射(Map).
这样一个数据集dataset。举个例子,当使用dataset[idx]dataset[idx]dataset[idx]命令时,可以在你的硬盘中读取数据集中的第idxidxidx张图片以及其标签,
len(dataset)len(dataset)len(dataset):则返回这个数据集的容量。

自定义类结构一般如下:

class CustomDataset(data.Dataset):#需要继承data.Datasetdef __init__(self):# TODO# 1. Initialize file path or list of file names.passdef __getitem__(self, index):# TODO# 1. Read one data from file (e.g. using numpy.fromfile, PIL.Image.open).# 2. Preprocess the data (e.g. torchvision.Transform).# 3. Return a data pair (e.g. image and label).#这里需要注意的是,第一步:read one data,是一个datapassdef __len__(self):# You should change 0 to the total size of your dataset.return 0

getitem最主要的方法是,其规定了如何读取数据,但是又不同于一般的方法,因为它是python built-in方法,其主要作用是能让该类可以像list一样通过索引值对数据进行访问。假定你定义好一个dataset,那么你可以直接通过Dataset[0]来访问第一个数据。

lterable式数据集

一个lterable式数据集,是抽象类:data.IterableDataset的子类,
并且腹泻了iter方法成为一个迭代器。这种数据集主要用于数据大小未知,或者以流的形式输入。本地文件不固定的情况,需要以迭代的方式来获取样本索引

迭代器

迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问。直到所有的元素被访问完结束,迭代器只能往前而不会后退,迭代器两个基本方法:iter()iter()iter()和next()next()next().
iter()iter()iter():方法返回一个特殊的迭代器对象,这个迭代器对象实现了next()方法,并通过$StopIteration $异常标识迭代的完成。
next()next()next() 方法会返回迭代器的输出。

class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):if self.a <= 20:x = self.aself.a += 1return xelse:raise StopIteration
#StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。myclass = MyNumbers()
myiter = iter(myclass)for x in myiter:print(x)

Sampler

sampler类的源代码主要由三种方法,如下:

class Sampler(object):r"""Base class for all Samplers.Every Sampler subclass has to provide an __iter__ method, providing a wayto iterate over indices of dataset elements, and a __len__ method thatreturns the length of the returned iterators."""# 一个 迭代器 基类def __init__(self, data_source):passdef __iter__(self):raise NotImplementedErrordef __len__(self):raise NotImplementedError
  • init方法:初始化。
  • iter:用来产生迭代索引值,也就是指定每个step需要读取那些数据。
  • len: 用来返回每次迭代器的长度。
    python提供了我们几种采样器,如下:

SequentialSampler

按顺序对数据集采样,其原理首先在初始化的时候,拿到数据集data_source,之后在__iter__方法中首先得到一个和data_source一样长度的range迭代器。每次只返回一个索引值。

RandomSampler

随机采样

SubsetRandomSampler

子集随机采样,用于训练,测试集和验证集合的划分。

WeightedRandomSampler

加权随机采样。

BatchSampler

前面的采样器每次只返回一个索引,但是我们在训练时是对批量数据进行训练。而这样的工作都需要BatchSampler来做。也就是说BatchSampler的作用就是将前面的Sampler采样得到的索引值进行合并,当数量等于一个batch大小后就将这一批的索引值返回

总结

慢慢的将各种采样方法,全部都将其搞定。慢慢的将其研究透彻,研究彻底。都行啦的样子与打算。

相关内容

热门资讯

A股分红派息转增一览:6股今日... 每经AI快讯,Wind数据显示,根据上市公司权益分配方案梳理统计,6只A股今日股权登记。其中,4股拟...
特朗普拟对进口电影征100%关... 来源:央视新闻客户端美国总统特朗普当地时间5月4日称,对所有进入美国、在外国制作的电影征收100%关...
云创数据积极应对挑战,加速推进... 去年云创数据的研发支出金额为3708.72万元,占营收比例达到73.58%。 ...
A股风险偏好有望回暖,5月或回... A股市场5月6日迎来5月首个交易日。回顾“五一”假期前市场表现,A股整体呈现窄幅盘整走势,小盘成长股...
以军战机猛烈空袭也门 据多家以色列媒体援引以色列安全部门消息人士的话报道称,当地时间5月4日晚,约30架以军战机千里奔袭,...
新华每日电讯:上海“绿色大民生... 浦江两岸,繁花似锦。一条“水环”串起十余座公园,浦东陆家嘴诞生户外运动新地标;国际花展展览面积创历年...
烟火升腾 全城沸腾 “五一”长... “第一次来长春,就被这里的消费氛围震撼了。晚上看灯光秀、品特色烧烤,白天逛文创集市,还能定制专属旅行...
广东农信系统加速改革 将组建农...   证券时报记者 安毅  又一省份明确农信系统改制方向。  广东省联社日前披露的2024年年报提到,...
全国首个地质生态产品概念发布 来源:矿权资源网近日,全国首个地质生态产品概念、理论内涵在浙江湖州安吉发布。  今年是“两山”理念提...
一所村级小学里的青春榜样 来源:科技日报科技日报记者 梁乐在五四青年节到来之际,中共中央总书记、国家主席、中央军委主席习近平给...
地名中的抗战记忆 | 黑龙江肇... 姚明久像  黑龙江省肇东市西北部,坐落着一个以抗日烈士之名命名的乡镇——明久乡。  姚明久参加抗联后...
中金:A股节后有望迎来“开门红... 转自:财联社【中金:A股节后有望迎来“开门红”】财联社5月6日电,中金公司研报认为,一季度A股上市企...
喜报!中国石油5名青年获国家级... 2025年度中国青年五四奖章暨新时代青年先锋奖评选结果揭晓中国石油5名青年获奖4月30日,2025年...
家务劳动大比拼 转自:湖州日报  德清县新安镇下舍中心学校日前举办“巧手做家务 劳动‘心’体验”主题活动。学生们通过...
走进沪上养老社区:“享受型”养... 转自:上观新闻如果一家养老院,拥有五星级酒店的房间设施,独立的单间和贴心的“管家”,甚至还有一步之遥...
德国联盟党与社民党签署联合执政... 转自:新华网  这是5月5日在德国柏林拍摄的德国联盟党与社民党联合执政协议签署仪式现场。新华社记者 ...
OpenAI放弃商业架构计划,... OpenAI CEO奥尔特曼在马斯克、辛顿和前OpenAI员工反对之后,如今,估值3000亿美元(约...
5月6日投资避雷针:5家公司因... 导读:财联社5月6日投资避雷针,近日,A股及海外市场潜在风险事件如下。国内经济信息方面包括:1)5月...
“五一”假期,洛阳接待游客73...   洛报融媒记者5日从洛阳市文广旅局获悉,今年“五一”假期,洛阳共接待游客736.27万人次,旅游总...
巴西警方粉碎Lady Gaga... 本报驻巴西特派记者 邵世均 本报特约记者 高文宇 本月3日,美国乐坛天后Lady Gaga在巴西里约...