ファインチューニング用のネットワーク再構成

Caffeにおけるファインチューニング用のネットワーク再構成とは、既存の事前学習済みネットワーク(たとえばImageNetで訓練されたモデル)を別のタスクやデータセットに適応させるために、ネットワーク構造の一部を変更または置き換えるプロセスです。これは転移学習の一形態であり、以下のようなステップで実施されます。


1. 再構成の目的

Caffeのモデルは.prototxtファイルでネットワークを定義します。ファインチューニングでは通常、以下のような目的でネットワークを再構成します。

  • 新しいタスクに合わせて出力層(分類層)を変更する(例:1000クラス → 10クラス)

  • 一部の層を初期化し直し再学習する

  • 学習率を層ごとに設定することで、事前学習済み層は微調整のみ、新規層は大きく更新する


2. train_val.prototxt の編集

再構成には、通常以下の編集を行います。

a. 最終層の差し替え

例:fc8 層を fc8_new に置き換え

protobuf
layer { name: "fc8_new" type: "InnerProduct" bottom: "fc7" top: "fc8_new" inner_product_param { num_output: 10 # 新しい分類数 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "loss" type: "SoftmaxWithLoss" bottom: "fc8_new" bottom: "label" top: "loss" }

b. 学習率の調整

既存の層の param フィールドで lr_mult を小さく設定し、微調整にとどめる。

protobuf
param { lr_mult: 0.1 decay_mult: 1 } # 重み param { lr_mult: 0.2 decay_mult: 0 } # バイアス

c. 新しい層の追加

新タスクに必要な層(BatchNorm, Dropout, GlobalPoolingなど)を追加する。


3. weightsの読み込みと初期化

solver.prototxtで定義された学習設定において、pretrained_modelパラメータで事前学習済みモデルを指定します:

protobuf
net: "models/my_model/train_val.prototxt" test_iter: 100 test_interval: 500 base_lr: 0.001 lr_policy: "step" ... snapshot_prefix: "models/my_model/finetune" pretrained_model: "models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"

このようにすると、ネットワークの構造が一致する層に対して重みがロードされ、それ以外の層(追加された出力層など)は自動的に初期化されます。


4. 注意点

  • .prototxtの層構成と.caffemodelの重み対応が正しくないと、Caffeは警告を出します(無視される層があるなど)。

  • nameが一致する層にしか重みは適用されないため、リネームした層には再学習が必要です。

  • 必要に応じて、ignore_missing: true オプションを使って未定義の重みを無視できます(NetParameterの読み込み時)。


まとめ

ファインチューニング用のネットワーク再構成では、

  • 目的に合わせて分類層などを再定義、

  • 学習率を層ごとに調整、

  • 事前学習済みモデルから重みを部分的にロードする
    ことで、既存の知識を活かしつつ、新しいタスクに適応する柔軟な学習が可能になります。これは特に学習データが少ないタスクにおいて非常に効果的です。

生成日:2025/05/23