Riprendi e itera
Riprendi esattamente un'esecuzione interrotta, avvia una nuova iterazione da best.pt con un tasso di apprendimento effettivamente applicato e confronta le esecuzioni affiancate.
I progetti reali consistono in una serie di esecuzioni di training. Alcune si interrompono a metà — per un portatile chiuso, una sessione SSH persa o una GPU cloud riassegnata — e ricominciare da zero significa sprecare ore. Altre terminano e la iterazione successiva dovrebbe basarsi su di esse, invece di ripartire da COCO.
In questa lezione interromperai un'esecuzione e la riprenderai, avvierai la seconda iterazione da best.pt con un tasso di apprendimento effettivamente applicato e confronterai tutte le esecuzioni in un'unica tabella. Imparerai anche a riconoscere i due comportamenti di resume che fanno sprecare esecuzioni senza che te ne accorga.
Pratico
Scegli il tipo di esecuzione giusto#

| Situazione | Tipo di esecuzione | Punto di partenza |
|---|---|---|
| Interruzione di corrente, disconnessione o esaurimento della memoria durante l'esecuzione | Ripresa | last.pt, con lo stato dell'ottimizzatore e la pianificazione originali |
| Esecuzione terminata; più dati, correzione delle annotazioni o training più lungo | Avvio iniziale | best.pt come modello preaddestrato |
Classi aggiunte o rimosse, molte annotazioni modificate oppure imgsz cambiato in modo significativo | Da zero | yolo26n.pt |
Esempio pratico: riprendere un'esecuzione interrotta#
resume=True ripristina il modello, lo stato dell'ottimizzatore, la pianificazione del tasso di apprendimento e il contatore delle epoche da last.pt, poi prosegue seguendo il piano originale:
yolo train resume=True model=runs/detect/pills_resume/weights/last.ptOutput reale di un'esecuzione di 5 epoche interrotta dopo l'epoca 2:
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: è ripartita esattamente dall'ultima epoca salvata, mantenendo il numero di epoche previsto in origine.- Non hai passato
datanéepochs: tutti gli argomenti provenivano dal checkpoint. Alcune impostazioni di esecuzione, comebatch,deviceeworkers, possono essere sovrascritte quando riprendi; tutte le altre vengono ignorate con un avvisoResume ignores ....
Esempio pratico: avvio iniziale della seconda iterazione#
La maggior parte degli esperimenti della «iterazione successiva» non consiste nel riprendere un'esecuzione: si tratta di nuove esecuzioni che partono dall'ultimo modello valido — semplice apprendimento per trasferimento all'interno del tuo progetto. Usa un tasso di apprendimento più basso, così il modello affina le proprie prestazioni invece di reimparare da zero:
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt") # avvio iniziale dalla prima iterazione
model.train(
data="my_dataset/data.yaml",
epochs=5,
imgsz=320,
optimizer="AdamW", # impostalo esplicitamente: optimizer="auto" ignora lr0
lr0=0.0005, # più moderato dello 0.002 selezionato automaticamente per la prima iterazione
name="pills_v2_warm",
)Il log conferma che l'impostazione è stata applicata: optimizer: AdamW(lr=0.0005, momentum=0.937). La guida al fine-tuning tratta il congelamento dei layer e il training in due fasi; la guida all'ottimizzazione degli iperparametri tratta le ricerche sistematiche.
Esempio pratico: confrontare le esecuzioni#
Assegna a ogni esecuzione un nome che descriva la modifica — pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames — e non usare mai train2 o final. Ogni esecuzione genera un results.csv, quindi bastano poche righe per confrontarle:
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.694Cinque epoche con avvio iniziale hanno aumentato mAP50-95 da 0.659 a 0.694, mentre cinque epoche con i pesi COCO (pills_resume) hanno raggiunto solo 0.579. L'avvio iniziale permette di migliorare spendendo meno, purché classi e annotazioni non siano cambiate nel frattempo. Dopo alcune esecuzioni, uno strumento di monitoraggio si ripaga da sé: la Ultralytics Platform (consulta Confrontare le esecuzioni e scegliere la migliore) oppure le integrazioni Comet e Weights & Biases, che registrano automaticamente ogni esecuzione.
Riduci i costi di ogni iterazione#
La maggior parte delle iterazioni serve a rispondere a una domanda, ad esempio «i nuovi fotogrammi sono stati utili?». Mentre esplori, questi argomenti ti aiutano a ottenere risposte più rapidamente:
| Argomento | Esempio | Effetto |
|---|---|---|
fraction | fraction=0.5 | Esegue il training sulla prima metà delle immagini di training, ordinate per nome del file |
time | time=0.25 | Si arresta dopo 0.25 ore, sovrascrivendo epochs |
patience | patience=10 | Si arresta quando le prestazioni di validazione non migliorano per 10 epoche |
imgsz | imgsz=320 | Usa un quarto dei pixel rispetto a 640; confronta le esecuzioni solo alla stessa dimensione |
cache | cache=True | Mantiene le immagini decodificate in RAM, così il caricamento è più rapido nelle epoche successive |
Modifica una sola cosa per iterazione e conferma il risultato migliore con un'esecuzione alla dimensione completa prima di distribuirlo. Quando hai bisogno di ripartire da zero, usa lo stesso comando con i pesi preaddestrati:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # torna ai pesi preaddestrati su COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")Evita questi errori#
Sintomo: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, seguito da una nuova esecuzione — sul dataset predefinito coco8, a meno che tu non abbia passato data. Causa: resume=True riprende solo le esecuzioni interrotte in anticipo. Soluzione: interrompila e avvia intenzionalmente una nuova esecuzione da best.pt.
Sintomo: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically... Causa: il valore predefinito optimizer=auto sceglie autonomamente il tasso di apprendimento. Soluzione: imposta esplicitamente optimizer (ad esempio "AdamW" o "SGD") ogni volta che imposti lr0 e controlla la riga di log optimizer:.
Se esegui una seconda volta l'addestramento con name="pills_v1", i risultati vengono scritti in pills_v1-2, cosa che può facilmente creare confusione in seguito. Usa un nome nuovo e descrittivo per ogni esecuzione.
Mostra la soluzione
Se su una macchina veloce è difficile temporizzare Ctrl+C, un callback può interrompere l'esecuzione dopo l'epoca 2:
from ultralytics import YOLO
def power_cut(trainer):
if trainer.epoch == 1: # Indicizzato da 0: interrompi dopo aver salvato l'epoca 2
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.