您好,欢迎访问这里是您的网站名称官网!
全国咨询热线+86 0000 88888
FH-FH至尊建筑节能遮阳研发中心

新闻动态

NEWS CENTER
【mmdetection3d】——自定义运行时配置
发布时间:2024-05-06 04:57浏览次数:

自定义 PyTorch 支持的优化器

我们已经支持使用所有 PyTorch 实现的优化器,且唯一需要修改的地方就是改变配置文件中的 字段。
举个例子,如果您想使用 (注意到这样可能会使性能大幅下降),您可以这样修改:

 

为了修改模型的学习率,用户只需要修改优化器配置中的 字段。用户可以根据 PyTorch 的 API 文档 直接设置参数。

自定义并实现优化器

1. 定义新的优化器

一个自定义优化器可以按照如下过程定义:

假设您想要添加一个叫 的,拥有参数 , 和 的优化器,您需要创建一个叫做 的目录。
接下来,应该在目录下某个文件中实现新的优化器,比如 :

 
2. 将优化器添加到注册器

为了找到上述定义的优化器模块,该模块首先需要被引入主命名空间。有两种方法实现之:

  • 新建 文件用于引入。

    新定义的模块应该在 中被引入,使得注册器可以找到新模块并注册之:

 

您也需要通过添加如下语句在 中引入 :

 

或者在配置中使用 来人工引入新优化器:

 

模块 会在程序伊始被引入,且 类在那时会自动被注册。
注意到只有包含 类的包应该被引入。
不能 被直接引入。

事实上,用户可以在这种引入的方法中使用完全不同的文件目录结构,只要保证根目录能在 中被定位。

3. 在配置文件中指定优化器

接下来您可以在配置文件的 字段中使用 。
在配置文件中,优化器在 字段中以如下方式定义:

 

为了使用您自己的优化器,该字段可以改为:

 

自定义优化器的构造器

部分模型可能会拥有一些参数专属的优化器设置,比如 BatchNorm 层的权重衰减 (weight decay)。
用户可以通过自定义优化器的构造器来对那些细粒度的参数进行调优。

 

默认优化器构造器在这里实现。这部分代码也可以用作新优化器构造器的模版。

额外的设置

没有在优化器部分实现的技巧应该通过优化器构造器或者钩子来实现 (比如逐参数的学习率设置)。我们列举了一些常用的可以稳定训练过程或者加速训练的设置。我们欢迎提供更多类似设置的 PR 和 issue。

  • 使用梯度裁剪 (gradient clip) 来稳定训练过程

    一些模型依赖梯度裁剪技术来裁剪训练中的梯度,以稳定训练过程。举例如下:

     

    如果您的配置继承了一个已经设置了 的基础配置,那么您可能需要 字段来覆盖基础配置中无用的设置。详见配置文件的说明文档

  • 使用动量规划器 (momentum scheduler) 来加速模型收敛

    我们支持用动量规划器来根据学习率更改模型的动量,这样可以使模型更快地收敛。
    动量规划器通常和学习率规划器一起使用,比如说,如下配置文件在 3D 检测中被用于加速模型收敛。
    更多细节详见 CyclicLrUpdaterCyclicMomentumUpdater 的实现。

     

默认情况,我们使用阶梯式学习率衰减的 1 倍训练规程。这会调用 中的
我们在这里支持很多其他学习率规划方案,比如和规程。下面是一些样例:

  • 多项式衰减规程:

     
  • 余弦退火规程:

     

工作流是一个(阶段,epoch 数)的列表,用于指定不同阶段运行顺序和运行的 epoch 数。
默认情况它被设置为:

 

这意味着,工作流包括训练 1 个 epoch。
有时候用户可能想要检查一些模型在验证集上的评估指标(比如损失、准确率)。
在这种情况中,我们可以将工作流设置如下:

 

这样,就是交替地运行 1 个 epoch 进行训练,1 个 epoch 进行验证。

请注意:

  1. 模型参数在验证期间不会被更新。
  2. 配置文件中, 里的 字段只控制训练 epoch 的数量,而不会影响验证工作流。
  3. 和 工作流不会改变 的行为,这是因为 被 调用,且验证工作流只会影响通过 调用的钩子。因此, 和 的唯一区别就是执行器 (runner) 会在每个训练 epoch 之后在验证集上计算损失。

自定义并实现钩子

1. 实现一个新钩子

存在一些情况下用户可能需要实现新钩子。在版本 v2.3.0 之后,MMDetection 支持自定义训练过程中的钩子 (#3395)。因此用户可以直接在 mmdet 中,或者在其基于 mmdet 的代码库中实现钩子并通过更改训练配置来使用钩子。
在 v2.3.0 之前,用户需要更改代码以使得训练开始之前钩子已经注册完毕。
这里我们给出一个,在 mmdet3d 中创建并使用新钩子的例子。

 

取决于钩子的功能,用户需要指定钩子在每个训练阶段时的行为,具体包括如下阶段:,,,,,和 。

2. 注册新钩子

接下来我们需要引入 。假设新钩子位于文件 中,有两种方法可以实现之:

  • 更改 来引入之:

    新定义的模块应在 中引入,以使得注册器可以找到新模块并注册之:

 

或者在配置中使用 来人为地引入之

 
3. 更改配置文件
 

您可以将字段 设置为 或者 ,来设置钩子的优先级,如下所示:

 

默认情况,在注册阶段钩子的优先级被设置为 。

使用 MMCV 中实现的钩子

如果钩子已经在 MMCV 中被实现了,您可以直接通过更改配置文件来使用该钩子:

 

更改默认的运行时钩子

有一些常用的钩子并没有通过 注册,它们是:

  • 日志配置 (log_config)
  • 检查点配置 (checkpoint_config)
  • 评估 (evaluation)
  • 学习率配置 (lr_config)
  • 优化器配置 (optimizer_config)
  • 动量配置 (momentum_config)

在这些钩子中,只有日志钩子拥有 的优先级,其他钩子的优先级均为 。
上述教程已经涉及了如何更改 ,,和 。
下面我们展示如何在 ,,和 上做文章。

检查点配置

MMCV 执行器会使用 来初始化

 

用户可以设置 来保存一定少量的检查点,或者用 来决定是否保存优化器的状态。更多参数的细节详见这里

日志配置

将多个日志钩子封装在一起,并允许设置日志记录间隔。现在 MMCV 支持 ,,和 。
更详细的使用方法请移步 MMCV 文档

 
评估配置

的配置会被用于初始化
除了 字段,其他参数,比如 ,会被传递给 。

 
在线客服
联系电话
全国免费咨询热线 +86 0000 88888
  • · 专业的设计咨询
  • · 精准的解决方案
  • · 灵活的价格调整
  • · 1对1贴心服务
代理加盟
回到顶部

平台注册入口