模块作用

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

基本抽象

提供了两种基本抽象:Dataset和Iterator

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. C# “从元数据”

    所谓元数据.其实是指由微软所封装的类..这些类你可以查看.但是无法修改. 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述.将您的代码编译 ...

  2. 分布式事务(4)---RocketMQ实现分布式事务项目

    RocketMQ实现分布式事务 有关RocketMQ实现分布式事务前面写了一篇博客 1.RocketMQ实现分布式事务原理 下面就这个项目做个整体简单介绍,并在文字最下方附上项目Github地址. 一 ...

  3. NOIP 2004 虫食算题解

    问题 E: [Noip2004]虫食算 时间限制: 1 Sec  内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...

  4. 多线程与高并发(五)final关键字

    final可以修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,我们先依次学习final的基础用法,然后再研究final关键字在多线程中的语义. 一.变量 变量,可以分为成员变量 ...

  5. 关于Object.defineProperty 的基础知识

    Object.defineProperty 这个方法大家耳熟能详,可以对 对象的属性进行添加或修改的操作.即可以进行  数据劫持 .vue就是通过这个方法来劫持数据的. 平时我们创建对象的时候,一般通 ...

  6. Salesforce Admin篇(三) Delegated Administrator

    项目中,我们可能会遇见以下的场景. 1. HR 经理针对申请者和工作相关的表的app会经常需要修改布局查看需要的页面的字段: 2. 开发者将record type对应的picklist values等 ...

  7. Centos7 安装VNCserver&图形界面

    1.安装软件包. yum install tigervnc-server -y yum groups install GNOME yum groups install "Virtualiza ...

  8. ssm框架下的文件上传和文件下载

    最近在做一个ssm的项目,遇到了添加附件和下载的功能,在网上查了很多资料,发现很多都不好用,经过摸索,发现了一套简便的方法,和大家分享一下. 1.在自己已经构建好的maven  web项目中 pom. ...

  9. 一文彻底搞懂Java中的环境变量

    一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...

  10. 【iOS】copy 关键字

    以前没注意过 iOS 的 copy, nonatomic, assign, weak, strong 等关键字. 偏偏今天遇到了一个问题,恰恰是关键字的问题,如图: 之前用的是 assign, 没有用 ...