TensorFlowIO操作(一)----线程和队列
線程和隊列
在使用TensorFlow進行異步計算時,隊列是一種強大的機制。
為了感受一下隊列,讓我們來看一個簡單的例子。我們先創建一個“先入先出”的隊列(FIFOQueue),并將其內部所有元素初始化為零。然后,我們構建一個TensorFlow圖,它從隊列前端取走一個元素,加上1之后,放回隊列的后端。慢慢地,隊列的元素的值就會增加。
TensorFlow提供了兩個類來幫助多線程的實現:tf.Coordinator和 tf.QueueRunner。Coordinator類可以用來同時停止多個工作線程并且向那個在等待所有工作線程終止的程序報告異常,QueueRunner類用來協調多個工作線程同時將多個張量推入同一個隊列中。
隊列概述
隊列,如FIFOQueue和RandomShuffleQueue,在TensorFlow的張量異步計算時都非常重要。
例如,一個典型的輸入結構:是使用一個RandomShuffleQueue來作為模型訓練的輸入:
- 多個線程準備訓練樣本,并且把這些樣本推入隊列。
- 一個訓練線程執行一個訓練操作
同步執行隊列
# 創建一個隊列 Q = tf.FIFOQueue(3, dtypes=tf.float32)# 數據進隊列 init = Q.enqueue_many(([0.1, 0.2, 0.3],))# 定義操作,op,出隊列,+1,進隊列,注意返回的都是op out_q = Q.dequeue() data = out_q + 1 en_q = Q.enqueue(data)with tf.Session() as sess:# 初始化隊列,是數據進入 sess.run(init)# 執行兩次入隊加1for i in range(2):sess.run(en_q)# 循環取隊列for i in range(3):print(sess.run(Q.dequeue()))?
tf.QueueRunner
QueueRunner類會創建一組線程, 這些線程可以重復的執行Enquene操作, 他們使用同一個Coordinator來處理線程同步終止。此外,一個QueueRunner會運行一個closer thread,當Coordinator收到異常報告時,這個closer thread會自動關閉隊列。
您可以使用一個queue runner,來實現上述結構。 首先建立一個TensorFlow圖表,這個圖表使用隊列來輸入樣本。增加處理樣本并將樣本推入隊列中的操作。增加training操作來移除隊列中的樣本。
tf.Coordinator
Coordinator類用來幫助多個線程協同工作,多個線程同步終止。 其主要方法有:
- should_stop():如果線程應該停止則返回True。
- request_stop(): 請求該線程停止。
- join():等待被指定的線程終止。
首先創建一個Coordinator對象,然后建立一些使用Coordinator對象的線程。這些線程通常一直循環運行,一直到should_stop()返回True時停止。 任何線程都可以決定計算什么時候應該停止。它只需要調用request_stop(),同時其他線程的should_stop()將會返回True,然后都停下來。
異步執行隊列:
#主線程,不斷的去取數據,開啟其它線程來進行增加計數,入隊 #主線程結束了,隊列線程沒有結束,就會拋出異常 #主線程沒有結束,需要將隊列線程關閉,防止主線程等待 Q = tf.FIFOQueue(1000,dtypes=tf.float32)# 定義操作 var = tf.Variable(0.0) increment_op = tf.assign_add(var,tf.constant(1.0)) en_op = Q.enqueue(increment_op)# 創建一個隊列管理器,指定線程數,執行隊列的操作 qr = tf.train.QueueRunner(Q,enqueue_ops=[increment_op,en_op]*3)with tf.Session() as sess:tf.global_variables_initializer().run()# 生成一個線程協調器coord = tf.train.Coordinator()# 啟動線程執行操作threads_list = qr.create_threads(sess,coord=coord,start=True)print(len(threads_list),"----------")# 主線程去取數據for i in range(20):print(sess.run(Q.dequeue()))# 請求其它線程終止 coord.request_stop()# 關閉線程coord.join(threads_list)?
轉載于:https://www.cnblogs.com/fwl8888/p/9794188.html
總結
以上是生活随笔為你收集整理的TensorFlowIO操作(一)----线程和队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL用source命令导入不记入b
- 下一篇: windows php exec()不生