Transferlernen mit eingefrorenen Schichten
📚 Diese Anleitung erklärt, wie man YOLOv5 🚀 Schichten einfriert, wenn Transfer-Lernen. 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 anfänglichen Gewichte an Ort und Stelle 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 Sie beginnen
Repo klonen und requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuestenVersion von YOLOv5 heruntergeladen.
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Backbone einfrieren
Alle Schichten, die mit der train.py 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 anzuzeigen:
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
"""
Ein Blick auf die Modellarchitektur zeigt, dass die Schichten 0-9 das Rückgrat des Modells bilden:
# 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 Faltungsschichten 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 dem offiziellen COCO Pre-Training --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 ist die Auslastung von GPU umso geringer, je mehr Module eingefroren sind und je weniger GPU Speicher zum Trainieren benötigt wird. Dies deutet darauf hin, dass größere Modelle oder Modelle, die mit einer größeren Bildgröße trainiert wurden, 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, z. B. CUDA, CUDNN, Python, und PyTorchvorinstalliert, um Ihre Projekte in Gang zu bringen.
- Kostenlose GPU Notizbücher:
- Google Wolke: GCP-Schnellstart-Anleitung
- Amazon: AWS Schnellstart-Anleitung
- Azure: AzureML-Schnellstart-Anleitung
- 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 Schlüsselbereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu, wobei die Tests alle 24 Stunden und bei jeder neuen Übertragung durchgeführt werden.