tensorflow初探七之隊(duì)列-Tensorflow技術(shù)解析與實(shí)戰(zhàn)學(xué)習(xí)

隊(duì)列

隊(duì)列(queue)本身也是圖中的一個(gè)節(jié)點(diǎn)衡奥,是一種有狀態(tài)的節(jié)點(diǎn),其他節(jié)點(diǎn)锦庸,如入隊(duì)節(jié)點(diǎn)(enqueue)和出隊(duì)節(jié)點(diǎn)(dequeue)敲霍,可以修改它的內(nèi)容杰标。例如,入隊(duì)節(jié)點(diǎn)可以把新元素插到隊(duì)列末尾猪半,出隊(duì)節(jié)點(diǎn)可以把隊(duì)列前面的元素刪除兔朦。TensorFlow 中主要有兩種隊(duì)列偷线,即 FIFOQueue 和 RandomShuffleQueue。

  • FIFOQueue 創(chuàng)建一個(gè)先入先出隊(duì)列沽甥。例如声邦,我們?cè)谟?xùn)練一些語(yǔ)音、文字樣本時(shí)摆舟,使用循環(huán)神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)亥曹,希望讀入的訓(xùn)練樣本是有序的,就要用 FIFOQueue恨诱。
  • RandomShuffleQueue 創(chuàng)建一個(gè)隨機(jī)隊(duì)列媳瞪,在出隊(duì)列時(shí),是以隨機(jī)的順序產(chǎn)生元素的照宝。例如蛇受,我們?cè)谟?xùn)練一些圖像樣本時(shí),使用 CNN 的網(wǎng)絡(luò)結(jié)構(gòu)厕鹃,希望可以無(wú)序地讀入訓(xùn)練樣本兢仰,就要用RandomShuffleQueue,每次隨機(jī)產(chǎn)生一個(gè)訓(xùn)練樣本剂碴。RandomShuffleQueue 在 TensorFlow 使用異步計(jì)算時(shí)非常重要把将。因?yàn)?TensorFlow 的會(huì)話是支持多線程的,我們可以在主線程里執(zhí)行訓(xùn)練操作忆矛,使用 RandomShuffleQueue 作為訓(xùn)練輸入察蹲,開多個(gè)線程來(lái)準(zhǔn)備訓(xùn)練樣本,將樣本壓入隊(duì)列后催训,主線程會(huì)從隊(duì)列中每次取出 mini-batch 的樣本進(jìn)行訓(xùn)練洽议。
#  FIFOQueue 先進(jìn)先出
q=tf.FIFOQueue(3,"float")
init=q.enqueue_many(([0.1,0.2,0.3],))

x=q.dequeue()
y=x+1
q_inc=q.enqueue([y])

with tf.Session() as sess:
    sess.run(init)
    for i in range(2):
        sess.run(q_inc)
    quelen=sess.run(q.size())
    for i in range(quelen):
        print(sess.run(q.dequeue()))

#RandomShuffleQueue
q=tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes="float")
with tf.Session() as sess:
    for i in range(0,10):
        sess.run(q.enqueue(i))
    for i in range(0,8):
        print(sess.run(q.dequeue()))

#3.0
#4.0
#8.0
#2.0
#0.0
#1.0
#7.0
#9.0

注意到RandomShuffleQueue的參數(shù)有容量和最小長(zhǎng)度。當(dāng)隊(duì)列長(zhǎng)度等于最小值瞳腌,執(zhí)行出隊(duì)操作以及隊(duì)列長(zhǎng)度等于最大值绞铃,執(zhí)行入隊(duì)操作時(shí)镜雨,會(huì)有阻斷情況發(fā)生嫂侍。只有當(dāng)隊(duì)列滿足要求后,才能繼續(xù)執(zhí)行荚坞√舫瑁可以通過設(shè)置繪畫在運(yùn)行時(shí)的等待時(shí)間來(lái)解除阻斷。

q=tf.RandomShuffleQueue(capacity=10,min_after_dequeue=2,dtypes="float")
with tf.Session() as sess:
    for i in range(0,10):
        sess.run(q.enqueue(i))
    for i in range(0,10):
        run_options = tf.RunOptions(timeout_in_ms = 10000) # 等待 10 秒
        try:
            print(sess.run(q.dequeue(), options=run_options))
        except tf.errors.DeadlineExceededError:
            print('out of range')
            break;

如果入隊(duì)操作是在主線程中進(jìn)行颓影,那么當(dāng)入隊(duì)產(chǎn)生阻斷時(shí)各淀,會(huì)影響后續(xù)的讀數(shù)據(jù)以及訓(xùn)練操作。會(huì)話中可以運(yùn)行多個(gè)線程诡挂,我們使用線程管理器 QueueRunner 創(chuàng)建一系列的新線程進(jìn)行入隊(duì)操作碎浇,讓主線程繼續(xù)使用數(shù)據(jù)临谱,即訓(xùn)練網(wǎng)絡(luò)和讀取數(shù)據(jù)是異步的,主線程在訓(xùn)練網(wǎng)絡(luò)奴璃,另一個(gè)線程在將數(shù)據(jù)從硬盤讀入內(nèi)存悉默。

