tensorflow數(shù)據(jù)讀取

在學(xué)習(xí)tensorflow的過程中吧雹,有很多小伙伴反映讀取數(shù)據(jù)這一塊很難理解颊糜。確實(shí)這一塊官方的教程比較簡(jiǎn)略,網(wǎng)上也找不到什么合適的學(xué)習(xí)材料。今天這篇文章就以圖片的形式迟郎,用最簡(jiǎn)單的語言,為大家詳細(xì)解釋一下tensorflow的數(shù)據(jù)讀取機(jī)制审编,文章的最后還會(huì)給出實(shí)戰(zhàn)代碼以供參考剪决。

一、tensorflow讀取機(jī)制圖解

首先需要思考的一個(gè)問題是蔗候,什么是數(shù)據(jù)讀扰省?以圖像數(shù)據(jù)為例锈遥,讀取數(shù)據(jù)的過程可以用下圖來表示:

假設(shè)我們的硬盤中有一個(gè)圖片數(shù)據(jù)集0001.jpg纫事,0002.jpg,0003.jpg……我們只需要把它們讀取到內(nèi)存中所灸,然后提供給GPU或是CPU進(jìn)行計(jì)算就可以了丽惶。這聽起來很容易,但事實(shí)遠(yuǎn)沒有那么簡(jiǎn)單爬立。事實(shí)上钾唬,我們必須要把數(shù)據(jù)先讀入后才能進(jìn)行計(jì)算,假設(shè)讀入用時(shí)0.1s侠驯,計(jì)算用時(shí)0.9s抡秆,那么就意味著每過1s,GPU都會(huì)有0.1s無事可做吟策,這就大大降低了運(yùn)算的效率儒士。

如何解決這個(gè)問題?方法就是將讀入數(shù)據(jù)和計(jì)算分別放在兩個(gè)線程中踊挠,將數(shù)據(jù)讀入內(nèi)存的一個(gè)隊(duì)列乍桂,如下圖所示:

讀取線程源源不斷地將文件系統(tǒng)中的圖片讀入到一個(gè)內(nèi)存的隊(duì)列中冲杀,而負(fù)責(zé)計(jì)算的是另一個(gè)線程,計(jì)算需要數(shù)據(jù)時(shí)睹酌,直接從內(nèi)存隊(duì)列中取就可以了权谁。這樣就可以解決GPU因?yàn)镮O而空閑的問題!

而在tensorflow中憋沿,為了方便管理旺芽,在內(nèi)存隊(duì)列前又添加了一層所謂的“文件名隊(duì)列”

為什么要添加這一層文件名隊(duì)列辐啄?我們首先得了解機(jī)器學(xué)習(xí)中的一個(gè)概念:epoch采章。對(duì)于一個(gè)數(shù)據(jù)集來講,運(yùn)行一個(gè)epoch就是將這個(gè)數(shù)據(jù)集中的圖片全部計(jì)算一遍壶辜。如一個(gè)數(shù)據(jù)集中有三張圖片A.jpg悯舟、B.jpg、C.jpg砸民,那么跑一個(gè)epoch就是指對(duì)A抵怎、B、C三張圖片都計(jì)算了一遍岭参。兩個(gè)epoch就是指先對(duì)A反惕、B、C各計(jì)算一遍演侯,然后再全部計(jì)算一遍姿染,也就是說每張圖片都計(jì)算了兩遍。

tensorflow使用文件名隊(duì)列+內(nèi)存隊(duì)列雙隊(duì)列的形式讀入文件秒际,可以很好地管理epoch悬赏。下面我們用圖片的形式來說明這個(gè)機(jī)制的運(yùn)行方式。如下圖程癌,還是以數(shù)據(jù)集A.jpg, B.jpg, C.jpg為例舷嗡,假定我們要跑一個(gè)epoch,那么我們就在文件名隊(duì)列中把A嵌莉、B进萄、C各放入一次,并在之后標(biāo)注隊(duì)列結(jié)束锐峭。

程序運(yùn)行后中鼠,內(nèi)存隊(duì)列首先讀入A(此時(shí)A從文件名隊(duì)列中出隊(duì)):

再依次讀入B和C:

