コンテンツへスキップ

凍結層による転移学習

このガイドでは、転移学習時にYOLOv5 🚀層を凍結する方法を説明します。転移学習は、ネットワーク全体を再学習させることなく、新しいデータに対してモデルを素早く再学習させる便利な方法です。その代わりに、初期の重みの一部はそのまま凍結され、残りの重みは損失を計算するために使用され、オプティマイザによって更新されます。これは通常の学習よりも少ないリソースで済み、学習時間を短縮できるが、最終的な学習精度が低下する可能性がある。

始める前に

レポをクローンし、requirements.txtをPython>=3.8.0環境にインストールする。 PyTorch>=1.8.モデルとデータセットは、最新のYOLOv5 リリースから自動的にダウンロードされます。

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

フリーズ・バックボーン

train.pyにマッチする全てのレイヤー freeze のリストは、トレーニング開始前に勾配をゼロに設定することで凍結されます。

# Freeze
freeze = [f'model.{x}.' for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f'freezing {k}')
        v.requires_grad = False

モジュール名のリストを見るには

for k, v in model.named_parameters():
    print(k)

"""Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

モデル・アーキテクチャを見ると、モデルのバックボーンはレイヤー0から9であることがわかる:

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  - [-1, 1, Conv, [64, 6, 2, 2]]  # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
  - [-1, 3, C3, [128]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C3, [256]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 9, C3, [512]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C3, [1024]]
  - [-1, 1, SPPF, [1024, 5]]  # 9


# YOLOv5 v6.0 head
head:
  - [-1, 1, Conv, [512, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C3, [512, False]]  # 13

  - [-1, 1, Conv, [256, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C3, [256, False]]  # 17 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 14], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C3, [512, False]]  # 20 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C3, [1024, False]]  # 23 (P5/32-large)

  - [[17, 20, 23], 1, Detect, [nc]]  # Detect(P3, P4, P5)

というわけで、'model.0.' を名前に含むすべてのモジュールを含むように、フリーズリストを定義することができます。- model.9.'を含むすべてのモジュールをフリーズリストに含めることができます:

python train.py --freeze 10

すべてのレイヤーをフリーズ

Detect()の最終出力コンボリューションレイヤーを除くフルモデルをフリーズさせるために、フリーズリストに、名前に'model.0.''model.23.- model.23.'を含むすべてのモジュールを含むように設定する:

python train.py --freeze 24

結果

VOC上のYOLOv5mを、上記の2つのシナリオとデフォルトモデル(凍結なし)で訓練する。 --weights yolov5m.pt:

train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

精度比較

その結果、フリーズはトレーニングをスピードアップさせるが、最終的な精度はわずかに低下することがわかった。

冷凍トレーニングmAP50の結果

冷凍トレーニングmAP50-95の結果

表結果

GPU使用率の比較

興味深いことに、より多くのモジュールをフリーズさせればさせるほど、トレーニングに必要なGPUメモリが少なくなり、GPU使用率が下がる。このことは、より大きなモデルや、より大きな画像サイズでトレーニングされたモデルは、より高速にトレーニングするためにフリーズすることが有益であることを示している。

トレーニングGPUメモリ割り当て率

トレーニングGPUメモリ使用率

対応環境

Ultralytics は、CUDAや CUDNNといった必要不可欠な依存関係がプリインストールされた、すぐに使えるさまざまな環境を提供します、 Pythonそして PyTorchなどの不可欠な依存関係がプリインストールされています。

プロジェクト状況

YOLOv5 CI

このバッジは、YOLOv5 GitHub ActionsContinuous Integration (CI) テストがすべて正常にパスしていることを示します。これらのCIテストは、トレーニング検証推論エクスポートベンチマークといったさまざまな重要な側面にわたって、YOLOv5 の機能とパフォーマンスを厳密にチェックします。これらのテストは、macOS、Windows、Ubuntu上で、24時間ごとおよび新しいコミットごとに実施され、一貫した信頼性の高い動作を保証します。



作成日:2023-11-12 更新日:2024-01-14
作成者:glenn-jocher(4)

コメント