Retomar e iterar
Retoma exatamente uma execução interrompida, inicia um novo ciclo a partir de best.pt com uma taxa de aprendizagem que seja efetivamente aplicada e compara as execuções lado a lado.
Os projetos reais consistem numa série de execuções de treino. Algumas param a meio — porque se fecha um portátil, se perde uma sessão SSH ou se interrompe uma GPU na cloud — e recomeçar do zero desperdiça horas. Outras terminam, e o ciclo seguinte deve basear-se nelas em vez de começar novamente com COCO.
Nesta lição, vais interromper uma execução e retomá-la, iniciar o segundo ciclo a partir de best.pt com uma taxa de aprendizagem que seja efetivamente aplicada e comparar todas as execuções numa tabela. Também vais aprender dois comportamentos de resume que desperdiçam execuções sem dares por isso.
Prático
Escolhe o tipo de execução certo#

| Situação | Tipo de execução | Começa a partir de |
|---|---|---|
| Falha de energia, desconexão ou falta de memória a meio da execução | Retomar | last.pt, com o respetivo estado do otimizador e plano de aprendizagem |
| Execução concluída; mais dados, uma correção de anotações ou treino mais longo | Iniciar a partir de pesos existentes | best.pt como modelo pré-treinado |
Classes adicionadas ou removidas, muitas anotações alteradas ou imgsz bastante alterado | Do zero | yolo26n.pt |
Exemplo prático: retomar uma execução interrompida#
resume=True restaura o modelo, o estado do otimizador, o plano da taxa de aprendizagem e o contador de épocas a partir de last.pt e, depois, continua o plano original:
yolo train resume=True model=runs/detect/pills_resume/weights/last.ptSaída real de uma execução de 5 épocas interrompida após a época 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: retomou exatamente após a última época guardada, com o objetivo original.- Não especificaste
datanemepochs: todos os argumentos vieram do ponto de controlo. Algumas definições de execução, comobatch,deviceeworkers, podem ser substituídas ao retomar; todas as outras são ignoradas, com um avisoResume ignores ....
Exemplo prático: iniciar o segundo ciclo a partir de pesos existentes#
A maioria das experiências do tipo "ciclo seguinte" não consiste em retomar uma execução; são novas execuções que partem do teu último modelo válido — aprendizagem por transferência simples dentro do teu próprio projeto. Usa uma taxa de aprendizagem mais baixa para refinar o modelo em vez de o treinar novamente:
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt") # # iniciar a partir dos pesos do ciclo 1
model.train(
data="my_dataset/data.yaml",
epochs=5,
imgsz=320,
optimizer="AdamW", # # definir explicitamente: optimizer="auto" ignora lr0
lr0=0.0005, # # mais suave do que os 0.002 selecionados automaticamente no ciclo 1
name="pills_v2_warm",
)O registo confirma que a definição foi aplicada: optimizer: AdamW(lr=0.0005, momentum=0.937). O guia de ajuste fino aborda o congelamento de camadas e o treino em duas etapas; o guia de ajuste de hiperparâmetros aborda as pesquisas.
Exemplo prático: comparar execuções#
Dá a cada execução um nome que indique o que foi alterado — pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames — nunca train2 nem final. Cada execução cria um results.csv, por isso a comparação requer apenas algumas linhas:
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.694Cinco épocas iniciadas a partir de pesos existentes elevaram o mAP50-95 de 0.659 para 0.694, enquanto cinco épocas com pesos de COCO (pills_resume) chegaram apenas a 0.579. Iniciar a partir de pesos existentes permite progredir com menos esforço — desde que as classes e as anotações não tenham sido alteradas entretanto. Após algumas execuções, uma ferramenta de acompanhamento compensa: Ultralytics Platform (consulta Comparar execuções e escolher a melhor) ou as integrações Comet e Weights & Biases, que registam automaticamente todas as execuções.
Mantém cada ciclo económico#
A maioria dos ciclos responde a uma pergunta, como "os novos fotogramas ajudaram?". Estes argumentos permitem obter respostas mais rapidamente enquanto exploras:
| Argumento | Exemplo | Efeito |
|---|---|---|
fraction | fraction=0.5 | Treina com a primeira metade das imagens de treino (ordenadas pelo nome do ficheiro) |
time | time=0.25 | Para após 0.25 horas, substituindo epochs |
patience | patience=10 | Para quando a aptidão de validação não melhora durante 10 épocas |
imgsz | imgsz=320 | Um quarto dos píxeis de 640; compara execuções apenas com o mesmo tamanho |
cache | cache=True | Mantém as imagens descodificadas na RAM para acelerar o carregamento nas épocas seguintes |
Altera uma coisa por ciclo e confirma o melhor resultado com uma execução em tamanho completo antes de o lançar. Quando precisares de começar do zero, usa a mesma chamada com os pesos pré-treinados:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # voltar aos pesos pré-treinados no COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")Evita estes erros#
Sintoma: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, seguido de uma execução completamente nova — no conjunto de dados predefinido coco8, a menos que tenhas passado data. Causa: resume=True só continua execuções que tenham parado antes do fim. Solução: interrompe-a e inicia deliberadamente uma nova execução a partir de best.pt.
Sintoma: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically.... Causa: o optimizer=auto predefinido escolhe a sua própria taxa de aprendizagem. Solução: define explicitamente optimizer (por exemplo, "AdamW" ou "SGD") sempre que definires lr0 e confirma a linha de registo optimizer:.
Treinar com name="pills_v1" uma segunda vez grava em pills_v1-2, o que pode causar confusão mais tarde. Usa um nome novo e descritivo para cada execução.
Mostrar solução
Se for difícil acertar o momento do Ctrl+C em uma máquina rápida, um callback pode interromper a execução após a época 2:
from ultralytics import YOLO
def power_cut(trainer):
if trainer.epoch == 1: # Indexado a partir de 0: interrompa após salvar a época 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.