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