隊(duì)列管理器

q=tf.FIFOQueue(1000,'float')
counter=tf.Variable(0.0)
incre_op=tf.assign_add(counter,tf.constant(1.0))
enqueue_op=q.enqueue(counter)

qr=tf.train.QueueRunner(q,enqueue_ops=[incre_op,enqueue_op]*1)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    #啟動(dòng)入隊(duì)操作
    enqueue_threads=qr.create_threads(sess,start=True)
    #主線程是取數(shù)據(jù)操作
    for i in range(10):
        print(sess.run(q.dequeue()))

#3.0
#11.0
#69.0
#73.0
#90.0
#97.0
#107.0
#226.0
#266.0
#274.0

輸出的隊(duì)列也不是我們期待的自然數(shù)列,并且線程被阻斷苟穆。這是因?yàn)榧?1 操作和入隊(duì)操作不同步抄课,可能加 1 操作執(zhí)行了很多次之后,才會(huì)進(jìn)行一次入隊(duì)操作雳旅。

上述代碼最后報(bào)異常跟磨,然后會(huì)話自動(dòng)關(guān)閉。入隊(duì)線程自顧自地執(zhí)行攒盈,在需要的出隊(duì)操作完成之后抵拘,程序沒法結(jié)束,一直到超過隊(duì)列的容量之后型豁,會(huì)導(dǎo)致cancalledError仑濒。因此需要協(xié)調(diào)器來(lái)管理線程。

協(xié)調(diào)器coordinator
可以解決上面的入隊(duì)線程不受控制的情況偷遗。

q=tf.FIFOQueue(1000,'float')
counter=tf.Variable(0.0)
incre_op=tf.assign_add(counter,tf.constant(1.0))
enqueue_op=q.enqueue(counter)

qr=tf.train.QueueRunner(q,enqueue_ops=[incre_op,enqueue_op]*1)
sess=tf.Session()
sess.run(tf.global_variables_initializer())
coord=tf.train.Coordinator() #協(xié)調(diào)器墩瞳,協(xié)調(diào)線程間的關(guān)系可以視為一種信號(hào)量,用來(lái)做同步
enqueue_threads = qr.create_threads(sess, coord = coord,start=True)

for i in range(0,10):
    print(sess.run(q.dequeue()))
    
coord.request_stop()# 通知其他線程關(guān)閉
coord.join(enqueue_threads)# join 操作等待其他線程結(jié)束氏豌,其他所有線程關(guān)閉之后喉酌,這一函數(shù)才能返回

#3.0
#20.0
#304.0
#1118.0
#1164.0
#1242.0
#1311.0
#1320.0
#1381.0
#1387.0

這個(gè)很奇怪,并沒有按照書上說的關(guān)閉線程之后再執(zhí)行出隊(duì)操作泵喘,就會(huì)拋出 tf.errors.OutOfRange 錯(cuò)誤泪电。而且

print(sess.run(q.size()))
#每次都不一樣,這次是170
for i in range(0,10):
    print(sess.run(q.dequeue()))
#在此實(shí)行上面的代碼纪铺,得到10個(gè)1387
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末相速,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鲜锚,更是在濱河造成了極大的恐慌突诬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芜繁,死亡現(xiàn)場(chǎng)離奇詭異旺隙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骏令,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蔬捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人榔袋,你說我怎么就攤上這事周拐≌±” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵妥粟,是天一觀的道長(zhǎng)高蜂。 經(jīng)常有香客問我,道長(zhǎng)罕容,這世上最難降的妖魔是什么备恤? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮锦秒,結(jié)果婚禮上露泊,老公的妹妹穿的比我還像新娘。我一直安慰自己旅择,他們只是感情好惭笑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著生真,像睡著了一般沉噩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柱蟀,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天川蒙,我揣著相機(jī)與錄音,去河邊找鬼长已。 笑死畜眨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的术瓮。 我是一名探鬼主播康聂,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胞四!你這毒婦竟也來(lái)了恬汁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辜伟,失蹤者是張志新(化名)和其女友劉穎氓侧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游昼,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甘苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烘豌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡看彼,死狀恐怖廊佩,靈堂內(nèi)的尸體忽然破棺而出囚聚,到底是詐尸還是另有隱情,我是刑警寧澤标锄,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布顽铸,位于F島的核電站,受9級(jí)特大地震影響料皇,放射性物質(zhì)發(fā)生泄漏谓松。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一践剂、第九天 我趴在偏房一處隱蔽的房頂上張望鬼譬。 院中可真熱鬧,春花似錦逊脯、人聲如沸优质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巩螃。三九已至,卻和暖如春匕争,著一層夾襖步出監(jiān)牢的瞬間避乏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工甘桑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淑际,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓扇住,卻偏偏與公主長(zhǎng)得像春缕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艘蹋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容