跳转至内容

Ultralytics YOLO 超参数调优指南

简介

超参数调优不仅仅是一次性设置,而是一个旨在优化机器学习模型性能指标(如准确率、精确率和召回率)的迭代过程。在Ultralytics YOLO 的应用场景中,这些超参数可能涵盖从学习率到架构细节(如层数或所用激活函数的类型)等各个方面。Ultralytics 云端训练,并提供可配置的超参数和实时指标跟踪功能。



观看: 如何调整超参数以获得更好的模型性能 🚀

什么是超参数?

超参数是算法的高级结构设置。它们在训练阶段之前设置,并在训练期间保持不变。以下是 Ultralytics YOLO 中一些常用的调整超参数:

  • 学习率 lr0:决定每次迭代中朝着最小值移动的步长 损失函数.
  • 批量大小 batch:在前向传播中同时处理的图像数量。
  • 迭代次数(Epochs epochs:一个 epoch 是所有训练样本的一次完整的前向和后向传播。
  • 架构细节:例如通道数、层数、激活函数类型等。

超参数优化搜索空间可视化

有关YOLO26中使用的所有数据增强超参数的完整列表,请参阅配置页面

遗传进化和突变

Ultralytics YOLO 使用遗传算法来优化超参数。遗传算法的灵感来源于自然选择和遗传机制。

  • 交叉:每次迭代都会结合迄今为止观察到的最多九种适应度最高的配置中的基因,采用基于适应度加权的亲本选择的BLX-α交叉算法。
  • 变异:随后,对重组后的候选解应用对数正态乘法因子对每个超参数进行扰动(每个参数的概率为0.5)。变异强度σ在前300次迭代中从0.2线性衰减至0.1,因此算法在初期广泛探索,并在收敛过程中逐步优化。 第 1 次迭代没有用于交叉的亲本,因此使用默认的训练超参数作为基准。

准备进行超参数调优

在开始调优过程之前,重要的是:

  1. 确定评估指标:确定用于评估模型性能的指标。这可以是AP50、F1分数或其他。
  2. 设置调整预算: 确定您愿意分配多少计算资源。超参数调整可能需要大量的计算。

涉及的步骤

初始化超参数

首先从一组合理的初始超参数开始。这可以是 Ultralytics YOLO 设置的默认超参数,也可以是基于您的领域知识或之前的实验得出的。

突变超参数

使用 _mutate 方法,以基于现有集合生成一组新的超参数。该 Tuner 类 自动处理此过程。

训练模型

训练是使用经过变异的超参数集执行的。 然后使用您选择的指标评估训练性能。

评估模型

使用AP50、F1分数或自定义指标等来评估模型的性能。评估过程有助于确定当前超参数是否优于之前的超参数。

记录结果

记录性能指标和相应的超参数对于日后参考至关重要。Ultralytics YOLO 将这些结果保存为 NDJSON 格式。

重复

重复此过程,直到达到设定的迭代次数或性能指标令人满意为止。每次迭代都建立在从先前运行中获得的知识之上。

默认搜索空间描述

下表列出了YOLO26中超参数调优的默认搜索空间参数。每个参数都有一个由元组定义的特定值范围。 (min, max).

参数类型值范围描述
lr0float(1e-5, 1e-2)训练开始时的初始学习率。较低的值提供更稳定的训练,但收敛速度较慢
lrffloat(0.01, 1.0)最终学习率因子,表示为lr0的比例。控制训练期间学习率的降低程度
momentumfloat(0.7, 0.98)SGD动量因子。较高的值有助于保持梯度方向的一致性,并能加速收敛。
weight_decayfloat(0.0, 0.001)L2 正则化因子,用于防止过拟合。值越大,正则化效果越强
warmup_epochsfloat(0.0, 5.0)线性学习率预热的 epoch 数。有助于防止早期训练不稳定
warmup_momentumfloat(0.0, 0.95)预热阶段的初始动量。逐渐增加到最终动量值
boxfloat(1.0, 20.0)总损失函数中的边界框损失权重。平衡框回归与分类。
clsfloat(0.1, 4.0)分类损失在总损失函数中的权重。值越高,越强调正确分类的预测。
cls_pwfloat(0.0, 1.0)用于处理类别不平衡问题的类别权重。数值越高,稀有类别的权重越大。
dflfloat(0.4, 12.0)DFL(分布焦点损失)在总损失函数中的权重。值越高,越强调精确的边界框定位。
hsv_hfloat(0.0, 0.1)HSV 颜色空间中的随机色调增强范围。帮助模型泛化到各种颜色变化
hsv_sfloat(0.0, 0.9)HSV 空间中的随机饱和度增强范围。模拟不同的光照条件
hsv_vfloat(0.0, 0.9)随机值(亮度)增强范围。帮助模型处理不同的曝光水平
degreesfloat(0.0, 45.0)最大旋转增强角度。帮助模型对对象方向保持不变。
translatefloat(0.0, 0.9)最大平移增强,以图像尺寸的比例表示。提高对对象位置的鲁棒性。
scalefloat(0.0, 0.95)随机缩放增强范围。有助于模型 detect 不同大小的对象
shearfloat(0.0, 10.0)最大剪切增强角度。向训练图像添加类似透视的扭曲。
perspectivefloat(0.0, 0.001)随机透视增强范围。模拟不同的视角
flipudfloat(0.0, 1.0)训练期间垂直图像翻转的概率。适用于高空/航拍图像。
fliplrfloat(0.0, 1.0)水平图像翻转的概率。有助于模型对物体方向保持不变性。
bgrfloat(0.0, 1.0)使用 BGR 增强的概率,该增强会交换颜色通道。有助于颜色不变性。
mosaicfloat(0.0, 1.0)使用 mosaic 增强的概率,它组合了 4 张图像。对小物体检测特别有用。
mixupfloat(0.0, 1.0)使用 mixup 增强的概率,它混合了两张图像。可以提高模型的鲁棒性。
cutmixfloat(0.0, 1.0)使用 cutmix 数据增强的概率。在保持局部特征的同时组合图像区域
copy_pastefloat(0.0, 1.0)使用复制粘贴增强的概率。有助于提高实例分割性能。
close_mosaicfloat(0.0, 10.0)在最后 N 个 epoch 中禁用 mosaic,以在训练完成前稳定训练

自定义搜索空间示例

以下是如何定义搜索空间并使用 model.tune() 方法来利用 Tuner 用于在COCO8数据集上对YOLO26n进行30个周期的超参数调优的类,使用AdamW优化器,并跳过绘图、检查点和除最终周期外的验证,以实现更快的调优。

警告

此示例仅用于演示。从短期或小规模调优运行中获得的超参数,在实际训练中很少是最佳的。在实践中,调优应在与完整训练相似的设置下进行,包括可比较的数据集、周期和数据增强,以确保可靠和可迁移的结果。快速调优可能会使参数偏向更快的收敛或短期验证增益,而这些增益不具备泛化性。

示例

from ultralytics import YOLO

# Initialize the YOLO model
model = YOLO("yolo26n.pt")

# Define search space
search_space = {
    "lr0": (1e-5, 1e-2),
    "degrees": (0.0, 45.0),
}

# Tune hyperparameters on COCO8 for 30 epochs
model.tune(
    data="coco8.yaml",
    epochs=30,
    iterations=300,
    optimizer="AdamW",
    space=search_space,
    plots=False,
    save=False,
    val=False,
)

恢复中断的超参数调优会话

您可以通过传递以下参数来恢复中断的超参数调优会话 resume=True。您可以选择性地传递目录 name 在以下情况下使用 runs/{task} 恢复训练。否则,它将恢复上次中断的会话。你还需要提供所有之前的训练参数,包括 data, epochs, iterationsspace.

使用 resume=True 使用 model.tune()

from ultralytics import YOLO

# Define a YOLO model
model = YOLO("yolo26n.pt")

# Define search space
search_space = {
    "lr0": (1e-5, 1e-2),
    "degrees": (0.0, 45.0),
}

# Resume previous run
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, resume=True)

