背景
- 最近需要测试一下在backbone部分如果不使用预训练参数的话,模型需要多少轮才能收敛
- 所使用的backbone是mmcls.ConvNeXt
- mmdetection版本为2.28.2,mmcls版本为0.25.0
修改流程
- 最简单的方法,直接去mmcls的model zoo里找到对应backbone的config,看看官方是怎么定义的,如链接,然后照葫芦画瓢即可,下面讲一讲如果想按照自己的思路改应该怎么做
- 第一步,找到mmdetection2.28里的backbone初始化逻辑:init_cfg怎么设置,以及支持哪些初始化方法
- 一个常见的backbone配置文件写法如下,可见其使用的是type为Pretrained的预训练参数初始策略
- 要修改该init_cfg,首先去官方文档查看init_cfg应该怎么写,里面对init_cfg的写法进行了详细说明,对应链接
- 同时,上述链接最后一行给出的链接里也说明了都支持哪几种初始化方法,每种初始化方法需要哪些初始化参数可以看这个链接,或者直接在代码库的mmcv文件夹里的cnn/utils/weight_init.py文件里去看其初始定义,其实就是和pytorch里各个初始化函数所需要的参数一致
- 到这里,我们已经知道了init_cfg里的type有哪些,并且每种type需要传递哪些参数
- 第二步,去mmcls库里的backbone初始配置文件定义里看看官方都对不同的层进行了怎样的定义(寻找方式,去mmcls库对应版本的官方文档里找model zoo的地址(我这里是0.25.0版本的model zoo),之后在model zoo里找到对应的config文件地址),比如conv层用的什么初始化方式,LN层用了什么初始化方式等,然后再决定自己对应的层里应该怎么初始化
- 第三步,同样参考官方backbone初始配置文件里定义的优化器设置自己从头训练想要的优化器
结论
- 实测用官方相同的优化器参数、并在backbone后添加neck和head在自己的数据集上从头训练效果不佳,因此还是建议非必要尽量使用官方的预训练参数,这种预训练+下游微调的方式也是现在工业界的主流思路