首页 > 其他分享 >MMLab中自定义模块初始化方法

MMLab中自定义模块初始化方法

时间:2023-02-05 14:56:58浏览次数:33  
标签:初始化 MMLab 自定义 cfg self module init 模块

这方面好像介绍的少,看了下基本原理,下面介绍下如何在搭载权重的模型中加入自定义模块时方便的进行初始化。

MMLab的逻辑时对每个部分进行初始化,若此部分定义了初始化方法为Pretrained则加载权重,然后对内部其他模块不再进行其他的初始化操作。

但其存在着一个问题。例如,需要对backbone改进,加入自定义模块后同时需要原模型的预训练权重,此时无法方便的对新加入模块进行初始化操作(因为代码决定其会跳过了此部分初始化,直接进行下一部分的初始化操作)。源代码如下(在BaseModule)中:

        if not self._is_init:
            if self.init_cfg:
                print_log(
                    f'initialize {module_name} with init_cfg {self.init_cfg}',
                    logger=logger_name)
                initialize(self, self.init_cfg)
                if isinstance(self.init_cfg, dict):
                    # prevent the parameters of
                    # the pre-trained model
                    # from being overwritten by
                    # the `init_weights`
                    if self.init_cfg['type'] == 'Pretrained':
                        return

            for m in self.children():
                if hasattr(m, 'init_weights'):
                    m.init_weights()
                    # users may overload the `init_weights`
                    update_init_info(
                        m,
                        init_info=f'Initialized by '
                        f'user-defined `init_weights`'
                        f' in {m.__class__.__name__} ')

            self._is_init = True

那么如何对自定义模块方便地进行初始化呢,下面介绍三种方法:

(1)定义一个my_weight_init()对自定义模块中的所有module进行初始化操作,其优点是可操作性强,但设置复杂。代码如下:

def my_module_weights_init(target_module):
    for m in target_module.modules():
        if type(m) == nn.Conv2d:
            nn.init.xavier_normal_(m.weight.data)
            nn.init.constant_(m.bias.data, 0.0)

对自定义的模块的初始化直接调用apply即可。

(2)对于MMLab中定义好的模块,若其存在init_cfg则可直接输入相关设置参数进行初始化操作。

(3)最为方便的方法,在mmcv.cnn.utils.weight_init中存在initialize函数,可通过相关参数对函数内部所有相关层进行初始化操作,主要原理是建立初始化器的实例化对象,对模块参数进行处理。mmcv中目前可调用一下八种方法进行初始化,位于mmcv.cnn.utilsz中。

'ConstantInit', 'XavierInit', 'NormalInit', 'TruncNormalInit', 'UniformInit', 'KaimingInit', 'PretrainedInit', 'Caffe2XavierInit'

 上述initialize方法的相关代码如下:

def my_module_weights_init(target_module, init_cfg):
    from mmcv.cnn.utils.weight_init import initialize
    initialize(target_module, init_cfg)

调用初始化方法的代码(可直接调用initialize方法,我为了方便好看改了个名):

        my_module_init_cfg = [dict(type='TruncNormal', layer=['Conv2d', 'Linear'], std=.02, bias=0.), dict(type='Constant', layer=['LayerNorm'], val=1., bias=0.),]
        my_module_weights_init(self.gt_seg_downsample_layers, my_module_init_cfg)

 

欢迎补充其他方便的方法。

标签:初始化,MMLab,自定义,cfg,self,module,init,模块
From: https://www.cnblogs.com/lzqdeboke/p/17093345.html

相关文章

  • tp5.x 自定义错误页
    thinkphp5自定义错误页面,话不多说,直接上干货1.关闭所有app_debug,即把 'app_debug'=>true修改为'app_debug'=>false2.在config.php(tp5.1config目录app.php)中配......
  • qtableview及自定义model的使用,对比qtablewidget性能及内存优化(转)
    以前一直使用qtableiwdget,最近有时间来研究下qtableview,才知道,qtableview和自定义model,比qtablewidget的性能啊,及占用内存啊,优化太多了。以前我使用qtablewidget是进行动态......
  • zabbix自定义监控项
    有时候当我们监控的项目在zabbix预定义的key中没有定义时,这时候我们可以通过编写zabbix的用户参数的方法来监控我们要求的项目item。形象一点说zabbix代理端配置文件中的U......
  • 6.3【微信小程序全栈开发课程】记录页面(三)--记录数据组件初始化
    1、功能介绍在记录页面对记录数据进行展示,每条记录数据后面都有编辑按钮,点击编辑按钮,出现修改文本框,点击修改按钮后,文本框会自动收起2、创建组件在src/components文件夹下面......
  • OpenMMLab AI实战营 第三课笔记
    OpenMMLabAI实战营第三课笔记目录OpenMMLabAI实战营第三课笔记进入mmclassification目录导入工具包下载数据集数据集目录结构下载config配置文件命令行-训练用......
  • 162-cas-server5.3修改自定义登录页,记住我
    新建src/main/resources资源目录将War包里的~/classes/templates/中的相关文件,复制过来:比如我修改到的圈红的哪些文件,复制过来修改就行。application.properties中添加......
  • 微信小程序-自定义tabbar配置及注意事项
    1.选中要创建tabbar组件的目录,右键选定新建Componen2.然后编写wxml代码和wxss样式<cover-viewclass="tab-bar"><cover-viewclass="tab-bar-border"></cover-view>......
  • QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托
    1写在前面的话我们在之前写的《QT(7)-初识委托》文章末尾提到,“使用一个类继承QStyledItemDelegate实现常用的控件委托,在使用时可以直接调用接口,灵活实现各种委托”。我......
  • kotlin中类初始化顺序介绍
    问题背景kotlin的类初始化过程,经常涉及到主构造函数、次构造函数、init函数,那么类初始化过程,他们的执行顺序是什么呢?问题分析首先,我们看下主构造函数、次构造函数、init......
  • .Net 7 高端玩法,自定义一个CLR运行时
    前言:曾几何时,一直想自己定制一个CLR运行时玩玩。满足下技术控的虚荣心,本篇带你一步一步打造一个属于自己的.Net7运行时。概括假设你的电脑已经安装了.Net,并且运行正......