當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]轉(zhuǎn)展多處都沒有找到詳細(xì)介紹Tensorflow讀取文件的方法引言Tensorflow的數(shù)據(jù)讀取有三種方式:Preloaded data: 預(yù)加載數(shù)據(jù)Feeding: Python產(chǎn)生數(shù)據(jù),再把數(shù)據(jù)喂給

轉(zhuǎn)展多處都沒有找到詳細(xì)介紹Tensorflow讀取文件的方法


引言


Tensorflow的數(shù)據(jù)讀取有三種方式:

Preloaded data: 預(yù)加載數(shù)據(jù)Feeding: Python產(chǎn)生數(shù)據(jù),再把數(shù)據(jù)喂給后端。Reading from file: 從文件中直接讀取

這三種有讀取方式有什么區(qū)別呢? 我們首先要知道TensorFlow(TF)是怎么樣工作的。

TF的核心是用C++寫的,這樣的好處是運(yùn)行快,缺點(diǎn)是調(diào)用不靈活。而Python恰好相反,所以結(jié)合兩種語言的優(yōu)勢。涉及計(jì)算的核心算子和運(yùn)行框架是用C++寫的,并提供API給Python。Python調(diào)用這些API,設(shè)計(jì)訓(xùn)練模型(Graph),再將設(shè)計(jì)好的Graph給后端去執(zhí)行。簡而言之,Python的角色是Design,C++是Run。

Preload與Feeding Preload

import?tensorflow?as?tf
#?設(shè)計(jì)Graph
x1?=?tf.constant([2,?3,?4])
x2?=?tf.constant([4,?0,?1])
y?=?tf.add(x1,?x2)
#?打開一個(gè)session?-->?計(jì)算y
with?tf.Session()?as?sess:
????print?sess.run(y)

在設(shè)計(jì)Graph的時(shí)候,x1和x2就被定義成了兩個(gè)有值的列表,在計(jì)算y的時(shí)候直接取x1和x2的值。

Feeding

import?tensorflow?as?tf
#?設(shè)計(jì)Graph
x1?=?tf.placeholder(tf.int16)
x2?=?tf.placeholder(tf.int16)
y?=?tf.add(x1,?x2)
#?用Python產(chǎn)生數(shù)據(jù)
li1?=?[2,?3,?4]
li2?=?[4,?0,?1]
#?打開一個(gè)session?-->?喂數(shù)據(jù)?-->?計(jì)算y
with?tf.Session()?as?sess:
????print?sess.run(y,?feed_dict={x1:?li1,?x2:?li2})


在這里x1, x2只是占位符,沒有具體的值,那么運(yùn)行的時(shí)候去哪取值呢?這時(shí)候就要用到sess.run()中的feed_dict參數(shù),將Python產(chǎn)生的數(shù)據(jù)喂給后端,并計(jì)算y。

兩種方法的區(qū)別

Preload:
將數(shù)據(jù)直接內(nèi)嵌到Graph中,再把Graph傳入Session中運(yùn)行。當(dāng)數(shù)據(jù)量比較大時(shí),Graph的傳輸會(huì)遇到效率問題。
Feeding:
用占位符替代數(shù)據(jù),待運(yùn)行的時(shí)候填充數(shù)據(jù)。

Reading From File

前兩種方法很方便,但是遇到大型數(shù)據(jù)的時(shí)候就會(huì)很吃力,即使是Feeding,中間環(huán)節(jié)的增加也是不小的開銷,比如數(shù)據(jù)類型轉(zhuǎn)換等等。最優(yōu)的方案就是在Graph定義好文件讀取的方法,讓TF自己去從文件中讀取數(shù)據(jù),并解碼成可使用的樣本集。


在上圖中,首先由一個(gè)單線程把文件名堆入隊(duì)列,兩個(gè)Reader同時(shí)從隊(duì)列中取文件名并讀取數(shù)據(jù),Decoder將讀出的數(shù)據(jù)解碼后堆入樣本隊(duì)列,最后單個(gè)或批量取出樣本(圖中沒有展示樣本出列)。我們這里通過三段代碼逐步實(shí)現(xiàn)上圖的數(shù)據(jù)流,這里我們不使用隨機(jī),讓結(jié)果更清晰。

