データ拡張処理(Data Augmentation)
Qiitaの関連記事(https://qiita.com/tky1117/items/92ac941a541dedbad2f5)
で、データセットを増幅したら正答率が上がったと言う記述があったので検証してみました。
以下のコードは学習画像・学習ラベルが(test_X,test_Y)のベクトル化が終わったものを前提とします。詳しくはチュートリアルをご覧下さい。
from keras.preprocessing.image import ImageDataGenerator
#拡張後のデータセットの保存ディレクトリを作成
save_path = os.path.join(main_path, 'kmnist-train_aug-imgs_no_change.npz')
if not os.path.exists(save_path):
#データセットを拡張(回転、画像サイズ変換は一切せず)
image_data_generator = ImageDataGenerator(fill_mode = 'constant', rotation_range = 0, width_shift_range = 0, height_shift_range = 0)
generator = image_data_generator.flow(train_X, shuffle = False, batch_size = len(train_X))
train_aug_X = generator.next()
#(232365, 28, 28, 1) -> (232365, 28, 28)
train_aug_X = np.reshape(train_aug_X, train_aug_X.shape[: 3])
#拡張後のデータセットを圧縮
np.savez_compressed(save_path, train_aug_X.astype(np.uint8))
#学習画像データセットをロード
train_X_file = np.load(os.path.join(main_path, 'kmnist-train-imgs.npz'))
#学習画像データセットをロード
train_aug_X_file = np.load(os.path.join(main_path, 'kmnist-train_aug-imgs_no_change.npz'))
train_Y_file = np.load(os.path.join(main_path, 'kmnist-train-labels.npz'))
train_Y = train_Y_file['arr_0']
#データセットと拡張したデータセットを結合
train_X = np.concatenate([train_X_file['arr_0'], train_aug_X_file['arr_0']], axis = 0)
train_Y = np.concatenate([train_Y, train_Y], axis = 0)
#データセットの画像をシャッフル
indices = np.array(range(len(train_X)))
np.random.shuffle(indices)
train_X = train_X[indices]
train_Y = train_Y[indices]
np.savez_compressed(os.path.join(main_path, 'k49-train_con-imgs_no_change.npz'), train_X)
np.savez_compressed(os.path.join(main_path, 'k49-train_con-labels_no_change.npz'), train_Y)
train_X = np.expand_dims(train_X, axis = 3) / 255.0
train_Y = np_utils.to_categorical(train_Y, n_class)
増幅前の正答率は97%だったので、さらなる改善を期待していたのですが、
バッチサイズ108000枚(データセットの1.8倍)、エポック数100で学習させたら正答率が約64%と残念な結果になりました。
過学習を疑ったのでエポック数50で再挑戦しましたが、正答率が約67%と改善が見られませんでした。
今後データセット拡張しようとしている方はお気をつけ下さい。