Ultralytics YOLO27:
Get Started

使用 Ray Tune 和 YOLO26 高效调优超参数#

调优超参数对于实现模型的最佳性能至关重要,它能帮助你找到最优的超参数组合。调优过程包括使用不同的超参数运行多次试验,并评估每次试验的性能。

使用 Ultralytics YOLO26 和 Ray Tune 加速调优#

Ultralytics YOLO26 集成了 Ray Tune,用于调优超参数,从而简化 YOLO26 模型超参数的优化过程。借助 Ray Tune,你可以利用高级搜索策略、并行处理和提前停止来加快调优过程。

Ray Tune#

Ray Tune hyperparameter optimization workflow

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

# 加载 YOLO26n 模型
model = YOLO("yolo26n.pt")

# 在 COCO8 数据集上开始调优 YOLO26n 训练的超参数
result_grid = model.tune(data="coco8.yaml", use_ray=True)

tune() 方法参数#

YOLO26 中的 tune() 方法提供了一个易于使用的接口,可通过 Ray Tune 调优超参数。该方法接受多个参数,你可以用它们自定义调优过程。下面详细介绍各个参数:

参数类型说明默认值
datastr要运行调优器的数据集 YAML 文件,其中指定了训练和验证数据路径以及其他数据集专属设置。分类任务则使用数据集目录或内置数据集名称(例如 imagenet10)。
spacedict, optional用于定义 Ray Tune 超参数搜索空间的字典。每个键对应一个超参数名称,值则指定调优时要探索的取值范围。如果未提供,YOLO26 会使用包含多种超参数的默认搜索空间。
grace_periodint, optionalRay Tune 中 ASHA 调度器的轮次宽限期。达到此轮数之前,调度器不会终止任何试验,从而确保模型至少经过一定程度的训练,再决定是否提前停止。10
gpu_per_trialint, optionalRay 为每次试验分配的 GPU 数量。要使用 GPU 训练,请明确设置此参数;如果省略,试验将不会获得 GPU 资源。None
iterationsint, optional调优过程中要运行的最大试验次数。此参数有助于控制测试的超参数组合总数,避免调优过程无限运行。300
search_algstr or Searcher, optional要使用的 Ray Tune 搜索策略。你可以直接传入 Ray 搜索器对象,也可以使用受支持的字符串,例如 optuna、hyperopt、bayesopt、bohb、hebo、nevergrad、zoopt、ax 或 random。基于字符串的搜索器会自动使用默认任务指标和 mode="max"。默认策略使用 Optuna 多变量 TPE,并提供适用于并行处理的建议。"optuna"
**train_argsdict, optional调优期间传递给 train() 方法的其他参数。这些参数可包括训练轮数、批量大小以及其他特定于训练的配置。{}

通过自定义这些参数,你可以根据自己的具体需求和可用计算资源,微调超参数优化过程。

默认搜索空间说明#

下表列出了使用 Ray Tune 调优 YOLO26 时的默认搜索空间参数。除 close_mosaic 使用 tune.randint() 外,每个参数都由 tune.uniform() 定义了特定的取值范围。

参数范围说明
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)学习率逐渐升高的轮数,用于稳定训练初期的过程。
warmup_momentumtune.uniform(0.0, 0.95)初始动量值,在预热阶段逐渐增大。
boxtune.uniform(1.0, 20.0)边界框损失项的权重,用于平衡模型的定位精度。
clstune.uniform(0.1, 4.0)分类损失项的权重,用于平衡模型的类别预测准确率。
cls_pwtune.uniform(0.0, 1.0)类别加权系数,从禁用(0.0)到完全按频率倒数加权(1.0)。
dfltune.uniform(0.4, 12.0)框距离回归项的权重,用于提升边界框定位精度。
hsv_htune.uniform(0.0, 0.1)色调增强范围,通过引入颜色变化帮助模型提升泛化能力。
hsv_stune.uniform(0.0, 0.9)饱和度增强范围,通过改变颜色强度来提升鲁棒性。
hsv_vtune.uniform(0.0, 0.9)明度(亮度)增强范围,帮助模型适应各种光照条件。
degreestune.uniform(0.0, 45.0)以度为单位的旋转增强范围,有助于识别旋转的物体。
translatetune.uniform(0.0, 0.9)平移增强范围,用于在水平方向和垂直方向移动图像。
scaletune.uniform(0.0, 0.95)缩放增强范围,用于模拟不同距离下的物体。
sheartune.uniform(0.0, 10.0)以度为单位的剪切增强范围,用于模拟透视偏移。
perspectivetune.uniform(0.0, 0.001)透视增强范围,用于模拟 3D 视角变化。
flipudtune.uniform(0.0, 1.0)垂直翻转增强的概率,可增加数据集的多样性。
fliplrtune.uniform(0.0, 1.0)水平翻转增强的概率,适用于对称物体。
bgrtune.uniform(0.0, 1.0)BGR 通道交换增强的概率,有助于提升颜色不变性。
mosaictune.uniform(0.0, 1.0)Mosaic 增强的概率,可将四张图像合并为一个训练样本。
mixuptune.uniform(0.0, 1.0)Mixup 增强的概率,可将两张图像及其标签混合在一起。
cutmixtune.uniform(0.0, 1.0)Cutmix 增强的概率,可在保留局部特征的同时组合图像区域。
copy_pastetune.uniform(0.0, 1.0)在 flip 模式下,表示复制到图像中的符合条件物体所占比例;在 mixup 模式下,还表示执行该操作的概率。
close_mosaictune.randint(0, 11)在最后 N 个轮次中禁用 Mosaic,以便在训练结束前稳定训练过程。

