学習データの量が十分でなくて精度があがらない時、複雑なモデルを使ってなんとかしようとしたら、余計ひどい目にあう。
今回は、常識的に言われていることを、実際にやって体感してみました。
2019/3/30追加
>これはリライトです。
>バージョンアップの記事が時間がたって陳腐化したので書き換えてみました。
ベースにするのはこの記事
カラー画像で少ない学習データでやってみたものです。
この時は精度がいまいちだったので、次の回で「データを水増しして増やす」方法で改善を試みたのでした。
今回のこころみについて
学習データが十分にある時は、より複雑で深いモデルを使うことで精度をあげることができます。
これは、まあ誰でもしってる常識みたいなもの。
だから、学習データが少なくても、もう少し深いモデルを使ったら、多少でも精度が向上するんじゃないか・・と考えたとしてもおかしくないです。
まあ。
ものの本によれば、そういう試みはうまくいかない・・とあります。
理屈的にも納得できる部分はありますし、それはそれでよいのですが、一度も試さないで机上の理論だけで決めつけるのはどうだろうか。
そう思ってやってみることにしたわけです。
resnetをつかってみよう
resnet18.sdcprojを使います。
ニューラルネットワークコンソールで、上記プロジェクトを開き、適当なフォルダに名前をつけて保存しておきます。
データセットを付け替える
サンプルは「ImageNet」のデータをInputに想定してます。
これを、Caltecのデータに変更する必要があります。
こちらで用意した画像を元に、Create Objectします。
サイズは、ImageNetにあわせて、480×480にReSizeします。
これで、トレーニングと評価用の両方のデータセットを登録します。
なお、Validationのデータ数がデフォルトの64より少ない場合は、Configタブで「Batch Size」をデータ数にあわせて変更する必要があります。
レイヤーオプションの最低限の変更
4つのタブに分かれていますが、それぞれに以下の変更が必要です。
その1
一番右下のAffineが「1000」になっているのを「3」(今回は3カテゴリなので)に変更します。
その2
Validation、Runtime、Validation5のinputのサイズを、3,480,480にあわせます。
これで動くはずです。
学習・評価してみました
正直、とんでもなく時間がかかります。
自分は動かしたまま寝て、翌朝に確認しました。
学習結果グラフはのせません。
予測してたよりひどかったので(笑)
評価の結果だけのせておきます。
ひどいもんです。
でも、まあ・・予想通りといえば予測通り。
- データ量が少ない
- モデルが複雑
この2つは「過学習」の発生しやすい二大条件です。
その2つがそろったら、こういうことになるんですね。
納得できました。
二度としませんけど(笑)
ではでは。