改善過擬合的其中一個方法是增加資料,但資料並非那麼好取得,這時候我們可以用keras自帶的一個資料增強Data Augmentation手段,看看能否解決問題。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
來看看有那些可以設定的參數,有些常使用的拿出來講。
datagen = ImageDataGenerator(
width_shift_range = 0.3,
height_shift_range = 0.3,
shear_range = 0.1,
rotation_range = 30,
rescale = 1 / 255.,
)
model.fit(
x = datagen.flow(x_train, y_train, batch_size=32),
steps_per_epoch = train.shape[0] // batch_size,
epochs = 20,
validation_data = datagen.flow(x_valid, y_valid, batch_size=32),
validation_steps = valid.shape[0] // batch_size,
verbose = 2
)
範例中對驗證集也使用資料增強,但你也可以不要這麼做,各位注意到我們並沒有使用到horizontal_flip和vertical_flip,因為在現實中並不會有人將數字顛倒或鏡像的寫,所以不用這麼做,如果做貓狗辨識的話可以加入水平翻轉,我們在用資料增強時需要考慮到現實中是否會出現這些情況來做決定。
以往step不需要手動設定,但是資料生成器會不斷地循環下去,所以需要手動設定停止條件steps_per_epoch和validation_steps。
你也需要手動分割出訓練集與驗證集,即使你只在訓練集上用資料生成器,你可以手動分割,想要每次都使用同樣的分割並跳過預處理步驟的話,你可以save起來,下次要用再load回來,這裡使用sklearn套件提供的隨機分割,沒有的要自己裝。
from sklearn.model_selection import train_test_split
import time
x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.1, random_state=int(time.time()))
np.save(r'x_train.npy', x_train)
np.save(r'y_train.npy', y_train)
np.save(r'x_valid.npy', x_valid)
np.save(r'y_valid.npy', y_valid)
x_train = np.load(r'x_train.npy')
y_train = np.load(r'y_train.npy')
x_valid = np.load(r'x_valid.npy')
y_valid = np.load(r'y_valid.npy')