層の凍結と再学習(layer.trainable = False)

Kerasにおける転移学習ファインチューニングでは、「層の凍結(freeze)」や「再学習(unfreeze)」の操作が重要です。これらは、モデルの一部の層の重みを固定したり、再び学習可能にしたりすることで、学習効率や汎化性能を高めるために利用されます。


1. 層の凍結(layer.trainable = False

概要

転移学習では通常、**事前学習済みモデル(例:VGG16, ResNet)をベースにして、新しいタスクに対する学習を行います。その際、事前学習モデルの一部またはすべての層の重みを固定(凍結)**することで、既存の知識(低レベル特徴など)を保持します。

凍結の方法(コード例)

python
from tensorflow.keras.applications import VGG16 # 事前学習済みモデル(全層含む)を読み込み base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # すべての層を凍結(学習不可に) for layer in base_model.layers: layer.trainable = False

この設定により、model.fit()を行ってもこれらの層の重みは更新されず、固定された状態になります。


2. 新しいタスクのための出力層の追加

事前学習済みの部分に新しい出力層を追加して、新しいデータセットに適応させます。

python
from tensorflow.keras import models, layers # 転移学習用の新しいモデル構築 model = models.Sequential([ base_model, # 凍結済みのベース layers.Flatten(), layers.Dense(256, activation='relu'), layers.Dense(10, activation='softmax') # クラス数に応じて変更 ])

3. 層の再学習(ファインチューニング)

概要

転移学習の第2段階として、凍結していた一部の層を再び学習可能(unfreeze)にすることで、より対象データに特化したモデルに調整する手法がファインチューニングです。

再学習の方法(コード例)

python
# 最後の数層だけ再学習可能にする for layer in base_model.layers[-4:]: layer.trainable = True

※学習率は小さめに設定するのが一般的です(例:optimizer=Adam(learning_rate=1e-5))。これは、事前学習済みの重みを大きく変えすぎないためです。


4. 凍結・再学習の流れ(まとめ)

ステップ 内容 目的
① モデルの読み込み 事前学習済みモデル(例:VGG16)を読み込む 既存の知識(特徴抽出能力)を活用
② 層の凍結 layer.trainable = False 不必要な重み更新を防ぐ
③ 出力層の追加 新しい分類タスクに合わせて出力層を追加 新タスクに適応
④ 転移学習 凍結済みモデル+新出力層を訓練 出力層のみ学習
⑤ ファインチューニング 上位層を再学習(trainable=True モデルを新データにさらに適応

5. 注意点

  • BatchNormalization層は凍結・再学習の際の挙動が特殊です。訓練・推論のモードによって挙動が変わるため、凍結時は特に慎重に扱う必要があります。

  • 層を再学習可能にした場合は、model.compile()を再度実行する必要があります。これは、コンパイル時に各層のtrainable状態が固定されるためです。


このように、Kerasではlayer.trainable = Falseを使うことで、事前学習モデルの層の学習可否を柔軟に制御し、効果的な転移学習・ファインチューニングが実現できます。

生成日:2025/05/22