cedro-blog

Keras VGG16学習済みモデルでファインチューニングをやってみる

今回は、VGG16の学習済みモデルをファインチューニングし、少ない学習データで高い認識精度を持つモデルを作ってみます。

こんにちは cedro です。

前回、VGG16学習済みモデルを使って、1000カテゴリー一般物体認識をやってみました。では、その1000カテゴリー以外の物体を認識させたい時どうするのか、さらに大量の画像データを集めて、また長時間かけて学習する以外方法はないのでしょうか。

そこで登場するのが、ファインチューニングです。これは、ニューラルネットワークが学習する時に、入力に近い層ではのような単純な模様を学習し、出力に近い層複雑な模様を学習する性質を利用します。

つまり、入力に近い層ベーシックな内容を学習しているのでここは新たに学習させず出力に近い層のみ学習させるわけです。こうすることで、少ない学習データでしかも早く学習が完了し、結構精度が出ます。

ということで、今回は、VGG16学習済みモデルファインチューニングし、少ない学習データ高い認識精度を持つモデルを作ってみます。

 

データセットを準備します

9/13のブログで使ったオリジナルデータセットを流用します。これは、CelebAデータセットから、属性ファイルを使って、4種類の画像500枚づつピックアップしたもので、合計 500枚×4種類=2,000枚 です。

9/13のブログでは、Keras のサンプルプログラム CNNを使って、画像を900枚(各225枚×4=900枚)学習させました。その認識精度の結果は、ImageDataGenerator使わない場合 77.44%使う場合79.41% でした。

今回は、これと同じ条件で、VGG16の学習に画像を900枚だけ使ってファインチューニングし、認識精度がどうなるか試してみます。

 

プログラムを作成します

24行目からが、データセットを読み込む部分です。CelebAの画像データは、178×218ですので、36行目128×128でセンタークロップし、37行目224×224にリサイズしています。

47行目2000個の画像データを、学習:評価=45%:55%でランダムに分割しています。これによって、学習データは900枚になります。

59行目からが、モデルを構築する部分です。畳み込み13層は imagenet で学習した重みをそのまま使って学習させず全結合3層のみ学習させますオプチマイザーSGDを使っています。

98行目からが、ロス・精度の時系列グラフを作成する部分です。

 

今回、学習させるのは、赤矢印全結合3層(+Dropout)のみです。入力側の畳み込み13層は学習させません。

 

学習結果はどうなったか

ImageDataGenerator を使わずに学習した場合です(先ほどのプログラムのまま)。Validation accuracy が30epoch で既に80%を超えていますので立ち上がりが早いです。9/13のCNNの場合と比べると、2〜3倍程度立ち上がりが早いです。もちろん、最終的な Validation accuracy81.18% CNNの場合より、+3.74 ポイント向上しています。

 

ImageDataGenerator を使って学習した場合です(プログラムにImageDataGeneratorを追加)。使わない場合と比べると立ち上がりはゆっくり目です。最終的な Validation accuracy83.55% CNNの場合より、+4.14 ポイント向上しています。

 

まとめるとこんな形になります。ファインチューング、結構効果的な手法のようです。

では、また。