TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

點擊上方“關注”,All in AI中國

機器學習和深度學習的核心支柱之一是訓練模型時使用的數據,因為它們是算法能夠歸納和創建相關模型的來源。在使用Tensorflow時,將數據提供給這些模型有好幾種方法,但作者推薦的方法是使用TFRecord格式,該格式主要存儲在映射中被結構化的數據字節數組。每一個映射都可以很容易地解釋為一個特徵或示例,它包含所有的相關信息,這些信息將在以後的訓練和測試步驟中被使用。

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

大多數關於TFRecord的帖子都是直接創建這些特徵,而不需要對存儲進行必要的保護。當作者試圖使用TFRecord文件來處理圖像時,作者遇到了有關存儲大型文件的問題,因為那些TFRecord文件開始增長到原始數據大小的10倍,這使得在處理大型數據集時可能會變得非常令人煩惱。

鏈接文章中來自tensorflow庫的封閉式問題清楚地顯示了這種問題的存在(https://github.com/tensorflow/tensorflow/issues/9675),但也提供了一個非常有效的解決方案。因此,我們將在創建TFRecord特徵之前對圖像進行編碼,而不是盲目地存儲圖像。

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

(所有代碼片段都基於一個可用的TFRecord構建腳本,可以在這個存儲庫中找到,(https://github.com/tinenbruno/image-tfrecord-builder它基於Kwot Sin工作。)

步驟1. 組織你的圖像數據集

首先,我們需要組織我們的數據集,以便我們能更輕鬆地使用它。要做到這一點,其中一種方法是按照以下方式構建它:

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

使用這種結構,它將支持我們進行簡單地迭代文件夾,以收集有關於類名和圖像路徑的所有信息。

步驟2. 拆分你的數據集

我們將在你的數據集中創建兩種類型的拆分。第一種類型會評估你的機器學習模型的核心,它是關於在訓練和測試子集中拆分數據集的。如它名稱所示,訓練數據集將用於模型的訓練步驟中,而測試數據集將會用於驗證該模型。

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

我們將創建的第二個拆分類型被用於訓練和測試數據集的分片。分片可以加快你的閱讀速度,值得注意的是,分片時通常不會使用超過千兆字節大小的文件。如果你的數據集將會變得非常大,這一點將會非常重要。

步驟3. 創建你的TFRecord文件

我們將對每個圖像進行編碼,使用OpenCV加載後將其作為特徵存儲在TFRecord文件中。 例如,使用cv2.imencode,我們可以將圖像編碼為JPEG。

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

然後,我們可以簡單地使用這個編碼的圖像字符串來生成代表我們特徵的映射。由於我們的目標只是獲得一個小記錄,因此我們只會存儲後續步驟中所需的最少信息。

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

從TFRecords讀取

作者還有一件重要的事情要說明:如何從TFRecord文件中讀取。如前文所述,TFRecord以結構化的方式存儲特徵,在構建TFRecord文件時定義了存儲方式。然後,從TFRecord文件中讀取時,準確地瞭解正在讀取的特徵的結構是很重要的。如果你遵循這篇文章的示例,那麼當你從TFRecord文件讀取時,我們期望它被解析為如下內容:

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

我們還需要解碼JPEG編碼的圖像,可以使用以下方法完成:

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法

結論

最後,我們將獲得一個TFRecord格式的數據集,其大小接近原始數據。考慮到與其訓練時間相比,解碼時間通常是無關緊要的,這可能是節省存儲費用的一個很好的解決方案。

TensorFlow高效讀取數據之TFrecord,可能是節省存儲費用的好辦法


分享到:


相關文章: