Ultralytics YOLO27:
Get Started

机器学习最佳实践与模型训练技巧#

简介#

开展计算机视觉项目时,最重要的步骤之一就是模型训练。在进入这一步之前,你需要明确目标,并收集和标注数据。预处理数据,确保数据干净且一致之后,就可以开始训练模型了。

模型训练是教模型识别视觉模式并根据数据进行预测的过程,它会直接影响应用的准确性。本指南将介绍最佳实践、优化技巧和故障排查建议,帮助你有效训练计算机视觉模型。



观看: 模型训练技巧 | 如何处理大型数据集 | 批量大小、GPU 利用率和 混合精度

如何训练机器学习模型#

训练计算机视觉模型时,会调整模型的内部参数以尽量减少错误。首先,向模型输入大量带标签的图像。模型会预测图像中的内容,再将预测结果与实际标签或内容进行比较,以计算误差。这些误差反映了模型的预测与真实值之间的差距。

训练期间,模型会通过称为反向传播的过程反复进行预测、计算误差并更新参数。在此过程中,模型会调整内部参数(权重和偏置)以减少误差。多次重复这一循环后,模型的准确性会逐渐提高。随着训练推进,模型会学会识别形状、颜色和纹理等复杂模式。

What is Backpropagation?

这一学习过程使计算机视觉模型能够执行各种任务,包括目标检测、实例分割、语义分割和图像分类。最终目标是创建一个能够将所学知识泛化到新的、未见过的图像上的模型,从而使其能够在实际应用中准确理解视觉数据。

了解了训练模型背后的原理后,接下来看看训练模型时需要考虑的事项。

使用大型数据集训练#

计划使用大型数据集训练模型时,有几个方面需要考虑。例如,你可以调整批量大小、控制 GPU 利用率、选择使用多尺度训练等。下面逐一详细介绍这些选项。

批量大小与 GPU 利用率#

使用大型数据集训练模型时,高效利用 GPU 至关重要。批量大小是一个重要因素,它指机器学习模型在一次训练迭代中处理的数据样本数量。 使用 GPU 所支持的最大批量大小,可以充分发挥 GPU 的能力,并缩短模型训练时间。不过,你需要避免 GPU 内存耗尽。如果遇到内存错误,请逐步减小批量大小,直到模型能够顺利训练。



观看: 如何使用 Ultralytics YOLO26 进行批量推理 | 在 Python 中加速目标检测 🎉

对于 YOLO26,你可以在训练模式参数中设置 batch 参数,使其与 GPU 容量相匹配。在单个加速器上,batch=-1 会分析模型,并选择一个批量大小,目标是将内存利用率控制在约 60%;像 batch=0.70 这样的分数值则用于指定其他利用率。多 GPU 运行需要显式设置全局批量大小,且该值必须是设备数量的倍数。在 CPU 和 Apple 芯片上,AutoBatch 会发出警告并回退到 batch=16。

子集训练#

子集训练是一种实用策略,即使用能够代表整个数据集的较小数据集来训练模型。它可以节省时间和资源,尤其适用于模型开发和测试的初期阶段。如果时间紧张,或正在尝试不同的模型配置,子集训练是不错的选择。

对于 YOLO26,你可以轻松使用 fraction 参数实现子集训练。使用 fraction=0.1 这样的比例表示使用 10% 的训练数据;使用 fraction=300 这样的整数表示恰好使用 300 张训练图像;或者使用 fraction=[300, 100, 0] 这样的 [train, val, test] 列表来限制各个数据拆分并跳过测试图像。像 [300, 100] 这样的双项列表会保留完整的测试拆分。NDJSON 数据集会在下载前选择间隔均匀的记录,因此重复运行时使用的子集完全相同。这种方法便于快速迭代和调优,让你在投入完整数据集前进行验证。

多尺度训练#

多尺度训练是一种通过使用不同尺寸的图像进行训练来提升模型泛化能力的技术。模型可以学会检测不同尺度和距离下的目标,从而变得更加稳健。