# Resume tuning run with name 'tune_exp'
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, name="tune_exp", resume=True)

结果

成功完成超参数调整过程后,您将获得多个文件和目录,其中封装了调整的结果。以下是每个文件和目录的描述:

文件结构

以下是结果的目录结构。像这样的训练目录 train1/ 包含独立的调优迭代,即一个模型使用一组超参数进行训练。该 tune/ 目录包含来自所有单独模型训练的调整结果:

runs/
└── detect/
    ├── train1/
    ├── train2/
    ├── ...
    └── tune/
        ├── best_hyperparameters.yaml
        ├── tune_fitness.png
        ├── tune_results.ndjson
        ├── tune_scatter_plots.png
        └── weights/
            ├── last.pt
            └── best.pt

文件描述

best_hyperparameters.yaml

此 YAML 文件包含在调整过程中找到的最佳性能超参数。您可以使用此文件来初始化具有这些优化设置的未来训练。

  • 格式: YAML
  • 用法: 超参数结果
  • 示例:

    # 558/900 iterations complete ✅ (45536.81s)
    # Results saved to /usr/src/ultralytics/runs/detect/tune
    # Best fitness=0.64297 observed at iteration 498
    # Best fitness metrics are {'metrics/precision(B)': 0.87247, 'metrics/recall(B)': 0.71387, 'metrics/mAP50(B)': 0.79106, 'metrics/mAP50-95(B)': 0.62651, 'val/box_loss': 2.79884, 'val/cls_loss': 2.72386, 'val/dfl_loss': 0.68503, 'fitness': 0.64297}
    # Best fitness model is /usr/src/ultralytics/runs/detect/train498
    # Best fitness hyperparameters are printed below.
    
    lr0: 0.00269
    lrf: 0.00288
    momentum: 0.73375
    weight_decay: 0.00015
    warmup_epochs: 1.22935
    warmup_momentum: 0.1525
    box: 18.27875
    cls: 1.32899
    dfl: 0.56016
    hsv_h: 0.01148
    hsv_s: 0.53554
    hsv_v: 0.13636
    degrees: 0.0
    translate: 0.12431
    scale: 0.07643
    shear: 0.0
    perspective: 0.0
    flipud: 0.0
    fliplr: 0.08631
    mosaic: 0.42551
    mixup: 0.0
    copy_paste: 0.0
    

