Practice
deep learning
此篇文章主要著重在 ImageDataGenerator 的使用,以及是否能增進 CNN 的辨識率,因此文章內主要的 CNN Architecture 均沿用 " 卷積神經網路 Convolutional Neural Network ( CNN ) 與 全連接神經網路 Fully Connected Feedforward Network 於 MNIST 上之實作 " 一文。
ImageDataGenerator
: 利用現有的資料經過旋轉、翻轉、縮放…等方式增加更多的訓練資料。
ReduceLROnPlateau
: 當我們使用 gradient descent 進行權重更新時,如果 Learning rate 固定,很容易到後面 Loss 會降不下來,而這個套件便是可以在我們設定的 epoch 內,若 Loss 沒有下降,可以自動調整 Learning rate 衰減 (這邊我們會設定為 0.5 倍)
接下來就是 ImageDataGenerator
與 ReduceLROnPlateau
設定的重點
這邊值得注意的是 ImageDataGenerator
內的參數必須要依照我們的資料進行調整,舉例來說,如果我們今天是做一般貓狗照片的辨識,我們可以將 rotation_rang
上調 ( 貓狗照片不會因為大角度旋轉而改變 Label,但數字若旋轉角度太大會有可能變成另外一個數字 ) 、加上 horizontal_flip = True
或是 vertical_flip = True
這兩個參數…等等[1]。
但我們今天是做手寫數字的辨識,因此在參數上面必須多所斟酌,不然很有可能會訓練出一套極差的 model。
這邊也有許多要注意的地方 :
由於我們在訓練資料上用了 ImageDataGenerator
,因此在訓練的步驟我們必須要使用 .fit_generator()
(如果我們在訓練資料上使用任何的 generator 都應該這樣使用 )。
我們以往對於資料 fit
以後還要再做 transform
,但在 ImageDataGenerator
我們在 fit
完後,要把資料做轉換的步驟則是用 .flow(X,y)
或是 .flow_from_directory(directory)
一個 epoch 要跑完全部的訓練資料,所以若訓練資料有 n 筆,batch size 為 m ,那麼每一個 epoch 應該要跑 n/m 次,亦即 steps_per_epoch
*batch_size
= len(training data)
,validation data 亦然。
準確率可以到達將近 99.5%
這邊蠻有趣的地方是,以往訓練資料的準確度應該要比驗證資料來的高,而 Loss 應該要比驗證資料來的低。但經過 ImageDataGenerator
後訓練資料在模型上的表現卻總是不及驗證資料。但最後測試資料的分數仍然有明顯的提高。
其實這裡有一個問題,因為我們放了兩個變因進去 : ImageDataGenerator
與 ReduceLROnPlateau
,所以是否真的是 ImageDataGenerator
導致準確度提高的呢 ?
為了處理這個問題,我也有另外做一個只有 ReduceLROnPlateau
的 model,準確度的確也有提高,但大約在 99.4% 左右,也就是說 ImageDataGenerator
的影響雖然存在,但是卻不高,或許在參數上面調整一下可能會可以有明顯的差距。抑或者,在數字辨識上的資料增強本來就不會有太大的效果 ?
詳細的參數設置可以參閱 Keras Document。 ↩︎