Keras: CNN画像分類 (転移学習/Fine Tuning)

Takami Torao Python 3.5 Keras 2.2 TensorFlow 1.8 #Keras #TensorFlow #VGG16
  • このエントリーをはてなブックマークに追加

概要

転移学習 (transfer learning) はネットワークをゼロから学習させる代わりに、別のタスクで学習したネットワークを元に目的のタスクに最学習させることで、学習のための計算コストや学習に必要なデータセットの数を削減する手法。その際に行われる再学習は fine tuning (微調整) と呼ばれる。

Keras では ImageNet で学習済みのモデルが簡単に利用できる。Keras で利用可能な学習済みモデルには犬と猫が品種ごとに多く含まれていることから、それらを用いて犬と猫を見分ける二値分類器を再構築する例が Web や書籍ではよく見られる。学習用のデータセットが少ない場合に有効な手段である。

Keras には ImageNet のデータセットを 1,000 分類ラベルで学習したモデルが含まれている。多値分類ではなく二値分類。

設計

ここでは構造が比較的単純な VGG16 を使用する。VGG16 は 5 つのブロック (畳み込み層 + Pooling層) と 1 つの分類器 (全結合層) で構成されている。

VGG16 Layers
Fig 1. VGG16 Layers

Keras で利用可能な ImageNet 学習済みモデルは 224×224×3×batch 次元の入力をとり 1000×batch 次元の出力を行うように学習されたパラメータ (=重み; 状態) を持っている。

VGG16 Layers
Fig 2. VGG16 Layers with Trained Parameters

ここで、入力層に近い層のパラメータは学習に使用した画像の具象的な特徴が反映され、出力層に近い層のパラメータは分類を特定する特徴が反映され、そして中間付近のパラメータは抽象的な特徴が反映されている。

新しい分類を定義するということは以前の分類器のパラメータが再利用できないことと等しい。また、そもそも出力層の次元も異なるであろう。したがって分類器は新しい分類に沿ったものと置き換える。例えばここで二値分類に変更するのであれば活性化関数をより適切な sigmoid などに変更する事も考慮する。

新しい学習によって以前の学習状態が上書きされてしまわないように学習済みの層のパラメータ更新を freeze する。ただし、分類器に近い畳み込み層のパラメータは以前の分類を specific に反映した学習状態を持っていると考えられる。このため、分類器に近い層を新しい学習によって再学習させるべきかを考慮する。また、再学習させる場合、新しい学習で過度に上書きされないように learning rate を低めに設定すべきかを考慮する。

VGG16 Layers
Fig 3. Replace Classifier and Freeze Parameters

この状態から新しいデータセットで学習させることにより、以前の学習で得た特徴量を維持したまま新しい分類に

実験1: 二値分類

実験2: 多クラス分類

問題と対応

TypeError: softmax() got an unexpected keyword argument axis’

Keras 2.2.0 に対してバックエンドで TensorFlow 1.4.0 を使用すると softmax を使用した時に発生する。TensorFlow のバージョンを上げるか、環境上の理由で変更できないのであればエラーの報告されている .../keras/backend/tensorflow_backend.py の該当箇所を return tf.nn.softmax(x, axis) に変更する。

参照

  1. Francois Chollet (2018)PythonとKerasによるディープラーニング, マイナビ出版
  2. 太田満久, 須藤広大, 黒澤匠雅, 小田大輔 (2018) TensorFlow開発入門 Kerasによる深層学習モデル構築手法, 翔泳社
  3. Keras: CNN中間層出力の可視化