はじめに
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
(右側の青色) を見ると若干, 過学習気味かもしれないが, まぁ良しとしましょう.
まとめ
ImageDataGenerator のパラメータの最適化をランダムサーチで行った. 結果として, 若干, 過学習気味ではあるが, 良いパラメータが得られた.
しかし「過学習気味」ということを真面目に考えると, やはり, 得られたパラメータの 3 つが小さめの値になった ということが気になる. 単に val_loss
を最小にするということではなく, 損失関数の変化を見ながら val_loss
の小さいパラメータの組み合わせを選択するというデリケートな作業が必要なのかもしれない.
次にやるとしたら, グリッドサーチで真面目にパラメータを振って, 損失関数を見比べながら最適なパラメータの組み合わせを探すことかな?