事前学習済みモデルの利用(chainercv.models など)

Chainerにおける転移学習とファインチューニングの手法の一つに、「事前学習済みモデルの利用」があります。これは、既に大規模なデータセット(例:ImageNet)で訓練されたモデルの重みを利用して、新たなタスクに適応させる方法です。Chainerでは主に chainercv.models モジュールを用いることで、VGG、ResNet、SSDなどの事前学習済みモデルに簡単にアクセスできます。


1. 転移学習とは

転移学習(Transfer Learning)は、別のタスクで学習したモデルの重み(特徴表現)を流用して、新しい関連タスクの学習を加速または精度向上する手法です。


2. chainercv.models の基本的な使い方

例:事前学習済みのResNet50を使う

python
from chainercv.links import ResNet50 import chainer # 事前学習済みモデルを読み込む model = ResNet50(pretrained_model='imagenet')

このコードで、ImageNetで学習されたResNet50の重みがロードされます。


3. 転移学習の一般的なステップ

ステップ1:事前学習済みモデルの読み込み

python
model = ResNet50(pretrained_model='imagenet')

ステップ2:出力層の置換

タスクが異なる場合(例:1000クラス → 10クラスなど)、最後の全結合層を差し替えます。

python
import chainer.links as L import chainer.functions as F # 1000クラス → 10クラス分類に変更 model.fc6 = L.Linear(None, 10)

ステップ3:ファインチューニング

部分的に学習させる層を選び、それ以外は requires_grad=False に相当する手法で固定します。Chainerでは、層を選んでoptimizerに登録することで制御します。

python
# 出力層だけを最適化対象に optimizer = chainer.optimizers.Adam() optimizer.setup(model.fc6)

必要に応じて、他の層も optimizer.add_hook() で加えることができます。


4. 特徴抽出器としての利用

モデル全体を凍結し、出力特徴ベクトルだけを新しい分類器に入力する方法です。

python
# forward計算を改造して特徴抽出だけ行う def extract_features(x): h = model.conv1(x) h = model.res2(h) h = model.res3(h) h = model.res4(h) h = model.res5(h) return F.average_pooling_2d(h, ksize=h.shape[2:])

5. 利用可能な事前学習済みモデル(chainercv.models より一部)

モデル名 用途 学習済みデータセット
ResNet50 画像分類 ImageNet
VGG16 画像分類 ImageNet
SSD300 物体検出 VOC, COCO
FasterRCNN 物体検出 VOC, COCO

6. 注意点

  • pretrained_model='imagenet' を指定しないと、重みは初期化されます。

  • モデルの構造を変更する際は、既存の重みに依存する部分が壊れないよう注意が必要です。

  • データセットの入力サイズ・前処理がモデルに適合しているか確認する必要があります(特に物体検出系)。


まとめ

Chainerでは chainercv.models を用いることで、簡単に事前学習済みモデルをロードし、転移学習やファインチューニングに活用できます。新たなタスクに対しては出力層を差し替える、あるいは特徴抽出器として用いることで、少ないデータでも高い精度を実現しやすくなります。

生成日:2025/05/23