【Keras】特徴量の抽出【犬猫判別3】

 

こんにちは、のっくんです。

 

最近はもっぱらディープラーニングにはまっています。

 

前回、前々回に引き続き犬と猫の画像判別をやってみます。

 

だんだん精度は良くなってきていますが、まだまだ良くなる余地があります。

今回は、既存モデルを使った特徴量抽出をやってみたいと思います。

 

スポンサーリンク

特徴量の抽出とは

 

特徴量抽出には、ディープラーニングでは有名なVGG16を使います。

このモデルは画像に何が映っているか判別するためのモデルです。1000クラスの画像分類ができます。

 

前の記事でその性能を試してみました。

【Keras】VGG16モデルを使って画像の判別をしてみた

 

モデルを読み込んで、画像を入れただけですが、犬、猫、ゾウを正しく判別しました。

ディープラーニングってすげえ。

 

今回はこのモデルで特徴を抽出して、特徴量を入力として学習します。

既存の優秀なモデルがあるのであれば、1から学習するよりも精度がでる予感がします。

 

学習済みモデルは畳み込みベースとも呼ばれます。

 

畳み込みベースを使った特徴抽出の方法は2つあります。

  1. 畳み込みベースを使って特徴量を抽出し配列に保存。それを全結合分類器の入力として使う。
  2. 畳み込みベースを拡張して新しいモデルを作り訓練する。

 

1の方法は処理が軽いですが、水増しができません。2は重いですが、水増しが可能です。

この記事では1の方法をやっていきます。

インポート

 

 

モデルの読み込み

 

学習済みのモデル(畳み込みベース)を読み込みます。

 

 

1000クラスに分類するための全結合層は必要ないので、include_topはFalseにしています。

 

(150,150)の画像を入力として、特徴量の出力は(4,4,512)の形です。この形と同じnumpyの配列を用意して、そこに特徴量を保存して行くことにします。

 

特徴量の抽出

 

さてここからが本番です。

特徴量を抽出するのに、以下のステップに従いコードを書いていきます。

  1. 特徴量とラベルを格納するnumpy配列の初期化
  2. ジェネレータの初期化
  3. ジェネレータを回し、画像とラベルを取得(この時に無限ループしないようにループ回数を指定)
  4. 画像から特徴量を抽出しnumpy配列に格納
  5. 特徴量はそのまま全結合層にインプットするため平坦化する

 

 

学習

 

得られた特徴量を全結合層の入力として学習させてみます。

 

 

可視化

 

 

バリデーションの正解率は最高で90.50%でした。

どんどん精度が上がっていって面白いですね。

ただ、訓練が進んでもバリデーションのロスが減っていっていません。水増ししていないので過学習が起きています。

次は、特徴量抽出+水増しにもチャレンジしたいと思います。

 

次回の記事:

【Keras】転移学習とファインチューニング【犬猫判別4】

前回の記事:

【Keras】学習の初歩【犬猫判別1】

【Keras】水増しとデータ拡張【犬猫判別2】

 

おわり。

参考

ABOUTこの記事をかいた人

のっくん

理系院卒で大企業の研究所に就職。 趣味はプログラミング、レアジョブ英会話、筋トレ、旅行。 Twitter:@yamagablog