用tf.data.dataset构建input pipline

用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“

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值