此時(shí),如果再嘗試讀入沿癞,系統(tǒng)由于檢測(cè)到了“結(jié)束”援雇,就會(huì)自動(dòng)拋出一個(gè)異常(OutOfRange)。外部捕捉到這個(gè)異常后就可以結(jié)束程序了椎扬。這就是tensorflow中讀取數(shù)據(jù)的基本機(jī)制惫搏。如果我們要跑2個(gè)epoch而不是1個(gè)epoch具温,那只要在文件名隊(duì)列中將A、B筐赔、C依次放入兩次再標(biāo)記結(jié)束就可以了铣猩。

二、tensorflow讀取數(shù)據(jù)機(jī)制的對(duì)應(yīng)函數(shù)

如何在tensorflow中創(chuàng)建上述的兩個(gè)隊(duì)列呢茴丰?

對(duì)于文件名隊(duì)列达皿,我們使用tf.train.string_input_producer函數(shù)。這個(gè)函數(shù)需要傳入一個(gè)文件名list贿肩,系統(tǒng)會(huì)自動(dòng)將它轉(zhuǎn)為一個(gè)文件名隊(duì)列峦椰。

此外tf.train.string_input_producer還有兩個(gè)重要的參數(shù),一個(gè)是num_epochs汰规,它就是我們上文中提到的epoch數(shù)汤功。另外一個(gè)就是shuffle,shuffle是指在一個(gè)epoch內(nèi)文件的順序是否被打亂控轿。若設(shè)置shuffle=False冤竹,如下圖,每個(gè)epoch內(nèi)茬射,數(shù)據(jù)還是按照A、B冒签、C的順序進(jìn)入文件名隊(duì)列在抛,這個(gè)順序不會(huì)改變:

如果設(shè)置shuffle=True,那么在一個(gè)epoch內(nèi)萧恕,數(shù)據(jù)的前后順序就會(huì)被打亂刚梭,如下圖所示:

在tensorflow中,內(nèi)存隊(duì)列不需要我們自己建立票唆,我們只需要使用reader對(duì)象從文件名隊(duì)列中讀取數(shù)據(jù)就可以了朴读,具體實(shí)現(xiàn)可以參考下面的實(shí)戰(zhàn)代碼。

除了tf.train.string_input_producer外走趋,我們還要額外介紹一個(gè)函數(shù):tf.train.start_queue_runners衅金。初學(xué)者會(huì)經(jīng)常在代碼中看到這個(gè)函數(shù),但往往很難理解它的用處簿煌,在這里氮唯,有了上面的鋪墊后,我們就可以解釋這個(gè)函數(shù)的作用了姨伟。

在我們使用tf.train.string_input_producer創(chuàng)建文件名隊(duì)列后惩琉,整個(gè)系統(tǒng)其實(shí)還是處于“停滯狀態(tài)”的,也就是說夺荒,我們文件名并沒有真正被加入到隊(duì)列中(如下圖所示)瞒渠。此時(shí)如果我們開始計(jì)算良蒸,因?yàn)閮?nèi)存隊(duì)列中什么也沒有,計(jì)算單元就會(huì)一直等待伍玖,導(dǎo)致整個(gè)系統(tǒng)被阻塞诚啃。

而使用tf.train.start_queue_runners之后,才會(huì)啟動(dòng)填充隊(duì)列的線程私沮,這時(shí)系統(tǒng)就不再“停滯”始赎。此后計(jì)算單元就可以拿到數(shù)據(jù)并進(jìn)行計(jì)算,整個(gè)程序也就跑起來了仔燕,這就是函數(shù)tf.train.start_queue_runners的用處造垛。

三、實(shí)戰(zhàn)代碼

我們用一個(gè)具體的例子感受tensorflow中的數(shù)據(jù)讀取晰搀。如圖五辽,假設(shè)我們?cè)诋?dāng)前文件夾中已經(jīng)有A.jpg、B.jpg外恕、C.jpg三張圖片杆逗,我們希望讀取這三張圖片5個(gè)epoch并且把讀取的結(jié)果重新存到read文件夾中。

對(duì)應(yīng)的代碼如下:

