cpu負責tensorflow的計算,io負責讀取檔案
由於速度上的差異,通常做法是:主線程進行模型訓練,子執行緒讀取資料,二者通過佇列進行資料傳輸
相當於主線程從佇列讀資料,子程序往佇列放資料
在使用tensorflow進行非同步計算時,佇列是一種強大的機制。
乙個簡單的例子。先建立乙個「先入先出」的佇列(fifoqueue),並將其內部所有元素初始化為零。然後,構建乙個tensorflow圖,它從佇列前端取走乙個元素,加上1之後,放回佇列的後端。慢慢地,佇列的元素的值就會增加。
tensorflow提供了兩個類來幫助多執行緒的實現:tf.coordinator和 tf.queuerunner。coordinator類可以用來同時停止多個工作執行緒並且向那個在等待所有工作執行緒終止的程式報告異常,queuerunner類用來協調多個工作執行緒同時將多個張量推入同乙個佇列中。
在訓練樣本的時候,希望讀入的訓練樣本時有序的
tf.fifoqueue 先進先出佇列,按順序出佇列
tf.randomshufflequeue 隨機出佇列
tf.fifoqueue 順序佇列
fifoqueue(capacity, dtypes, name=『fifo_queue』)
建立乙個以先進先出的順序對元素進行排隊的佇列
capacity:整數。可能儲存在此佇列中的元素數量的上限
dtypes:dtype物件列表。長度dtypes必須等於每個佇列元
素中的張量數,dtype的型別形狀,決定了後面進佇列元素形狀
method
dequeue(name=none)
enqueue(vals, name=none):
enqueue_many(vals, name=none):vals列表或者元組
返回乙個進佇列操作
size(name=none)
同步過程:先執行往佇列放資料,再去取資料訓練
例子:完成乙個出佇列、+1、入佇列操作(同步操作)
import tensorflow as tf
#模擬一下同步先處理資料,然後才能取資料訓練
#tensorflow當中,執行操作有依賴性
#1.首先定義佇列
q=tf.fifoqueue(
3,tf.float32)
#放入一些資料
enq_many=q.enqueue_many([[
0.1,
0.2,
0.3],]
)#2.定義一些處理資料邏輯,取資料的過程 取資料,+1,入佇列
out_q=q.dequeue(
)data=out_q+
1en_q=q.enqueue(data)
with tf.session(
)as sess:
#初始化佇列
sess.run(enq_many)
#處理資料
for i in
range
(100):
sess.run(en_q)
#訓練資料
入佇列需要注意
分析:當資料量很大時,入隊操作從硬碟中讀取資料,放入記憶體中,
主線程需要等待入隊操作完成,才能進行訓練。會話裡可以執行多個
執行緒,實現非同步讀取。
佇列管理器
tf.train.queuerunner(queue, enqueue_ops=none)
建立乙個queuerunner
queue:a queue
enqueue_ops:新增執行緒的佇列操作列表,*2,指定兩個執行緒
create_threads(sess, coord=none,start=false)
建立執行緒來執行給定會話的入隊操作
start:布林值,如果true啟動執行緒;如果為false呼叫者
必須呼叫start()啟動執行緒
coord:執行緒協調器,後面執行緒管理需要用到
return:
您可以使用乙個queue runner,來實現上述結構。 首先建立乙個tensorflow圖表,這個圖表使用佇列來輸入樣本。增加處理樣本並將樣本推入佇列中的操作。增加training操作來移除佇列中的樣本。
通過佇列管理器來實現變數加1,入隊,主線程出佇列的操作(非同步操作)
分析:這時候有乙個問題就是,入隊自顧自的去執行,在需要的出
隊操作完成之後,程式沒法結束。需要乙個實現執行緒間的同步,終
止其他執行緒。
執行緒協調器
tf.train.coordinator()
執行緒協調員,實現乙個簡單的機制來協調一組執行緒的終止
request_stop()
should_stop() 檢查是否要求停止
join(threads=none, stop_grace_period_secs=120)
等待執行緒終止
return:執行緒協調員例項
首先建立乙個coordinator物件,然後建立一些使用coordinator物件的執行緒。這些執行緒通常一直迴圈執行,一直到should_stop()返回true時停止。 任何執行緒都可以決定計算什麼時候應該停止。它只需要呼叫request_stop(),同時其他執行緒的should_stop()將會返回true,然後都停下來。
# 二、模擬非同步,子執行緒存入樣本,主線程讀取樣本
# 1、定義乙個佇列,1000
q2 = tf.fifoqueue(
1000
, tf.float32)
# 2、定義要做的事情,迴圈,+1,放佇列
var2 = tf.variable(
0.0)
# 實現自增op
data2 = tf.assign_add(var2, tf.constant(
1.0)
)en_q2 = q2.enqueue(data2)
# 3、定義佇列管理器op,指定多少個子執行緒,子執行緒該幹什麼事
qr2 = tf.train.queuerunner(q2, enqueue_ops=
[en_q2]*2
)# 初始化變數op
init_op2 = tf.global_variables_initializer(
)with tf.session(
)as sess2:
# 初始化變數
sess2.run(init_op2)
# 開啟執行緒協調器
coord = tf.train.coordinator(
)# 開啟子執行緒
threads = qr2.create_threads(sess2, coord=coord, start=
true
)# 主線程讀取資料,等待訓練
for i in
range
(300):
print
(sess2.run(q2.dequeue())
)# **執行緒
coord.request_stop(
) coord.join(threads)
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 ...
佇列之順序佇列與迴圈佇列
一 佇列的概念 只能在表的一端進行插入操作,只能在表的另一端進行刪除操作,這種資料結構稱為 佇列。把允許插入的一端叫 隊尾 rear 允許刪除的一端叫 對頭 front 二 佇列的分類 佇列本身也是一種線性表,因而和線性表一樣也有順序和鏈式儲存結構兩種儲存方式。採用順序儲存結構實現的佇列稱為順序佇列...