【MMEngine】由EpochBased 切换至 IterBased参数修改解析及源码讲解

目录

🎵🎵背景

👉👉动机 

🌟 🌟EpochBased 配置举例

🌸🌸按照 iter 训练模型

🌷train_cfg

🌷default_hooks

🌷param_scheduler 

🌷log_processor

🌸🌸按照 epoch 训练模型

🌷train_cfg

🌷default_hooks

🌷param_scheduler

🌷log_processor

🐸🐸注意事项

✌️完整mmengine源码:链接

整理不易,欢迎一键三连!!!送你们一条美丽的--分割线--


🎵🎵背景

  • 上一篇讲到如何基于mmengine设置train_cfg参数,感兴趣的童鞋可以移步。
  • 上一篇主要讲解通过RUNNER.ITERBASEDTRAINLOOP与RUNNER.EPOCHBASEDTRAINLOOP 源码解析说明了基于迭代次数和轮数的config文件设置。本篇主要讲解除train_cfg之外,由EPOCHBASED 切换至 ITERBASED的其他参数的完整设置。

👉👉动机 

        基于MMEngine做模型训练,设置各种hook时,总是看不到源码,只能按照既定模式进行网络训练,要修改就得自己试参数,索性咱们就一次深挖到底,看看最底层的代码是如何写的,就不用每次猜参数了。

        MMEngine 支持两种训练模式:

  • 基于轮次的 EpochBased 方式
  • 基于迭代次数的 IterBased 方式

        这两种方式在下游算法库均有使用,例如MMDetection 默认使用 EpochBased 方式,MMSegmentation默认使用 IterBased 方式。本篇主要讲解除train_cfg参数之外,由EPOCHBASED 切换至 ITERBASED的其他参数的完整设置。

🌟 🌟EpochBased 配置举例

        MMEngine 很多模块默认以 EpochBased 的模式执行,如 ParamSchedulerLoggerHookCheckpointHook 等,常见的 EpochBased 配置写法如下:

param_scheduler = dict(
    type='MultiStepLR',
    milestones=[6, 8]
    by_epoch=True  # by_epoch 默认为 True,这边显式的写出来只是为了方便对比
)

default_hooks = dict(
    logger=dict(type='LoggerHook'),
    checkpoint=dict(type='CheckpointHook', interval=2),
)

train_cfg = dict(
    by_epoch=True,  # by_epoch 默认为 True,这边显式的写出来只是为了方便对比
    max_epochs=10,
    val_interval=2
)

log_processor = dict(
    by_epoch=True
)  # log_processor 的 by_epoch 默认为 True,这边显式的写出来只是为了方便对比, 实际上不需要设置

runner = Runner(
    model=ResNet18(),
    work_dir='./work_dir',
    train_dataloader=train_dataloader_cfg,
    optim_wrapper=dict(optimizer=dict(type='SGD', lr=0.001, momentum=0.9)),
    param_scheduler=param_scheduler
    default_hooks=default_hooks,
    log_processor=log_processor,
    train_cfg=train_cfg,
    resume=True,
)

🌸🌸按照 iter 训练模型

        如果想按照 iter 训练模型,需要做以下改动:

🌷train_cfg

  • 将 train_cfg 中的 by_epoch 设置为 False,同时将 max_iters 设置为训练的总 iter 数,val_iterval 设置为验证间隔的 iter 数。示例代码如下:
train_cfg = dict(
    by_epoch=False,
    max_iters=10000,
    val_interval=2000
)

🌷default_hooks

  • 将 default_hooks 中的 logger 的 log_metric_by_epoch 设置为 False, checkpoint 的 by_epoch 设置为 False。示例代码如下:
default_hooks = dict(
    logger=dict(type='LoggerHook', log_metric_by_epoch=False),
    checkpoint=dict(type='CheckpointHook', by_epoch=False, interval=2000),
)

🌷param_scheduler 

  • 将 param_scheduler 中的 by_epoch 设置为 False,并將 epoch 相关的参数换算成 iter。示例代码如下:
param_scheduler = dict(
    type='MultiStepLR',
    milestones=[6000, 8000],
    by_epoch=False,
)

🌷log_processor

  • 将 log_processor 的 by_epoch 设置为 False。示例代码如下:
log_processor = dict(
    by_epoch=False
)

