系列文章目录
前言
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

总结
模型初始化对模型收敛过程与模型泛化性能十分重要,相较于具有大量数据的预训练权重,数据量较少的话随机初始化还是一种较为可靠的方式
本文介绍了在MMsegmentation中如何进行模型初始化,包括单个模块、多个模块的初始化,并探讨了精细初始化的方法。特别地,文章讨论了如何在缺少Swin-transformer-V2-base-mask2former预训练权重的情况下,利用mmpretrain更换主干网络,并展示了训练效果。


1453

被折叠的 条评论
为什么被折叠?



