跳至内容

模型训练的机器学习最佳实践和技巧

导言

计算机视觉项目中,最重要的步骤之一就是模型训练。在完成这一步之前,您需要确定目标收集和注释数据。在对数据进行预处理以确保其干净一致后,就可以开始训练模型了。

那么,什么是模型训练?模型训练是教会模型识别视觉模式并根据数据进行预测的过程。它直接影响应用程序的性能和准确性。在本指南中,我们将介绍最佳实践、优化技术和故障排除技巧,帮助您有效地训练计算机视觉模型。

How to Train a Machine Learning Model

计算机视觉模型通过调整其内部参数来训练,以最大程度地减少错误。最初,模型被馈送大量标记图像。它对这些图像中的内容进行预测,并将预测与实际标签或内容进行比较以计算误差。这些误差显示模型的预测与真实值的相差程度。

在训练期间,模型通过称为反向传播的过程迭代进行预测、计算误差并更新其参数。在此过程中,模型调整其内部参数 (weights and biases) 以减少错误。通过多次重复此循环,模型逐渐提高了其准确性。随着时间的流逝,它学会了识别复杂的图案,如形状、颜色和纹理。

什么是反向传播?

这一学习过程使计算机视觉模型能够执行各种任务,包括物体检测实例分割图像分类。我们的最终目标是创建一个能够将其学习成果推广到新的、未见过的图像中的模型,从而在实际应用中准确理解视觉数据。

现在我们知道了训练模型时幕后发生了什么,让我们看看训练模型时要考虑的要点。

大型数据集上的训练

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

批量大小和GPU 利用率

When training models on large datasets, efficiently utilizing your GPU is key. Batch size is an important factor. It is the number of data samples that a machine learning model processes in a single training iteration. Using the maximum batch size supported by your GPU, you can fully take advantage of its capabilities and reduce the time model training takes. However, you want to avoid running out of GPU memory. If you encounter memory errors, reduce the batch size incrementally until the model trains smoothly.

关于 YOLOv8,您可以将 batch_size 参数中的 培训配置 to match your GPU capacity. Also, setting batch=-1 将根据设备的性能自动确定可有效处理的批量大小。通过微调批量大小,您可以充分利用GPU 资源,改善整个培训流程。

子集训练

子集训练是一种智能策略,涉及在表示较大数据集的较小数据集上训练模型。它可以节省时间和资源,尤其是在初始模型开发和测试期间。如果您时间紧迫或尝试不同的模型配置,子集训练是一个不错的选择。

当谈到 YOLOv8,您可以使用 fraction 参数。此参数允许您指定数据集中用于训练的比例。例如,将 fraction=0.1 将在 10% 的数据上训练模型。在提交使用完整数据集训练模型之前,可以使用此技术进行快速迭代和调整模型。子集训练可帮助您快速取得进展并及早发现潜在问题。

多尺度培训

多尺度训练是一种通过在不同尺寸的图像上进行训练来提高模型泛化能力的技术。您的模型可以学会检测不同尺度和距离的物体,从而变得更加强大。

例如,在训练YOLOv8 时,可以通过设置 scale 参数。此参数按指定因子调整训练图像的大小,模拟不同距离的对象。例如,将 scale=0.5 会将图像大小减小一半,而 scale=2.0 会翻倍。配置此参数可让您的模型体验各种图像比例,并提高其在不同对象大小和场景中的检测能力。

缓存

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

训练时可以控制缓存 YOLOv8 使用 cache 参数:

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

混合精密训练

混合精度训练使用 16 位 (FP16) 和 32 位 (FP32) 浮点类型。FP16 和 FP32 的优势通过使用 FP16 实现更快的计算速度,利用 FP32 在需要的地方保持精度。神经网络的大多数操作都是在 FP16 中完成的,以受益于更快的计算和更低的内存使用。但是,模型权重的主副本保存在 FP32 中,以确保权重更新步骤的准确性。您可以在相同的硬件约束下处理更大的模型或更大的批量大小。

混合精度训练概述

若要实现混合精度训练,需要修改训练脚本并确保硬件(如 GPU)支持它。许多现代深度学习框架,例如 Tensorflow,提供对混合精度的内置支持。

