模块作用

tf.data api用于创建训练前导入数据和数据处理的pipeline,使得处理大规模数据,不同数据格式和复杂数据处理变的容易。

基本抽象

提供了两种基本抽象:DatasetIterator

Dataset

表示元素序列集合,每个元素包含一个或者多个Tensor对象,每个元素是一个样本。有两种方式可以创建Dataset。

  1. 从源数据创建,比如:Dataset.from_tensor_slices()
  2. 通过数据处理转换创建,比如 Dataset.map()/batch()

Iterator

用于从Dataset获取数据给训练作为输入,作为输入管道和训练代码的接口。最简单的例子是“one-shot iterator”,和一个dataset绑定并返回它的元素一次。通过调整初始化参数,可以实现一些复杂场景的需求,比如循环迭代训练集的元素。

基本机制

基本使用的流程如下:

1. 创建一个dataset
2. 做一些数据处理(map, batch)
3. 创建一个iterator提供给训练使用

数据结构

每个元素都有相同的数据结构,每个元素包含一个或者多个tensor,可以元组表示或者嵌套表示。每个tensor包含类型tf.DType和维度形状tf.TensorShape。每个tensor可以有名称,通过collections.namedtuple或者字典实现。

Dataset的数据处理接口能够支持任意数据结构。

创建Iterator

有了dataset以后,下一步就是创建一个iterator提供访问数据元素的接口,现在tf.data api支持4中iterator来实现不同程度的复杂场景。

  • one-shot,
  • initializable,
  • reinitializable
  • feedable.

one-shot

最简单,最常用,就是一次遍历所有元素,目前(2019/08)也是estimator唯一支持的iterator。

initializable

需要显示运行初始化操作,可以通过tf.placeholder参数化dataset。

reinitializalbe

可以从多个dataset多次初始化,当然需要相同数据结构。每次切换数据集,使用前需要初始化,

feedable

可以从多个dataset多次初始化,初始化完毕后,可以通过tf.placeholder随时切换数据集。

获取iterator的值

通过session.run(iterator.get_next())完成,若没有数据了则报异常:tf.errors.OutOfRangeError。

iterator.get_next()返回的是tf.Tensor对象,需要在session中执行才会有值。

保存iterator状态

