tensorflow将读取数据分为了两个步骤,先读入文件名队列,再读入内存队列进行运算。为了减少GPU的等待时间,提高计算速度,tensorflow使用两个线程来分别处理这两个步骤。tf有三个函数string_input_producer, slice_input_producer, input_producer用于建立文件名队列。
函数参数如下所示,除了tensor list是必须外,其余都可以省略。input_producer输入为一个tensor,每行是一个数据,slice_input_producer输入为一个tensor列表,string_input_producer输入为一个string类型的tensor列表。
tf.train.input_producer(
input_tensor,
element_shape=None,
num_epochs=None, #文件名队列中数据重复n次,保证每个文件都会被访问n次
shuffle=True,
seed=None,
capacity=32,
shared_name=None,
summary_name=None,
name=None,
cancel_op=None
)
tf.train.string_input_producer(
string_tensor,
num_epochs=None,
shuffle=True,
seed=None,
capacity=32,
shared_name=None,
name=None,
cancel_op=None
)
tf.train.slice_input_producer(
tensor_list,
num_epochs=None,
shuffle=True,
seed=None,
capacity=32,
shared_name=None,
name=None
)
文件名队列并不会直接读入,需要用tf.train.start_queue_runners()启动
threads = tf.train.start_queue_runners(sess,coord)
官方建议:
THIS FUNCTION IS DEPRECATED. It will be removed in a future version. Instructions for updating: Queue-based input pipelines have been replaced by tf.data. Use tf.data.Dataset.from_tensor_slices(input_tensor).shuffle(tf.shape(input_tensor, out_type=tf.int64)[0]).repeat(num_epochs). If shuffle=False, omit the .shuffle(...)
现在一般使用更简洁的data api来读取数据。