Pytorchで転移学習


転移学習とFine Tuninguの違い

– 転移学習:既存の学習済モデル(出力層以外の部分)を、重みデータは変更せずに特徴量抽出機として利用する。
– ファインチューニング:既存の学習済モデル(出力層以外の部分)を、重みデータを一部再学習して特徴量抽出機として利用する。

引用:”Keras / Tensorflowで転移学習を行う”

PyTorchでFine-Tuning

転移学習とFine-Tuningの違いは、

  1. 転移学習:出力層だけを学習させるか
  2. Fine-Tuning:出力層以外も学習させるか

PyTorchでは、

  1. 転移学習:出力層以外のパラメータを固定する
  2. Fine-Tuning:パラメータを固定しない(一部固定するも)

転移学習

今回は、ResNetを使用します。

転移学習で重要なのは、”パラメータの固定”です。

pytorchでは、”requires_grad = False”でパラメータの固定をします。

入力画像のサイズ

入力画像のサイズは、(224, 224)なので、リサイズする必要があります。

data_transform = transforms.Compose([
    transforms.Resized(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

モデルの読み込み

from torchvision import models

net = models.resnet18(pretrained=True)

パラメータの固定

転移学習では、モデルのパラメータを固定します。

#ネットワークのパラメータを固定
for param in net.parameters():
    param.requires_grad = False

出力層のノード数の変更

出力層をnクラスに変更します。

今回は、2クラスとします。

#出力層をnクラスに変更
num_ftrs = net.fc.in_features
net.fc = nn.Linear(num_ftrs, 2).to(device)
net = net.to(device)

参考

Keras / Tensorflowで転移学習を行う