{"record":{"id":"29bd72ee4b1913cc","repo":"open-mmlab/mmdetection","slug":"frozen-stages-must-be-in-range-1-len-arch-settin-29bd72","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/cspnext.py","lineNumber":95,"sourceCode":"        norm_cfg: ConfigType = dict(type='BN', momentum=0.03, eps=0.001),\n        act_cfg: ConfigType = dict(type='SiLU'),\n        norm_eval: bool = False,\n        init_cfg: OptMultiConfig = dict(\n            type='Kaiming',\n            layer='Conv2d',\n            a=math.sqrt(5),\n            distribution='uniform',\n            mode='fan_in',\n            nonlinearity='leaky_relu')\n    ) -> None:\n        super().__init__(init_cfg=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        self.stem = nn.Sequential(\n            ConvModule(\n                3,\n                int(arch_setting[0][0] * widen_factor // 2),\n                3,\n                padding=1,\n                stride=2,\n                norm_cfg=norm_cfg,\n                act_cfg=act_cfg),\n            ConvModule(","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/models/backbones/cspnext.py#L77-L113","documentation":"CSPNeXt.__init__ validates frozen_stages lies in [-1, len(arch_setting)] for the chosen arch's stage list. An out-of-range value means you asked to freeze more stages than the backbone has, so construction fails immediately.","triggerScenarios":"Setting frozen_stages >= number of stages+1 (e.g. 5+ on CSPNeXt with ~5 stages); using frozen_stages values tuned for a different backbone family.","commonSituations":"Porting RTMDet/YOLOX configs across backbones; incrementing frozen_stages during transfer-learning experiments until it exceeds stage count; typo (e.g. frozen_stages=-2 is also out of range).","solutions":["Use frozen_stages=-1 (no freeze) or a value 0..num_stages-1 for the chosen arch","Check len(self.arch_settings[arch]) in cspnext.py to confirm stage count","Lower the value one step at a time until construction succeeds"],"exampleFix":"# before\nbackbone=dict(type='CSPNeXt', arch='P5', frozen_stages=6)\n# after\nbackbone=dict(type='CSPNeXt', arch='P5', frozen_stages=4)","handlingStrategy":"validation","validationCode":"n = len(CSPNeXt.arch_settings[arch])\nassert -1 <= frozen_stages <= n, f'frozen_stages out of range for arch {arch}'","typeGuard":"def valid_cspnext_fs(v, n: int) -> bool:\n    return isinstance(v, int) and -1 <= v <= n","tryCatchPattern":null,"preventionTips":["Check arch_settings length before tuning","Use -1 to disable freezing","Don't copy ResNet frozen_stages values blindly"],"tags":["mmdet","backbone","cspnext","frozen-stages","config"],"backgroundTag":null,"analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}