混合精度训练在使用 YOLOv8.您可以使用 amp 在训练配置中标记。设置 amp=True 启用自动混合精度 (AMP) 训练。混合精度训练是优化模型训练过程的一种简单而有效的方法。

预训练重量

使用预训练权重是加快模型训练过程的明智之举。预训练的权重来自于已经在大型数据集上训练过的模型,为你的模型提供了先机。迁移学习可使预训练模型适应新的相关任务。对预训练模型的微调包括从这些权重开始,然后在特定数据集上继续训练。这种训练方法训练时间更快,而且通常性能更好,因为模型一开始就对基本特征有了扎实的了解。

"(《世界人权宣言》) pretrained 参数使迁移学习变得容易 YOLOv8.设置 pretrained=True 将使用默认的预训练权重,或者您可以指定自定义预训练模型的路径。使用预训练权重和迁移学习可有效提高模型的能力并降低训练成本。

处理大型数据集时要考虑的其他技术

处理大型数据集时,还需要考虑其他几种技术:

  • 学习率调度器:实施学习率调度器可在训练过程中动态调整学习率。经过良好调整的学习率可以防止模型过冲最小值并提高稳定性。当训练YOLOv8 时 lrf 参数通过将最终学习率设置为初始率的一小部分来帮助管理学习率计划。
  • 分布式训练:对于处理大型数据集而言,分布式训练可以改变游戏规则。您可以将训练工作量分散到多个 GPU 或机器上,从而缩短训练时间。

要训练的纪元数

训练模型时,epoch 是指整个训练数据集的一次完整传递。在一个时期内,模型对训练集中的每个示例进行一次处理,并根据学习算法更新其参数。通常需要多个时期才能使模型随着时间的推移学习和优化其参数。

出现的一个常见问题是如何确定要训练模型的周期数。一个好的起点是 300 个纪元。如果模型过早超拟合,则可以减少 epoch 数。如果 300 个 epoch 后未发生过拟合,则可以将训练扩展到 600、1200 或更多 epoch。

但是,理想的纪元数可能会因数据集的大小和项目目标而异。较大的数据集可能需要更多的 epoch 才能使模型有效学习,而较小的数据集可能需要更少的 epoch 来避免过度拟合。关于 YOLOv8,您可以将 epochs 参数。

提前停止

提前停止是优化模型训练的宝贵技术。通过监视验证性能,您可以在模型停止改进后停止训练。您可以节省计算资源并防止过拟合。

这一过程包括设置一个耐心参数,决定在停止训练前要等待多少个历元验证指标的改善。如果模型的性能在这些历元内没有改善,就会停止训练,以避免浪费时间和资源。

提前停课概述

为 YOLOv8,您可以通过在训练配置中设置耐心参数来启用提前停止。例如 patience=5 表示如果连续 5 个周期的验证指标没有改进,则训练将停止。使用这种方法可确保训练过程保持高效,并在没有过多计算的情况下实现最佳性能。

在云培训和本地培训之间进行选择

训练模型有两个选项:云训练和本地训练。

云培训提供了可扩展性和强大的硬件,是处理大型数据集和复杂模型的理想选择。Google Cloud、AWS 和 Azure 等平台可按需访问高性能 GPU 和 TPU,从而加快训练时间,并可进行大型模型实验。不过,云训练可能会很昂贵,尤其是长期训练,而且数据传输会增加成本和延迟。

本地培训提供了更好的控制和自定义,使你能够根据特定需求定制环境,并避免持续的云成本。对于长期项目来说,它可能更经济,而且由于您的数据保留在本地,因此更安全。但是,本地硬件可能具有资源限制并需要维护,这可能会导致大型模型的训练时间更长。

选择优化器

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

您还可以微调优化器参数以提高模型性能。调整学习率可在更新参数时设置步骤的大小。为了稳定起见,您可以从适度的学习率开始,随着时间的推移逐渐降低学习率,以改善长期学习。此外,设置动量决定了过去的更新对当前更新的影响程度。动量的常见值约为 0.9。它通常提供良好的平衡。

通用优化器

