tfsenflow队列|tf.train.slice_input_producer|tf.train.Coordinator|tf.train.start_queue_runners
#### ''' tf.train.slice_input_producer :定义样本放入文件名队列的方式[迭代次数,是否乱序],但此时文件名队列还没有真正写入数据 slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None,capacity=32, shared_name=None, name=None) tensor_list:如[images,labels] = [['img1','image2','imag3','img4','img5','img6'],[1,2,3,4,5,6]] num_epochs:可选参数,迭代次数 num_epochs=None 无限次遍历tensor列表 num_epochs=N 生成器只能遍历列表N次 shuffle:shuffle=True 乱序样本 shuffle=False需要在批处理时使用tf.train.shuffle_batch函数打乱样本 seed:随机数种子 在shuffle=True 时使用 capacity:设置tensor列表的容量 shared_name:可选参数,如果设置一个‘shared_name’,则在不同的上下文环境(Session)中可以通过这个名字共享生成的tensor name:设置操作名称 ''' import tensorflow as tf ###思路:准备入文件名队列 创建线程 入队线程 images = ['img1','image2','imag3','img4','img5','img6'] labels = [1,2,3,4,5,6] epoch_num = 8 queue = tf.train.slice_input_producer([images,labels],num_epochs=None,shuffle=False) #从文件里抽取tensor,准备放入文件名队列 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) coord = tf.train.Coordinator() ###创建一个线程协调器,用来管理之后再Session中启动的所有线程 ###启动入队线程,由多个或单个线程,按照设定规则把文件读入到文件名队列中,返回线程ID的列表。一般情况下,系统有多少核,就会启动多少个入队线程 ###入队具体使用多少个线程在tf.train.batch中设定 threads = tf.train.start_queue_runners(sess,coord=coord) for i in range(epoch_num): k = sess.run(queue) print("*************") print(i,k,k[0],k[1]) ''' ************* 0 [b'img1', 1] b'img1' 1 ************* 1 [b'image2', 2] b'image2' 2 ************* 2 [b'imag3', 3] b'imag3' 3 ************* 3 [b'img4', 4] b'img4' 4 ************* 4 [b'img5', 5] b'img5' 5 ************* 5 [b'img6', 6] b'img6' 6 ************* 6 [b'img1', 1] b'img1' 1 ************* 7 [b'image2', 2] b'image2' 2 '''
import tensorflow as tf ###思路:准备入文件名队列 创建线程 入队线程 异常处理 images = ['img1','image2','imag3','img4','img5','img6'] labels = [1,2,3,4,5,6] epoch_num = 8 queue = tf.train.slice_input_producer([images,labels],num_epochs=None,shuffle=False) #从文件里抽取tensor,准备放入文件名队列 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) coord = tf.train.Coordinator() ###创建一个线程协调器,用来管理之后再Session中启动的所有线程 ###启动入队线程,由多个或单个线程,按照设定规则把文件读入到文件名队列中,返回线程ID的列表。一般情况下,系统有多少核,就会启动多少个入队线程 ###入队具体使用多少个线程在tf.train.batch中设定 threads = tf.train.start_queue_runners(sess,coord=coord) try: for i in range(epoch_num): if coord.should_stop(): ###查询是否应该终止所有线程,当文件队列(queue)中的所有文件都已经读取出列的时候, # 会抛出一个 OutofRangeError 的异常,这时候就应该停止Sesson中的所有线程了; break k = sess.run(queue) print("*************") print(i,k,k[0],k[1]) except tf.errors.OutOfRangeError: ###如果读取文件到文件队列末尾会抛出此异常 print('完成!!现在终止所有线程') finally: ##协调器coord发出所有线程终止信号,使用coord.join(threads)把线程加入主线程,等待threads结束 coord.request_stop() print('所有线程请求终止') coord.join(threads) ###把开启的线程加入主线程,等待threads结束 print('所有线程终止')