文件準(zhǔn)備

$?echo?-e?"Alpha1,A1nAlpha2,A2nAlpha3,A3"?>?A.csv
$?echo?-e?"Bee1,B1nBee2,B2nBee3,B3"?>?B.csv
$?echo?-e?"Sea1,C1nSea2,C2nSea3,C3"?>?C.csv
$?cat?A.csv
Alpha1,A1
Alpha2,A2
Alpha3,A3

單個(gè)Reader,單個(gè)樣本

import?tensorflow?as?tf
#?生成一個(gè)先入先出隊(duì)列和一個(gè)QueueRunner
filenames?=?['A.csv',?'B.csv',?'C.csv']
filename_queue?=?tf.train.string_input_producer(filenames,?shuffle=False)
#?定義Reader
reader?=?tf.TextLineReader()
key,?value?=?reader.read(filename_queue)
#?定義Decoder
example,?label?=?tf.decode_csv(value,?record_defaults=[['null'],?['null']])
#?運(yùn)行Graph
with?tf.Session()?as?sess:
????coord?=?tf.train.Coordinator()??#創(chuàng)建一個(gè)協(xié)調(diào)器,管理線程
????threads?=?tf.train.start_queue_runners(coord=coord)??#啟動(dòng)QueueRunner,?此時(shí)文件名隊(duì)列已經(jīng)進(jìn)隊(duì)。
????for?i?in?range(10):
????????print?example.eval()???#取樣本的時(shí)候,一個(gè)Reader先從文件名隊(duì)列中取出文件名,讀出數(shù)據(jù),Decoder解析后進(jìn)入樣本隊(duì)列。
????coord.request_stop()
????coord.join(threads)
#?outpt
Alpha1
Alpha2
Alpha3
Bee1
Bee2
Bee3
Sea1
Sea2
Sea3
Alpha1

單個(gè)Reader,多個(gè)樣本

import?tensorflow?as?tf
filenames?=?['A.csv',?'B.csv',?'C.csv']
filename_queue?=?tf.train.string_input_producer(filenames,?shuffle=False)
reader?=?tf.TextLineReader()
key,?value?=?reader.read(filename_queue)
example,?label?=?tf.decode_csv(value,?record_defaults=[['null'],?['null']])
#?使用tf.train.batch()會(huì)多加了一個(gè)樣本隊(duì)列和一個(gè)QueueRunner。Decoder解后數(shù)據(jù)會(huì)進(jìn)入這個(gè)隊(duì)列,再批量出隊(duì)。
#?雖然這里只有一個(gè)Reader,但可以設(shè)置多線程,相應(yīng)增加線程數(shù)會(huì)提高讀取速度,但并不是線程越多越好。
example_batch,?label_batch?=?tf.train.batch(
??????[example,?label],?batch_size=5)
with?tf.Session()?as?sess:
????coord?=?tf.train.Coordinator()
????threads?=?tf.train.start_queue_runners(coord=coord)
????for?i?in?range(10):
????????print?example_batch.eval()
????coord.request_stop()
????coord.join(threads)
#?output
#?['Alpha1'?'Alpha2'?'Alpha3'?'Bee1'?'Bee2']
#?['Bee3'?'Sea1'?'Sea2'?'Sea3'?'Alpha1']
#?['Alpha2'?'Alpha3'?'Bee1'?'Bee2'?'Bee3']
#?['Sea1'?'Sea2'?'Sea3'?'Alpha1'?'Alpha2']
#?['Alpha3'?'Bee1'?'Bee2'?'Bee3'?'Sea1']
#?['Sea2'?'Sea3'?'Alpha1'?'Alpha2'?'Alpha3']
#?['Bee1'?'Bee2'?'Bee3'?'Sea1'?'Sea2']
#?['Sea3'?'Alpha1'?'Alpha2'?'Alpha3'?'Bee1']
#?['Bee2'?'Bee3'?'Sea1'?'Sea2'?'Sea3']
#?['Alpha1'?'Alpha2'?'Alpha3'?'Bee1'?'Bee2']

多Reader,多個(gè)樣本