自定义搜索空间示例#

在本示例中,我们演示如何使用自定义搜索空间,通过 Ray Tune 和 YOLO26 调优超参数。提供自定义搜索空间后,你可以将调优过程集中在感兴趣的特定超参数上。

用法
from ray import tune

from ultralytics import YOLO

# 定义 YOLO 模型
model = YOLO("yolo26n.pt")

# 对模型运行 Ray Tune
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" 和值 tune.uniform(1e-5, 1e-2) 的字典,为初始学习率 lr0 提供自定义搜索空间。最后,我们将训练轮数等其他训练参数作为 epochs=50 直接传递给 tune 方法。

搜索算法示例#

你可以按名称选择 Ray Tune 搜索策略。对于基于字符串的搜索算法,Ultralytics 会自动使用当前任务的默认优化指标和 mode="max"。如果未提供 search_alg,Ultralytics 会使用 Optuna 多变量 TPE,并提供适用于并行处理的建议。

使用字符串 `search_alg` 和 `model.tune()`
from ultralytics import YOLO

# 定义 YOLO 模型
model = YOLO("yolo26n.pt")

result_grid = model.tune(
    data="coco8.yaml",
    epochs=50,
    search_alg="optuna",
    use_ray=True,
)

如果你需要自定义搜索器的采样器,或覆盖搜索器的指标和优化模式,请传入实例化的 Ray Tune 搜索器对象,而不是字符串。

使用 `OptunaSearch` 对象和 `model.tune()`
from ray.tune.search.optuna import OptunaSearch

from ultralytics import YOLO

# 定义 YOLO 模型
model = YOLO("yolo26n.pt")

# 定义搜索器
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。

将 `resume=True` 与 `model.tune()` 配合使用
from ultralytics import YOLO

# 定义 YOLO 模型
model = YOLO("yolo26n.pt")

# 恢复之前的运行
results = model.tune(use_ray=True, data="coco8.yaml", epochs=50, resume=True)

# 恢复名为 'tune_exp_2' 的 Ray Tune 运行
results = model.tune(use_ray=True, data="coco8.yaml", epochs=50, name="tune_exp_2", resume=True)

处理 Ray Tune 结果#

使用 Ray Tune 运行超参数调优实验后,你可能需要对所得结果进行各种分析。本指南将介绍处理和分析这些结果的常见工作流程。

从目录加载 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 模型的超参数,请按以下步骤操作:

    1. 安装所需的软件包:

      pip install -U ultralytics "ray[tune]" optuna
      pip install wandb # optional for logging
      yolo settings wandb=True
    2. 加载 YOLO26 模型并开始调优:

      from ultralytics import YOLO
      
      # 加载 YOLO26 模型
      model = YOLO("yolo26n.pt")
      
      # 使用 COCO8 数据集开始调优
      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 调优过程中,请按以下步骤操作:

    1. 安装 W&B:

      pip install wandb
      wandb login
      yolo settings wandb=True
    2. 运行调优器:

      from ultralytics import YOLO
      
      # 加载 YOLO 模型
      model = YOLO("yolo26n.pt")
      
      # 每个 Ray 试验都会在此项目中创建自己的 W&B 运行
      result_grid = model.tune(data="coco8.yaml", project="YOLO-Tuning", use_ray=True)

    此设置可让你监控调优过程、跟踪超参数配置,并可视化 W&B 中的结果。

  • Ray Tune 为超参数优化提供了诸多优势:

    • 高级搜索策略: 使用 贝叶斯优化 和 HyperOpt 等算法,高效搜索参数。
    • 并行性: 支持并行执行多个试验,大幅加快调优过程。
    • 提前停止: 使用 ASHA 等策略提前终止表现不佳的试验,从而节省计算资源。

    Ray Tune 与 Ultralytics 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)

    这样可以自定义调优过程中要探索的超参数范围,例如初始学习率和动量。有关高级配置,请参阅自定义搜索空间示例部分。

评论