前面基本上把 TensorFlow 的在影像處理上的基礎知識介紹完了,下面我們就用 TensorFlow 來搭建一個分類 cifar10 的神經網路。
首先準備資料:
cifar10 的資料集共有 6 萬幅 32 * 32 大小的圖片,分為 10 類,每類 6000 張,其中 5 萬張用於訓練, 1 萬張用於測試。資料集被分成了5 個訓練的 batches 和 1 個測試的 batch。每個 batch 裡的圖片都是隨機排列的。官網上提供了三個版本的下載連結,分別是 Python 版本的,Matlab 版本的和二進位制檔案版本的。其中,Python 版本的資料格式,官網上給了讀取資料的程式碼,Matlab 版本的資料和 Python 版本的資料格式差不多。二進位制版本的資料,有 5 個訓練用的 batches,data_batch_1.bin ~ data_batch_5.bin 和一個測試用的 test_batch.bin,每個 bin 檔案的格式如下:
<1 x label><3072 x pixel>
...
<1 x label><3072 x pixel>
共有一萬行,每行 3073 個位元組,第一個位元組表示標籤資訊,剩下的 3072 位元組分為 RGB 三通道,每個通道 1024( = 32 * 32) 個位元組,注意,行與行之間沒有明顯的區分識別符號,所以整個 bin 檔案位元組長度恰好是 3073 萬。
考慮到 TensorFlow 可以讀取固定長度格式的資料(用 tf.FixedLengthRecordReader ),我們下載二進位制格式的資料。新建資料夾/home/your_name/TensorFlow/cifar10/data,從cifar10 官網上下載二進位制格式的檔案壓縮包,解壓到此資料夾,得到 cifar-10- batches-bin 資料夾,裡面有 8 個檔案,6 個 .bin檔案,一個 readme, 一個 .txt 說明了類別。
然後我們來考慮如下的網路結構進行 cifar10 的分類:每次輸入一個batch的 64 幅影像, 轉化成 64*32*32*3 的四維張量,經過步長為 1,卷積核大小為 5*5 ,Feature maps 為64的卷積操作,變為 64*32*32*64 的四維張量,然後經過一個步長為 2 的 max_pool 的池化層,變成 64*16*16*64 大小的四維張量,再經過一次類似的卷積池化操作,變為 64*8*8*64 大小的4維張量,再經過兩個全連線層,對映到 64*192 的二維張量,然後經過一個 sortmax 層,變為 64*10 的張量,最後和標籤 label 做一個交叉熵的損失函式。如下圖所示:
參考文獻:
1. https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10