Ajuste de hiperparámetros eficiente con Ray Tune y YOLO11
El ajuste de hiperparámetros es vital para lograr el máximo rendimiento del modelo al descubrir el conjunto óptimo de hiperparámetros. Esto implica ejecutar pruebas con diferentes hiperparámetros y evaluar el rendimiento de cada prueba.
Acelere el ajuste con Ultralytics YOLO11 y Ray Tune
Ultralytics YOLO11 incorpora Ray Tune para el ajuste de hiperparámetros, optimizando la optimización de los hiperparámetros del modelo YOLO11. Con Ray Tune, puede utilizar estrategias de búsqueda avanzadas, paralelismo y parada temprana para acelerar el proceso de ajuste.
Ray Tune
Ray Tune es una biblioteca de ajuste de hiperparámetros diseñada para la eficiencia y la flexibilidad. Admite varias estrategias de búsqueda, paralelismo y estrategias de detención temprana, y se integra perfectamente con frameworks populares de aprendizaje automático, incluyendo Ultralytics YOLO11.
Integración con Weights & Biases
YOLO11 también permite la integración opcional con Weights & Biases para monitorear el proceso de ajuste.
Instalación
Para instalar los paquetes necesarios, ejecute:
Instalación
# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]"
# Optionally install W&B for logging
pip install wandb
Uso
Uso
from ultralytics import YOLO
# Load a YOLO11n model
model = YOLO("yolo11n.pt")
# Start tuning hyperparameters for YOLO11n training on the COCO8 dataset
result_grid = model.tune(data="coco8.yaml", use_ray=True)
tune()
Parámetros del método
El tune()
método en YOLO11 proporciona una interfaz fácil de usar para el ajuste de hiperparámetros con Ray Tune. Acepta varios argumentos que te permiten personalizar el proceso de ajuste. A continuación, se muestra una explicación detallada de cada parámetro:
Parámetro | Tipo | Descripción | Valor predeterminado |
---|---|---|---|
data |
str |
El archivo de configuración del conjunto de datos (en formato YAML) para ejecutar el optimizador. Este archivo debe especificar las rutas de los datos de entrenamiento y validación, así como otros ajustes específicos del conjunto de datos. | |
space |
dict, optional |
Un diccionario que define el espacio de búsqueda de hiperparámetros para Ray Tune. Cada clave corresponde a un nombre de hiperparámetro, y el valor especifica el rango de valores a explorar durante el ajuste. Si no se proporciona, YOLO11 utiliza un espacio de búsqueda predeterminado con varios hiperparámetros. | |
grace_period |
int, optional |
El período de gracia en épocas para el programador ASHA en Ray Tune. El programador no finalizará ninguna prueba antes de este número de épocas, lo que permite que el modelo tenga un entrenamiento mínimo antes de tomar una decisión sobre la detención temprana. | 10 |
gpu_per_trial |
int, optional |
El número de GPU que se asignarán por prueba durante el ajuste. Esto ayuda a administrar el uso de la GPU, particularmente en entornos multi-GPU. Si no se proporciona, el sintonizador utilizará todas las GPU disponibles. | None |
iterations |
int, optional |
El número máximo de pruebas que se ejecutarán durante el ajuste. Este parámetro ayuda a controlar el número total de combinaciones de hiperparámetros probadas, lo que garantiza que el proceso de ajuste no se ejecute indefinidamente. | 10 |
**train_args |
dict, optional |
Argumentos adicionales para pasar al train() método durante el ajuste. Estos argumentos pueden incluir configuraciones como el número de épocas de entrenamiento, tamaño de lote, y otras configuraciones específicas del entrenamiento. |
{} |
Al personalizar estos parámetros, puedes ajustar el proceso de optimización de hiperparámetros para que se adapte a tus necesidades específicas y a los recursos computacionales disponibles.
Descripción del espacio de búsqueda predeterminado
La siguiente tabla enumera los parámetros predeterminados del espacio de búsqueda para el ajuste de hiperparámetros en YOLO11 con Ray Tune. Cada parámetro tiene un rango de valores específico definido por tune.uniform()
.
Parámetro | Rango | Descripción |
---|---|---|
lr0 |
tune.uniform(1e-5, 1e-1) |
Tasa de aprendizaje inicial que controla el tamaño del paso durante la optimización. Los valores más altos aceleran el entrenamiento, pero pueden causar inestabilidad. |
lrf |
tune.uniform(0.01, 1.0) |
Factor final de la tasa de aprendizaje que determina cuánto disminuye la tasa de aprendizaje al final del entrenamiento. |
momentum |
tune.uniform(0.6, 0.98) |
Factor de momentum para el optimizador que ayuda a acelerar el entrenamiento y superar los mínimos locales. |
weight_decay |
tune.uniform(0.0, 0.001) |
Parámetro de regularización que previene el sobreajuste penalizando los valores de peso grandes. |
warmup_epochs |
tune.uniform(0.0, 5.0) |
Número de épocas con una tasa de aprendizaje que aumenta gradualmente para estabilizar el entrenamiento temprano. |
warmup_momentum |
tune.uniform(0.0, 0.95) |
Valor de momento inicial que aumenta gradualmente durante el período de calentamiento. |
box |
tune.uniform(0.02, 0.2) |
Peso para el componente de pérdida del cuadro delimitador, que equilibra la precisión de la localización en el modelo. |
cls |
tune.uniform(0.2, 4.0) |
Peso para el componente de pérdida de clasificación, que equilibra la precisión de la predicción de clases en el modelo. |
hsv_h |
tune.uniform(0.0, 0.1) |
Rango de aumento de tono que introduce variabilidad de color para ayudar al modelo a generalizar. |
hsv_s |
tune.uniform(0.0, 0.9) |
Rango de aumento de saturación que varía la intensidad del color para mejorar la robustez. |
hsv_v |
tune.uniform(0.0, 0.9) |
Rango de aumento del valor (brillo) que ayuda al modelo a funcionar en diversas condiciones de iluminación. |
degrees |
tune.uniform(0.0, 45.0) |
Rango de aumento de rotación en grados, mejorando el reconocimiento de objetos rotados. |
translate |
tune.uniform(0.0, 0.9) |
Rango de aumento de traslación que desplaza las imágenes horizontal y verticalmente. |
scale |
tune.uniform(0.0, 0.9) |
Rango de aumento de escala que simula objetos a diferentes distancias. |
shear |
tune.uniform(0.0, 10.0) |
Rango de aumento de cizalladura en grados, simulando cambios de perspectiva. |
perspective |
tune.uniform(0.0, 0.001) |
Rango de aumento de perspectiva que simula cambios de punto de vista 3D. |
flipud |
tune.uniform(0.0, 1.0) |
Probabilidad de aumento de volteo vertical, lo que incrementa la diversidad del conjunto de datos. |
fliplr |
tune.uniform(0.0, 1.0) |
Probabilidad de aumento de volteo horizontal, útil para objetos simétricos. |
mosaic |
tune.uniform(0.0, 1.0) |
Probabilidad de aumento de mosaico que combina cuatro imágenes en una muestra de entrenamiento. |
mixup |
tune.uniform(0.0, 1.0) |
Probabilidad de aumento de Mixup que mezcla dos imágenes y sus etiquetas. |
cutmix |
tune.uniform(0.0, 1.0) |
Probabilidad de aumento de Cutmix que combina regiones de la imagen manteniendo las características locales, mejorando la detección de objetos parcialmente ocluidos. |
copy_paste |
tune.uniform(0.0, 1.0) |
Probabilidad de aumento de copiar-pegar que transfiere objetos entre imágenes para aumentar la diversidad de instancias. |
Ejemplo de espacio de búsqueda personalizado
En este ejemplo, demostramos cómo usar un espacio de búsqueda personalizado para el ajuste de hiperparámetros con Ray Tune y YOLO11. Al proporcionar un espacio de búsqueda personalizado, puede enfocar el proceso de ajuste en hiperparámetros específicos de interés.
Uso
from ray import tune
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo11n.pt")
# Run Ray Tune on the model
result_grid = model.tune(
data="coco8.yaml",
space={"lr0": tune.uniform(1e-5, 1e-1)},
epochs=50,
use_ray=True,
)
En el fragmento de código anterior, creamos un modelo YOLO con los pesos preentrenados "yolo11n.pt". Luego, llamamos al tune()
método, especificando la configuración del conjunto de datos con "coco8.yaml". Proporcionamos un espacio de búsqueda personalizado para la tasa de aprendizaje inicial lr0
usando un diccionario con la clave "lr0" y el valor tune.uniform(1e-5, 1e-1)
. Finalmente, pasamos argumentos de entrenamiento adicionales, como el número de épocas directamente al método de ajuste como epochs=50
.
Reanudación de una sesión de ajuste de hiperparámetros interrumpida con Ray Tune
Puede reanudar una sesión de Ray Tune interrumpida pasando resume=True
. Opcionalmente, puede pasar el directorio name
utilizado por Ray Tune en runs/{task}
para reanudar. De lo contrario, se reanudaría la última sesión interrumpida. No es necesario que proporciones el iterations
y space
de nuevo, pero debes proporcionar el resto de los argumentos de entrenamiento, incluyendo data
y epochs
.
Usando resume=True
con model.tune()
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo11n.pt")
# Resume previous run
results = model.tune(use_ray=True, data="coco8.yaml", epochs=50, resume=True)
# Resume Ray Tune run with name 'tune_exp_2'
results = model.tune(use_ray=True, data="coco8.yaml", epochs=50, name="tune_exp_2", resume=True)
Procesamiento de los resultados de Ray Tune
Después de ejecutar un experimento de ajuste de hiperparámetros con Ray Tune, es posible que desees realizar varios análisis de los resultados obtenidos. Esta guía te guiará a través de los flujos de trabajo comunes para procesar y analizar estos resultados.
Cargando los resultados del experimento de ajuste desde un directorio
Después de ejecutar el experimento de ajuste con tuner.fit()
, puedes cargar los resultados desde un directorio. Esto es útil, especialmente si estás realizando el análisis después de que el script de entrenamiento inicial haya finalizado.
experiment_path = f"{storage_path}/{exp_name}"
print(f"Loading results from {experiment_path}...")
restored_tuner = tune.Tuner.restore(experiment_path, trainable=train_mnist)
result_grid = restored_tuner.get_results()
Análisis Básico a Nivel de Experimento
Obtenga una visión general del rendimiento de las pruebas. Puede comprobar rápidamente si hubo algún error durante las pruebas.
if result_grid.errors:
print("One or more trials failed!")
else:
print("No errors!")
Análisis Básico a Nivel de Prueba
Acceda a las configuraciones de hiperparámetros de cada prueba y a las últimas métricas reportadas.
for i, result in enumerate(result_grid):
print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")
Trazado del historial completo de métricas reportadas para una prueba
Puedes trazar el historial de las métricas reportadas para cada prueba y ver cómo evolucionaron las métricas con el tiempo.
import matplotlib.pyplot as plt
for i, result in enumerate(result_grid):
plt.plot(
result.metrics_dataframe["training_iteration"],
result.metrics_dataframe["mean_accuracy"],
label=f"Trial {i}",
)
plt.xlabel("Training Iterations")
plt.ylabel("Mean Accuracy")
plt.legend()
plt.show()
Resumen
En esta documentación, cubrimos los flujos de trabajo comunes para analizar los resultados de los experimentos ejecutados con Ray Tune utilizando Ultralytics. Los pasos clave incluyen la carga de los resultados del experimento desde un directorio, la realización de análisis básicos a nivel de experimento y de prueba, y el trazado de métricas.
Explore más a fondo consultando la página de documentación Analizar resultados de Ray Tune para aprovechar al máximo sus experimentos de ajuste de hiperparámetros.
Preguntas frecuentes
¿Cómo puedo ajustar los hiperparámetros de mi modelo YOLO11 usando Ray Tune?
Para ajustar los hiperparámetros de su modelo Ultralytics YOLO11 utilizando Ray Tune, siga estos pasos:
-
Instale los paquetes requeridos:
pip install -U ultralytics "ray[tune]" pip install wandb # optional for logging
-
Cargue su modelo YOLO11 y comience a ajustarlo:
from ultralytics import YOLO # Load a YOLO11 model model = YOLO("yolo11n.pt") # Start tuning with the COCO8 dataset result_grid = model.tune(data="coco8.yaml", use_ray=True)
Esto utiliza las estrategias de búsqueda avanzada y el paralelismo de Ray Tune para optimizar eficientemente los hiperparámetros de su modelo. Para obtener más información, consulte la documentación de Ray Tune.
¿Cuáles son los hiperparámetros predeterminados para el ajuste de YOLO11 con Ray Tune?
Ultralytics YOLO11 utiliza los siguientes hiperparámetros predeterminados para el ajuste con Ray Tune:
Parámetro | Rango de valores | Descripción |
---|---|---|
lr0 |
tune.uniform(1e-5, 1e-1) |
Tasa de aprendizaje inicial |
lrf |
tune.uniform(0.01, 1.0) |
Factor de tasa de aprendizaje final |
momentum |
tune.uniform(0.6, 0.98) |
Momentum |
weight_decay |
tune.uniform(0.0, 0.001) |
Decaimiento de peso |
warmup_epochs |
tune.uniform(0.0, 5.0) |
Épocas de calentamiento |
box |
tune.uniform(0.02, 0.2) |
Peso de la pérdida de la caja |
cls |
tune.uniform(0.2, 4.0) |
Peso de la pérdida de clase |
hsv_h |
tune.uniform(0.0, 0.1) |
Rango de aumento de tono |
translate |
tune.uniform(0.0, 0.9) |
Rango de aumento de traslación |
Estos hiperparámetros se pueden personalizar para que se adapten a sus necesidades específicas. Para obtener una lista completa y más detalles, consulte la guía de Ajuste de Hiperparámetros.
¿Cómo puedo integrar Weights & Biases con el ajuste de mi modelo YOLO11?
Para integrar Weights & Biases (W&B) con su proceso de ajuste de Ultralytics YOLO11:
-
Instale W&B:
pip install wandb
-
Modifica tu script de ajuste:
import wandb from ultralytics import YOLO wandb.init(project="YOLO-Tuning", entity="your-entity") # Load YOLO model model = YOLO("yolo11n.pt") # Tune hyperparameters result_grid = model.tune(data="coco8.yaml", use_ray=True)
Esta configuración le permitirá supervisar el proceso de ajuste, realizar un seguimiento de las configuraciones de hiperparámetros y visualizar los resultados en W&B.
¿Por qué debería usar Ray Tune para la optimización de hiperparámetros con YOLO11?
Ray Tune ofrece numerosas ventajas para la optimización de hiperparámetros:
- Estrategias de búsqueda avanzadas: Utiliza algoritmos como la optimización bayesiana y HyperOpt para una búsqueda de parámetros eficiente.
- Paralelismo: Admite la ejecución paralela de múltiples pruebas, lo que acelera significativamente el proceso de ajuste.
- Parada anticipada: Emplea estrategias como ASHA para terminar anticipadamente los ensayos de bajo rendimiento, ahorrando recursos computacionales.
Ray Tune se integra perfectamente con Ultralytics YOLO11, proporcionando una interfaz fácil de usar para ajustar los hiperparámetros de forma eficaz. Para empezar, consulta la guía de Ajuste de hiperparámetros.
¿Cómo puedo definir un espacio de búsqueda personalizado para el ajuste de hiperparámetros de YOLO11?
Para definir un espacio de búsqueda personalizado para su ajuste de hiperparámetros de YOLO11 con Ray Tune:
from ray import tune
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
search_space = {"lr0": tune.uniform(1e-5, 1e-1), "momentum": tune.uniform(0.6, 0.98)}
result_grid = model.tune(data="coco8.yaml", space=search_space, use_ray=True)
Esto personaliza el rango de hiperparámetros como la tasa de aprendizaje inicial y el momento que se explorarán durante el proceso de ajuste. Para configuraciones avanzadas, consulta la sección Custom Search Space Example.