1. 程式人生 > >tensorflow下的佇列與執行緒(1)

tensorflow下的佇列與執行緒(1)

實驗環境:windows 7,anaconda 3(Python 3.5),tensorflow(gpu/cpu)
函式:
tf.FIFOQueue(capacity,dtypes,shapes),tf.RandomShuffleQueue(capacity,min_after_dequeue,dtypes,shapes)
tf.FIFOQueue.enqueue(vals),tf.FIFOQueue.enqueue_many(vals),tf.FIFOQueue.dequeue()
tf.train.Coordinator(),tf.train.QueueRunner(queue,enqueue_ops),
tf.train.QueueRunner.create_threads(sess,coord,start)
定義多個執行緒來填充樣本到佇列,再從佇列中獲取一批資料的基本思路如下:
這裡寫圖片描述


實驗程式碼:

"""顯式建立QueueRunner"""
import tensorflow as tf
import numpy as np
#建立session
sess = tf.InteractiveSession()
#建立資料
data = [[i,i+1,i+2,i+3] for i in range(1,11)]#10行4列資料
label = np.random.randint(0,2,10)
#建立佇列

#方法1:建立先入先出佇列
#capacity表示佇列容量,dtypes表示入隊的資料型別(兩種分別是data,label的資料型別),
#shapes表示佇列每一項有幾列([4],[]表示讀入的data和label的每一項分別4列和1列)
q = tf.FIFOQueue(capacity=5,dtypes=[tf.float32,tf.int32],shapes=[[4],[]]) #方法2:建立隨機佇列 #capacity,dtypes,shapes同上,min_after_dequeue的意思是佇列至少要留下的項數 # q = tf.RandomShuffleQueue(capacity=5,min_after_dequeue=1,dtypes=[tf.float32,tf.int32],shapes=[[4],[]]) enqueue_op = q.enqueue_many([data,label])#定義入隊操作 qr = tf.train.QueueRunner(q,enqueue_ops=[enqueue_op]*2
)#建立QueueRunner.[enqueue_op]*2的意思是定義兩個入隊執行緒,並賦值給enqueue_ops coord = tf.train.Coordinator()#建立Coordinator,用來停止兩個執行緒 enqueue_threads = qr.create_threads(sess=sess,coord=coord,start=True)#使用QueueRunner建立兩個執行緒,用start=True使執行緒全部執行 data_sample,label_sample = q.dequeue()#定義彈出佇列的每一項 step = 0 print(coord.should_stop()) while not coord.should_stop():#判斷是否結束所有執行緒 if step >= 20: coord.request_stop()#請求所有執行緒結束 data_batch,label_batch = sess.run([data_sample,label_sample]) print('data_batch_%d:%s,label_batch_%d:%d' % (step,data_batch,step,label_batch)) step = step + 1 coord.join(enqueue_threads)#阻塞主執行緒,直到兩個入隊執行緒結束 print(coord.should_stop())

實驗結果:
這裡寫圖片描述