使用 Ray Tune 和 YOLO26 高效调优超参数#
超参数调优对于实现模型的最佳性能至关重要,因为它可以发现最优的超参数组合。这包括使用不同的超参数运行试验,并评估每次试验的性能。
使用 Ultralytics YOLO26 和 Ray Tune 加速调优#
Ultralytics YOLO26 集成了 Ray Tune,用于超参数调优,从而简化 YOLO26 模型超参数的优化过程。借助 Ray Tune,你可以利用高级搜索策略、并行处理和提前停止来加快调优过程。
Ray Tune#
Ray Tune 是一个专为高效性和灵活性设计的超参数调优库。它支持各种搜索策略、并行处理和提前停止策略,并且可以无缝集成包括 Ultralytics YOLO26 在内的热门机器学习框架。
与 Weights & Biases 集成#
YOLO26 还支持可选集成 Weights & Biases,用于监控调优过程。
安装#
要安装所需的软件包,请运行:
# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]" optuna
# Optionally install and enable W&B for per-trial logging
pip install wandb
yolo settings wandb=True使用方法#
from ultralytics import YOLO
# Load a YOLO26n model
model = YOLO("yolo26n.pt")
# Start tuning hyperparameters for YOLO26n training on the COCO8 dataset
result_grid = model.tune(data="coco8.yaml", use_ray=True)tune() 方法参数#
YOLO26 中的 tune() 方法提供了一个易于使用的接口,用于通过 Ray Tune 进行超参数调优。它接受多个参数,让你可以自定义调优过程。下面详细说明每个参数:
| 参数 | 类型 | 描述 | 默认值 |
|---|---|---|---|
data | str | 运行调优器所使用的数据集 YAML,其中指定训练和验证数据路径以及其他数据集特定设置。分类任务则使用数据集目录或内置数据集名称(例如 imagenet10)。 | |
space | dict, optional | 定义 Ray Tune 超参数搜索空间的字典。每个键对应一个超参数名称,其值指定调优期间要探索的数值范围。如果未提供,YOLO26 将使用包含各种超参数的默认搜索空间。 | |
grace_period | int, optional | Ray Tune 中 ASHA 调度器的训练轮次宽限期。调度器不会在达到此轮次数之前终止任何试验,从而让模型至少完成一定程度的训练后再决定是否提前停止。 | 10 |
gpu_per_trial | int, optional | Ray 为每次试验分配的 GPU 数量。显式设置此参数以使用 GPU 训练;省略时,试验不会获得 GPU 资源。 | None |
iterations | int, optional | 调优期间要运行的最大试验次数。此参数有助于控制所测试的超参数组合总数,确保调优过程不会无限运行。 | 300 |
search_alg | str or Searcher, optional | 要使用的 Ray Tune 搜索策略。你可以直接传入 Ray 搜索器对象,也可以使用受支持的字符串,例如 optuna、hyperopt、bayesopt、bohb、hebo、nevergrad、zoopt、ax 或 random。基于字符串的搜索器会自动使用默认任务指标和 mode="max"。默认设置使用 Optuna 多变量 TPE,并采用支持并行的建议方式。 | "optuna" |
**train_args | dict, optional | 调优期间要传递给 train() 方法的其他参数。这些参数可以包括训练轮次数、批量大小以及其他训练特定配置。 | {} |
通过自定义这些参数,你可以根据具体需求和可用计算资源微调超参数优化过程。
默认搜索空间说明#
下表列出了 YOLO26 使用 Ray Tune 进行超参数调优时的默认搜索空间参数。每个参数都有由 tune.uniform() 定义的特定取值范围。
| 参数 | 范围 | 描述 |
|---|---|---|
lr0 | tune.uniform(1e-5, 1e-2) | 控制优化过程中步长的初始学习率。较高的值可以加快训练,但可能导致不稳定。 |
lrf | tune.uniform(0.01, 1.0) | 最终学习率因子,决定训练结束时学习率降低的幅度。 |
momentum | tune.uniform(0.7, 0.98) | 优化器的动量因子,有助于加速训练并克服局部最小值。 |
weight_decay | tune.uniform(0.0, 0.001) | 通过惩罚较大的权重值来防止过拟合的正则化参数。 |
warmup_epochs | tune.uniform(0.0, 5.0) | 学习率逐步增加以稳定训练初期的轮次数。 |
warmup_momentum | tune.uniform(0.0, 0.95) | 在预热期间逐步增加的初始动量值。 |
box | tune.uniform(1.0, 20.0) | 边界框损失分量的权重,用于平衡模型中的定位精度。 |
cls | tune.uniform(0.1, 4.0) | 分类损失分量的权重,用于平衡模型中的类别预测精度。 |
cls_pw | tune.uniform(0.0, 1.0) | 类别加权幂,从禁用(0.0)到完全按频率倒数加权(1.0)。 |
dfl | tune.uniform(0.4, 12.0) | 框距离回归分量的权重,强调精确的边界框定位。 |
hsv_h | tune.uniform(0.0, 0.1) | 色调增强范围,引入颜色变化以帮助模型泛化。 |
hsv_s | tune.uniform(0.0, 0.9) | 饱和度增强范围,改变颜色强度以提高鲁棒性。 |
hsv_v | tune.uniform(0.0, 0.9) | 明度(亮度)增强范围,帮助模型适应各种光照条件。 |
degrees | tune.uniform(0.0, 45.0) | 以度为单位的旋转增强范围,提高模型对旋转目标的识别能力。 |
translate | tune.uniform(0.0, 0.9) | 平移增强范围,在水平方向和垂直方向移动图像。 |
scale | tune.uniform(0.0, 0.95) | 缩放增强范围,模拟处于不同距离的目标。 |
shear | tune.uniform(0.0, 10.0) | 以度为单位的剪切增强范围,模拟视角变化。 |
perspective | tune.uniform(0.0, 0.001) | 透视增强范围,模拟三维视点变化。 |
flipud | tune.uniform(0.0, 1.0) | 垂直翻转增强概率,增加数据集多样性。 |
fliplr | tune.uniform(0.0, 1.0) | 水平翻转增强概率,适用于对称目标。 |
bgr | tune.uniform(0.0, 1.0) | BGR 通道交换增强概率,有助于提高颜色不变性。 |
mosaic | tune.uniform(0.0, 1.0) | 马赛克增强概率,将四张图像合并为一个训练样本。 |
mixup | tune.uniform(0.0, 1.0) | Mixup 增强概率,将两张图像及其标签混合在一起。 |
cutmix | tune.uniform(0.0, 1.0) | Cutmix 增强概率,在保留局部特征的同时合并图像区域。 |
copy_paste | tune.uniform(0.0, 1.0) | 在 flip 模式下,这是复制到图像中的符合条件目标所占的比例;在 mixup 模式下,它还表示执行该操作的概率。 |
close_mosaic | tune.randint(0, 11) | 在最后 N 个训练轮次中禁用马赛克,以便在训练完成前稳定训练。 |
自定义搜索空间示例#
在本示例中,我们演示如何使用自定义搜索空间,通过 Ray Tune 和 YOLO26 进行超参数调优。通过提供自定义搜索空间,你可以将调优过程集中于感兴趣的特定超参数。
from ray import tune
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo26n.pt")
# Run Ray Tune on the model
result_grid = model.tune(
data="coco8.yaml",
space={"lr0": tune.uniform(1e-5, 1e-2)},
epochs=50,
use_ray=True,
)在上面的代码片段中,我们使用 "yolo26n.pt" 预训练权重创建 YOLO 模型。然后,我们调用 tune() 方法,并使用 "coco8.yaml" 指定数据集配置。我们通过一个字典为初始学习率 lr0 提供自定义搜索空间,其中键为 "lr0",值为 tune.uniform(1e-5, 1e-2)。最后,我们将其他训练参数(例如训练轮次数)作为 epochs=50 直接传递给 tune 方法。
搜索算法示例#
你可以按名称选择 Ray Tune 搜索策略。对于基于字符串的搜索算法,Ultralytics 会自动使用当前任务的默认优化指标和 mode="max"。如果未提供 search_alg,Ultralytics 将使用 Optuna 多变量 TPE,并采用支持并行的建议方式。
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo26n.pt")
result_grid = model.tune(
data="coco8.yaml",
epochs=50,
search_alg="optuna",
use_ray=True,
)如果需要自定义搜索器的采样器,或覆盖其指标和优化模式,请传入已实例化的 Ray Tune 搜索器对象,而不是字符串。
from ray.tune.search.optuna import OptunaSearch
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo26n.pt")
# Define a searcher
searcher = OptunaSearch(
metric="metrics/mAP50-95(B)",
mode="max",
)
result_grid = model.tune(
data="coco8.yaml",
epochs=50,
search_alg=searcher,
use_ray=True,
)使用 Ray Tune 恢复中断的超参数调优会话#
你可以通过传入 resume=True 来恢复中断的 Ray Tune 会话。你还可以选择传入 Ray Tune 在 runs/{task} 下使用的目录 name 以继续运行。否则,它将恢复上一次中断的会话。你无需再次提供 iterations 和 space,但需要再次提供其余训练参数,包括 data 和 epochs。
from ultralytics import YOLO
# Define a YOLO model
model = YOLO("yolo26n.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)处理 Ray Tune 结果#
使用 Ray Tune 运行超参数调优实验后,你可能需要对获得的结果进行各种分析。本指南将带你了解处理和分析这些结果的常见工作流。
从目录加载调优实验结果#
model.tune(use_ray=True) 返回一个 Ray ResultGrid 并将实验保存到 runs/{task}/tune,或者保存到你传入的 name 中。要在原脚本退出后加载这些结果,请恢复会话,这会恢复保存的试验并返回相同的 ResultGrid:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result_grid = model.tune(data="coco8.yaml", epochs=50, use_ray=True, resume=True)基本实验级分析#
概览各次试验的表现。你可以快速检查试验期间是否出现任何错误。
if result_grid.errors:
print("One or more trials failed!")
else:
print("No errors!")基本试验级分析#
访问单次试验的超参数配置和最后报告的指标。
for i, result in enumerate(result_grid):
print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")绘制试验报告指标的完整历史记录#
你可以绘制每次试验报告指标的历史记录,以查看指标如何随时间变化。
import matplotlib.pyplot as plt
for i, result in enumerate(result_grid):
plt.plot(
result.metrics_dataframe["training_iteration"],
result.metrics_dataframe["metrics/mAP50-95(B)"],
label=f"Trial {i}",
)
plt.xlabel("Training Iterations")
plt.ylabel("mAP50-95")
plt.legend()
plt.show()总结#
在本指南中,我们介绍了使用 Ultralytics 通过 Ray Tune 运行实验时分析结果的常见工作流。关键步骤包括从目录加载实验结果、执行基本的实验级和试验级分析,以及绘制指标。
你可以进一步查看 Ray Tune 的分析结果文档页面,充分利用超参数调优实验。
常见问题#
要使用 Ray Tune 调优 Ultralytics YOLO26 模型的超参数,请按以下步骤操作:
-
安装所需软件包:
pip install -U ultralytics "ray[tune]" optuna pip install wandb # optional for logging yolo settings wandb=True -
加载 YOLO26 模型并开始调优:
from ultralytics import YOLO # Load a YOLO26 model model = YOLO("yolo26n.pt") # Start tuning with the COCO8 dataset result_grid = model.tune(data="coco8.yaml", use_ray=True)
该过程利用 Ray Tune 的高级搜索策略和并行处理来高效优化模型的超参数。有关更多信息,请查看 Ray Tune 文档。
-
Ultralytics YOLO26 使用以下默认超参数通过 Ray Tune 进行调优:
参数 取值范围 描述 lr0tune.uniform(1e-5, 1e-2)初始学习率 lrftune.uniform(0.01, 1.0)最终学习率因子 momentumtune.uniform(0.7, 0.98)动量 weight_decaytune.uniform(0.0, 0.001)权重衰减 warmup_epochstune.uniform(0.0, 5.0)预热轮次 boxtune.uniform(1.0, 20.0)框损失权重 clstune.uniform(0.1, 4.0)类别损失权重 cls_pwtune.uniform(0.0, 1.0)类别加权幂 dfltune.uniform(0.4, 12.0)框距离损失权重 hsv_htune.uniform(0.0, 0.1)色调增强范围 translatetune.uniform(0.0, 0.9)平移增强范围 你可以根据具体需求自定义这些超参数。有关完整列表和更多详细信息,请参阅超参数调优指南。
要将 Weights & Biases(W&B)集成到 Ultralytics YOLO26 调优流程中:
-
安装 W&B:
pip install wandb wandb login yolo settings wandb=True -
运行调优器:
from ultralytics import YOLO # Load YOLO model model = YOLO("yolo26n.pt") # Each Ray trial creates its own W&B run in this project result_grid = model.tune(data="coco8.yaml", project="YOLO-Tuning", use_ray=True)
此设置可以让你监控调优过程、跟踪超参数配置,并在 W&B 中可视化结果。
-
要使用 Ray Tune 为 YOLO26 超参数调优定义自定义搜索空间:
from ray import tune from ultralytics import YOLO model = YOLO("yolo26n.pt") search_space = {"lr0": tune.uniform(1e-5, 1e-2), "momentum": tune.uniform(0.7, 0.98)} result_grid = model.tune(data="coco8.yaml", space=search_space, use_ray=True)这会自定义调优过程中要探索的超参数范围,例如初始学习率和动量。有关高级配置,请参阅自定义搜索空间示例部分。