在學習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:
新聞熱點
疑難解答