参考文章:
TensorFlow全新的数据读取方式:Dataset API入门教程
TensorFlow 利用Dataset读取和构建数据
【Tensorflow】Dataset 中的 Iterator
一、基本概念
1.DataSet

简单来说,Dataset可以看作是相同类型“元素”的有序列表,其中,单个“元素”可以是向量,也可以是字符串、图片,甚至是tuple或者dict。Dataset具有三个重要的子类TextLineDataset、TFRecordDataset、FixedLengthRecordDataset
2.Iterator

Iterator可以看作一个对应的数据集迭代器实例,用于实现从Dataset中取出数据。
常见的Iterator主要有oneshot Iterator、initializable iterator、reinitializable iterator
feedable iterator

3…Eager模式与非Eager模式
Eager模式,主要是从动态图的角度考虑,为了更加灵活的使用。
具体可以参考:Eager Execution
二、Dataset创建
1.Dataset简单创建方法
#range():
dataset = tf.data.Dataset.range(5)
#from_tensor_slices():
dataset = tf.data.Dataset.from_tensor_slices(np.array([1.0, 2.0, 3.0, 4.0, 5.0]))
from_tensor_slices真正作用是切分传入Tensor的第一个维度,生成相应的dataset,例如:
dataset = tf.data.Dataset.from_tensor_slices(np.random.uniform(size=(5, 2)))
传入的数值是一个矩阵,它的形状为(5, 2),tf.data.Dataset.from_tensor_slices就会切分它形状上的第一个维度,最后生成的dataset中一个含有5个元素,每个元素的形状是(2, ),即每个元素是矩阵的一行。

在实际使用中,我们可能还希望Dataset中的每个元素具有更复杂的形式,如每个元素是一个Python中的元组,或是Python中的词典。
我们可以让每一个元素是一个词典:
dataset = 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”中的数值,最终dataset中的一个元素就是类似于{“a”: 1.0, “b”: [0.9, 0.1]}的形式。
在图像识别问题中,一个元素可以是{“image”: image_tensor, “label”: label_tensor}的形式,这样处理起来更方便。同样,利用tf.data.Dataset.from_tensor_slices创建每个元素是一个tuple的dataset也是可以的。
dataset = 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(filenames)
filenames可以是一个TFRecord文件,也可以是一个文件LIST。
当然,从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)})return  features["index"],features['col1'],features['col2']training_filenames = ["file-0.tfrecords","file-1.tfrecords","file-2.tfrecords"]
dataset = tf.data.TFRecordDataset(training_filenames)
dataset = dataset.map(parser)

三、Iterator
1.一次性one_shot
单次的迭代器,不支持动态的数据集,不支持参数化。

import tensorflow as tf
dataset = tf.data.Dataset.range(5)
iterator = dataset.make_one_shot_iterator()
with tf.Session() as sess:for i in range(5):try:print(sess.run(iterator.get_next()))except tf.errors.OutOfRangeError:print('errors.OutOfRangeError')##output:0,1,2,3,4

2.initializable_iterator
我们都知道 Tensorflow 中有一种 feeding 机制,它允许我们在程序运行时再真正决定我们需要的数据,很遗憾,单次的 Iterator 不能满足这要的要求。它的创建方式是:
iterator = dataset.make_initializable_iterator()
在每次重新初始化的时候都需要调用:
iterator = dataset.make_initializable_iterator()

def initialable_test():numbers = tf.placeholder(tf.int64,shape=[])dataset = tf.data.Dataset.range(numbers)iterator = dataset.make_initializable_iterator()with tf.Session() as sess:for i in range(5):try:print(sess.run(iterator.get_next()))except tf.errors.OutOfRangeError:print('errors.OutOfRangeError')

这里的Iterator的数据来源不变,还是原来的Dataset,只是可以参数化的使用原来的数据集,如指定输出数据的数量。
3.reinitialable_iterator
当需要一个 Iterator 从不同的 Dataset 对象中读取数值,TensorFlow提供了一个Iterator,但要求是不同数据源的结构一致(利用from_structure来统一数据源的结构)。

示例代码:

def reinitialable_iterator_test():training_data = tf.data.Dataset.range(10)validation_data = tf.data.Dataset.range(5)iterator = tf.data.Iterator.from_structure(training_data.output_types,training_data.output_shapes)train_op = iterator.make_initializer(training_data)validation_op = iterator.make_initializer(validation_data)next_element = iterator.get_next()with tf.Session() as sess:           sess.run(train_op)for _ in range(8):print(sess.run(next_element))sess.run(validation_op)for _ in range(3):print(sess.run(next_element))

4.feedableiterator

可以看到,feedableiterator可以看作是一个转换器,它可以将不同的数据集的不同的管道Iterator连在一起,随心所欲的切换数据的源。这一点,它和reinitialable_iterator相似,但是,不同之处在于——feedableiterator 在不同的 Iterator 切换的时候,可以做到不从头开始。
从具体实现来看,它是通过一个 string 类型的 handle 实现的,需要注意的一点是,string_handle() 方法返回的是一个 Tensor,只有运行一个 Tensor 才会返回 string 类型的 handle。不然,程序会报错。
先来看一下from_string_handle()官网API:

