記事の要約
転移学習とfine tuningを使って少ないデータで画像認識をおこなったという話。
ソースコードは→https://github.com/yuushiokamura/cnn_trainfer_learning
アウトライン
・想定する読者
・個人でDLする際の難点
・あらかじめ学習されたモデルを使おう
・転移学習をfine tuning
・顔画像で試してみよう
想定する読者
CNNの原理がなんとなくわかる方
ちまちましたデータ集めの苦手な方
仕事で画像認識に始めたばかりの方
転移学習・fine tuning という手法について知りたい方
文章ばっかの記事に飽きない方
個人で(自分のPCで)DLするときの障壁
これはまず大きい壁にぶち当たります。
GPUが搭載されていない!
これはどうにもならないですよね。まさかプライベート用のPCをdeep learningように買い替えるわけにもいきませんし。。。GPUなしには学習に時間がかかってしょうがないです。。。
解決策としては・・・
・クラウドコンピューティングサービスを使う←ぶっちゃけおすすめ。googleやamazonはdeep learning の学習用に無料でGPUが一部使えるようなので、それを使う。例えばgoogle colablatryでは12時間まで使えるはずです。
・外付けできるGPUをかう。←あんまりおお勧めしませんが、こういった手段もあります。
####・計算量を減らす。←これができれば一番いいわけで、そのためにどうしましょうというのが今回のメインテーマ。
deep learningをやるうえでもう一つ大変なのがデータ集めです。
何千枚ものデータを集める作業、くそめんどくさいですよできればやりたくないですよね?データ量が減れば学習時間もへるので一石二鳥でもあります。
少ないデータで学習する方法として、データの水増しがありますが、今回はアルゴリズム側の改善策、転移学習を紹介します。
転移学習とfine tuning
転移学習・fine tuningはどちらも似たような意味で、混同されがちですが、どちらもあらかじめ学習されたモデルを利用して効率よく学習しようという手法です。
出典 http://cs231n.stanford.edu/syllabus.html
一般的に転移学習は特徴量抽出層をそのまま使い、全結合層のみを学習しなおします。一方fine tuningは特徴量抽出層の一部も学習し直す手法のことです。
例えばVGG16というモデルはImageNetという膨大な画像データセットで学習されており、1000クラス分類を行うことができるモデルです。このモデルを使うと、どんなメリットがあるかというと、VGG16は膨大で多様な画像データから、1000クラス分類を行うことのできる特徴量を抽出できるので、それを利用すれば、未知の分類も少ないデータでもできる、ということです。あとメリットといえば、実装が楽です
### kerasで学習済みのVGG16モデルを読み込むには
from keras.applications.vgg16 import VGG16
で読み込むことができます。
モデルに組み込むには
vgg = VGG16(weights='imagenet', include_top=False,
input_tensor=Input(shape=(224, 224, 3)))
inputのサイズは(224,224,3)で固定のようです。ここで読み込まれるのは、全結合層を除く層なので、全結合層を作って、くっつけてください。
for layer in self.vgg.layers[:non_train_layers]:
layer.trainable = False
non_train_layersで指定した層までの学習を止めることができます。(重みパラメータの固定)
顔画像で試してみよう
cnnで手書き文字認識を試された方は、つぎは実際の画像データで試したくなるでしょう。その際に、犬猫でもいいんですが、少ないデータでは難易度の高い顔認識をやってみたいと思います。
今回学習用につかったデータは石原さとみさんの画像と長瀬智也さんの画像です。選んだ理由は特にありません。しいて言えば超美人な石原さとみさんと、もう一方はあんまり似てると識別がむずかしいかなと思ってわりとごつい方にしました。。。
顔部分のトリミングはめんどくさい時間不足のため、行っていません。顔メインの画像だけを抽出しました。だいたい300枚ずつくらいあります。それにしても石原さとみさんはクローリングしたら顔メインの画像が多かったですね。。美人だからでしょうか。。?
結果
結果というほどのグラフもないですが、転移学習、fine tuning フル学習での精度と学習時間を記載しておきます。
フル学習 | 転移学習 | fine tuning | |
---|---|---|---|
学習時間 | 3時間程度 | 1時間 | 50分 |
精度(val acc) | 70%程度 | 92.2% | 94.7% |