zoukankan      html  css  js  c++  java
  • tensorflow批量读取数据

    Tensorflow 数据读取有三种方式:

    Preloaded data: 预加载数据,在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。

    Feeding: Python产生数据,再把数据喂给后端。TensorFlow程序运行的每一步, 让Python代码来供给数据。

    Reading from file: 从文件中直接读取,在TensorFlow图的起始, 让一个输入管线从文件中读取数据。

    https://www.cnblogs.com/jyxbk/p/7773319.html
    https://blog.csdn.net/XUEER88888888888888/article/details/86666614
    https://www.cnblogs.com/zyly/p/8982335.html
    https://blog.csdn.net/chenghtao/article/details/82110434
    https://www.cnblogs.com/jyxbk/p/7773319.html
    https://www.sogou.com/link?url=DSOYnZeCC_rR_TP93bdO6NeXnRkLS7fcqFq8n02wCL9Pp37pjYjVUJBPmYRRn48s
    https://blog.csdn.net/christianashannon/article/details/78966048

             对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练(tip:使用这种方法时,结合yield 使用更为简洁,大家自己尝试一下吧,我就不赘述了)。但是,如果数据量较大,这样的方法就不适用了,因为太耗内存,所以这时最好使用tensorflow提供的队列queue,也就是第二种方法 从文件读取数据。对于一些特定的读取,比如csv文件格式,官网有相关的描述,在这儿我介绍一种比较通用,高效的读取方法(官网介绍的少),即使用tensorflow内定标准格式——TFRecords
    
        TensorFlow提供了一个队列机制,通过多线程将读取数据与计算数据分开。因为在处理海量数据集的训练时,无法把数据集一次全部载入到内存中,需要一边从硬盘中读取,一边进行训练,为了加快训练速度,我们可以采用多个线程读取数据,一个线程消耗数据。(队列:https://www.jianshu.com/p/d063804fb272)
    

    TensorFlow里与Queue有关的概念和用法。

    其实概念只有三个:

    Queue是TF队列和缓存机制的实现
    QueueRunner是TF中对操作Queue的线程的封装
    Coordinator是TF中用来协调线程运行的工具

    1. Queue
      根据实现的方式不同,分成具体的几种类型,例如:

    tf.FIFOQueue 按入列顺序出列的队列
    tf.RandomShuffleQueue 随机顺序出列的队列
    tf.PaddingFIFOQueue 以固定长度批量出列的队列
    tf.PriorityQueue 带优先级出列的队列
    ... ...

    这些类型的Queue除了自身的性质不太一样外,创建、使用的方法基本是相同的。
    创建函数的参数:
    tf.FIFOQueue(capacity, dtypes, shapes=None, names=None ...)

    Queue主要包含入列(enqueue)和出列(dequeue)两个操作。enqueue操作返回计算图中的一个Operation节点,dequeue操作返回一个Tensor值。Tensor在创建时同样只是一个定义(或称为“声明”),需要放在Session中运行才能获得真正的数值。(详细请参考:https://blog.csdn.net/fegang2002/article/details/82949863)下面是一个单独使用Queue的例子:

    import tensorflow as tf
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

    tf.InteractiveSession()

    q = tf.FIFOQueue(2, "float")
    init = q.enqueue_many(([0,0],))

    x = q.dequeue()
    y = x+1
    q_inc = q.enqueue([y])

    init.run()
    q_inc.run()
    q_inc.run()
    q_inc.run()
    x.eval() # 返回1
    x.eval() # 返回2
    x.eval() # 卡住

    如果一次性入列超过Queue Size的数据,enqueue操作会卡住,直到有数据(被其他线程)从队列取出。对一个已经取空的队列使用dequeue操作也会卡住,直到有新的数据(从其他线程)写入

    1. QueueRunner
      Tensorflow的计算主要在使用CPU/GPU和内存,而数据读取涉及磁盘操作,速度远低于前者操作。因此通常会使用多个线程读取数据,然后使用一个线程消费数据。QueueRunner就是来管理这些读写队列的线程的。
      QueueRunner需要与Queue一起使用(这名字已经注定了它和Queue脱不开干系),但并不一定必须使用Coordinator。看下面这个例子:

    增加计数的进程会不停的后台运行,执行入队的进程会先执行10次(因为队列长度只有10),然后主线程开始消费数据,当一部分数据消费被后,入队的进程又会开始执行。最终主线程消费完20个数据后停止,但其他线程继续运行,程序不会结束。

  • 相关阅读:
    small case change m and n
    关于闭包
    如何让IE兼容css3属性?
    全屏滚动插件
    bind()&call()&apply()的区别?
    nodejs和npm的关系
    数据库面试题整理
    微机原理复习整理
    软件工程复习整理
    leetcode字符串系列
  • 原文地址:https://www.cnblogs.com/Ann21/p/11088881.html
Copyright © 2011-2022 走看看