#Creates a new, uninitialized Iterator based on the given handle
@staticmethod
from_string_handle(string_handle,output_types, output_shapes=None, output_classes=None)
Args:
string_handle: A scalar tf.Tensor of type tf.string that evaluates to a handle produced by the Iterator.string_handle() method.
output_types: A nested structure of tf.DType objects corresponding to each component of an element of this dataset.
output_shapes: (Optional.) A nested structure of tf.TensorShape objects corresponding to each component of an element of this dataset. If omitted, each component will have an unconstrainted shape.
output_classes: (Optional.) A nested structure of Python type objects corresponding to each component of an element of this iterator. If omitted, each component is assumed to be of type tf.Tensor.

示例代码:

def feeding_iterator_test():train_data = tf.data.Dataset.range(100,200,5)val_data = tf.data.Dataset.range(0,100,10).repeat(2)handle = tf.placeholder(tf.string,shape=[])iterator = tf.data.Iterator.from_string_handle(handle,train_data.output_types,train_data.output_shapes)next_element = iterator.get_next()train_op = train_data.make_one_shot_iterator()validation_op = val_data.make_initializable_iterator()with tf.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.run(next_element,feed_dict={handle:val_iterator_handle}))print('======')return

四、其他
主要总结了非Eager模式下Iterator和Dataset的常规用法,相关的其他用法之后再做详细补充。

DataSet与Iterator用法总结相关推荐

  1. java中Iterator用法总结

    Java中Iterator用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级& ...

  2. java queue iterator_Java DelayQueue iterator()用法及代码示例

    DelayQueue的iterator()方法用于在DelayQueue中的所有元素上返回迭代器.这些元素可以过期或未过期. 用法: public Iterator iterator () 参数:此方 ...

  3. c++ 的map、iterator用法

    https://blog.csdn.net/bangdingshouji/article/details/73028424 参考: 资料一:http://www.cplusplus.com/refer ...

  4. c++ 的map、iterator用法

    https://blog.csdn.net/bangdingshouji/article/details/73028424 参考: 资料一:http://www.cplusplus.com/refer ...

  5. java中iterator用法_java_详解Java中Iterator迭代器的用法,迭代器(Iterator)迭代 - phpStudy...

    详解Java中Iterator迭代器的用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为&quo ...

  6. tf.data.Dataset.from_tensor_slices 的用法

    将python列表和numpy数组转换成tensorflow的dataset 只有dataset才能被model.fit函数训练 import tensorflow as tf import nump ...

  7. Struts2 s:iterator 用法

    s:iterator 标签 一般都是用来抓取List中的内容,而List中一般都是存放的一些dto,下面是一个简单的实例, class Group: String id; String name; L ...

  8. java listiterator_Java笔记--Java的List、Iterator用法

    1. List的使用 准备知识: List继承自Collection接口.List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作. 跟Set ...

  9. 《Pytorch学习指南》- Dataset和Dataloader用法详解

    目录 前言 DataSet DataLoader 数据构建 1. 创建Dataset 类 :sparkles: 2. 读取数据 :ambulance: 3. 返回数据 :zap: 读取数据 :art: ...

最新文章

  1. Flutter开发之《新锐专家之路:混合开发篇》笔记(55)
  2. Webpack-IE低版本兼容指南
  3. LINUx设置ip导致内核挂死,Linux之TCPIP内核参数优化
  4. 文件描述符fd是什么?
  5. Flink示例——Flink-CDC
  6. JavaMail--发送html邮件
  7. 201521123059 《Java程序设计》第八周学习总结
  8. Solr 部分 局部字段修改 更新 删除
  9. php 时间类型int类型,mysql 查询 int类型日期转换成datetime类型
  10. html 中的一些知识
  11. mysql数据库中文选什么数据类型_Mysql 数据类型及选择原则
  12. 计算机毕业设计-JSP+Servlet网上会议室预约系统-JavaWeb会议室预约系统
  13. Cannot uninstall .. It is a distutils installed project and thus we cannot accurately determine 解决方案
  14. RDL 报表 - 横向合并单元格后单元格被撑高
  15. wing ftp linux 怎么用,Wing FTP Server使用方法(操作步骤)
  16. 图片指纹技术检测图片相似度
  17. 00后学习创作娱乐生活宅家必备:钉钉、书旗小说、橙瓜码字
  18. QT学习的相关博客论坛
  19. 渗透测试 | 域名信息收集
  20. CapsuleRRT: Relationships-aware Regression Tracking via Capsules

热门文章

  1. Android之闹钟
  2. python中def func是什么意思_Python的函数参数详解
  3. phpmailer 私密抄送_phpmailer 参数使用说明
  4. JS/Jquery常用代码
  5. 2021山西孕博会|山西产康展会|山西月子展会
  6. web前端导出数据到excel表格
  7. 设计模式(一):模板方法、观察者模式、策略模式
  8. 区块链的简单介绍(二)
  9. Java for Selenium | Java术语中英文对照
  10. 《CoCoNuT: Combining Context-Aware Neural Translation Models using Ensemble for Program Repair》论文笔记