Transferlernen mit eingefrorenen Schichten
📚 In dieser Anleitung wird erklärt, wie man YOLOv5 🚀 Schichten beim Transferlernen einfriert. Transferlernen ist eine nützliche Methode, um ein Modell schnell auf neue Daten zu trainieren, ohne dass das gesamte Netz neu trainiert werden muss. Stattdessen wird ein Teil der ursprünglichen Gewichte eingefroren und der Rest der Gewichte wird zur Berechnung des Verlusts verwendet und vom Optimierer aktualisiert. Dies erfordert weniger Ressourcen als ein normales Training und ermöglicht kürzere Trainingszeiten, kann aber auch zu einer Verringerung der endgültigen Trainingsgenauigkeit führen.
Bevor du anfängst
Klone das Repo und installiere die requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5 Version heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Backbone einfrieren
Alle Ebenen, die der train.py entsprechen freeze
Liste in train.py werden eingefroren, indem ihre Gradienten auf Null gesetzt werden, bevor das Training beginnt.
# 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
Um eine Liste der Modulnamen zu sehen:
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
"""
Wenn wir uns die Modellarchitektur ansehen, sehen wir, dass das Rückgrat des Modells die Schichten 0-9 sind:
# 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)
Wir können also die Freeze-Liste so definieren, dass sie alle Module enthält, die 'model.0.' - 'model.9.' in ihrem Namen enthalten:
Alle Ebenen einfrieren
Um das gesamte Modell mit Ausnahme der letzten Ausgangsfaltungsschichten in Detect() einzufrieren, setzen wir freeze list so, dass es alle Module mit 'model.0. - model.23.' in ihrem Namen enthalten:
Ergebnisse
Wir trainieren YOLOv5m auf VOC für die beiden oben genannten Szenarien zusammen mit einem Standardmodell (kein Einfrieren), ausgehend von den offiziellen COCO Pre-Trainings --weights yolov5m.pt
:
train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml
Genauigkeitsvergleich
Die Ergebnisse zeigen, dass das Einfrieren das Training beschleunigt, aber die endgültige Genauigkeit leicht verringert.
GPU Vergleich der Inanspruchnahme
Interessanterweise gilt: Je mehr Module eingefroren werden, desto weniger GPU Speicher wird für das Training benötigt und desto geringer ist die GPU Auslastung. Dies deutet darauf hin, dass größere Modelle oder Modelle, die mit einer größeren Bildgröße trainiert werden, vom Einfrieren profitieren können, um schneller zu trainieren.
Unterstützte Umgebungen
Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten vorinstalliert sind, wie z. B. CUDA, CUDNN, Python, und PyTorch, um deine Projekte zu starten.
- Kostenlose GPU Notizbücher:
- Google Cloud: GCP Schnellstart-Anleitung
- Amazon: AWS Schnellstart-Anleitung
- Azure: AzureML Schnellstartanleitung
- Docker: Docker Schnellstart-Anleitung
Projektstatus
Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen Bereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu. Die Tests werden alle 24 Stunden und bei jeder neuen Übertragung durchgeführt.