tensorflow提供了三种读取数据的机制,分别是1.constant, 2.feed_dict ,3. file reader。
对于数据读取一般会有这两个问题:1.内存占用 2.数据读取时间。对于较大的数据集,由于内存限制,feed方式直接把全部数据加载到内存中是不可能的,(当然,可以把数据预先写到hdf5/tfrecord的二进制文件中,用yield制作一个batch generator,每次生成1个batch的数据), 但本文介绍的是第三种方法,他把读取数据和计算放在了不同的线程中,并行运行,节省了时间,对gpu利用率就高了。
tensorflow使用文件名队列和样本队列来管理文件,文件名队列可用tf.train.string_input_producer
生成,传入文件名list,同时可以指定num_epoch和shuffle,它会将num_epoch个filenames list加入队列,tensorflow使用这个队列来实现epoch,当队列中的文件都被读完时,会报出异常终止线程。
之后需要定义file reader来读取队列中的文件,常用的有tf.TextLineReader(csv文件), tf.FixedLengthRecordReader(对于像图片这种固定长度的数据), tf.TFRecordReader(tfrecord文件)。reader之后一般还会有相应的decode来解析数据
reader读取的数据会放到样本队列中,使用tf.train.batch的话会自动生成一个样本队列。(如果不使用batch, 我觉得数据直接读到内存中,没有产生样本队列。) tf.train.batch(
其中,capcity是样本队列的容量,num_thread是reader的读取线程,如果超过1,会进行单reader多线程读取。当进行多线程读取时,队列会将数据均匀的分给不同的线程,最大程度的提高速度。由于是并行的所以数据会被打乱,如果想要更shuffle的效果,可以使用shuffle_batch,每次出队时数据会被shuffle一次,但是这个函数要注意设置capcity,已提供足够的空间执行shuffle操作。
tensors,
batch_size,
num_threads=1,
capacity=32
)
。
下面介绍一下多线程的东西:
1.QueueRunner
一个QueueRunner负责一个队列,并产生操作入队/出队的线程,这个对象在创建上述队列时会内部生成,所以在会话中要调用tf.train.start_queue_runners(sess, coord)
来运行queueRunner。
2.Coordinator
Coordinator时线程协调器,当出现线程运行异常和关闭线程时都由协调器负责操作。
下面是创建会话的基本模板。
# Create the graph, etc. init_op = [tf.initialize_all_variables(), tf.initialize_local_variables()] # Create a session for running operations in the Graph. sess = tf.Session() # Initialize the variables (like the epoch counter). sess.run(init_op) # Start input enqueue threads. coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) try: while not coord.should_stop(): # Run training steps or whatever sess.run(train_op) except tf.errors.OutOfRangeError: print 'Done training -- epoch limit reached' finally: # When done, ask the threads to stop. coord.request_stop() # Wait for threads to finish. coord.join(threads) sess.close()
Note:
使用tf.train.batch/shuffle_batch时,需要image的尺寸是相同的所以对于动态尺寸的图片,要进行tf.image.resize_images(image,[heigh, width])
引用:
http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/reading_data.html
https://zhuanlan.zhihu.com/p/27238630
http://honggang.io/2016/08/19/tensorflow-data-reading/
https://blog.csdn.net/s_sunnyy/article/details/72924317