用dataset构建input pipline
这一部分主要参考tensorflow的官方教程:tf.data.datasets, 上一篇tensorflow数据读取是基于多线程数据抓取的方式,维护多队列(文件队列,example队列),是比较偏底层的。可能现在tensorflow开始慢慢走了上封装之路,datasets的出现隐藏了底层的实现。(还好不像python~~~~~~~~匿了)。
因为本人是做计算机视觉方向的,所以这里就从计算机视觉的需求出发。主要考虑从TFRecords中读取数据。
整个小目录可能会更好理解:
- 数据导入
- 基本机制
- Dataset结构
- 创建一个iterator
- 从iterator消费数据
- 从tfrecords读取数据
- 数据预处理接口:Datasets.map
- 解析TFRecords数据
- 图片数据decoding, resize
- 图片数据的normalize
- 打包数据:Batching
- 简单的打包
- 使用padding打包
- 举个栗子
- 写入tfrecords文件
- map函数数据预处理
- 处理多个epochs
- random shuffling一下
- batching搞起
- 输出来看看
1. 数据导入
tensorflow的口号:tf.data API可以让你以简单可复用的方式构建复杂的Input Pipeline。例如:一个图片模型的Pipeline可能会聚合在一个分布式文件系统中的多个文件,对每个图片进行随机扰动(random perturbations),接着将随机选中的图片合并到一个training batch中。tf.data API可以很方便地以不同的数据格式处理大量的数据,以及处理复杂的转换。
Dataset API引入了两个新的抽象类到Tensorflow中:
- tf.data.Dataset:表示一串元素(elements,tfrecors中的example),其中每个元素包含了一或多个Tensor对象。例如:在一个图片pipeline中,一个元素可以是单个训练样本,它们带有一个表示图片数据的tensors和一个label组成的pair。对于datasets其实理解为一个数据堆就行,我们可以在这个数据堆上进行多种操作,预处理、排序、batching等等。有两种不同的方式创建一个dataset:
- 创建一个source (例如:Dataset.from_tensor_slices()), 从一或多个tf.Tensor对象中构建一个dataset
- 应用一个transformation(例如:Dataset.batch()),从一或多个tf.data.Dataset对象上构建一个dataset
- tf.data.Iterator:它提供了主要的方式来从一个dataset中抽取元素。通过Iterator.get_next() 返回的该操作会yields出Datasets中的下一个元素,作为输入pipeline和模型间的接口使用。
2. 基本机制
这部分描述了创建不同Dataset和Iterator对象的机制,以及如何使用它们来抽取数据。
Step1: 定义Source
要想启动一个input pipeline,你必须定义一个source。这里官方主要给了两类方法:
- tf.data.Dataset.from_tensors(), 以及 tf.data.Dataset.from_tensor_slices(),这种方法我理解的一般针对内存小数据进行处理。
- 另外一种方式就是transformations, 具体点就是如果此时你有一个tfrecords的文件在磁盘,这个时候我们可以应用map函数,将磁盘数据做成一个映射一样(或者理解为带映射的软连接)得到我们的datasets,比如这个map函数可以是decode(至少需要解析tfrecords),或者是多个映射的累积,比如先decode,然后还想normalize,还想shuffling一下,还想repeat一下,还想batching一下等等。
Step2:消费数据
对于消费数据,datasets封装得比较好,只留出了几个不同类型的接口。但都是属于迭代指针类型一样,iterator对象。它提供了一次可以访问dataset中的一个元素(例如:通过调用Dataset.make_one_shot_iterator())。tf.data.Iterator提供了两个操作:
- Iterator.initializer:它允许你(re)initialize iterator的状态
- Iterator.get_next():它返回tf.Tensor对象,对应于指定的下一个元素。
之后,建议直接看代码吧。
2.1 Dataset结构
一个dataset由element组成,它们每个都具有相同的结构。一个元素包含了一或多个tf.Tensor对象,称为“components“