tune_fitness.png

这是一幅展示适应度随迭代次数变化的图表。它有助于您直观了解遗传算法随时间推移的表现。

  • 格式: PNG
  • 用法: 性能可视化

超参数调优:Fitness 与迭代次数

该地块包含:

  • 每个数据集的每次迭代对应一个标记,因此单数据集运行中,每次迭代显示一个点;而多数据集运行中,每次迭代针对每个数据集显示一个点。
  • 一条虚线的“平滑均值”线 通过高斯平滑计算得出(sigma=3) 针对每次迭代的顶级适应度值。

tune_results.ndjson

一个 NDJSON 文件,其中包含每次调优迭代的详细结果。每行是一个 JSON 对象,包含聚合适应度、已调优的超参数以及各数据集的指标。单数据集调优和多数据集调优使用相同的文件格式。

  • 格式:NDJSON
  • 用法: 每次迭代的结果跟踪。
  • 示例:

为便于阅读,下面给出了一个格式化后的示例。在实际的 .ndjson 文件中,每个对象都存储在一行上。

{
    "iteration": 1,
    "fitness": 0.48628,
    "hyperparameters": {
        "lr0": 0.01,
        "lrf": 0.01,
        "momentum": 0.937,
        "weight_decay": 0.0005
    },
    "datasets": {
        "coco8": {
            "metrics/precision(B)": 0.65666,
            "metrics/recall(B)": 0.85,
            "metrics/mAP50(B)": 0.85086,
            "metrics/mAP50-95(B)": 0.64104,
            "val/box_loss": 1.57958,
            "val/cls_loss": 1.04986,
            "val/dfl_loss": 1.32641,
            "fitness": 0.64104
        },
        "coco8-grayscale": {
            "metrics/precision(B)": 0.6582,
            "metrics/recall(B)": 0.51667,
            "metrics/mAP50(B)": 0.59106,
            "metrics/mAP50-95(B)": 0.33152,
            "val/box_loss": 1.95424,
            "val/cls_loss": 1.64059,
            "val/dfl_loss": 1.70226,
            "fitness": 0.33152
        }
    },
    "save_dirs": {
        "coco8": "runs/detect/coco8",
        "coco8-grayscale": "runs/detect/coco8-grayscale"
    }
}

顶级 fitness 是每个数据集的算术平均值 fitness 值。对于单数据集调优, datasets 字典中有一个条目,其 fitness 等同于顶级 fitness. 每次迭代完成后都会记录一个 JSON 对象。实际的 save_dirs 路径均为绝对路径;为便于阅读,上文对其进行了缩写。

tune_scatter_plots.png

