當前位置:
首頁 > 科技 > 十圖詳解TensorFlow數據讀取機制

十圖詳解TensorFlow數據讀取機制

作者丨何之源

責編丨火山火山

在學習TensorFlow的過程中,有很多小夥伴反映讀取數據這一塊很難理解。確實這一塊官方的教程比較簡略,網上也找不到什麼合適的學習材料。今天這篇文章就以圖片的形式,用最簡單的語言,為大家詳細解釋一下TensorFlow的數據讀取機制,文章的最後還會給出實戰代碼以供參考。

TensorFlow讀取機製圖解

首先需要思考的一個問題是,什麼是數據讀取?以圖像數據為例,讀取數據的過程可以用下圖來表示:

假設我們的硬碟中有一個圖片數據集0001.jpg,0002.jpg,0003.jpg……我們只需要把它們讀取到內存中,然後提供給GPU或是CPU進行計算就可以了。這聽起來很容易,但事實遠沒有那麼簡單。事實上,我們必須要把數據先讀入後才能進行計算,假設讀入用時0.1s,計算用時0.9s,那麼就意味著每過1s,GPU都會有0.1s無事可做,這就大大降低了運算的效率。

如何解決這個問題?方法就是將讀入數據和計算分別放在兩個線程中,將數據讀入內存的一個隊列,如下圖所示:

讀取線程源源不斷地將文件系統中的圖片讀入到一個內存的隊列中,而負責計算的是另一個線程,計算需要數據時,直接從內存隊列中取就可以了。這樣就可以解決GPU因為IO而空閑的問題!

而在TensorFlow中,為了方便管理,在內存隊列前又添加了一層所謂的「文件名隊列」。

為什麼要添加這一層文件名隊列?我們首先得了解機器學習中的一個概念:epoch。對於一個數據集來講,運行一個epoch就是將這個數據集中的圖片全部計算一遍。如一個數據集中有三張圖片A.jpg、B.jpg、C.jpg,那麼跑一個epoch就是指對A、B、C三張圖片都計算了一遍。兩個epoch就是指先對A、B、C各計算一遍,然後再全部計算一遍,也就是說每張圖片都計算了兩遍。

TensorFlow使用文件名隊列+內存隊列雙隊列的形式讀入文件,可以很好地管理epoch。下面我們用圖片的形式來說明這個機制的運行方式。如下圖,還是以數據集A.jpg, B.jpg, C.jpg為例,假定我們要跑一個epoch,那麼我們就在文件名隊列中把A、B、C各放入一次,並在之後標註隊列結束。

程序運行後,內存隊列首先讀入A(此時A從文件名隊列中出隊):

再依次讀入B和C:

此時,如果再嘗試讀入,系統由於檢測到了「結束」,就會自動拋出一個異常(OutOfRange)。外部捕捉到這個異常後就可以結束程序了。這就是TensorFlow中讀取數據的基本機制。如果我們要跑2個epoch而不是1個epoch,那隻要在文件名隊列中將A、B、C依次放入兩次再標記結束就可以了。

TensorFlow讀取數據機制的對應函數

如何在TensorFlow中創建上述的兩個隊列呢?

如果設置shuffle=True,那麼在一個epoch內,數據的前後順序就會被打亂,如下圖所示:

在TensorFlow中,內存隊列不需要我們自己建立,我們只需要使用reader對象從文件名隊列中讀取數據就可以了,具體實現可以參考下面的實戰代碼。

實戰代碼

我們用一個具體的例子感受TensorFlow中的數據讀取。如圖,假設我們在當前文件夾中已經有A.jpg、B.jpg、C.jpg三張圖片,我們希望讀取這三張圖片5個epoch並且把讀取的結果重新存到read文件夾中。

對應的代碼如下:

# 導入TensorFlow

import TensorFlow as tf

# 新建一個Session

with tf.Session() as sess:

# 我們要讀三幅圖片A.jpg, B.jpg, C.jpg

filename = [ A.jpg , B.jpg , C.jpg ]

# string_input_producer會產生一個文件名隊列

# reader從文件名隊列中讀數據。對應的方法是reader.read

reader = tf.WholeFileReader()

key, value = reader.read(filename_queue)

tf.local_variables_initializer().run()

# 使用start_queue_runners之後,才會開始填充隊列

i = 0

while True:

i += 1

# 獲取圖片數據並保存

image_data = sess.run(value)

with open( read/test_%d.jpg % i, wb ) as f:

f.write(image_data)

運行代碼後,我們得到就可以看到read文件夾中的圖片,正好是按順序的5個epoch:

我們這裡只是用三張圖片舉例,實際應用中一個數據集肯定不止3張圖片,不過涉及到的原理都是共通的。

總結

這篇文章主要用圖解的方式詳細介紹了TensorFlow讀取數據的機制,最後還給出了對應的實戰代碼,希望能夠給大家學習TensorFlow帶來一些實質性的幫助。

2017中國人工智慧大會(CCAI 2017)由中國人工智慧學會、螞蟻金服主辦,CSDN承辦,大會將於7月22日-23日在杭州隆重舉行。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

C+中命名空間的五大常見用法
資料庫壓縮技術的過去與未來,另又有公司的資料庫被工程師刪了
跳過肉眼?全面解讀Google最新發布的JPEG壓縮演算法Guetzli
中國最強的人工智慧學術會議來了
又是谷歌!持續交付武器Spinnaker褪去面紗,里程碑版本1.0正式發布

TAG:CSDN |

您可能感興趣

TensorFlow 數據讀取
volume讀取模型color信息
Python使用pandas讀取Excel文件多個WorkSheet的數據並繪製柱狀圖和熱力圖
tensorflow的模型保存於讀取
讀取ClassPath下resource文件的正確姿勢
解決SpringBoot無法讀取js css靜態資源的新方法
在iPhone上讀取micro SD存儲卡的方法!
如何用 Python 讀取 Outlook 中的電子郵件
iMessage漏洞致iPhone上任意文件讀取
SpringBoot如何讀取資源文件
Spring Boot 讀取靜態資源文件
Hooking Chrome瀏覽器的SSL函數來讀取SSL通信數據
Python讀取與更改xml文件
不完整的Http讀取和Python中的Requests庫
Thermanator攻擊:通過讀取鍵盤上的熱殘留竊取密碼
python筆記14-讀取yaml配置文件
頭條:Thermanator攻擊可通過讀取鍵盤上熱殘留竊取密碼
Spark讀取結構化數據
群聯首發SD/microSD Express存儲卡主控:讀取速度達900MB/s
群聯首發SD/microSD Express存儲卡主控:讀取速度達900MB/s