在使用tensorflow進行非同步計算時,佇列是一種強大的機制。
為了感受一下佇列,讓我們來看乙個簡單的例子。我們先建立乙個「先入先出」的佇列(fifoqueue),並將其內部所有元素初始化為零。然後,我們構建乙個tensorflow圖,它從佇列前端取走乙個元素,加上1之後,放回佇列的後端。慢慢地,佇列的元素的值就會增加。
tensorflow提供了兩個類來幫助多執行緒的實現:tf.coordinator和tf.queuerunner。coordinator類可以用來同時停止多個工作執行緒並且向那個在等待所有工作執行緒終止的程式報告異常,queuerunner類用來協調多個工作執行緒同時將多個張量推入同乙個佇列中。
佇列,如fifoqueue和randomshufflequeue,在tensorflow的張量非同步計算時都非常重要。
例如,乙個典型的輸入結構:是使用乙個randomshufflequeue來作為模型訓練的輸入:
同步佇列
importtensorflow as tf
#模擬 同步處理資料後取資料
#define queue
q = tf.fifoqueue(3,tf.float32)
#input data 這裡列表 會被當成乙個張量,所以要在後面加乙個逗號
enq_many = q.enqueue_many([[0.1,0.2,0.3],])
#define take data from queue take data then +1 put this data back
out_q =q.dequeue()
#tf中允許過載
data = out_q+1en_q =q.enqueue(data)
with tf.session() as sess:
#初始化佇列
sess.run(enq_many)
#處理資料
for i in range(100):
#這裡en_q 對data依賴data->out_1->enq_many
sess.run(en_q)
#訓練資料
for i in
range(q.size().eval()):
print(sess.run(q.dequeue()))
queuerunner 會建立一組執行緒, 這些執行緒可以重複的執行enquene操作, 他們使用同乙個coordinator來處理執行緒同步終止。此外,乙個queuerunner會執行乙個closer thread,當coordinator收到異常報告時,這個closer thread會自動關閉佇列。
您可以使用乙個queue runner,來實現上述結構。 首先建立乙個tensorflow圖表,這個圖表使用佇列來輸入樣本。增加處理樣本並將樣本推入佇列中的操作。增加training操作來移除佇列中的樣本。
coordinator類用來幫助多個執行緒協同工作,多個執行緒同步終止。 其主要方法有:
coord =tf.train.coordinator()threads = qr.create_threads(sess,coord = coord,start=true)
coord.request_stop()
coord.join(threads)
首先建立乙個coordinator物件,然後建立一些使用coordinator物件的執行緒。這些執行緒通常一直迴圈執行,一直到should_stop()返回true時停止。 任何執行緒都可以決定計算什麼時候應該停止。它只需要呼叫request_stop(),同時其他執行緒的should_stop()將會返回true,然後都停下來。
非同步佇列
importtensorflow as tf
#模擬非同步 子執行緒存入樣本,主線程讀取樣本
#1 定乙個佇列
q = tf.fifoqueue(1000,tf.float32)
#2 定義子執行緒 +1 進佇列
var = tf.variable(0.0)#
變數op
#assign_add 是自增 這裡直接+=1 是不可以的
data = tf.assign_add(var,tf.constant(1.0))#
加法op
en_q =q.enqueue(data)
#佇列管理器op
qr = tf.train.queuerunner(q,enqueue_ops=[en_q]*2)
with tf.session() as sess:
tf.global_variables_initializer().run()
#開啟執行緒管理器
coord =tf.train.coordinator()
#真正開啟執行緒
threads = qr.create_threads(sess,coord=coord,start=true)
for i in range(300):
(sess.run(q.dequeue()))
#強行停止
coord.request_stop()
coord.join(threads)
Tensorflow使用多執行緒
tensorflow的session物件支援多執行緒,可以在同乙個session中建立多個執行緒,預設是cpu有多少個核,就啟動多少個執行緒。tensorflow提供了倆個類來實現對session中多執行緒的管理 tf.coordinator和tf.queuerunner,這倆個類必須一起使用。co...
tensorflow學習筆記
tensorflow安裝可以直接通過命令列或者原始碼安裝,在此介紹tensorflow8命令列安裝如下 安裝tensorflow sudo pip install upgrade 另外,解除安裝tensorflow命令為 sudo pip uninstall tensorflow tensorflo...
Tensorflow學習筆記
1.如何在虛擬機器中安裝tensor flow 1 首先安裝pip pip install 2 pip install 2.學習tensorflow需要學習 python and linux 3.使用 tensorflow,你必須明白 tensorflow 1 使用圖 graph 來表示計算任務.2...