此文件包含由此生成的散点图 tune_results.ndjson,帮助您直观地了解不同超参数与性能指标之间的关系。默认值为 0 的超参数(例如, degreesshear (下文)可能从其初始状态仅缓慢演化,因为乘法突变因子从接近零的值开始,几乎没有多少空间可供扩展。

  • 格式: PNG
  • 用法: 探索性数据分析

超参数调优结果散点图分析

weights/

此目录包含超参数调整过程中最后一次迭代和最佳迭代的已保存 PyTorch 模型。

  • last.pt:last.pt 是来自训练的最后一个 epoch 的权重。
  • best.pt:best.pt 是实现最佳适应度分数的迭代的权重。

使用这些结果,您可以为将来的模型训练和分析做出更明智的决策。请随时查阅这些文件,以了解您的模型表现如何以及如何进一步改进它。

结论

得益于基于遗传算法的方案(该方案结合了 BLX-α 交叉算法与对数正态突变算法),Ultralytics YOLO 中的超参数调优过程YOLO 简单又强大。遵循本指南中概述的步骤,将有助于您系统地调优模型,从而获得更佳的性能。

延伸阅读

  1. Wikipedia 中的超参数优化
  2. YOLOv5 超参数演化指南
  3. 使用Ray Tune和YOLO26进行高效超参数调优

要获得更深入的了解,您可以浏览 Tuner 源代码和随附文档。如果您有任何问题、功能请求或需要进一步的帮助,请随时通过以下方式与我们联系 GitHubDiscord.

常见问题

如何在超参数调整期间优化 Ultralytics YOLO 的学习率

要优化 Ultralytics YOLO 的学习率,请首先使用 lr0 参数设置初始学习率。常用值范围为 0.0010.01。在超参数调整过程中,将改变此值以找到最佳设置。您可以利用 model.tune() 方法来自动执行此过程。例如:

示例

from ultralytics import YOLO

# Initialize the YOLO model
model = YOLO("yolo26n.pt")

# Tune hyperparameters on COCO8 for 30 epochs
model.tune(data="coco8.yaml", epochs=30, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)

有关更多详细信息,请查看Ultralytics YOLO 配置页面

在YOLO26中使用遗传算法进行超参数调优有哪些好处?

Ultralytics YOLO26中的遗传算法提供了一种探索超参数空间的稳健方法,从而实现高度优化的模型性能。主要优势包括:

  • 高效搜索:BLX-α杂交算法结合了适应度最高的亲本基因,而对数正态突变则会对结果进行扰动,从而发现新的候选基因。
  • 避免局部最小值:通过引入随机性,它们有助于避免局部最小值,从而确保更好的全局优化。
  • 性能指标:它们会根据特定任务的适应度得分进行调整(检测任务中mAP50)。

要了解遗传算法如何优化超参数,请查看超参数演化指南

Ultralytics YOLO 的超参数调优过程需要多长时间?

使用Ultralytics YOLO进行超参数调优所需的时间很大程度上取决于多个因素,例如数据集的大小、模型架构的复杂性、迭代次数以及可用的计算资源。例如,在COCO8等数据集上对YOLO26n进行30个周期的调优可能需要数小时到数天,具体取决于硬件。

为了有效地管理调整时间,请预先定义一个明确的调整预算(内部章节链接)。这有助于平衡资源分配和优化目标。

在 YOLO 的超参数调优期间,我应该使用哪些指标来评估模型性能?

在 YOLO 中进行超参数调整期间评估模型性能时,可以使用以下几个关键指标:

  • AP50:IoU 阈值为 0.50 时的平均精度。
  • F1-Score: 精度和召回率的调和平均值。
  • 精度和召回率: 单独的指标,指示模型在识别真阳性与假阳性和假阴性方面的准确性

这些指标可帮助您了解模型性能的不同方面。有关全面概述,请参阅 Ultralytics YOLO 性能指标 指南。

我可以使用Ray Tune对YOLO26进行高级超参数优化吗?

是的,Ultralytics YOLO26集成了Ray Tune以进行高级超参数优化。Ray Tune提供了贝叶斯优化和Hyperband等复杂的搜索算法,以及并行执行能力,以加速调优过程。

要将Ray Tune与YOLO26结合使用,只需设置 use_ray=True 中的参数 model.tune() 方法调用。更多详情和示例,请查看 Ray Tune 集成指南.



📅 创建于 2 年前 ✏️ 更新于 0 天前
glenn-jocherraimbekovmY-T-GRizwanMunawarUltralyticsAssistantLaughing-qfaruk.gmstss@gmail.compderrenger1490435889@qq.comMatthewNoyce

评论