kaggleの練習コンペDogs vs. Catsに出場


このエントリーをはてなブックマークに追加

Kaggleで開催されていた練習用コンテスト Dogs vs. Cats Redux: Kernels Edition | Kaggle に参加しました。このコンテストでは、画像の中に犬または猫のどちらが映っているかを識別する識別器を学習し、その性能を競います。通常では犬か猫かの2値で答える問題設定が多いかと思いますが、このコンペでは犬か猫かの確率値を0.0から1.0の間の実数値で答えます。

結果は1314人中74位で、上位6%に入ったといえば聞こえはいいのですが、実態は手も足も出なかったという印象です。以下、簡単なメモです。

実装1: Chainer

まずはChainerを使ってDeepNetの自力実装を試みました。ディープラーニングの様々なモデルを使ってCIFAR-10画像データセットの分類を行う - Qiita のVGG likeなモデルを参考に、与えられた学習データのみを使ってスクラッチからのモデルの学習を試みました。

入力画像をGTX 1070のメモリが許す限り大きくしたり(144x144の画像からランダムな位置で128x128の画像を切り出し)、on-the-flyで画像に摂動を加えて水増ししたり、出力層をsigmoid cross entropyにして確率値を出せるようにしたりなど、思いつきそうな工夫をあれこれ入れました。しかしエラー値0.13(正解率にして95%程度、順位にして約50%のあたり)程度で足踏みしてしまいました。感覚的にはもう少しよい値が出そうだと感じましたが、これがネットワークの限界なのか、学習方法に何らかの不備があるのかは不明です。

実装2: Keras

Kaggleではコンペ中も掲示板形式で参加者同士の議論が公開されています。その中に、Kerasの70行ほどのコードでエラー値0.06を出すサンプルが掲載されていました(Dogs vs. Cats Redux: Kernels Edition | Kaggle)。このコードでは、あらかじめ学習済のネットワークを特徴量抽出器として流用し、犬猫判別の判別器部分のみを学習する、いわゆる転移学習が行われています。

このコードを使うと、あっさりとエラー値0.059が出ました。転移学習恐るべしです。さらに小手先の閾値調整(値の範囲をクリッピングして、誤分類時のペナルティを下げるなど)を実施して、エラー値が0.05164(正解率にして99%程度)まで下がりました。

感想

学習データが数万枚オーダーで存在したためスクラッチで学習してもそれなりの精度が出ることを期待しましたが、実際は転移学習によるサンプルコードの性能に遥か及びませんでした。

今回はほぼサンプルコードを動かしただけで終わってしまいましたが、次回は最低一つくらいは何らかの工夫を加えてサンプルコードよりよい成績を狙いたいと思います。また、Discussionをくまなくチェックし、素早く巨人の肩に乗る練習も行いたいと思います。