Ultralytics YOLO27: Únete a la lista de espera.
Get Started
Entrena tu primer modelo YOLO·Entrenar·Lección 8/10
Lecciónprincipiante

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.

Resultado

Sabrás elegir correctamente entre reanudar, iniciar desde pesos preentrenados y empezar de cero; ejecutarás cada opción y compararás las ejecuciones en una tabla.

Vía rápida
Si ya tienes experiencia, aquí tienes un resumen.
  1. ¿Se ha interrumpido y no ha cambiado nada? yolo train resume=True model=.../weights/last.pt.

  2. ¿Ha terminado o vas a cambiar los datos o la configuración? Inicia una nueva ejecución desde .../weights/best.pt.

  3. Para establecer lr0, establece también optimizer; con optimizer=auto, se ignora lr0.

  4. Pon a cada ejecución un nombre que indique qué ha cambiado y compara sus archivos results.csv.

Práctico

Elige el tipo de ejecución adecuado#

Gráficos de entrenamiento de Ultralytics Platform que muestran las curvas de pérdida y métricas de una ejecución a lo largo de las épocas

SituaciónTipo de ejecuciónSe inicia desde
Corte de corriente, desconexión o falta de memoria durante la ejecuciónReanudaciónlast.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 largoInicio desde pesos preentrenadosbest.pt como modelo preentrenado
Se han añadido o eliminado clases, se han cambiado muchas etiquetas o imgsz ha cambiado muchoDesde ceroyolo26n.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.pt

Salida 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 data ni epochs: todos los argumentos procedían del punto de control. Algunos ajustes de ejecución, como batch, device y workers, se pueden sobrescribir al reanudar; cualquier otro ajuste se ignora y genera una advertencia Resume 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.694

Cinco é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ámetroEjemploEfecto
fractionfraction=0.5Entrena con la primera mitad de las imágenes de entrenamiento (ordenadas por nombre de archivo)
timetime=0.25Se detiene después de 0.25 horas y sobrescribe epochs
patiencepatience=10Se detiene cuando la aptitud de validación no mejora durante 10 épocas
imgszimgsz=320Una cuarta parte de los píxeles de 640; compara ejecuciones solo si tienen el mismo tamaño
cachecache=TrueMantiene 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#

Reanudar una ejecución terminada

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.

lr0 se ignora silenciosamente

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:.

Reutilizar nombres no sobrescribe los archivos

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.

Pruébalo

Practica los tres tipos de ejecución. Inicia una ejecución de 5 épocas llamada pills_resume, detenla después de la época 2 (con Ctrl+C o con la devolución de llamada de la solución) y reanúdala. Entrena pills_v2_warm con los mejores pesos de pills_v1 mediante optimizer="AdamW" y lr0=0.0005. Entrega la tabla compare_runs.py y una frase sobre desde qué ejecución continuarías y por qué.

Cuándo se considera terminado
Has terminado la lección cuando se cumplen todas estas condiciones.
  • La ejecución reanudada imprimió Resuming training ... from epoch 3 y completó las 5 épocas.

  • El registro de pills_v2_warm muestra AdamW(lr=0.0005, ...), no el mensaje del optimizador automático.

  • Tienes una tabla comparativa impresa de todas las ejecuciones con nombres descriptivos y una decisión en una frase.

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.py
pills_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.
Qué viene después

Ya puedes entrenar, diagnosticar e iterar. Ahora, pasa los modelos de las imágenes fijas al vídeo, donde se ejecuta la mayoría de las implementaciones reales.