训练

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

自定义训练循环

准备好模型和数据加载器后,编写训练循环所需的其他一切都可以在PyTorch中找到,您可以自由编写自己的训练循环。这种方式让研究人员能更清晰地管理整个训练逻辑并拥有完全控制权。tools/plain_train_net.py中提供了一个这样的示例。

用户可轻松控制训练逻辑的任何自定义设置。

训练器抽象化

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

  • SimpleTrainer 提供了一个极简的训练循环,适用于单成本、单优化器、单数据源的训练场景,不包含其他功能。 其他任务(如检查点保存、日志记录等)可以通过 钩子系统来实现。

  • DefaultTrainer 是一个基于 yacs 配置初始化的 SimpleTrainer,被 tools/train_net.py 和许多脚本所使用。它包含了更多用户可能希望采用的标准默认行为,包括优化器、学习率调度、日志记录、评估、检查点等默认配置。

要自定义一个DefaultTrainer

  1. 对于简单的自定义需求(例如更改优化器、评估器、学习率调度器、数据加载器等),只需在子类中覆盖其方法,就像tools/train_net.py中那样。

  2. 如需在训练期间执行额外任务,请查看hook系统确认是否支持该功能。

    例如,要在训练期间打印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。 如何自定义它们请参考上文。