save and restore the current state of the iterator (and, effectively, the whole input pipeline). 能将整个输入pipeline保存并恢复(原理是什么?

saveable = tf.contrib.data.make_saveable_from_iterator(iterator)
tf.add_to_collection(tf.GraphKeys.SAVEABLE_OBJECTS, saveable)
saver = tf.train.Saver()

读取输入数据

直接读取numpy的数据得到array,调用Dataset.from_tensor_slices

读取TFRecord data: dataset = tf.data.TFRecordDataset(filenames)

通过文件的方式,可以支持不能够全部导入内存中的场景。tf.data.TFRcordDataset将读取数据流作为整个输入流的一部分。

同时,文件名可以通过tf.placeholder传入。

这里所有的dataset的返回,也都是tensorflow中的operation,需要在session中计算得到值。

解析tf.Example

推荐情形下,输入需要从TFRecord文件格式读取TF Example的protocol buffer messages,每个TF Example包含一个或者多个features,输入管道需要将其转换为tensor。

典型列子

# Transforms a scalar string `example_proto` into a pair of a scalar string and# a scalar integer, representing an image and its label, respectively.
def _parse_function(example_proto):
features = {"image": tf.FixedLenFeature((), tf.string, default_value=""), "label": tf.FixedLenFeature((), tf.int64, default_value=0)}
parsed_features = tf.parse_single_example(example_proto, features) return parsed_features["image"], parsed_features["label"]
# Creates a dataset that reads all of the examples from two files, and extracts
# the image and label features.
filenames = ["/var/data/file1.tfrecord", "/var/data/file2.tfrecord"]
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(_parse_function)

对于图像,可以通过tf.image.decode_jpeg等方式提取和resize。

任意的python逻辑处理数据情形

在文本当中,比如有时候需要调用其他python库,比如jieba,这时候输入处理需要通过t'f.py_func()opeation完成。

Batching dataset elements

简单batch

调用Dataset.batch()实现,所有元素包含同样的数据结构。

带Padding的batch

当所有元素包含不同长度的数据结构时,可以通过padding使得单个batch数据长度一致。序列模型情形下。制定padding的shape为可变长度,比如(None,)来完成,会自动padding到单个batch的最大长度。当然,可以重写padding的值或者padding的长度。

训练流程

多批次遍历

tf.data提供了两种遍历数据的方式

想要遍历数据多次,可以使用Dataset.repeat(n)操作完成。遍历n次对应多少次epochs。若不提供参数,则将无限循环。同时,将不会给出一个批次结束的信号。

若想在每个批次结束后做处理,则需要在外围加循环,然后通过重复初始化迭代器完成,捕捉tf.errors.OutOfRangeError异常。

随机shuffle

dataset.shuffle()维持一个缓存区,随机取下一个数据。

高阶API

tf.train.MonitoredTrainingSession 接口简化了分布式Tensorflow的很多方面。MonitoredTrainingSession 用tf.error.OutOfRangeError来获取训练是否结束,所以推荐采用one-shot 迭代器。

用dataset作为estimator的输入函数时,直接将dataset返回,estimator会自动创建迭代器并初始化。

TensorFlow Data模块的更多相关文章

  1. jQuery1.9.1源码分析--数据缓存Data模块

    jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...

  2. 读Zepto源码之Data模块

    Zepto 的 Data 模块用来获取 DOM 节点中的 data-* 属性的数据,和储存跟 DOM 相关的数据. 读 Zepto 源码系列文章已经放到了github上,欢迎star: reading ...

  3. TensorFlow saved_model 模块

    最近在学tensorflow serving 模块,一直对接口不了解,后面看到这个文章就豁然开朗了, 主要的困难在于   tf.saved_model.builder.SavedModelBuilde ...

  4. tensorflow data's save and load

    note: if you'll load data,the data shape should be similar with saved data's shape.    -- 中式英语,天下无敌 ...

  5. 服务器安装tensorflow导入模块报错Illegal instruction (core dumped)

    在ubuntu上安装tensorflow后导入模块显示Illegal instruction (core dumped) 服务器的版本是Ubuntu 16.04.5 降低版本,成功导入模块 pip3 ...

  6. tensorflow mnist模块详解

    tensorflow的官方文档是以mnist数据集为例子开始的.文档本身没有介绍tensorflow.contrib.learn.python.learn.datasets.mnist模块.要想用te ...

  7. 使用tensorflow.data.Dataset构造batch数据集(具体用法在下一篇博客介绍)

    import tensorflow as tf import numpy as np def _parse_function(x): num_list = np.arange(10) return n ...

  8. Python pandas.io.data 模块迁移

    这段时间用pandas做数据分析, import pandas.io.data as web 然后得到下面的错误提示 "The pandas.io.data module is moved ...

  9. data模块

    这个模块原本应该存放Excel文件,提供utils目录下的config模块调用: 这里公司内部无法使用Excel读取数据,顾使用了ddt,其实里面就是.xslx文件

随机推荐

  1. 你必须了解的java内存管理机制(四)-垃圾回收

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

  2. 如何编写无须人工干预的shell脚本

    在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行.比如 cp test.txt boo/test.txt,会询问是否覆盖?ssh远程登陆时,需要输入人工密码后,才可以继续执行ss ...

  3. 5.Ray-Handler之ToReadHandler编写

    如图右上角所示,Ray中有两类Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的CoreHandler,PartSubHandler派 ...

  4. OpenCV多版本切换和配置--opencv 安装与卸载、添加 opencv_contrib modules 以及 OpenCv 多版本切换

    1. 查看安装Opencv的版本.以及libs和cflags $ pkg-config --modversion opencv $ pkg-config --cflags opencv // 编译链接 ...

  5. Java监控任务的生命周期

    Observable: public interface Observable { enum Cycle{ STARTED, RUNNING, DONE, ERROR } Cycle getCycle ...

  6. 【攻略】百度货币识别API,搞定防诈骗的应用小程序

    1.需求及方案: 近两年用外币进行诈骗的案件很多.例如:2015年12月,一安徽诈骗团伙,用不值1角人民币的50印蒂(intis,秘鲁旧货币,1991年发行新货币后已停止流通,目前无货币价值,仅有&q ...

  7. vue组件之间的传值——中央事件总线与跨组件之间的通信($attrs、$listeners)

    vue组件之间的通信有很多种方式,最常用到的就是父子组件之间的传值,但是当项目工程比较大的时候,就会出现兄弟组件之间的传值,跨级组件之间的传值.不可否认,这些都可以类似父子组件一级一级的转换传递,但是 ...

  8. JDBC连接-操作数据库

    JDBC连接数据库的操作步骤 *条件:先启动mysql,然后创建新连接.这里我用Navicat工具来操作数据库. 前面是创建数据库,以及授权的问题.然后打开eclipse 这里我整理一下 抛出的两个异 ...

  9. Excel催化剂开源第51波-Excel催化剂遍历单元格操作性能保障

    在Excel催化剂推出的这一年多时间里,经常性听到一种声音,大概意思是真正会写代码的人,都不会看上Excel催化剂写出来的功能,自己造一个更舒服贴心,仿佛会一点VBA就可以天下无敌一般,也好像Exce ...

  10. springboot4自动配置的原理(浅层)

    自动配置的原理(浅层) @Configuration //这是一个配置类 @EnableConfigurationProperties(HttpProperties.class)//启用Configu ...