Reanudar e iterar
Reanuda exactamente una ejecución interrumpida, inicia una nueva ronda desde best.pt con una tasa de aprendizaje que se aplique de verdad y compara las ejecuciones una al lado de la otra.
Los proyectos reales constan de una serie de ejecuciones de entrenamiento. Algunas se interrumpen a mitad de camino —por cerrar el portátil, perder una sesión SSH o porque se reclame una GPU en la nube— y empezar de cero supone perder horas de trabajo. Otras terminan, y la siguiente ronda debería aprovecharlas en lugar de volver a empezar desde COCO.
En esta lección interrumpirás una ejecución y la reanudarás, iniciarás la segunda ronda desde best.pt con una tasa de aprendizaje que se aplique de verdad y compararás todas las ejecuciones en una tabla. También aprenderás cuáles son los dos comportamientos de resume que hacen perder tiempo sin que te des cuenta.
Práctico
Elige el tipo de ejecución adecuado#

| Situación | Tipo de ejecución | Se inicia desde |
|---|---|---|
| Corte de corriente, desconexión o falta de memoria durante la ejecución | Reanudación | last.pt, con su estado del optimizador y su plan de aprendizaje |
| Ejecución terminada; más datos, una corrección de las etiquetas o un entrenamiento más largo | Inicio desde pesos preentrenados | best.pt como modelo preentrenado |
Se han añadido o eliminado clases, se han cambiado muchas etiquetas o imgsz ha cambiado mucho | Desde cero | yolo26n.pt |
Ejemplo práctico: reanudar una ejecución interrumpida#
resume=True restaura el modelo, el estado del optimizador, el plan de tasa de aprendizaje y el contador de épocas desde last.pt; después, continúa con el plan original:
yolo train resume=True model=runs/detect/pills_resume/weights/last.ptSalida real de una ejecución de 5 épocas interrumpida después de la é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: reanudó la ejecución justo después de la última época guardada y mantuvo el objetivo original.- No has pasado
dataniepochs: todos los argumentos procedían del punto de control. Algunos ajustes de ejecución, comobatch,deviceyworkers, se pueden sobrescribir al reanudar; cualquier otro ajuste se ignora y genera una advertenciaResume ignores ....
Ejemplo práctico: iniciar la segunda ronda desde pesos preentrenados#
La mayoría de los experimentos de la «siguiente ronda» no reanudan una ejecución; son ejecuciones nuevas que parten de tu último buen modelo: es aprendizaje por transferencia dentro de tu propio proyecto. Usa una tasa de aprendizaje más baja para que el modelo se refine en lugar de volver a aprender:
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt") # iniciar desde los pesos de la ronda 1
model.train(
data="my_dataset/data.yaml",
epochs=5,
imgsz=320,
optimizer="AdamW", # establecer explícitamente: optimizer="auto" ignora lr0
lr0=0.0005, # más suave que el 0.002 seleccionado automáticamente en la ronda 1
name="pills_v2_warm",
)El registro confirma que el ajuste se ha aplicado: optimizer: AdamW(lr=0.0005, momentum=0.937). La guía de ajuste fino explica cómo congelar capas y entrenar en dos fases; la guía de ajuste de hiperparámetros explica los barridos.
Ejemplo práctico: comparar ejecuciones#
Pon a cada ejecución un nombre que indique qué ha cambiado —pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames—; nunca uses train2 ni final. Cada ejecución genera un results.csv, así que comparar resultados solo requiere unas pocas líneas:
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 desde pesos preentrenados elevaron mAP50-95 de 0.659 a 0.694, mientras que cinco épocas con los pesos de COCO (pills_resume) solo alcanzaron 0.579. Iniciar desde pesos preentrenados permite avanzar con menos coste, siempre que las clases y las etiquetas no hayan cambiado. Cuando acumules varias ejecuciones, un sistema de seguimiento compensa: Ultralytics Platform (consulta Comparar ejecuciones y elegir la mejor) o las integraciones con Comet y Weights & Biases, que registran automáticamente todas las ejecuciones.
Reduce el coste de cada ronda#
La mayoría de las rondas responden a una pregunta, como «¿han servido de algo los fotogramas nuevos?». Estos argumentos te permiten obtener respuestas más rápido mientras exploras:
| Parámetro | Ejemplo | Efecto |
|---|---|---|
fraction | fraction=0.5 | Entrena con la primera mitad de las imágenes de entrenamiento (ordenadas por nombre de archivo) |
time | time=0.25 | Se detiene después de 0.25 horas y sobrescribe epochs |
patience | patience=10 | Se detiene cuando la aptitud de validación no mejora durante 10 épocas |
imgsz | imgsz=320 | Una cuarta parte de los píxeles de 640; compara ejecuciones solo si tienen el mismo tamaño |
cache | cache=True | Mantiene las imágenes decodificadas en RAM para acelerar la carga en las épocas siguientes |
Cambia una sola cosa por ronda y confirma que es la mejor opción con una ejecución a tamaño completo antes de ponerla en producción. Si necesitas empezar de cero, usa la misma llamada con los pesos preentrenados:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # volver a los pesos preentrenados con COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")Evita estos errores#
Síntoma: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, seguido de una ejecución completamente nueva, con el conjunto de datos predeterminado coco8 salvo que pasaras data. Causa: resume=True solo continúa las ejecuciones que se detuvieron antes de terminar. Solución: detén el proceso e inicia deliberadamente una ejecución nueva a partir de best.pt.
Síntoma: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically.... Causa: el valor predeterminado optimizer=auto elige su propia tasa de aprendizaje. Solución: establece explícitamente optimizer (por ejemplo, "AdamW" o "SGD") siempre que establezcas lr0, y confirma la línea de registro optimizer:.
Si vuelves a entrenar con name="pills_v1", los resultados se guardan en pills_v1-2, lo que puede llevar a confusiones más adelante. Usa un nombre nuevo y descriptivo para cada ejecución.
Mostrar solución
Si te cuesta calcular el momento de pulsar Ctrl+C en un equipo rápido, una devolución de llamada puede detener la ejecución por ti después de la época 2:
from ultralytics import YOLO
def power_cut(trainer):
if trainer.epoch == 1: # Indexado desde 0: detener después de guardar la é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.