介绍
我们知道,在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跑完,队列关闭的标志