le.tuan.anh

2017.09.08

Transfer learningを使って、花の名前を予測した結果を共有します。

こんにちは!エンジニアのアインです。

データ量が少なくても、DeepLearningを使える方法を紹介します。

データセット

花のデータセットがすでにあって、全部は500の種類で、50万枚画像があります。自動的に花の名前を予想できました。

コンピュータのSpecs

  • Intel Core I5 6600K
  • NVidia GTX 1070 8GB OC
  • RAM 16GB

環境

  • Python 2.7
  • Keras 1.2.0
  • Tensorflow 1.0

Transfer Learning

スクラッチから学習することは非常に少ないです。自分で大きなデータセットを作ると、時間やお金が沢山かかってしまうからです。一般的には、大きなデータセットでトレーニング済みのモデルを使って、学習したパラメーターをデフォルトにし、具体的な問題で再トレーニングします。3つの主要なTransfer Learningのシナリオがあります。

  1. ConvNetの固定なフィーチャを抽出します。ImageNetでトレーニングしたモデルから最後のLayerを削除して、残りのフィーチャを固定して、新しいデータセットを学習するです。
  2. Fine-tuning。第二のストラテジーはConvNetを置き換えると再トレーニングだけではない、あらかじめトレーニングされたネットワークの重みを微調整することもします。
  3. Pretrained models . Kerasのライブラリーがすでに提供したモデルを使って、Fine-tuningしました。

今回のデータセットが量が少ないですから、スクラッチから学習するモデルとPretrained-Modelsというシナリオを確かめました

ここに 書かれた方法を元に実装し、自分の用意したデータを活用しました。

結果

Tables Pre-trained models スクラッチから学習
Precision 0.84 0.5
Recall 0.98 0.6
F1 0.90 0.54

Tips

  1. 花のデータセットをImagenetのデータセットは同じ部分があるし、データ量は多いいので、 Pretrained-Modelsを使って、overfitを発生しない事を期待できます。全てのフィーチャをFine-tuningするといい結果を出せました。
  2. スクラッチから学習するモデルも確かめましたが、結果があまりよくないです。画像のデータにとって、ConvNetを使うを1千万のデータがあれば最初から学習と結果が出せるかもしれませんが、データ量がそんなに足らないとTransferLearningを使った方がいいです。
  3. Learning rates. 長いな範囲のLearning Rateを確かめましたが、全てのフィーチャをFine-tuningすると小さいで使うと結果が良いです。具体的には0.0001でトレーニングしました。
  4. データ量を増えるため、増強方法が役に足します。画像が回して、Zoom-in,Zoom-outして、いろいろデータがデータに追加できます。Overfitを行う可能性も減らします。KerasのImageDataGeneratorモジュールがすでに提供しましたので、とても便利です。
  5. デバッグごとがメッチャク難しなので、以下のシナリオを実装しました:
    • 小さいなデータ量から学習します。正則化を使いづに、Loss値が0になるかどうかを観察してください。もし0にならないとモデルを作成する部分は問題があります
    • Overfitが行うできるようにした後、正則化を使って全体のデータセットを使って、学習します
    • トレーニング時間がかかりますので、TensorBoardというVisualizationライブラリーを使って、Loss値を観察してください。