Fortsetzen und iterieren
Setze einen unterbrochenen Trainingslauf exakt fort, starte einen neuen Durchlauf mit best.pt und einer tatsächlich angewendeten Lernrate und vergleiche die Trainingsläufe direkt miteinander.
Echte Projekte bestehen aus einer Reihe von Trainings. Manche werden mittendrin abgebrochen – etwa durch einen geschlossenen Laptop, eine unterbrochene SSH-Verbindung oder eine vorzeitig beendete Cloud-GPU-Instanz. Von vorn zu beginnen bedeutet, stundenlange Arbeit wegzuwerfen. Andere Trainingsläufe werden abgeschlossen; der nächste Durchlauf sollte darauf aufbauen, statt wieder mit COCO zu starten.
In dieser Lektion unterbrichst du einen Trainingslauf und setzt ihn fort, startest den zweiten Durchlauf mit best.pt und einer tatsächlich angewendeten Lernrate und vergleichst alle Trainingsläufe in einer Tabelle. Außerdem lernst du zwei Verhaltensweisen von resume kennen, durch die Trainingsläufe unbemerkt verschwendet werden.
Praxisnah
Die richtige Art von Trainingslauf wählen#

| Situation | Art des Trainingslaufs | Ausgangspunkt |
|---|---|---|
| Stromausfall, Verbindungsabbruch oder unzureichender Arbeitsspeicher während des Trainings | Fortsetzen | last.pt mit seinem Optimiererzustand und Zeitplan |
| Trainingslauf abgeschlossen; mehr Daten, korrigierte Labels oder längeres Training | Warmstart | best.pt als vortrainiertes Modell |
Klassen hinzugefügt oder entfernt, viele Labels geändert oder imgsz stark verändert | Neustart | yolo26n.pt |
Praxisbeispiel: Einen unterbrochenen Trainingslauf fortsetzen#
resume=True stellt das Modell, den Optimiererzustand, den Lernraten-Zeitplan und den Epochen-Zähler aus last.pt wieder her und setzt dann den ursprünglichen Plan fort:
yolo train resume=True model=runs/detect/pills_resume/weights/last.ptEchte Ausgabe eines Trainingslaufs mit 5 Epochen, der nach Epoche 2 gestoppt wurde:
Resuming training runs/detect/pills_resume/weights/last.pt from epoch 3 to 5 total epochs
3/5 0G 1.232 2.393 0.005478 206 320: 100% 6/6 4.5s
4/5 0G 1.345 1.859 0.005833 208 320: 100% 6/6 4.5s
5/5 0G 1.31 1.625 0.005854 191 320: 100% 6/6 4.4s
3 epochs completed in 0.004 hours.from epoch 3 to 5 total epochs: Der Trainingslauf setzte exakt nach der letzten gespeicherten Epoche mit dem ursprünglichen Ziel fort.- Du hast weder
datanochepochsübergeben: Alle Argumente stammten aus dem Prüfpunkt. Einige Laufzeiteinstellungen wiebatch,deviceundworkerskönnen beim Fortsetzen überschrieben werden; alle anderen werden mit einerResume ignores ...-Warnung ignoriert.
Praxisbeispiel: Den zweiten Durchlauf mit einem Warmstart beginnen#
Bei den meisten Experimenten für den „nächsten Durchlauf“ handelt es sich nicht um Fortsetzungen, sondern um neue Trainingsläufe, die mit deinem letzten guten Modell starten – schlichtes Transferlernen innerhalb deines eigenen Projekts. Verwende eine niedrigere Lernrate, damit das Modell verfeinert wird, statt erneut zu lernen:
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt") # # Warmstart mit Durchlauf 1
model.train(
data="my_dataset/data.yaml",
epochs=5,
imgsz=320,
optimizer="AdamW", # # Explizit festlegen: optimizer="auto" ignoriert lr0
lr0=0.0005, # # Zurückhaltender als der in Durchlauf 1 automatisch gewählte Wert 0.002
name="pills_v2_warm",
)Das Protokoll bestätigt, dass die Einstellung wirksam war: optimizer: AdamW(lr=0.0005, momentum=0.937). Der Leitfaden zur Feinabstimmung behandelt das Einfrieren von Schichten und das zweistufige Training; der Leitfaden zur Hyperparameteroptimierung behandelt Suchläufe.
Praxisbeispiel: Trainingsläufe vergleichen#
Benenne jeden Trainingslauf nach der jeweiligen Änderung – pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames –, niemals train2 oder final. Jeder Trainingslauf schreibt eine results.csv; ein Vergleich ist daher mit wenigen Zeilen erledigt:
from pathlib import Path
import pandas as pd
for csv in sorted(Path("runs/detect").glob("*/results.csv")):
df = pd.read_csv(csv)
best = df["metrics/mAP50-95(B)"].max()
print(f"{csv.parent.name:<14} epochs={len(df):<3} best mAP50-95={best:.3f}")pills_resume epochs=5 best mAP50-95=0.579
pills_v1 epochs=10 best mAP50-95=0.659
pills_v2_warm epochs=5 best mAP50-95=0.694Fünf Epochen mit Warmstart steigerten mAP50-95 von 0.659 auf 0.694, während fünf Epochen mit COCO-Gewichten (pills_resume) nur 0.579 erreichten. Ein Warmstart bringt Fortschritte mit weniger Aufwand – sofern sich Klassen und Labels nicht geändert haben. Ab einer Handvoll Trainingsläufe lohnt sich ein Tracking-Werkzeug: Die Ultralytics Platform (siehe Trainingsläufe vergleichen und den besten auswählen) oder die Integrationen von Comet und Weights & Biases protokollieren jeden Trainingslauf automatisch.
Jeden Durchlauf mit geringem Aufwand halten#
Die meisten Durchläufe beantworten eine Frage, etwa: „Haben die neuen Bilder geholfen?“. Mit diesen Argumenten erhältst du beim Erkunden schneller Antworten:
| Argument | Beispiel | Auswirkung |
|---|---|---|
fraction | fraction=0.5 | Trainiert mit der ersten Hälfte der Trainingsbilder (nach Dateiname sortiert) |
time | time=0.25 | Bricht nach 0.25 Stunden ab und überschreibt epochs |
patience | patience=10 | Bricht ab, wenn sich die Validierungsleistung über 10 Epochen nicht verbessert hat |
imgsz | imgsz=320 | Ein Viertel der Pixelanzahl bei 640; vergleiche Trainingsläufe nur bei gleicher Größe |
cache | cache=True | Behält dekodierte Bilder im Arbeitsspeicher, damit sie in späteren Epochen schneller geladen werden |
Ändere pro Durchlauf nur eine Sache und bestätige das beste Ergebnis mit einem vollständigen Trainingslauf bei voller Bildgröße, bevor du es einsetzt. Wenn du tatsächlich neu starten musst, verwendest du denselben Aufruf mit den vortrainierten Gewichten:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # zurück zu den mit COCO vortrainierten Gewichten
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")Diese Fehler vermeiden#
Symptom: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, gefolgt von einem völlig neuen Lauf – auf dem standardmäßigen Datensatz coco8, sofern du nicht data übergeben hast. Ursache: resume=True setzt nur Läufe fort, die vorzeitig abgebrochen wurden. Lösung: Beende den Vorgang und starte bewusst einen neuen Lauf mit best.pt.
Symptom: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically... Ursache: Der Standardwert optimizer=auto wählt die Lernrate selbst. Lösung: Setze optimizer ausdrücklich (zum Beispiel "AdamW" oder "SGD"), wenn du lr0 festlegst, und prüfe die Protokollzeile optimizer:.
Wenn du ein zweites Mal mit name="pills_v1" trainierst, wird in pills_v1-2 geschrieben, was später leicht zu Verwechslungen führt. Verwende für jeden Lauf einen neuen, aussagekräftigen Namen.
Lösung anzeigen
Wenn es auf einem schnellen Rechner schwierig ist, Ctrl+C rechtzeitig zu drücken, kann ein Callback den Lauf nach Epoche 2 für dich stoppen:
from ultralytics import YOLO
def power_cut(trainer):
if trainer.epoch == 1: # 0-indiziert: nach dem Speichern von Epoche 2 stoppen
raise KeyboardInterrupt
model = YOLO("yolo26n.pt")
model.add_callback("on_model_save", power_cut)
model.train(data="my_dataset/data.yaml", epochs=5, imgsz=320, name="pills_resume")yolo train resume=True model=runs/detect/pills_resume/weights/last.pt
python round2.py
python compare_runs.pypills_v2_warm has the best mAP50-95 (0.694 vs 0.659 for pills_v1), with the same
classes and labels, so round three warm-starts from pills_v2_warm/weights/best.pt.