最近在學tensorflow,在此把學到的東西記錄一下。
在學習別人**時,遇到多執行緒訓練的問題,**擷取部分如下:
image, label = readmyowndata.read_and_decode("dog_and_cat_train.tfrecords")
sess = tf.interactivesession()
tf.global_variables_initializer().run()
coord=tf.train.coordinator()
threads= tf.train.start_queue_runners(coord=coord)
example = np.zeros((batch_size,128,128,3))
l = np.zeros((batch_size,1))
try:
for i in range(50):
for epoch in range(batch_size):
example[epoch], l[epoch] = sess.run([image,label])#在會話中取出image和label
train_step.run(feed_dict=)
print(accuracy.eval(feed_dict=)) #eval函式類似於重新run一遍,驗證,同時修正
except tf.errors.outofrangeerror:
print('done!')
finally:
coord.request_stop()
coord.join(threads)
乙個典型的輸入結構:是使用乙個randomshufflequeue
來作為模型訓練的輸入:
tensorflow的session
物件是可以支援多執行緒的,因此多個執行緒可以很方便地使用同乙個會話(session)並且並行地執行操作。然而,在python程式實現這樣的並行運算卻並不容易。所有執行緒都必須能被同步終止,異常必須能被正確捕獲並報告,回話終止的時候, 佇列必須能被正確地關閉。
所幸tensorflow提供了兩個類來幫助多執行緒的實現:tf.coordinator
和 tf.queuerunner
。從設計上這兩個類必須被一起使用。coordinator
類可以用來同時停止多個工作執行緒並且向那個在等待所有工作執行緒終止的程式報告異常。queuerunner
類用來協調多個工作執行緒同時將多個張量推入同乙個佇列中。
coordinator類用來幫助多個執行緒協同工作,多個執行緒同步終止。 其主要方法有:
首先建立乙個coordinator
物件,然後建立一些使用coordinator
物件的執行緒。這些執行緒通常一直迴圈執行,一直到should_stop()
返回true時停止。 任何執行緒都可以決定計算什麼時候應該停止。它只需要呼叫request_stop()
,同時其他執行緒的should_stop()
將會返回true
,然後都停下來。coordinator可以管理執行緒去做不同的事情,還支援捕捉和報告異常。
queuerunner
類會建立一組執行緒, 這些執行緒可以重複的執行enquene操作, 他們使用同乙個coordinator來處理執行緒同步終止。此外,乙個queuerunner會執行乙個closer thread,當coordinator收到異常報告時,這個closer thread會自動關閉佇列。
您可以使用乙個queue runner,來實現上述結構。 首先建立乙個tensorflow圖表,這個圖表使用佇列來輸入樣本。增加處理樣本並將樣本推入佇列中的操作。增加training操作來移除佇列中的樣本。
在python的訓練程式中,建立乙個queuerunner
來執行幾個執行緒, 這幾個執行緒處理樣本,並且將樣本推入佇列。建立乙個coordinator
,讓queue runner使用coordinator
來啟動這些執行緒,建立乙個訓練的迴圈, 並且使用coordinator
來控制queuerunner
的執行緒們的終止。
通過queue runners啟動的執行緒不僅僅只處理推送樣本到佇列。他們還捕捉和處理由佇列產生的異常,包括outofrangeerror
異常,這個異常是用於報告佇列被關閉。 使用coordinator
的訓練程式在主迴圈中必須同時捕捉和報告異常。 下面是對上面訓練迴圈的改進版本。
Tensorflow使用多執行緒
tensorflow的session物件支援多執行緒,可以在同乙個session中建立多個執行緒,預設是cpu有多少個核,就啟動多少個執行緒。tensorflow提供了倆個類來實現對session中多執行緒的管理 tf.coordinator和tf.queuerunner,這倆個類必須一起使用。co...
tensorflow 佇列與多執行緒
1 tensorflow資料輸入簡介 為了避免影象預處理成為神經網路模型訓練效率的瓶頸,tensorflow提供了多執行緒處理輸入資料的框架。流程如下 1 指定原始資料的檔案列表 2 建立檔案列表佇列 3 從檔案中讀取資料 4 資料預處理 5 整理成batch作為神經網路輸入 tensorflow中...
TensorFlow佇列與多執行緒
1 tf.coordinatorimport numpy as np import threading import time import tensorflow as tf 執行緒中執行的程式,這個程式每隔1秒判斷是否需要停止並列印自己的id def myloop coord,worker id ...