前提・実現したいこと
Kerasを利用して画像認識やセマンティックセグメンテーションを実施しているのですが、学習時の検証データの精度の捉え方について確認させてください。
##①学習時に表れる周期性について
汎化性検証のためのテストデータは別に設けた上で、学習時は訓練データ:検証データ=8:2として以下のコードで学習を行なっております。
python
1 model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), 2 loss='categorical_crossentropy', metrics=['accuracy'])
その際、学習の進捗のグラフが以下のように周期的なものとなるのですが、何か問題があるのでしょうか。
訓練データはShuffle=True、検証データはShuffle=Falseとしておりますので、各エポック終了時の検証では順番に全ての検証データの精度を確かめるものと考えており、過学習はしていなそうではありますが周期性が表れるのは何かおかしい気がします。
このModelAccuracyを見るに最大80%程度の精度が期待できますが、データをいくつかに分けて交差検証を行なっても実際には60-75%程度の精度しか出ません。
当然検証データよりは精度が低下するものだとは思っていますが、学習の度に大きく精度が上下するところも含め、正しく学習がなされているか疑問が残ります。
##②val_accの認識について(セマンティックセグメンテーションの固有の現象?)
以下のコードのように、2値(白黒)で塗り分けるようなセグメンテーション(segnetなど)を学習したく、数千枚のデータを集め学習処理をしております。
python
1model.compile(optimizer = Adam(lr = 1e-4), loss = 'binary_crossentropy', metrics = ['accuracy'])
学習中、val_accの値を見ると、以下は1Epoch完了時なのに高精度な結果が得られている事に違和感を感じ、テストデータ=学習時の検証データとしてval_accと同様の結果が得られるのか確認をしました。(汎化性検証のためのテストデータは別に設けるべきなことは理解しておりますが、学習が正しくなされているのかの確認のため)
loss: 0.6931 - acc: 0.8460 - val_loss: 0.6911 - val_acc: 0.8708
そうしましたところ、やはり全くもってこのような精度は得られませんでしたがこれは何故でしょうか。
1つの疑問として、私は1Epoch完了毎に全ての検証データの精度検証を行なってval_loss,val_accを出力している考えておりましたが、この認識がそもそも誤りなのでしょうか。
もしくは、この画像全体を0と塗るとacc=0.90となるくらい片方のラベルに寄っているのですが、そのせいでしょうか。
ただ、いずれにしても1Epoch目に限らず学習時のval_accとその後自分で精度評価した時の精度は、検証用データ=テストデータとして同一環境にしているにも関わらず、全く一致しません。
どなたか何故このようなことが起きるのかお分かりになる方いらっしゃいましたらご助言頂ければありがたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/13 04:17 編集