为了实现TensorFlow的数据并行读取,我们常常为将一个tensor list传入batch_join函数,该函数会为list中的每个元素开一个新线程进行数据读取。构建tensor list的方法有很多:新开很多个reader,开一个reader然后新开很多个decoder,甚至新开很多个reader并新开很多个decoder。
它们的并行效果是不同的。
最基本的数据管道读取
TensorFlow中我们也许需要并行地读取数据,这个时候就需要用到tf的reader机制了。它的大概流程如下:
- 我们先有一个文件名列表
- 通过string_input_producer函数生成一个文件名队列
- 创建一个reader
- key,value = reader.read读取一行数据
- tensor = decode(value) 解析数据
- tf.train.batch(tensor) 构建batch
如上我们就可以构建起一个管道,将batch源源不断地输入到model graph中:
import tensorflow as tf
filenames = ['./data/A.csv', './data/B.csv', './data/C.csv', './data/D.csv']
filename_queue = tf.train.string_input_producer(filenames, shuffle=False)
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
example = tf.decode_csv(value, record_defaults=[[str(_)], ['null']])
batch = tf.train.batch(example, batch_size=10)
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(10):
v1, v2 = sess.run(batch)
v = []
for j in range(10):
v.append(v1[j] + '_' + v2[j])
print v
coord.request_stop()
coord.join(threads)
数据的并行读取——batch_join
如果我们想并行,一种高效的方式是构建tensor_list,然后使用batch_join
函数:
batch = tf.train.batch_join(example_list, batch_size=10)
expamle_list
是一个list,list的每一个元素都形如上一章节中的example
,batch_join
会为每一个元素创建一个线程,并行地完成batch的读取。
博主的疑惑在这时产生,你如果查询网上的代码,会发现有很多种expamle_list
的构建方式:
- 创建多个reader
- 创建多个decoder
- 创建多个reader然后每个reader创建多个decoder
它们是等效的吗?
多种expamle_list
的构建方式:
if mode == 0: # 多个decoder
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)</