重みの初期化¶
トレーニング中、適切な初期化戦略は、トレーニングの高速化またはより高いパフォーマンスの獲得に役立ちます。 MMCV は、nn.Conv2d
などのモジュールを初期化するためによく使用されるいくつかの方法を提供します。MMDetectionにおけるモデルの初期化は、主に init_cfg
を使用します。ユーザーは、次の2つの手順でモデルを初期化できます。
model_cfg
内のモデルまたはそのコンポーネントに対してinit_cfg
を定義しますが、子コンポーネントのinit_cfg
は優先順位が高く、親モジュールのinit_cfg
をオーバーライドします。通常どおりにモデルを構築しますが、
model.init_weights()
メソッドを明示的に呼び出すと、モデルパラメータは設定として初期化されます。
MMDetectionにおける初期化の高レベルのワークフローは次のとおりです。
model_cfg(init_cfg) -> build_from_cfg -> model -> init_weight() -> initialize(self, self.init_cfg) -> 子のinit_weight()
説明¶
これはdictまたはlist [dict]であり、次のキーと値が含まれています。
type
(str) は、INTIALIZERS
内の初期化子の名前を含み、その後に初期化子の引数が続きます。layer
(strまたはlist [str]) は、初期化される学習可能なパラメータを持つPytorchまたはMMCVの基本レイヤーの名前を含みます。例:'Conv2d'
、'DeformConv2d'
。override
(dictまたはlist [dict]) は、BaseModuleから継承せず、初期化設定が'layer'
キーにある他のレイヤーとは異なるサブモジュールを含みます。type
で定義された初期化子は、layer
で定義されたすべてのレイヤーで機能するため、サブモジュールがBaseModule
の派生クラスではないが、layer
内のレイヤーと同じ方法で初期化できる場合、override
を使用する必要はありません。override
には以下が含まれます。初期化子の引数が続く
type
。初期化されるサブモジュールを示す
name
。
パラメータの初期化¶
mmcv.runner.BaseModule
または mmdet.models
から新しいモデルを継承します。ここでは、FooModelの例を示します。
import torch.nn as nn
from mmcv.runner import BaseModule
class FooModel(BaseModule)
def __init__(self,
arg1,
arg2,
init_cfg=None):
super(FooModel, self).__init__(init_cfg)
...
コードで直接
init_cfg
を使用してモデルを初期化します。import torch.nn as nn from mmcv.runner import BaseModule # or directly inherit mmdet models class FooModel(BaseModule) def __init__(self, arg1, arg2, init_cfg=XXX): super(FooModel, self).__init__(init_cfg) ...
mmcv.Sequential
またはmmcv.ModuleList
コードで直接init_cfg
を使用してモデルを初期化します。from mmcv.runner import BaseModule, ModuleList class FooModel(BaseModule) def __init__(self, arg1, arg2, init_cfg=None): super(FooModel, self).__init__(init_cfg) ... self.conv1 = ModuleList(init_cfg=XXX)
設定ファイルで
init_cfg
を使用してモデルを初期化します。model = dict( ... model = dict( type='FooModel', arg1=XXX, arg2=XXX, init_cfg=XXX), ...
init_cfgの使用方法¶
layer
キーによるモデルの初期化layer
のみを定義すると、layer
キーのレイヤーのみが初期化されます。注:
layer
キーの値は、Pytorchの属性weightとbiasを持つクラス名です(そのため、MultiheadAttention layer
などはサポートされません)。
同じ構成でモジュールを初期化するための
layer
キーを定義します。init_cfg = dict(type='Constant', layer=['Conv1d', 'Conv2d', 'Linear'], val=1) # initialize whole module with same configuration
異なる構成でレイヤーを初期化するための
layer
キーを定義します。
init_cfg = [dict(type='Constant', layer='Conv1d', val=1),
dict(type='Constant', layer='Conv2d', val=2),
dict(type='Constant', layer='Linear', val=3)]
# nn.Conv1d will be initialized with dict(type='Constant', val=1)
# nn.Conv2d will be initialized with dict(type='Constant', val=2)
# nn.Linear will be initialized with dict(type='Constant', val=3)
override
キーによるモデルの初期化
属性名で特定の部分を初期化する場合、
override
キーを使用できます。override
の値はinit_cfgの値を無視します。# layers: # self.feat = nn.Conv1d(3, 1, 3) # self.reg = nn.Conv2d(3, 3, 3) # self.cls = nn.Linear(1,2) init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, override=dict(type='Constant', name='reg', val=3, bias=4)) # self.feat and self.cls will be initialized with dict(type='Constant', val=1, bias=2) # The module called 'reg' will be initialized with dict(type='Constant', val=3, bias=4)
init_cfgで
layer
がNoneの場合、overrideの名前を持つサブモジュールのみが初期化され、overrideのtypeと他の引数は省略できます。# layers: # self.feat = nn.Conv1d(3, 1, 3) # self.reg = nn.Conv2d(3, 3, 3) # self.cls = nn.Linear(1,2) init_cfg = dict(type='Constant', val=1, bias=2, override=dict(name='reg')) # self.feat and self.cls will be initialized by Pytorch # The module called 'reg' will be initialized with dict(type='Constant', val=1, bias=2)
layer
キーまたはoverride
キーを定義しない場合、何も初期化されません。無効な使用方法
# It is invalid that override don't have name key init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, override=dict(type='Constant', val=3, bias=4)) # It is also invalid that override has name and other args except type init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, override=dict(name='reg', val=3, bias=4))
事前トレーニング済みモデルを使用したモデルの初期化
init_cfg = dict(type='Pretrained', checkpoint='torchvision://resnet50')
詳細については、MMEngine のドキュメントを参照してください。