例如,训练 YOLO26 时,可以通过设置 scale 参数来启用尺度增强。该参数会按照指定比例调整训练图像的大小,以模拟不同距离下的目标。例如,设置 scale=0.5 后,训练期间会随机将训练图像缩放为原来的 0.5 到 1.5 倍。配置此参数后,模型就能接触到各种图像尺度,从而提升其在不同目标大小和场景下的检测能力。

Ultralytics 还支持通过 multi_scale 参数进行图像尺寸多尺度训练。与 scale 不同,后者会缩放图像,然后填充或裁剪回 imgsz;multi_scale 则会在每个批次中直接改变 imgsz 本身(并按模型步长取整)。例如,设置 imgsz=640 和 multi_scale=0.25 后,训练尺寸会以步长为单位在 480 到 800 之间采样(例如 480、512、544、……、800);而 multi_scale=0.0 则保持固定尺寸。

缓存#

缓存是提升机器学习模型训练效率的重要技术。将预处理后的图像存储在内存中,可以减少 GPU 等待从磁盘加载数据的时间。模型能够持续接收数据,不会因磁盘 I/O 操作而延迟。

使用 YOLO26 训练时,可以通过 cache 参数控制缓存:

  • cache=True:将数据集图像存储在 RAM 中,访问速度最快,但会占用更多内存。
  • cache='disk':将图像存储在磁盘上,速度比 RAM 慢,但比每次都重新加载数据快。
  • cache=False:禁用缓存,完全依赖磁盘 I/O,这是速度最慢的选项。

混合精度训练#

混合精度训练同时使用 16 位(FP16)和 32 位(FP32)浮点类型。它结合了 FP16 和 FP32 的优势:使用 FP16 加快计算,并在需要时使用 FP32 保持精度。大多数神经网络运算都使用 FP16,以加快计算速度并降低内存占用。不过,模型权重的主副本会以 FP32 保存,以确保权重更新步骤中的准确性。在相同硬件限制下,你可以处理更大的模型或使用更大的批量大小。

Mixed precision FP16 training benefits

要实现混合精度训练,你需要修改训练脚本,并确保硬件(例如 GPU)支持该功能。许多现代深度学习框架,例如 PyTorch 和 TensorFlow,都内置了混合精度支持。

使用 YOLO26 进行混合精度训练很简单:AMP 默认已启用(amp=True)。在 CUDA GPU 上,YOLO 会在训练开始时进行一次能力检查;如果检查失败,就会回退到完整 FP32 精度。在 CPU 和 Apple 芯片上则会完全跳过 AMP。设置 amp=False 可强制使用 FP32。

预训练权重#

使用预训练权重是加快模型训练的有效方法。预训练权重来自已在大型数据集上训练过的模型,可以让你的模型拥有一个良好的起点。迁移学习会将预训练模型调整到新的相关任务上。微调预训练模型时,先使用这些权重初始化模型,然后继续在特定数据集上训练。这种训练方法可以缩短训练时间,而且通常能带来更好的性能,因为模型一开始就已掌握基本特征。

预训练权重来自 model 参数,因此 model=yolo26n.pt 已经会从 COCO 权重开始训练。pretrained 参数用于控制是否保留这些权重(True,默认值)、丢弃这些权重(False),或替换为另一个检查点(pretrained=path/to/best.pt)。在 *.yaml 模型上设置 pretrained=True 本身并不会获取权重。完整的迁移学习工作流请参阅如何在自定义数据集上微调 YOLO。

处理大型数据集时还需考虑的其他技巧#

