使用 Ray Tune 和 YOLO11 进行高效的超参数调整
超参数调整对于通过发现最佳超参数集来实现最佳模型性能至关重要。这包括使用不同的超参数运行试验并评估每个试验的性能。
使用 Ultralytics YOLO11 和 Ray Tune 加速调优
Ultralytics YOLO11 结合了 Ray Tune 进行超参数调优,从而简化了 YOLO11 模型超参数的优化。借助 Ray Tune,您可以利用高级搜索策略、并行性和提前停止来加速调优过程。
Ray Tune
Ray Tune 是一个为效率和灵活性而设计的超参数调整库。它支持各种搜索策略、并行性和提前停止策略,并与包括 Ultralytics YOLO11 在内的流行机器学习框架无缝集成。
与 Weights & Biases 集成
YOLO11 还允许与 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 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()
方法参数
字段 tune()
YOLO11 中的 method 提供了一个易于使用的界面,用于使用 Ray Tune 进行超参数调整。它接受多个参数,允许您自定义调整过程。以下是每个参数的详细说明:
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
data |
str |
用于在 tuner 上运行的数据集配置文件(YAML 格式)。此文件应指定训练和验证数据路径,以及其他特定于数据集的设置。 | |
space |
dict, optional |
一个字典,用于定义 Ray Tune 的超参数搜索空间。每个键对应一个超参数名称,值指定在调整期间要探索的值范围。如果未提供,YOLO11 将使用具有各种超参数的默认搜索空间。 | |
grace_period |
int, optional |
Ray Tune 中 ASHA 调度器的epochs宽限期。调度器不会在此 epoch 数之前终止任何试验,从而允许模型在对提前停止做出决策之前进行一些最小训练。 | 10 |
gpu_per_trial |
int, optional |
在调整期间为每次试验分配的 GPU 数量。这有助于管理 GPU 使用情况,尤其是在多 GPU 环境中。如果未提供,则调谐器将使用所有可用的 GPU。 | None |
iterations |
int, optional |
调整期间运行的最大试验次数。此参数有助于控制测试的超参数组合的总数,确保调整过程不会无限期地运行。 | 10 |
**train_args |
dict, optional |
传递给的其他参数 train() 方法期间的调优。这些参数可以包括训练 epoch 数量等设置, 批次大小,以及其他特定于训练的配置。 |
{} |
通过自定义这些参数,您可以微调超参数优化过程,以适应您的特定需求和可用的计算资源。
默认搜索空间描述
下表列出了 YOLO11 中使用 Ray Tune 进行超参数调优的默认搜索空间参数。每个参数都有一个由以下内容定义的特定值范围 tune.uniform()
.
参数 | 范围 | 描述 |
---|---|---|
lr0 |
tune.uniform(1e-5, 1e-1) |
控制优化过程中步长的初始学习率。较高的值会加快训练速度,但也可能导致不稳定。 |
lrf |
tune.uniform(0.01, 1.0) |
最终学习率因子,它决定了训练结束时学习率降低的程度。 |
momentum |
tune.uniform(0.6, 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(0.02, 0.2) |
边界框损失分量的权重,用于平衡模型中的定位精度。 |
cls |
tune.uniform(0.2, 4.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) |
亮度(brightness)增强范围,帮助模型在各种光照条件下都能表现良好。 |
degrees |
tune.uniform(0.0, 45.0) |
旋转增强范围(度),提高对旋转物体的识别能力。 |
translate |
tune.uniform(0.0, 0.9) |
平移增强范围,用于水平和垂直移动图像。 |
scale |
tune.uniform(0.0, 0.9) |
缩放增强范围,用于模拟不同距离的物体。 |
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) |
水平翻转增强概率,对对称对象很有用。 |
mosaic |
tune.uniform(0.0, 1.0) |
Mosaic 增强概率,将四张图像合并为一个训练样本。 |
mixup |
tune.uniform(0.0, 1.0) |
Mixup 增强概率,用于混合两张图像及其标签。 |
cutmix |
tune.uniform(0.0, 1.0) |
Cutmix 增强概率,它结合了图像区域,同时保持局部特征,从而提高对部分遮挡物体的检测能力。 |
copy_paste |
tune.uniform(0.0, 1.0) |
复制-粘贴增强概率,用于在图像之间传输对象以增加实例多样性。 |
自定义搜索空间示例
在此示例中,我们将演示如何将自定义搜索空间用于 Ray Tune 和 YOLO11 的超参数调整。通过提供自定义搜索空间,您可以将调整过程集中在感兴趣的特定超参数上。
用法
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,
)
在上面的代码片段中,我们使用 "yolo11n.pt" 预训练权重创建了一个 YOLO 模型。然后,我们调用 tune()
method,使用 "coco8.yaml" 指定数据集配置。我们为初始学习率提供了一个自定义搜索空间 lr0
使用带有键“lr0”和值的字典 tune.uniform(1e-5, 1e-1)
。最后,我们将额外的训练参数(例如 epoch 的数量)直接传递给 tune 方法,作为 epochs=50
.
使用 Ray Tune 恢复中断的超参数调整会话
您可以通过传递以下参数来恢复中断的 Ray Tune 会话 resume=True
。您可以选择性地传递目录 name
由 Ray Tune 在以下情况下使用 runs/{task}
恢复训练。否则,它将恢复上次中断的会话。你不需要提供 iterations
和 space
再次,但是您需要再次提供其余的训练参数,包括 data
和 epochs
.
使用 resume=True
使用 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)
处理 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 的分析结果文档页面,以充分利用您的超参数调整实验,从而进行进一步探索。
常见问题
如何使用 Ray Tune 调整 YOLO11 模型的超参数?
要使用 Ray Tune 调整 Ultralytics YOLO11 模型的超参数,请按照以下步骤操作:
-
安装所需的软件包:
pip install -U ultralytics "ray[tune]" pip install wandb # optional for logging
-
加载您的 YOLO11 模型并开始调优:
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)
它利用 Ray Tune 的高级搜索策略和并行性,从而高效地优化模型的超参数。更多信息,请查阅 Ray Tune 文档。
使用 Ray Tune 调整 YOLO11 的默认超参数是什么?
Ultralytics YOLO11 使用以下默认超参数,以便使用 Ray Tune 进行调整:
参数 | 值范围 | 描述 |
---|---|---|
lr0 |
tune.uniform(1e-5, 1e-1) |
初始学习率 |
lrf |
tune.uniform(0.01, 1.0) |
最终学习率因子 |
momentum |
tune.uniform(0.6, 0.98) |
动量 |
weight_decay |
tune.uniform(0.0, 0.001) |
权重衰减 |
warmup_epochs |
tune.uniform(0.0, 5.0) |
预热 epochs |
box |
tune.uniform(0.02, 0.2) |
框损失权重 |
cls |
tune.uniform(0.2, 4.0) |
类损失权重 |
hsv_h |
tune.uniform(0.0, 0.1) |
色调增强范围 |
translate |
tune.uniform(0.0, 0.9) |
平移增强范围 |
可以自定义这些超参数以满足您的特定需求。有关完整列表和更多详细信息,请参阅超参数调优指南。
如何将 Weights & Biases 与我的 YOLO11 模型调优集成?
要将 Weights & Biases (W&B) 与您的 Ultralytics YOLO11 调优过程集成:
-
安装 W&B:
pip install wandb
-
修改您的调整脚本:
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)
通过此设置,您可以在W&B中监视调整过程、跟踪超参数配置以及可视化结果。
为什么我应该使用 Ray Tune 和 YOLO11 进行超参数优化?
Ray Tune 为超参数优化提供了许多优势:
- 高级搜索策略: 利用贝叶斯优化和HyperOpt等算法进行高效的参数搜索。
- 并行性: 支持并行执行多个试验,从而显着加快调整过程。
- 提前停止: 采用诸如 ASHA 之类的策略,提前终止表现不佳的试验,从而节省计算资源。
Ray Tune 与 Ultralytics YOLO11 无缝集成,提供了一个易于使用的界面,可以有效地调整超参数。要开始使用,请查看超参数调整指南。
如何为 YOLO11 超参数调整定义自定义搜索空间?
要使用 Ray Tune 为您的 YOLO11 超参数调整定义自定义搜索空间:
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)
这可以自定义超参数的范围,例如在调整过程中要探索的初始学习率和动量。有关高级配置,请参阅自定义搜索空间示例部分。