训练

从之前的教程中,您可能现在已经拥有了一个自定义模型和一个数据加载器。为了运行训练,用户通常倾向于以下两种风格之一

自定义训练循环

有了模型和数据加载器,编写训练循环所需的一切都可以从 PyTorch 中找到,您可以自由地自己编写训练循环。这种风格允许研究人员更清晰地管理整个训练逻辑并拥有完全的控制权。一个这样的例子在 tools/plain_train_net.py 中提供。

然后用户可以轻松地控制训练逻辑上的任何自定义。

训练器抽象

我们还提供了一个标准化的“训练器”抽象,它具有一个挂钩系统,有助于简化标准训练行为。它包含以下两种实例化

  • SimpleTrainer 为单成本、单优化器、单数据源训练提供了一个最小的训练循环,除此之外别无其他。其他任务(检查点、记录等)可以使用 挂钩系统 来实现。

  • DefaultTrainer 是一个从 yacs 配置初始化的 SimpleTrainer,由 tools/train_net.py 和许多脚本使用。它包括您可能想要加入的更多标准默认行为,包括对优化器、学习率计划、记录、评估、检查点等的默认配置。

要自定义 DefaultTrainer

  1. 对于简单的自定义(例如更改优化器、评估器、LR 调度器、数据加载器等),请在子类中覆盖 它的方法,就像 tools/train_net.py 一样。

  2. 对于训练期间的额外任务,请查看 挂钩系统 以查看它是否受支持。

    例如,要在训练期间打印 hello

    class HelloHook(HookBase):
      def after_step(self):
        if self.trainer.iter % 100 == 0:
          print(f"Hello at iteration {self.trainer.iter}!")
    
  3. 使用训练器+挂钩系统意味着将始终存在一些非标准行为无法支持,尤其是在研究中。出于这个原因,我们有意地使训练器和挂钩系统保持最小化,而不是强大。如果通过这种系统无法实现任何内容,从 tools/plain_train_net.py 开始手动实现自定义训练逻辑会更容易。

指标记录

在训练期间,detectron2 模型和训练器将指标放入一个集中式的 EventStorage 中。您可以使用以下代码访问它并将指标记录到它

from detectron2.utils.events import get_event_storage

# inside the model:
if self.training:
  value = # compute the value from inputs
  storage = get_event_storage()
  storage.put_scalar("some_accuracy", value)

有关更多详细信息,请参阅其文档。

然后,指标将使用 EventWriter 写入各种目标。DefaultTrainer 使用默认配置启用了一些 EventWriter。有关如何自定义它们的说明,请参见上文。