有時候我們會遇到資料集數量不足的問題,或是模型訓練發生過度擬合(Overfitting),會使用資料增強(Data Augmentation)來讓資料集擴增或產生多樣性,讓模型更加泛化(Generalization)。今天先介紹其中一種常用於影像的資料增強方法,為使用 Keras 中的 ImageDataGenerator()
來做資料增強,通常是對影像做一些幾何轉換,例如翻轉、平移、縮放或鏡射等,分割驗證集也可以在這裡操作。
匯入 ImageDataGenerator()
:
from keras.preprocessing.image import ImageDataGenerator
設定想要做的資料增強方法(以部分為例):
trdata = ImageDataGenerator(rescale = 1./255,
rotation_range=45,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
validation_split=0.2)
參數說明:
rescale
:將影像像素縮放,1./255 可將像素值轉換至 [0,1]。rotation_range
:隨機旋轉角度。width_shift_range
:隨機水平平移。height_shift_range
:隨機垂直平移。zoom_range
:隨機縮放。horizontal_flip
:隨機水平翻轉。validation_split
:分割驗證集的比例。其他參數可以參考:tf.keras.preprocessing.image.ImageDataGenerator - TensorFlow
在 Kaggle 資料集上,我找了一個 Bear dataset 作為實作範例資料集。
指定一個變數為資料集的路徑:
trpath = "./Kaggle/data/"
將這個資料集做資料增強:
trdata = ImageDataGenerator(rescale = 1./255,
rotation_range=45,
horizontal_flip=True,
validation_split=0.2)
之後可以利用 flow_from_directory()
來讀取路徑下的資料夾,如果資料集內是以類別整理好,會直接將資料夾名稱當作資料夾內檔案的類別名稱。
讀取訓練資料集:
traindata = trdata.flow_from_directory(directory=trpath,
target_size=(256,256),
shuffle=True,
subset='training')
其中 directory
為欲使用的訓練資料集路徑 trpath,target_size
為影像的大小,通常會使用長寬相同的正方形,shuffle
為將資料集做洗牌,subset
指定讀取哪一個資料集。
驗證資料集的讀取方法相同,也是從 trpath 讀取(因為我們從 trpath 中做分割,如果要另外準備一個驗證資料集也是可以的),subset
記得改成 'validation'
。
valdata = trdata.flow_from_directory(directory=trpath,
target_size=(256,256),
shuffle=True,
subset='validation')
用一張影像作為範例,印出 10 張使用 ImageDataGenerator()
以及上述參數做資料增強的結果:
今天先介紹到這裡,明天會介紹另一種做資料增強的方法。