介绍
我们知道,在tensorflow读取数据的时候,是先读取再利用GPU进行计算,举个栗子,计算机用了0.2秒读取数据,GPU用0.8秒计算。那么每秒GPU将有0.2秒无事可做。
解决
我们采用两个线程,一个线程读取数据,另一个计算。
代码实现
读取数据线程,一般用3个参数===>数据名,训练轮次,是否打乱数据
tf. train. string_ input_producer()
另一个线程
tf. WholeFileReader () 一个文件就是一个数据
tf.FixedLengthRecordReader()一个文件内包含多个数据
reader = tf. WholeFileReader ()
key, value = reader.read(filename_queue)
最后,需要启动线程,因为读取数据的线程是处于停滞的
tf. train.start_ queue_ runners
下面是 完整代码
。
import os
if not os.path.exists('read'):
os.makedirs('read/')
import tensorflow as tf
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)
# 程序最后会抛出一个OutOfRangeError,这是epoch跑完,队列关闭的标志