import?tensorflow?as?tf
filenames?=?['A.csv',?'B.csv',?'C.csv']
filename_queue?=?tf.train.string_input_producer(filenames,?shuffle=False)
reader?=?tf.TextLineReader()
key,?value?=?reader.read(filename_queue)
record_defaults?=?[['null'],?['null']]
example_list?=?[tf.decode_csv(value,?record_defaults=record_defaults)
??????????????????for?_?in?range(2)]??#?Reader設(shè)置為2
#?使用tf.train.batch_join(),可以使用多個(gè)reader,并行讀取數(shù)據(jù)。每個(gè)Reader使用一個(gè)線程。
example_batch,?label_batch?=?tf.train.batch_join(
??????example_list,?batch_size=5)
with?tf.Session()?as?sess:
????coord?=?tf.train.Coordinator()
????threads?=?tf.train.start_queue_runners(coord=coord)
????for?i?in?range(10):
????????print?example_batch.eval()
????coord.request_stop()
????coord.join(threads)
????
#?output
#?['Alpha1'?'Alpha2'?'Alpha3'?'Bee1'?'Bee2']
#?['Bee3'?'Sea1'?'Sea2'?'Sea3'?'Alpha1']
#?['Alpha2'?'Alpha3'?'Bee1'?'Bee2'?'Bee3']
#?['Sea1'?'Sea2'?'Sea3'?'Alpha1'?'Alpha2']
#?['Alpha3'?'Bee1'?'Bee2'?'Bee3'?'Sea1']
#?['Sea2'?'Sea3'?'Alpha1'?'Alpha2'?'Alpha3']
#?['Bee1'?'Bee2'?'Bee3'?'Sea1'?'Sea2']
#?['Sea3'?'Alpha1'?'Alpha2'?'Alpha3'?'Bee1']
#?['Bee2'?'Bee3'?'Sea1'?'Sea2'?'Sea3']
#?['Alpha1'?'Alpha2'?'Alpha3'?'Bee1'?'Bee2']

tf.train.batchtf.train.shuffle_batch函數(shù)是單個(gè)Reader讀取,但是可以多線程。tf.train.batch_jointf.train.shuffle_batch_join可設(shè)置多Reader讀取,每個(gè)Reader使用一個(gè)線程。至于兩種方法的效率,單Reader時(shí),2個(gè)線程就達(dá)到了速度的極限。多Reader時(shí),2個(gè)Reader就達(dá)到了極限。所以并不是線程越多越快,甚至更多的線程反而會(huì)使效率下降。

迭代控制

filenames?=?['A.csv',?'B.csv',?'C.csv']
filename_queue?=?tf.train.string_input_producer(filenames,?shuffle=False,?num_epochs=3)??#?num_epoch:?設(shè)置迭代數(shù)
reader?=?tf.TextLineReader()
key,?value?=?reader.read(filename_queue)
record_defaults?=?[['null'],?['null']]
example_list?=?[tf.decode_csv(value,?record_defaults=record_defaults)
??????????????????for?_?in?range(2)]
example_batch,?label_batch?=?tf.train.batch_join(
??????example_list,?batch_size=5)
init_local_op?=?tf.initialize_local_variables()
with?tf.Session()?as?sess:
????sess.run(init_local_op)???#?初始化本地變量?
????coord?=?tf.train.Coordinator()
????threads?=?tf.train.start_queue_runners(coord=coord)
????try:
????????while?not?coord.should_stop():
????????????print?example_batch.eval()
????except?tf.errors.OutOfRangeError:
????????print('Epochs?Complete!')
????finally:
????????coord.request_stop()
????coord.join(threads)
????coord.request_stop()
????coord.join(threads)
#?output
#?['Alpha1'?'Alpha2'?'Alpha3'?'Bee1'?'Bee2']
#?['Bee3'?'Sea1'?'Sea2'?'Sea3'?'Alpha1']
#?['Alpha2'?'Alpha3'?'Bee1'?'Bee2'?'Bee3']
#?['Sea1'?'Sea2'?'Sea3'?'Alpha1'?'Alpha2']
#?['Alpha3'?'Bee1'?'Bee2'?'Bee3'?'Sea1']
#?Epochs?Complete!

在迭代控制中,記得添加tf.initialize_local_variables(),官網(wǎng)教程沒有說明,但是如果不初始化,運(yùn)行就會(huì)報(bào)錯(cuò)。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