处理大型数据集时,还可以考虑另外几种技巧:

  • 学习率调度器:通过实现学习率调度器,可以在训练期间动态调整学习率。合理调优的学习率可以防止模型越过极小值,并提升稳定性。训练 YOLO26 时,lrf 参数通过将最终学习率设置为初始学习率的一定比例,帮助管理学习率调度。对于参数未提供的功能(例如逐层学习率或梯度裁剪),请继承训练器。
  • 分布式训练:处理大型数据集时,分布式训练可能会带来巨大改变。你可以将训练工作分散到多个 GPU 或机器上,从而缩短训练时间。对于拥有大量计算资源的企业级项目,这种方法尤其有价值。
  • Channels-last 内存格式:在 PyTorch 1.11 及更高版本中,CUDA 训练会自动使用更快的 NHWC 内存布局,但 Windows 除外,因为实测发现该布局在 Windows 上速度更慢。设置 channels_last=True 可强制启用该格式,设置 channels_last=False 则可保持 NCHW;PyTorch 1.10 及更早版本、CPU 和 MPS 默认仍使用 NCHW。

训练轮数#

训练模型时,一个 epoch 指完整遍历一次整个训练数据集。在一个 epoch 中,模型会处理训练集中的每个样本一次,并根据学习算法更新参数。通常需要训练多个 epoch,模型才能逐步学习并调整参数。

一个常见问题是:应该将模型训练多少个 epoch?一个不错的起点是 300 个 epoch。如果模型过早过拟合,可以减少 epoch 数。如果训练 300 个 epoch 后仍未出现过拟合,可以将训练延长至 600、1200 个或更多 epoch。

不过,理想的 epoch 数会因数据集大小和项目目标而异。较大的数据集可能需要更多 epoch,模型才能有效学习;较小的数据集则可能需要较少 epoch,以避免过拟合。对于 YOLO26,你可以在训练脚本中设置 epochs 参数。

提前停止#

提前停止是优化模型训练的有效技巧。通过监控验证性能,当模型不再提升时,你可以停止训练。这样可以节省计算资源并防止过拟合。

该过程需要设置一个耐心值参数,用于确定在停止训练前,等待验证指标提升的 epoch 数。如果模型在这些 epoch 内没有提升性能,就会停止训练,以免浪费时间和资源。

Early stopping to prevent model overfitting

对于 YOLO26,你可以在训练配置中设置耐心值参数来启用提前停止。例如,patience=5 表示如果验证指标连续 5 个 epoch 没有提升,训练就会停止。使用这种方法可确保训练过程保持高效,并在不过度消耗计算资源的情况下达到最佳性能。

选择云端还是本地训练#

训练模型有两种选择:云端训练和本地训练。

云端训练具有可扩展性,并能提供强大的硬件,非常适合处理大型数据集和复杂模型。Google Cloud、AWS 和 Azure 等平台可按需提供高性能 GPU 和 TPU,从而缩短训练时间,并支持使用更大的模型进行实验。不过,云端训练可能成本高昂,尤其是长期使用时,而且数据传输也会增加成本和延迟。

本地训练能提供更高的控制力和定制灵活性,让你根据具体需求调整环境,并避免持续的云端费用。对于长期项目,本地训练可能更经济;由于数据保留在本地,安全性也更高。不过,本地硬件可能存在资源限制并需要维护,这可能导致大型模型的训练时间更长。

选择优化器#

优化器是一种算法,可调整神经网络的权重以最小化损失函数,损失函数用于衡量模型的表现。简单来说,优化器通过调整模型参数来减少错误,帮助模型学习。选择合适的优化器会直接影响模型学习的速度和准确性。

你还可以微调优化器参数来提升模型性能。调整学习率可以设置更新参数时的步长。为了保持稳定,你可以先采用适中的学习率,然后逐渐降低学习率,以改善长期学习效果。此外,设置动量可以决定过去的更新对当前更新的影响程度。动量的常见取值约为 0.9,通常能取得不错的平衡。

常见优化器#

