画像識別で迷走した記録

はじめに

前回は、自分で作成したデータセットを水増しして4クラスの画像識別に挑戦しました.データを水増しすることで、汎化性能が上がりテストデータに対する精度が上がるかと思ったのですが、結果は惨敗.あらかじめ断っておきまさすが、今回の記事は迷走の記録です.技術的に有用な情報は皆無です.

悲しい結果に終わった記事は以下. shirakonotempura.hatenablog.com

具体的には、検証データに対する精度は上がったのですが、肝心のテストデータに対する精度が水増し前よりも下がるという状況. この後、いろいろと記事を読んで、原因は以下のようなところではないかと推測したわけです.

  • 水増しの仕方が悪い
  • ネットワークの設計が悪い
  • そもそもの画像データの質が悪い

この後、何も計画もなしに水増しの方法をパラスタしはじめたことが迷走の始まりでした.


迷走1:datagenのパラスタ

この後、画像変換における角度・スライド幅の範囲を変えてみたり、最適化手法の方法を変更してみたり、かなり迷走しました.
しかし、どれも検証データの結果はそこそこの結果になるのですが、テストデータに対する評価はよくて65%程度とまり. 水増し方法を変更するだけでは、にっちもさっちもいかないので水増し方法を変えるのはあきらめました.

私は、rangeの値は0.1でやってましたが、以下のような設定が多いようです.

train_datagen=ImageDataGenerator(
    rescale=1.0/255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

迷走2:optimizerのパラスタ

では、optimizerを違うのを使えば良くなるのではとAdadelta()としていたoptimizerRMSprop()、Adagrad()、Adam()、Nadam()として比較.それぞれのパラメータはデフォルトのまま利用しています.
検証データは90%近く精度は出ているのですが、結局テストデータに対する精度は相変わらず60%とかでした.強いて言えば、今回のケースではRMSprop()の収束があまりよくなかったのですが、これは問題によりけりでしょう.
載せていませんが、転移学習で使うSGD()も試してはいます.安定はしていましたが結果は同じでした.

f:id:shirakonotempura:20190112074748p:plain

迷走3:データセットを変えてみる

これが一番ダメな迷走でした.選んだ題材が悪かったのかとネコ科の猛獣をやめて果物の識別もやってみたりもしました.
猛獣よりは識別しやすいようで、テストデータに対する精度は80%近くは出ました.わーい.でも、検証データの精度は100%近く出ている上でのこのテスト精度なわけで、根本的解決にはならず.

f:id:shirakonotempura:20190112074755p:plain

この辺で、何をやっているのかわからなくなってきましたので、心を落ち着かせるためにデータを見つめなおすことにしました.

データの見直しをしてみる

結局はネコ科の猛獣識別でいい結果を出したいので、今更なのですが持っているデータをあらためて確認してみました.
そしたら、いろいろと問題の画像が出てきました.
サバンナの草原の中に、ポツンといるライオンやトラの画像.リンクスには、ヘリコプターの画像も混ざっていました.
いわゆる質が悪いデータセットを使っていたようです.
ですので、多少なりとも改善の期待を込めて画像の選別をしていこうと思います.基本的には画像内に1匹、かつ人の目で顔が認識できる写真のみを選別.選別後、150枚ずつくらいはデータが残ればいいのですが.ちなみにライオンはメスとオスが混ざっているのですが、これは両方ともライオンと識別できると期待をこめて残しておきます.

つべこべ言わずに転移学習を入れてみることにする

転移学習については、通常のCNNである程度結果が出てからと考えていたのですが、結局後で適用するのであればもう導入してしまおうと思います.

まとめ

まとめるも何もほぼ何も成果がないのですが・・.
今回いろいろと試してみて思ったのは、MNISTやIrisを使ったチュートリアルは簡単に精度が出せるけど、実際のデータでは難しいんだなあということ.
まあ、そんなことは多くの先人が数年前からたびたび指摘してくれているのですが、身をもって痛感しました.でも、自分で色々試しているうちにコードの書き方にも慣れてきましたので結果オーライと考えてまた頑張ります.