tensorflow数据读取——文件名队列和内存队列

转载 2018年04月16日 11:29:43

详细信息请参考:https://zhuanlan.zhihu.com/p/27238630

以从文件中读入图像数据为例。


一、tensorflow读取机制图解

为了提高GPU/CPU的对数据的运算效率,引入“内存”的概念,我们把“读入数据到内存队列”和“GPU/CPU计算数据”分别放入两个线程中,其中”读入数据到内存队列”的线程的图示如下:


为了方便管理,还需要在“内存队列”前加入“文件名队列”:


然后有没有发现,红色框里流程特别像工厂流水线上的女工在勤劳工作,这就是“文件读取管线”的概念了。程序运行后

首先,把ABC依次放入“文件名队列并在之后标注队列结束;

然后,“内存队列”获得“文件名队列”中的ABC(坑:获得的顺序也有可能是CBA或BCA,代码部分会给出解释);

最后,系统检测到“结束”就可以结束程序了。

以上就是tensorflow中读取数据的基本机制。


二、代码详解

所谓“机制”不过是为了简化理解一个过程的概念而已。下面通过代码来看看每句命令对应的状态。注:以读入一张“A.jpg”的3*3*3的图为例(如下图,虽然看起来是灰度图,但实际是3通道的)。


1.image_name = ['./A.jpg']

这一句好理解,获取文件名。

2.filename_queue = tf.train.string_input_producer(image_name,shuffle=False)

tf.train.string_input_producer()表示创建“文件名队列”,注意这里仅仅只是创建哦!创建后,整个系统还是处于“停滞状态”,文件名并没有被加入到队列中(如下图所示)此时如果我们开始计算,因为内存队列中什么也没有,计算单元就会一直等待,导致整个系统被阻塞。也就说女工们已经就位,第一道工序还没开始,大家就都没活干,得等着。

填坑:然后注意到参数shuffle = False,意思是要从“内存队列”中顺序获得“文件名队列”得到A、B、C,如果是shuffle=True(默认),那么就会乱序获取到“内存队列”,结果变为CBA或BCA等。当然我们只读入一张图“A.jpg”的话,shuffle为False还是True都无所谓。


3 image_reader = tf.WholeFileReader()
4._,image_file = image_reader.read(filename_queue)

实际上在tensorflow中,内存队列不需要我们自己建立,我们只需要使用reader对象从文件名队列中读取数据就可以了,这里读取后的数据保存在 image_file 中。


5.image = tf.image.decode_jpeg(image_file,channels=3)

对读取的图片解码成jpg的格式。


6. coord = tf.train.Coordinator() #协同启动的线程
7. threads = tf.train.start_queue_runners(sess=sess, coord=coord) #启动线程运行队列
8. print(sess.run(image))
9. coord.request_stop() #停止所有的线程
10.coord.join(threads)

刚才说过,队列只被创建了,要打破僵局,需要使用tf.train.start_queue_runners(),才能启动填充队列,这时系统不再“停滞”,整个系统才能跑起来。该函数一般搭配Coordinator一起使用,这是负责在收到任何关闭信号的时候,让所有的线程都知道。本人一开始也是没有写这一句,导致程序一直停滞。

以下是完整的代码和显示结果:

import tensorflow as tf

sess = tf.Session()

image_name = ['./A.jpg']
filename_queue = tf.train.string_input_producer(image_name)
image_reader = tf.WholeFileReader()
_,image_file = image_reader.read(filename_queue)
image = tf.image.decode_jpeg(image_file,channels=3)

coord = tf.train.Coordinator() #协同启动的线程
threads = tf.train.start_queue_runners(sess=sess, coord=coord) #启动线程运行队列
print(sess.run(image))
coord.request_stop() #停止所有的线程
coord.join(threads)
结果显示:

以上每一块代表图像的一行信息,所以显示共有三个分块,每一块包含所有列的信息。




一枝看上去很美的花——书评《Java与模式》

一枝看上去很美的花——书评《Java与模式》撰文/剃刀(本文首发于《程序员》杂志2003年第1期)躺在我面前的,是阎宏博士编著、电子工业出版社出版的厚达1024页的《Java与模式》。如果按照我的朋友...
  • gigix
  • gigix
  • 2003-01-06 15:21:00
  • 3294

tensorflow爬坑行:数据读取

tensorflow的数据读取 tensorflow在读取像imagenet这种大量图像数据,不能一次性load进内存时有几个坑,Mark一记,以助后来者。关于多GPU和分布式,本文只讨论数据并行...
  • qiaohan12345
  • qiaohan12345
  • 2016-08-28 08:21:26
  • 1683

SSD-Tensorflow训练总结

感想 今天我测试了一下我自己训练的模型,和YOLOv2做了一下对比,检测的都是对的,YOLOv2版本的准确率不高,但是SSD有很多没有检测出来,召回率不怎么高。 1 制作数据集 最麻烦的是制作vo...
  • w5688414
  • w5688414
  • 2017-10-30 17:26:14
  • 5660

TensorFlow:(一)数据读取与保存

在学习tensorflow的过程中,读取数据这一块很难理解。确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料。今天这篇文章就以图片的形式,用最简单的语言,为大家详细解释一下te...
  • Pumpkin_love
  • Pumpkin_love
  • 2018-04-12 19:41:48
  • 23

tensorflow 队列,多线程

取消placeholder 和feed_dict={}组合,使用队列QUEUE和coordinator来实现tensorflow的多线程 import tensorflow as tfx = tf....
  • heavenpeien
  • heavenpeien
  • 2018-04-09 13:42:48
  • 13

tensorflow学习笔记(四十二):输入流水线

tensorflow 如何读取数据tensorflow有三种把数据放入计算图中的方式: * 通过feed_dict * 通过文件名读取数据:一个输入流水线 在计算图的开始部分从文件中读取数据 *...
  • u012436149
  • u012436149
  • 2017-05-16 21:16:09
  • 3830

TensorFlow实战调试中所遇问题及解决方法1

程序源码(节选):exampleBatch1, labelBatch1 = batch_input(dataPath, num_epochs=100)with tf.Session() as sess...
  • phmatthaus
  • phmatthaus
  • 2018-02-26 14:49:25
  • 207

tensorflow队列读取机制

tensorflow提供了三种读取数据的机制,分别是1.constant, 2.feed_dict ,3. file reader。 对于数据读取一般会有这两个问题:1.内存占用 2.数据读取时间...
  • Android_chunhui
  • Android_chunhui
  • 2018-03-23 11:54:55
  • 71

tensorflow载入数据的三种方式

Tensorflow数据读取有三种方式: Preloaded data: 预加载数据Feeding: Python产生数据,再把数据喂给后端。Reading from file: 从文件中直接读取 ...
  • lujiandong1
  • lujiandong1
  • 2016-11-28 14:50:42
  • 15172

tensorflow学习笔记(五):TensorFlow变量共享和数据读取

1、变量共享   前面已经说过如何进行变量的生成和初始化内容,也用到了命名空间的概念,这里说一下什么是变量共享。当我们有一个非常庞大的模型的时候免不了需要进行大量的变量共享,而且有时候还希望能够在一...
  • woaidapaopao
  • woaidapaopao
  • 2017-06-13 16:28:44
  • 6892
收藏助手
不良信息举报
您举报文章:tensorflow数据读取——文件名队列和内存队列
举报原因:
原因补充:

(最多只允许输入30个字)