ImageDataGenerator のパラメータの最適化 (2)

はじめに

kaggle の digit-recognizer の学習時に, ImageDataGenerator を使っている. このパラメータの最適化のために, 前のブログ「ImageDataGenerator のパラメータの最適化 (1) - Diary of Masahiro SATO」では, GPyOpt を使いベイズ推定で最適なパラメータを求めようとした. しかし, 変形を小さくする方向 にパラメータが最適化されてしまい, 意図したような結果にならなかった.

そこで今回は, ランダムサーチ で最適なパラメータを求めてみる. 結果的には, 割とうまくいったと思う.

スクリプト

Parameters optimization of ImageDataGenerator usi…

44 行目からが, ランダムサーチのスクリプトである. 77 行目の while 文内で, 88 ~ 92 行目でランダムな値を設定している. 113 行目で学習し, 120 ~ 122 行目で accuracy, val_accuracy, loss, val_loss をファイルに保存し, また val_loss の最小値を取り出している. 133 ~ 139 行目でパラメータと val_loss の最小値をリストに保存. 144 行目は, while 文の開始時から duration 秒だけ経過したら break するようにしている (72 行目で duration は 7 時間にしている. これは, 8 時間経過すると kaggle のセッションが止まってしまうため)

結果

val_loss が最小になったのは, 以下の組み合わせのときだった.

パラメータ
rotation_range 11
width_shift_range 0.13
height_shift_range 0.25
shear_range 0.37
zoom_range 0.17

rotation_range, width_shift_range, zoom_range は小さめの値になったが, それ以外 (height_shift_range, shear_range) はそれなり (どれなり?) の値になったような気がする.

上記のパラメータにおける, 損失関数を下に示す. loss (右側の青色) を見ると若干, 過学習気味かもしれないが, まぁ良しとしましょう.

loss function of min val_loss

まとめ

ImageDataGenerator のパラメータの最適化をランダムサーチで行った. 結果として, 若干, 過学習気味ではあるが, 良いパラメータが得られた.

しかし「過学習気味」ということを真面目に考えると, やはり, 得られたパラメータの 3 つが小さめの値になった ということが気になる. 単に val_loss を最小にするということではなく, 損失関数の変化を見ながら val_loss の小さいパラメータの組み合わせを選択するというデリケートな作業が必要なのかもしれない.

次にやるとしたら, グリッドサーチで真面目にパラメータを振って, 損失関数を見比べながら最適なパラメータの組み合わせを探すことかな?