不同优化器各有优缺点。下面简要介绍几种常见的优化器。

  • SGD(随机梯度下降):

    • 根据损失函数相对于参数的梯度更新模型参数。
    • 简单高效,但收敛可能较慢,也可能陷入局部最小值。
  • Adam(自适应矩估计):

    • 结合了带动量的 SGD 和 RMSProp 的优点。
    • 根据梯度一阶矩和二阶矩的估计值,为每个参数调整学习率。
    • 适用于噪声较大的数据和稀疏梯度。
    • 效率高,通常所需的调参较少。对于较短的训练任务,YOLO26 的 optimizer=auto 会选择与 Adam 密切相关的 AdamW,而不是 Adam 本身。
  • RMSProp(均方根传播):

    • 通过用梯度除以近期梯度幅值的移动平均值,为每个参数调整学习率。
    • 有助于处理梯度消失问题,并且适用于循环神经网络。
  • MuSGD(Muon + SGD 混合优化器):

    • 结合了 SGD 风格的更新和受 Muon 启发的行为,从而提升大规模训练的稳定性。
    • 如果你希望获得类似 SGD 的泛化能力,同时需要比原始 SGD 更平稳的收敛效果,那么 MuSGD 是不错的选择。
    • 这对 YOLO26 训练方案尤其重要;如果不确定该选什么,可以从 optimizer=auto 开始,并在你的数据集上与 MuSGD 进行比较。

对于 YOLO26,optimizer 参数可让你从多种优化器中进行选择,包括 SGD、MuSGD、Adam、Adamax、AdamW、NAdam、RAdam 和 RMSProp;你也可以将其设为 auto,根据训练迭代次数自动选择优化器。

yolo train model=yolo26n.pt data=coco8.yaml optimizer=MuSGD

融入社区#

加入计算机视觉爱好者社区,可以帮助你解决问题并更快地学习。以下是一些交流、获取帮助和分享想法的方式。

社区资源#

  • GitHub Issues:访问 YOLO26 GitHub 仓库,使用 Issues 标签页提问、报告错误并建议新功能。社区成员和维护者都非常活跃,随时乐于提供帮助。
  • Ultralytics Discord 服务器:加入 Ultralytics Discord 服务器,与其他用户和开发者交流、获取支持并分享经验。

官方文档#

  • Ultralytics YOLO26 文档:查看 YOLO26 官方文档,获取各种计算机视觉项目的详细指南和实用技巧。

利用这些资源,你可以解决各种挑战,及时了解计算机视觉社区的最新趋势和实践。

要点总结#

训练计算机视觉模型需要遵循良好的实践、优化策略并解决遇到的问题。调整批次大小、采用混合精度训练,以及从预训练权重开始等技巧,可以提升模型性能并加快训练速度。子集训练和早停等方法有助于节省时间和资源。与社区保持联系并关注新趋势,有助于你不断提升模型训练技能。

常见问题#

  • 要提高 GPU 利用率,请将 batch 参数设为 GPU 支持的最大尺寸。在单个加速器上,batch=-1 会分析模型并以约 60% 的显存利用率为目标。在 CPU 和 Apple 芯片上,该参数会回退到 batch=16;多 GPU 训练则需要显式设置全局批次大小,且该数值必须是设备数量的倍数。更多信息请参阅训练模式参数。

  • 混合精度训练同时使用 16 位(FP16)和 32 位(FP32)浮点类型,以平衡计算速度和精度。YOLO26 默认通过 amp=True 启用混合精度;将 amp=False 设为相应值可强制使用 FP32。CPU 和 Apple 芯片会跳过 AMP。更多详情请参阅训练模式参数。

  • 多尺度训练通过使用不同尺寸的图像进行训练来提升模型性能,使模型能够更好地泛化到不同尺度和距离的目标。YOLO26 为此提供了两个独立参数。scale=0.5 会在 0.5 到 1.5 之间采样缩放因子,然后通过填充或裁剪恢复为固定的 imgsz;而 multi_scale=0.25 会在每个批次中以步幅为单位改变 imgsz 本身。有关设置和更多详情,请查看训练模式文档。

  • 使用预训练权重可以利用模型已经学到的基础视觉特征,大幅加快训练并提升模型准确率。通过 model 参数加载权重,例如 model=yolo26n.pt;随后,pretrained 会决定保留这些权重(默认值为 True)、丢弃这些权重(False),还是替换为另一个检查点(pretrained=path/to/best.pt,这是将权重迁移到 model=*.yaml 架构的方法)。更多信息请参阅训练模式文档。

评论