# 導(dǎo)入tensorflowimporttensorflowastf# 新建一個(gè)Sessionwithtf.Session()assess:# 我們要讀三幅圖片A.jpg, B.jpg, C.jpgfilename=['A.jpg','B.jpg','C.jpg']# string_input_producer會(huì)產(chǎn)生一個(gè)文件名隊(duì)列filename_queue=tf.train.string_input_producer(filename,shuffle=False,num_epochs=5)# reader從文件名隊(duì)列中讀數(shù)據(jù)鳞疲。對(duì)應(yīng)的方法是reader.readreader=tf.WholeFileReader()key,value=reader.read(filename_queue)# tf.train.string_input_producer定義了一個(gè)epoch變量罪郊,要對(duì)它進(jìn)行初始化tf.local_variables_initializer().run()# 使用start_queue_runners之后,才會(huì)開始填充隊(duì)列threads=tf.train.start_queue_runners(sess=sess)i=0whileTrue:i+=1# 獲取圖片數(shù)據(jù)并保存image_data=sess.run(value)withopen('read/test_%d.jpg'%i,'wb')asf:f.write(image_data)

我們這里使用filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)建立了一個(gè)會(huì)跑5個(gè)epoch的文件名隊(duì)列尚洽。并使用reader讀取悔橄,reader每次讀取一張圖片并保存。

運(yùn)行代碼后腺毫,我們得到就可以看到read文件夾中的圖片癣疟,正好是按順序的5個(gè)epoch:

如果我們?cè)O(shè)置filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=5)中的shuffle=True,那么在每個(gè)epoch內(nèi)圖像就會(huì)被打亂潮酒,如圖所示:

我們這里只是用三張圖片舉例睛挚,實(shí)際應(yīng)用中一個(gè)數(shù)據(jù)集肯定不止3張圖片,不過涉及到的原理都是共通的急黎。

四扎狱、總結(jié)

這篇文章主要用圖解的方式詳細(xì)介紹了tensorflow讀取數(shù)據(jù)的機(jī)制,最后還給出了對(duì)應(yīng)的實(shí)戰(zhàn)代碼叁熔,希望能夠給大家學(xué)習(xí)tensorflow帶來一些實(shí)質(zhì)性的幫助委乌。如果各位小伙伴還有什么疑問,歡迎評(píng)論或私信告訴我荣回,謝謝~


轉(zhuǎn)自:十圖詳解tensorflow數(shù)據(jù)讀取機(jī)制(附代碼)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遭贸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子心软,更是在濱河造成了極大的恐慌壕吹,老刑警劉巖著蛙,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耳贬,居然都是意外死亡踏堡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門咒劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顷蟆,“玉大人,你說我怎么就攤上這事腐魂≌寿耍” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蛔屹,是天一觀的道長(zhǎng)削樊。 經(jīng)常有香客問我,道長(zhǎng)兔毒,這世上最難降的妖魔是什么漫贞? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮育叁,結(jié)果婚禮上迅脐,老公的妹妹穿的比我還像新娘。我一直安慰自己擂红,他們只是感情好仪际,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昵骤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肯适。 梳的紋絲不亂的頭發(fā)上变秦,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音框舔,去河邊找鬼蹦玫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刘绣,可吹牛的內(nèi)容都是我干的樱溉。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼纬凤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼福贞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起停士,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤挖帘,失蹤者是張志新(化名)和其女友劉穎完丽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拇舀,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逻族,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骄崩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聘鳞。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖要拂,靈堂內(nèi)的尸體忽然破棺而出抠璃,到底是詐尸還是另有隱情,我是刑警寧澤宇弛,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布鸡典,位于F島的核電站,受9級(jí)特大地震影響枪芒,放射性物質(zhì)發(fā)生泄漏彻况。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一舅踪、第九天 我趴在偏房一處隱蔽的房頂上張望纽甘。 院中可真熱鬧,春花似錦抽碌、人聲如沸悍赢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)左权。三九已至,卻和暖如春痴颊,著一層夾襖步出監(jiān)牢的瞬間赏迟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工蠢棱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锌杀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓泻仙,卻偏偏與公主長(zhǎng)得像糕再,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玉转,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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