pytorch的num_works,pytorch csdn

  pytorch的num_works,pytorch csdn

  我们进一步了解py torch :3360数据加载器的迭代器和生成器的应用。

  发布时间:2020-08-22 22:37:07

  来源:剧本之家

  阅读量:130

  作者:韩索洛

  在使用pytorch训练模型时,通常需要加载大量的图像数据,因此pytorch提供了一个简单易用的数据加载工具data loader。

  为了在小批量循环中读取大数据集,Dataloader类的具体实现使用了迭代器和生成器。

  因为这个应用场景就是python中迭代器模型的意义所在,所以本文通过阅读数据加载器中的代码,可以更好的理解python中迭代器和生成器的概念。

  本文的主要内容如下

  解释python迭代器和生成器的概念

  如何解密pytorch的数据加载器代码并使用迭代器和生成器加载数据

  Python迭代基金会

  Python有以下关于迭代的概念:

  迭代对象迭代

  迭代程序

  发电机

  这三个概念是相互关联的,而不是孤立的。迭代器是基于迭代器开发的,生成器是基于迭代器开发的。

  学习这些概念的名词解释毫无意义。编程的很多抽象概念都是人为创造的协议和模型,以更好地实现某些功能。

  因此,要理解它们,我们必须探索概念背后的逻辑。为什么要这样设计?真正需要解决的问题是什么?什么场合最适合申请?

  迭代模式要解决的第一个基本问题是需要按照一定的顺序获取集合的内部数据,比如循环一定的链表。

  如果数据很小,没有问题。但在读取大量数据时,一次读取就会超过内存限制,所以可以考虑以下方法。

  把大数据分成几个小块进行分割。

  惰性取值法,必要时取值。

  读取循环数据分为三种APP应用场景,分别对应容器(可重复对象)、迭代器和生成器:

  For In Container:实现__getitem__()方法,该方法从0开始顺序遍历序列容器中的元素,以遍历python内部序列容器,如list。

  对于in迭代器:必须实现_ _ iterator _ _和__next__方法来重复用户定义的迭代器。__iter__是一个迭代协议,每个具体迭代的执行逻辑都位于__next__或next method中。

  为了节省循环内存和加快速度,对于生成器中的x:使用生成器实现惯性加载,在迭代器中加入yield语句。最简单的例子是range(5)

  代码示例:

  #列表中x的常规循环

  数字=[ 1,2,3,]

  对于数字中的n:

  打印(n) # 1,2,3

  for循环实际上做了什么

  # iter输入可重复对象的列表并返回迭代器。

  #获取数据的下一种方法

  My _ iterator=iterator (number))。

  下一个(我的迭代器)# 1

  下一个(我的迭代器)# 2

  下一个(我的迭代器)# 3

  next(my _ iterator)# stop iteration异常

  迭代器中x的#迭代器循环

  对于I,ninenumerate(数字) :

  Print (I,n) # 0,1/1,3/2,3

  #发电机中x的发电机回路

  forIinrange(3):

  打印(I) # 0,1,2

  上面的示例代码说明了如何使用python内置函数iter和next:

  调用iter函数__iter__并返回迭代器。

  输入下一个函数和迭代器,调用__next__检索数据。

  有两种方法很容易混淆:__iter__和__next__。区别如下

  __iter__是实际检索数据的__next__方法,实际调用由next(迭代器)进行,以便可以重复。

  __iter__可以返回自身(从),实际读取数据的实现放在__next__方法中。

  您可以将生成器对象与__iter__yield一起返回。

  __iter__以类似于python的类型系统的方式返回自身。为了一致性,python中的所有对象。

  每个对象创建后,都有一个类型指针。指向类型对象的指针指向元对象,而指向元对象的指针指向自身。

  将生成器yield语句添加到__iter__方法中。好处包括:

  降低循环判断逻辑的复杂度。

  惯性值,节省内存和时间。

  产出角色:

  返回语句而不是函数

  记住

  元素在循环迭代器中的位置。

  三种循环模式的共同功能

  容器中的x方法:

  列表,德克,…

  集合,冷冻集合,…

  字典,默认字典,有序字典,计数器,…

  元组,名为元组,…

  潜艇用热中子反应堆(海底热反应堆的缩写)

  对于迭代器中的x方法:

  枚举()#加上目录的指数

  已排序()#排序目录

  反转()#倒序目录

  zip() #合并目录

  对于发电机中的x方法:

  范围()

  地图()

  过滤器()

  减少()

  [列表中x的x(.)]

  数据记录器源码分析

  框架采用对于迭代器中的x模式,从数据加载器类中读取数据。

  为了实现该迭代模式,在数据加载器内部实现__iter__方法,实际返回的是_DataLoaderIter类。

  _DataLoaderIter类里面,实现了__iter__方法,返回自身,具体执行读数据的逻辑,在__下一个_ _方法中。

  以下代码只截取了单线程下的数据读取。

  类数据加载器(对象):

   r

  数据加载器。组合数据集和采样器,并提供

  数据集上的单进程或多进程迭代器。

  def __init__(self,dataset,batch_size=1,shuffle=False,):

  self.dataset=dataset

  自我。批处理取样器=批处理取样器

  .

  def __iter__(self):

  return _DataLoaderIter(self)

  def __len__(self):

  返回len(自助批处理_采样器)

  class _DataLoaderIter(对象):

   r 根据采样器 的指定,在数据加载器的数据集上迭代一次

  def __init__(self,loader):

  自我。sample _ ITER=ITER(自我。批处理_采样器)

  .

  def __next__(自己):

  如果self.num_workers==0: #相同进程加载

  indexes=next(self。样品_ ITER)#可能会引发停止迭代

  批量=自身。collate _ fn([self。索引中I的数据集[I])

  if self.pin_memory:

  batch=pin _内存_批处理(批处理)

  退货批次

  .

  def __iter__(self):

  回归自我

  数据加载器类中读取数据索引的方法,采用了对于发电机中的x方式,但是调用采用国际热核聚变实验堆和然后函数

  构建随机采样类RandomSampler,内部实现了__iter__方法

  __iter__方法内部使用了产量,循环遍历数据集,当数量达到批量大小大小时,就返回

  实例化随机采样类,传入国际热核聚变实验堆函数,返回一个迭代器

  然后会调用随机采样类中生成器,返回相应的指数数据

  类随机抽样器(对象):

  "随机抽样产生一个小批量的指数。"

  def __init__(self,batch_size,dataset,drop_last=False):

  self.dataset=dataset

  self.batch_size=批处理_大小

  self.num_imgs=len(数据集)

  self.drop_last=drop_last

  def __iter__(self):

  指数=NP。随机的。排列(自我。num _ imgs)

  批次=[]

  对于指数中的我:

  batch.append(i)

  if len(batch)==self.batch_size:

  产量批次

  批次=[]

  ##如果图像不产生批次

  如果len(批次)为0且不是self.drop_last:

  产量批次

  def __len__(self):

  if self.drop_last:

  回归自我。num _ imgs//self。批量大小

  否则:

  回归(自我。num _ imgs self。batch _ size-1)//self。批量大小

  batch _ sampler=随机抽样器(batch _ size .数据集)

  sample_iter=iter(batch_sampler)

  indexes=next(sample _ ITER)

  总结

  本文总结了大蟒中循环的三种模式:

  对于容器中的x可迭代对象

  对于迭代器中的x迭代器

  对于发电机中的x生成器

  框架中的数据加载模块数据加载器,使用生成器来返回数据的索引,使用迭代器来返回需要的张量数据,可以在大量数据情况下,实现小批量循环迭代式的读取,避免了内存不足问题。

  参考文章

  迭代器和生成器

  流畅的Python-第14章:可迭代的对象、迭代器和生成器

  py火炬-数据加载器源码

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: