使用 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]"
# Optionally install W&B for logging
pip install wandb用法
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() 方法参数
在 tune() YOLO26 中的方法为使用 Ray Tune 进行超参数调优提供了一个简单易用的界面。它接受多个参数,让你能够自定义调优过程。下面是每个参数的详细说明:
| 参数 | 类型 | 描述 | 默认值 |
|---|---|---|---|
data | str | 用于运行调优器的数据集配置文件(YAML 格式)。该文件应指定训练和 验证数据 路径,以及其他数据集特定的设置。 | |
space | dict, optional | 定义 Ray Tune 超参数搜索空间的字典。每个键对应一个超参数名称,值指定在调优期间要探索的数值范围。如果未提供,YOLO26 会使用包含各种超参数的默认搜索空间。 | |
grace_period | int, optional | 中的宽限期 epochs 属性利用 OpenVINO 的 ASHA scheduler 在 Ray Tune 中。调度器在达到此 epoch 数之前不会终止任何试验,让模型在决定是否提前停止前进行至少一定程度的训练。 | 10 |
gpu_per_trial | int, optional | 调优期间每个试验分配的 GPU 数量。这有助于管理 GPU 使用率,特别是在多 GPU 环境中。如果未提供,调优器将使用所有可用 GPU。 | None |
iterations | int, optional | 调优期间运行的最大试验次数。此参数有助于控制测试的超参数组合总数,确保调优过程不会无限期运行。 | 10 |
search_alg | str or Searcher, optional | 要使用的 Ray Tune 搜索策略。你可以直接传递一个 Ray 搜索器对象,或使用支持的字符串,例如 optuna, hyperopt, bayesopt, bohb, hebo, nevergrad, zoopt, ax,或者 random。基于字符串的搜索器会自动使用默认的任务指标和 mode="max"。如果未提供,Ray Tune 将回退到其默认的随机搜索策略,BasicVariantGenerator. | None |
**train_args | dict, optional | 调优期间传递给 train() 方法的附加参数。这些参数可以包括训练 epoch 数、batch size 以及其他特定于训练的配置。 | {} |
通过自定义这些参数,你可以根据自己的特定需求和可用的计算资源微调超参数优化过程。
默认搜索空间说明
下表列出了 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) | 学习率逐渐增加以稳定早期训练的 epoch 数。 |
warmup_momentum | tune.uniform(0.0, 0.95) | 在预热期间逐渐增加的初始动量值。 |
box | tune.uniform(1.0, 20.0) | BBox 损失分量的权重,平衡模型中的定位精度。 |
cls | tune.uniform(0.1, 4.0) | 分类损失分量的权重,平衡模型中的类别预测精度。 |
dfl | tune.uniform(0.4, 12.0) | Distribution Focal Loss 分量的权重,强调精确的 BBox 定位。 |
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) | 透视增强范围,模拟 3D 视角变化。 |
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) | Copy-paste 增强概率,在图像之间传输物体以增加实例多样性。 |
close_mosaic | tune.randint(0.0, 11) | 在最后 N 个 epoch 中禁用马赛克,以在完成前稳定训练。 |
自定义搜索空间示例
在此示例中,我们演示了如何为 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)。最后,我们将额外的训练参数(例如 epoch 数)直接作为 epochs=50.
传递给 tune 方法。
搜索算法示例mode="max"。如果 search_alg你可以按名称选择 Ray Tune 搜索策略。对于基于字符串的搜索算法,Ultralytics 将自动使用当前任务的默认优化指标和 BasicVariantGenerator.
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,
)将字符串 `search_alg` 与 `model.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,
)将 `OptunaSearch` 对象与 `model.tune()` 一起使用
恢复被中断的 Ray Tune 超参数调优会话resume=True 来恢复中断的超参数调优会话。你可以选择传递在 name你可以通过传递 runs/{task} Ray Tune 在 iterations 和 space 下使用的参数来恢复中断的 Ray Tune 会话。否则,它将恢复最后一次中断的会话。你不需要再次提供 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 运行超参数调优实验后,你可能希望对获得的结果进行各种分析。本指南将带你了解处理和分析这些结果的常见工作流程。
从目录加载调优实验结果tuner.fit()在使用
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()运行调优实验后,你可以从目录加载结果。这非常有用,特别是如果你是在初始训练脚本退出后进行分析。
基础实验级分析
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["mean_accuracy"],
label=f"Trial {i}",
)
plt.xlabel("Training Iterations")
plt.ylabel("Mean Accuracy")
plt.legend()
plt.show()总结
你可以绘制每个试验的报告指标历史记录,以查看指标随时间的演变情况。
在本指南中,我们介绍了使用 Ultralytics 运行 Ray Tune 实验结果分析的常见工作流程。关键步骤包括从目录加载实验结果、执行基础的实验级和试验级分析,以及绘制指标图表。通过查看 Ray Tune 的 分析结果
FAQ
文档页面进行深入探索,以充分利用你的超参数调优实验。
如何使用 Ray Tune 调整我的 YOLO26 模型超参数?
-
。它在 Windows 或 macOS 上不可用。
pip install -U ultralytics "ray[tune]" pip install wandb # optional for logging -
要使用 Ray Tune 调整你的 Ultralytics 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)
加载你的 YOLO26 模型并开始调优:这利用了 Ray Tune 的高级搜索策略和并行计算来高效优化模型的超参数。有关更多信息,请查阅 .
Ray Tune 文档
使用 Ray Tune 进行 YOLO26 调优的默认超参数是什么?
| 参数 | 值范围 | 描述 |
|---|---|---|
lr0 | tune.uniform(1e-5, 1e-2) | Ultralytics YOLO26 在使用 Ray Tune 进行调优时使用以下默认超参数: |
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) | 权重衰减 |
box | tune.uniform(1.0, 20.0) | 预热 epoch 数 |
cls | tune.uniform(0.1, 4.0) | Box 损失权重 |
dfl | tune.uniform(0.4, 12.0) | 分类损失权重 |
hsv_h | tune.uniform(0.0, 0.1) | DFL 损失权重 |
translate | tune.uniform(0.0, 0.9) | 色调增强范围 |
这些超参数可以根据你的特定需求进行定制。有关完整列表和更多详细信息,请参阅 超参数调优 指南。
我该如何将Weights & Biases集成到我的YOLO26模型调优中?
要将Weights & Biases (W&B) 集成到你的Ultralytics YOLO26调优流程中,请执行以下操作:
-
安装W&B:
pip install wandb -
修改你的调优脚本:
import wandb from ultralytics import YOLO wandb.init(project="YOLO-Tuning", entity="your-entity") # Load YOLO model model = YOLO("yolo26n.pt") # Tune hyperparameters result_grid = model.tune(data="coco8.yaml", use_ray=True)
此设置将使你能够监控调优过程、跟踪超参数配置,并在W&B中可视化结果。
为什么我应该使用Ray Tune进行YOLO26的超参数优化?
Ray Tune为超参数优化提供了众多优势:
- 高级搜索策略: 利用诸如 Bayesian Optimization 和HyperOpt等算法进行高效的参数搜索。
- 并行计算: 支持多个试验的并行执行,显著加快调优过程。
- 提前停止: 采用如ASHA等策略提前终止表现不佳的试验,从而节省计算资源。
Ray Tune与Ultralytics YOLO26无缝集成,提供了一个易于使用的接口来有效地调优超参数。要开始使用,请查看 超参数调优 指南。
我该如何为YOLO26超参数调优定义自定义搜索空间?
要通过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)这可以自定义在调优过程中需要探索的超参数范围,例如初始学习率和动量。有关高级配置,请参阅 自定义搜索空间示例 部分找到。