ショートカット

重みの初期化

トレーニング中、適切な初期化戦略は、トレーニングの高速化またはより高いパフォーマンスの獲得に役立ちます。 MMCV は、nn.Conv2d などのモジュールを初期化するためによく使用されるいくつかの方法を提供します。MMDetectionにおけるモデルの初期化は、主に init_cfg を使用します。ユーザーは、次の2つの手順でモデルを初期化できます。

  1. model_cfg 内のモデルまたはそのコンポーネントに対して init_cfg を定義しますが、子コンポーネントの init_cfg は優先順位が高く、親モジュールの init_cfg をオーバーライドします。

  2. 通常どおりにモデルを構築しますが、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の使用方法

  1. 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)
  1. 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))
    
  1. 事前トレーニング済みモデルを使用したモデルの初期化

    init_cfg = dict(type='Pretrained',
                checkpoint='torchvision://resnet50')
    

詳細については、MMEngine のドキュメントを参照してください。