質問: Tensorflow(Keras)を使ったマルチクラスの画像認識を試しています。 精度向上を目指して調査しているのですが、精度の出方に疑問があり困っています。 分類クラスは数千件、ImageGeneratorによる水増し、VGG16によるファインチューニングを行い、モデルの最終val_lossは0.1以下、検証結果はほぼ100%です。 以下、サンプル画像としていらすとやさんの素材を使用しています。(実際に使っている画像は写真なのですが、権利の関係でサンプルで失礼します) 学習元データは以下とします(ラベルは「サーバル」)。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/857b8e0685795e3f7fdd06d4e373fee2.jpeg) 学習後、以下のような画像を認識させた場合、正しくサーバルと認識されません(全く別のラベル「ワニ」等が出る。サーバルは全く上位に来ない)。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/ddaa9b74ff9bced48380251d28598732.jpeg) ですが以下のように「認識対象の画像に、学習元データを15%程透過した状態で重ねる」と「サーバル」とほぼ100%で認識されます。 (学習元データの透過率を100%にすると当然正しく認識出来ます) ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/73a0bae28b3e258470f7c8df98286c47.jpeg) 学習不足ならば透過状態でも認識出来ないでしょうし、 過学習だとしても元画像を15%程度加えたぐらいで認識出来るようになるものなのでしょうか? (もしくは「それぐらい強固に過学習してしまっている」と見るべきなのでしょうか?) 人間の眼で見る分には、認識対象画像と元画像を重ねた画像で大きな差異は見当たりません。 他要因として、色味・ノイズ量・ぼかしなども確認しましたが影響は無さそうでした。 (参考までに、認識対象画像をモノクロにするとトップ5位ぐらいにサーバルが入るようになりますが、トップにはなりません) 通常の精度向上というと、学習時のパラメータ・水増し時のパラメータ・認識対象画像の調整になるかなと思いますが、上記の状態なのでどの方針で進むべきかもよく分かっていません。 何かしらヒントになるような情報だけでも貰えると嬉しいです。
回答: アドバイスを受けて調整したら認識率がアップしました。 tiitoiさん、Q71さん、ありがとうございます。 ■学習元データ 縦長・横長の写真が混在しているので、横長の場合は上下を、縦長の場合は左右を黒で塗り潰して正方形にしていました。 この塗り潰し部分が過学習を生んでいたようでした。 また、回転もさせていませんでした(他のやや傾いた画像だと認識出来ていたのですがマグレだったようです)。 ■水増し内容を調整 ・ランダムクロップを追加。 ・ランダム回転を追加。 ・隙間の「黒埋め(fill_mode='constant')」を「画像の端の色で塗り潰し(fill_mode='nearest')」に変更。 ※なお、これらに加えて元々zoom_range、shear_range、brightness_rangeを加えてます。