掏粪男孩

这篇博客记录tensorflow一些知识。

tensorflow读取机制

在算法识别图片的时候,要先把图片读到内存中,然后再输入GPU进行读取。假设每张图片读取要0.1s,计算要0.9s,那么每一秒中GPU就有0.1s无事可做。为了充分利用GPU,使用两个线程,一个线程先将数据读取到内存队列,另一个线程直接从内存队列中读取数据进行计算。在tensorflow中,在内存队列前又增加了一个文件名队列。

为什么要增加文件名队列呢?平时实验中一个epoch就是把数据从头到尾的跑一边,实验一般有多个epoch,有几个epoch就把文件名在文件队列中复制几遍即可,这样就方便了内存队列,不用因为多个epoch而做出改变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 导入tensorflow
import tensorflow as tf

# 新建一个Session
with tf.Session() as sess:
# 我们要读三幅图片A.jpg, B.jpg, C.jpg
filename = ['A.jpg', 'B.jpg', 'C.jpg']
# string_input_producer会产生一个文件名队列
filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)
# reader从文件名队列中读数据。对应的方法是reader.read
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
# tf.train.string_input_producer定义了一个epoch变量,要对它进行初始化
tf.local_variables_initializer().run()
# 使用start_queue_runners之后,才会开始填充队列
threads = tf.train.start_queue_runners(sess=sess)
i = 0
while True:
i += 1
# 获取图片数据并保存
image_data = sess.run(value)
with open('read/test_%d.jpg' % i, 'wb') as f:
f.write(image_data)