dataset的使用,什么叫DataSet-它由什么组成-

  dataset的使用,什么叫DataSet?它由什么组成?

  参考文章:

  TensorFlow读取数据的新方式:数据集API介绍

  TensorFlow使用数据集来读取和构建数据。

  数据集中的[tensorflow]迭代器

  一.基本概念

  1.资料组

  简单来说,数据集可以看作是同类型“元素”的有序列表,其中单个“元素”可以是向量、字符串、图片,甚至是元组或字典。Dataset有三个重要的子类:TextLineDataset、TFRecordDataset和FixedLengthRecordDataset。

  2.迭代程序

  迭代器可以看作是数据集迭代器的对应实例,用于从数据集检索数据。

  常见的迭代器包括一次性迭代器、可初始化迭代器和可重新初始化迭代器。

  可馈送迭代器

  3…急切模式和非急切模式

  Eager模式,主要从动态图的角度出发,使用起来更加灵活。

  请参考:急切执行。

  第二,数据集创建

  1.创建1的简单方法。资料组

  #range():

  dataset=TF . data . dataset . range(5)

  # from _张量_切片():

  dataset=TF . data . dataset . from _ tensor _ slices(NP . array([1.0,2.0,3.0,4.0,5.0])

  from_Tensor_slices的真正作用是对传入张量的第一维进行切片,生成相应的数据集,例如:

  dataset=TF . data . dataset . from _ tensor _ slices(NP . random . uniform(size=(5,2)))

  传入的数值是一个矩阵,它的形状是(5,2)。TF . data . dataset . from _ tensor _ slices将拆分其形状的第一维。最终生成的数据集之一包含五个元素,每个元素的形状为(2,2),即每个元素是矩阵的一行。

  在实践中,我们可能还希望数据集中的每个元素具有更复杂的形式,比如每个元素在Python中是一个元组,在Python中是一个字典。

  我们可以把每个元素都变成一个字典:

  数据集=TF . data . dataset . from _ tensor _ slices(

  {

  “a”:NP . array([1.0,2.0,3.0,4.0,5.0]),

  “b”:NP . random . uniform(size=(5,2))

  }

  )

  此时,函数将分别拆分“A”中的值和“B”中的值。最后,数据集中的一个元素的形式是{“A”:1.0,“B”:[0.9,0.1]}。

  在图像识别问题中,一个元素可以是{“image”:image _ tensor,“label”:label _ tensor }的形式,这样处理起来更方便。同样,也可以通过使用TF . data . dataset . from _ tensor _ slices创建一个数据集,其中每个元素都是一个元组。

  数据集=TF . data . dataset . from _ tensor _ slices(

  (np.array([1.0,2.0,3.0,4.0,5.0]),np.random.uniform(size=(5,2)))

  )

  2.从TFRecord文件创建

  dataset=TF . data . tfrecorddataset(文件名)

  文件名可以是TFRecord文件或文件列表。

  当然,要解析来自filename的数据,需要构造一个解析器函数(对应于原始的TFRecords文件结构)。

  示例代码:

  def parser(record):features=TF . parse _ single _ example(record,features={ index: tf。FixedLenFeature([],tf.int64), col1: tf。FixedLenFeature([],tf.int64), col2: tf。FixedLenFeature([],tf.int64) })返回features[index],features[col1],Features[ col 2 ]training _ filenames=[ file-0 . TF records , file-1.tfrecords , file-2 . TF records ]dataset=TF . data . tfrecorddataset(training _ filenames)dataset=dataset . map(

  1.一次一次

  单迭代器不支持动态数据集和参数化。

  导入tensorflow为tf dataset=TF . data . dataset . range(5)iterator=dataset . make _ one _ shot _ iterator()带TF。session()as sess:for I in range(5):try:print(sess . run(iterator . get _ next()))except TF . errors . outofrangeerror:print( errors。outofrangererror )# #输出:0,1,2,3,4 2.initializable_iterator

  我们都知道张量流中有一种饲养机制,它允许我们在程序运行时再真正决定我们需要的数据,很遗憾,单次的迭代程序不能满足这要的要求。它的创建方式是:

  迭代器=数据集。make _ initializable _ iterator()

  在每次重新初始化的时候都需要调用:

  迭代器=数据集。make _ initializable _ iterator()

  def initial able _ test():numbers=TF。占位符(TF。int 64,shape=[])dataset=TF。数据。数据集。范围(数字)迭代器=数据集。带有TF的make _ initializable _ iterator().session()as sess:for I in range(5):try:print(sess。运行(迭代器。get _ next()))除了TF。错误。outofrangeerror:print( errors .outofrangererror’)这里的迭代程序的数据来源不变,还是原来的数据集,只是可以参数化的使用原来的数据集,如指定输出数据的数量。

  3 .重新初始化迭代器

  当需要一个迭代程序从不同的资料组对象中读取数值,张量流提供了一个迭代器,但要求是不同数据源的结构一致(利用来自_结构来统一数据源的结构)。

  示例代码:

  def re initiable _ iterator _ test():training _ data=TF。数据。数据集。范围(10)validation _ data=TF。数据。数据集。range(5)迭代器=TF。数据。迭代器。from _ structure(培训_数据。输出类型,训练数据。output _ shapes)train _ op=iterator。make _ initializer(training _ data)validation _ op=iterator。make _ initializer(validation _ data)next _ element=iterator。带有TF的get _ next()。session()as sess:sess。run(train _ op)for _ in范围(8):print(sess。run(next _ element))sess。对范围(3)中的_运行(validation _ op):打印(sess。run(next _ element))4 .可馈送迭代器

  可以看到,feedableiterator可以看作是一个转换器,它可以将不同的数据集的不同的管道迭代程序连在一起,随心所欲的切换数据的源。这一点,它和重新初始化_迭代器相似,但是,不同之处在于——feedableiterator在不同的迭代程序切换的时候,可以做到不从头开始。

  从具体实现来看,它是通过一个线类型的处理实现的,需要注意的一点是,string_handle()方法返回的是一个张量,只有运行一个张量才会返回线类型的把手。不然,程序会报错。

  先来看一下发件人字符串句柄()官网API:

  #根据给定句柄创建一个新的未初始化的迭代器@静态方法from _ string _ handle(string _ handle,output_types,output_shapes=None,output_classes=None)参数:字符串句柄:一个标量tf .tf.string类型的张量,其计算结果为Iterator.string_handle()方法生成的句柄。对应于此数据集元素的每个组件的类型对象. tf的嵌套结构。与此数据集元素的每个组件对应的张量形状对象。如果省略,每个组件将有一个不受约束的形状)Python。类型对象的嵌套结构,对应于这个迭代器的元素的每个组件。如果省略,则假设每个分量都属于tf。张量类型。示例代码:

  def feeding _ iterator _ test():train _ data=TF。数据。数据集。range(100,200,5)val _ data=TF。数据。数据集。范围(0,100,10).重复(2)handle=TF。占位符(TF。string,shape=[])iterator=TF。数据。迭代器。from _ string _ handle(句柄,训练数据.输出类型,训练数据。output _ shapes)next _ element=iterator。get _ next()train _ op=train _ data。make _ one _ shot _ iterator()validation _ op=val _ data。带TF的make _ initializable _ iterator()。session()as sess:train _ iterator _ handle=sess。run(train _ op . string _ handle())val _ iterator _ handle=sess。run(validation _ op . string _ handle())sess。run(validation _ op . initializer)for _ in range(5):for _ in range(2):print(sess。run(next_element,feed _ dict={ handle:train _ iterator _ handle })print(======)for _ in range(3):print(sess。运行(下一个元素,下一个元素四、其他

  主要总结了非渴望的模式下迭代程序和资料组的常规用法,相关的其他用法之后再做详细补充。

dataset的使用,什么叫DataSet-它由什么组成-