不同的优化器有不同的优点和缺点。让我们看一下一些常见的优化器。

  • SGD(随机梯度下降)

    • 使用损失函数相对于参数的梯度更新模型参数。
    • 简单高效,但收敛速度可能很慢,并且可能会卡在局部最小值。
  • 亚当(自适应矩估计)

    • 将 SGD 与 momentum 和 RMSProp 的优势相结合。
    • 根据梯度第一矩和第二矩的估计值调整每个参数的学习率。
    • 非常适合嘈杂的数据和稀疏的梯度。
    • 高效且通常需要较少的调整,使其成为推荐的优化器 YOLOv8.
  • RMSProp(均方根传播)

    • 通过将梯度除以最近梯度幅度的运行平均值来调整每个参数的学习率。
    • 有助于处理梯度消失问题,对递归神经网络有效。

为 YOLOv8这 optimizer 参数允许您从各种优化器中进行选择,包括 SGD、Adam、AdamW、NAdam、RAdam 和 RMSProp,也可以将其设置为 auto 用于根据模型配置自动选择。

与社区联系

成为计算机视觉爱好者社区的一员可以帮助您解决问题并更快地学习。以下是一些联系、获取帮助和分享想法的方法。

社区资源

  • GitHub 问题:访问YOLOv8 GitHub 代码库,使用 "问题 "选项卡提问、报告错误和建议新功能。社区和维护者非常活跃,随时准备提供帮助。
  • Ultralytics Discord 服务器:加入Ultralytics Discord 服务器,与其他用户和开发人员聊天,获得支持并分享经验。

官方文件

  • Ultralytics YOLOv8 文档:查看 YOLOv8 官方文档,了解各种计算机视觉项目的详细指南和有用技巧。

使用这些资源将帮助您解决挑战,并及时了解计算机视觉社区的最新趋势和实践。

关键要点

训练计算机视觉模型涉及遵循良好做法、优化策略以及在出现问题时解决问题。调整批量大小、混合精度训练以及从预训练权重开始等技术可以使模型更好地工作并更快地训练。子集训练和提前停止等方法可帮助您节省时间和资源。与社区保持联系并跟上新趋势将帮助您不断提高模型训练技能。

常见问题

在使用Ultralytics YOLO 训练大型数据集时,如何提高GPU 的利用率?

要提高GPU 的利用率,请设置 batch_size 请将培训配置中的参数设置为GPU 支持的最大尺寸。这将确保您充分利用GPU 的功能,缩短训练时间。如果遇到内存错误,可逐步减少批量大小,直到训练顺利进行。对于YOLOv8 ,设置 batch=-1 in your training script will automatically determine the optimal batch size for efficient processing. For further information, refer to the 培训配置.

什么是混合精度训练,如何在YOLOv8 中启用?

混合精度训练利用 16 位(FP16)和 32 位(FP32)浮点类型来平衡计算速度和精度。这种方法可以在不影响模型精度的情况下加快训练速度并减少内存使用量。要在YOLOv8 中启用混合精度训练,请设置 amp 参数改为 True in your training configuration. This activates Automatic Mixed Precision (AMP) training. For more details on this optimization technique, see the 培训配置.

多尺度训练如何提高YOLOv8 模型的性能?

多尺度训练通过在不同大小的图像上进行训练来提高模型性能,从而使模型在不同尺度和距离的图像上具有更好的泛化能力。在YOLOv8 中,您可以通过设置 scale 参数。例如 scale=0.5 将图像尺寸缩小一半,而 scale=2.0 doubles it. This technique simulates objects at different distances, making the model more robust across various scenarios. For settings and more details, check out the 培训配置.

如何使用预训练权重来加快YOLOv8 中的训练速度?

使用预训练的权重可以大大减少训练时间,并通过从一个已经了解基本特征的模型开始训练来提高模型性能。在YOLOv8 中,您可以设置 pretrained 参数改为 True or specify a path to custom pre-trained weights in your training configuration. This approach, known as transfer learning, leverages knowledge from large datasets to adapt to your specific task. Learn more about pre-trained weights and their advantages 这里.

历元数是指模型训练过程中训练数据集的完整遍数。典型的起始点是 300 个历元。如果模型过早拟合,可以减少次数。或者,如果没有观察到过拟合,可以将训练次数延长到 600、1200 或更多。要在YOLOv8 中进行设置,请使用 epochs parameter in your training script. For additional advice on determining the ideal number of epochs, refer to this section on number of epochs.



Created 2024-06-26, Updated 2024-07-05
Authors: glenn-jocher (3), Laughing-q (1), abirami-vina (1)

评论