{"record":{"id":"0cd4008964b407ce","repo":"open-mmlab/mmdetection","slug":"frozen-stages-must-be-in-range-1-len-arch-settin","errorCode":null,"errorMessage":"frozen_stages must be in range(-1, len(arch_setting) + 1). But received {frozen_stages}","messagePattern":"frozen_stages must be in range\\(-1, len\\(arch_setting\\) \\+ 1\\)\\. But received (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mmdet/models/backbones/csp_darknet.py","lineNumber":206,"sourceCode":"                 conv_cfg=None,\n                 norm_cfg=dict(type='BN', momentum=0.03, eps=0.001),\n                 act_cfg=dict(type='Swish'),\n                 norm_eval=False,\n                 init_cfg=dict(\n                     type='Kaiming',\n                     layer='Conv2d',\n                     a=math.sqrt(5),\n                     distribution='uniform',\n                     mode='fan_in',\n                     nonlinearity='leaky_relu')):\n        super().__init__(init_cfg)\n        arch_setting = self.arch_settings[arch]\n        if arch_ovewrite:\n            arch_setting = arch_ovewrite\n        assert set(out_indices).issubset(\n            i for i in range(len(arch_setting) + 1))\n        if frozen_stages not in range(-1, len(arch_setting) + 1):\n            raise ValueError('frozen_stages must be in range(-1, '\n                             'len(arch_setting) + 1). But received '\n                             f'{frozen_stages}')\n\n        self.out_indices = out_indices\n        self.frozen_stages = frozen_stages\n        self.use_depthwise = use_depthwise\n        self.norm_eval = norm_eval\n        conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule\n\n        self.stem = Focus(\n            3,\n            int(arch_setting[0][0] * widen_factor),\n            kernel_size=3,\n            conv_cfg=conv_cfg,\n            norm_cfg=norm_cfg,\n            act_cfg=act_cfg)\n        self.layers = ['stem']\n","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/models/backbones/csp_darknet.py#L188-L224","documentation":"CSPDarknet validates frozen_stages is an integer in [-1, len(arch_setting)] where arch_setting is the stage list for the chosen depth. frozen_stages=-1 means no freezing; values beyond the last stage index are rejected because there is no such stage to freeze.","triggerScenarios":"Setting frozen_stages=5 or larger on CSPDarknet depth 53 (4 stages, so valid range is -1..4); also non-integer values like frozen_stages=1.5 (not in range()).","commonSituations":"Copy-pasting ResNet configs where frozen_stages counts differently (ResNet allows up to 4); changing arch without adjusting frozen_stages; off-by-one confusion between number of stages and max freezable stage.","solutions":["Set frozen_stages to -1 (none) or 0..len(stages)-1, e.g. at most 3 for CSPDarknet with 4 stages","Count stages in the arch_settings entry for your depth before choosing","Use frozen_stages=-1 when you do not want freezing"],"exampleFix":"# before\nmodel = dict(backbone=dict(type='CSPDarknet', depth=53, frozen_stages=5))\n# after\nmodel = dict(backbone=dict(type='CSPDarknet', depth=53, frozen_stages=3))","handlingStrategy":"validation","validationCode":"n_stages = len(CSPDarknet.arch_settings[depth])\nassert isinstance(frozen_stages, int) and -1 <= frozen_stages <= n_stages, f'frozen_stages must be in [-1, {n_stages}]'","typeGuard":"def valid_frozen_stages(v, n_stages: int) -> bool:\n    return isinstance(v, int) and -1 <= v <= n_stages","tryCatchPattern":null,"preventionTips":["Use frozen_stages=-1 for no freezing","Never exceed num_stages-1 for actual stages","Adjust frozen_stages when switching backbones"],"tags":["mmdet","backbone","cspdarknet","frozen-stages","config"],"backgroundTag":null,"analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}