MMsegmentation-权重随机初始化

本文介绍了在MMsegmentation中如何进行模型初始化,包括单个模块、多个模块的初始化,并探讨了精细初始化的方法。特别地,文章讨论了如何在缺少Swin-transformer-V2-base-mask2former预训练权重的情况下,利用mmpretrain更换主干网络,并展示了训练效果。

系列文章目录


前言

mmlab下游分支调用权重随机初始化使用参考mmengine的说明文档
mmengine支持模型初始化方法包括:BaseInit, Caffe2XavierInit, ConstantInit,KaimingInit, NormalInit, PretrainedInit,TruncNormalInit, UniformInit, XavierInit,bias_init_with_prob, caffe2_xavier_init,constant_init, initialize, kaiming_init, normal_init,trunc_normal_init, uniform_init, update_init_info,xavier_init_
github链接


一、初始化单个模块

init_cfg=dict(type='Xavier', layer='Linear', distribution='uniform'),

二、初始化多个模块

代码如下(示例):

init_cfg=[dict(type='Xavier', layer='Conv2d', distribution='uniform'),
                dict(type='Xavier', layer='Linear', distribution='uniform')],

三、精细初始化

有时同一类型的不同模块有不同初始化方式,例如现在有 conv1 和 conv2 两个模块,他们的类型均为 Conv2d 。我们需要对 conv1 进行 Kaiming 初始化,conv2 进行 Xavier 初始化,则可以通过配置 override 参数来满足这样的需求:

import torch.nn as nn

from mmengine.model import BaseModule


class ToyNet(BaseModule):

    def __init__(self, init_cfg=None):
        super().__init__(init_cfg)
        self.conv1 = nn.Conv2d(1, 1, 1)
        self.conv2 = nn.Conv2d(1, 1, 1)


# 对 conv1 做 Kaiming 初始化,对 从 conv2 做 Xavier 初始化
toy_net = ToyNet(
    init_cfg=[
        dict(
            type='Kaiming',
            layer=['Conv2d'],
            override=dict(name='conv2', type='Xavier')),
    ], )
toy_net.init_weights()

三、Swin-transformer-V2-base-mask2former

**mmsegmentaton中没有Swin-transformer-V2-base-mask2former的相关参数文件,这里我们通过mmpretrain来实现主干网络的更换
**

需要安装好mmpretrain

# 参数文件是一个可解析文件,可以理解为导入mmpretrain.models,通过解析参数文件,使当前任务可以调用mmpretrain.models
custom_imports = dict(imports='mmpretrain.models', allow_failed_imports=False)
backbone=dict(
        type='mmpretrain.SwinTransformerV2',
        arch='base',
        img_size=384,
        in_channels=4,
        out_indices=[0, 1, 2, 3],
        drop_path_rate=0.1,
        window_size=[24, 24, 24, 12],
        pad_small_map=True,
        # pretrained_window_sizes=[12, 12, 12, 6],
        init_cfg=[dict(type='Xavier', layer='Conv2d', distribution='uniform'),
                dict(type='Xavier', layer='Linear', distribution='uniform')],
    ),

查看mmpretrain支持的模型,这里要注意的是

from mmpretrain import list_models
list_models()

在这里插入图片描述

模型名称可以参考backbone中定义的模型名称
在这里插入图片描述

训练效果

使用10000张数据进行训练,batchsize=8,损失函数相对比较平稳
在这里插入图片描述

swin-V1

在这里插入图片描述

swin-V2

在这里插入图片描述

总结

模型初始化对模型收敛过程与模型泛化性能十分重要,相较于具有大量数据的预训练权重,数据量较少的话随机初始化还是一种较为可靠的方式

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云朵不吃雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值