十圖詳解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日在杭州隆重舉行。
點擊展開全文
※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