📢📢 注意:如果你能保证 IterBasedTrainingEpochBasedTraining 总 iter 数一致,直接设置 convert_to_iter_based 为 True 即可。

🌸🌸按照 epoch 训练模型

🌷train_cfg

         如果想按照 epoch 训练模型,需要做以下改动:

  • 将 train_cfg 中的 by_epoch 设置为 True,同时将 max_epochs 设置为训练的总epoch数,val_iterval 设置为验证间隔的 epoch数。示例代码如下:
train_cfg = dict(
    by_epoch=True,
    max_epochs=10,
    val_interval=2
)

🌷default_hooks

  • 将 default_hooks 中的 logger 的 log_metric_by_epoch 设置为  True, checkpoint 的 by_epoch 设置为  True。示例代码如下:
default_hooks = dict(
    logger=dict(type='LoggerHook', log_metric_by_epoch=True),
    checkpoint=dict(type='CheckpointHook', interval=2, by_epoch=True),
)

🌷param_scheduler

  • 将 param_scheduler 中的 by_epoch 设置为  True,并將iter 相关的参数换算成 epoch 示例代码如下:
param_scheduler = dict(
    type='MultiStepLR',
    milestones=[6, 8],
    by_epoch=True,
)

🌷log_processor

  • 将 log_processor 的 by_epoch 设置为 True。示例代码如下:
log_processor = dict(
    by_epoch=True
)

📢​​​​​​​📢 注意:如果你能保证 IterBasedTrainingEpochBasedTraining 总 iter 数一致,直接设置 convert_to_iter_based 为 True 即可。示例代码如下:

🐸🐸注意事项

        如果基础配置文件为 train_dataloader 配置了基于 iteration/epoch 采样的 sampler,则需要在当前配置文件中将其更改为指定类型的 sampler,或将其设置为 None。当 dataloader 中的 sampler 为 None,MMEngine 或根据 train_cfg 中的 by_epoch 参数选择 InfiniteSampler(False) 或 DefaultSampler(True)

        如果基础配置文件在 train_cfg 中指定了 type,那么必须在当前配置文件中将 type 覆盖为(IterBasedTrainLoopEpochBasedTrainLoop),而不能简单的指定 by_epoch 参数。

✌️完整mmengine源码:链接

整理不易,欢迎一键三连!!!
送你们一条美丽的--分割线--

🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷
 

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
mmdetection中,厝村模型对应的代码位于`configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_4x4_1x_coco.py`文件中。 在这个配置文件中,我们可以看到: ```python # model settings model = dict( type='FCOS', pretrained='open-mmlab://detectron2/resnet50_caffe', backbone=dict( type='ResNet', depth=50, num_stages=4, out_indices=(0, 1, 2, 3), frozen_stages=1, norm_eval=True, style='caffe'), neck=dict( type='FPN', in_channels=[256, 512, 1024, 2048], out_channels=256, num_outs=5), bbox_head=dict( type='FCOSHead', num_classes=80, in_channels=256, stacked_convs=4, feat_channels=256, strides=[8, 16, 32, 64, 128], regress_ranges=((-1, 64), (64, 128), (128, 256), (256, 512), (512, INF)), center_sampling=True, center_sample_radius=1.5, norm_on_bbox=True, centerness_on_reg=True, dcn_on_last_conv=False, use_dgqp=False, loss_cls=dict( type='FocalLoss', use_sigmoid=True, gamma=2.0, alpha=0.25, loss_weight=1.0), loss_bbox=dict(type='GIoULoss', loss_weight=2.0), loss_centerness=dict( type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), # training and testing settings train_cfg=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.5, neg_iou_thr=0.4, min_pos_iou=0, ignore_iof_thr=-1), allowed_border=-1, pos_weight=-1, debug=False), test_cfg=dict( nms_pre=1000, min_bbox_size=0, score_thr=0.05, nms=dict(type='nms', iou_threshold=0.6), max_per_img=100)) ``` 其中,`pretrained`参数指定了使用预训练的权重,这里设置为了`open-mmlab://detectron2/resnet50_caffe`,表示使用Detectron2模型库中的预训练权重。在进行训练时,这个权重会被加载到网络中,并作为初始化参数。在训练完成后,模型参数会被保存到.pth文件中。具体的保存代码可以在`tools/train.py`文件中找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zy_destiny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值