zoukankan      html  css  js  c++  java
  • TensorFlow Data模块

    模块作用

    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会自动创建迭代器并初始化。

  • 相关阅读:
    ie的bug及兼容性
    解决多次include后全局变量global失效的问题
    针对MYISAM表锁的解决方案(转)
    解决二进制文件冲突
    linux基本命令(1) 开关机操作
    子网掩码(NETMASK),ip地址,默认网关
    linux中常见设备对照表
    解决base64通过http传输后+变空格的问题
    mysql 查询某值是否存在于某结果集或表中
    laravel 报错 No query results for model
  • 原文地址:https://www.cnblogs.com/axder/p/11349293.html
Copyright © 2011-2022 走看看