{"record":{"id":"8dda2a3b3249c131","repo":"open-mmlab/mmdetection","slug":"frozen-stages-must-be-in-range-1-8-but-receive","errorCode":null,"errorMessage":"frozen_stages must be in range(-1, 8). But received {frozen_stages}","messagePattern":"frozen_stages must be in range\\(-1, 8\\)\\. But received (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mmdet/models/backbones/mobilenet_v2.py","lineNumber":86,"sourceCode":"            if init_cfg is None:\n                self.init_cfg = [\n                    dict(type='Kaiming', layer='Conv2d'),\n                    dict(\n                        type='Constant',\n                        val=1,\n                        layer=['_BatchNorm', 'GroupNorm'])\n                ]\n        else:\n            raise TypeError('pretrained must be a str or None')\n\n        self.widen_factor = widen_factor\n        self.out_indices = out_indices\n        if not set(out_indices).issubset(set(range(0, 8))):\n            raise ValueError('out_indices must be a subset of range'\n                             f'(0, 8). But received {out_indices}')\n\n        if frozen_stages not in range(-1, 8):\n            raise ValueError('frozen_stages must be in range(-1, 8). '\n                             f'But received {frozen_stages}')\n        self.out_indices = out_indices\n        self.frozen_stages = frozen_stages\n        self.conv_cfg = conv_cfg\n        self.norm_cfg = norm_cfg\n        self.act_cfg = act_cfg\n        self.norm_eval = norm_eval\n        self.with_cp = with_cp\n\n        self.in_channels = make_divisible(32 * widen_factor, 8)\n\n        self.conv1 = ConvModule(\n            in_channels=3,\n            out_channels=self.in_channels,\n            kernel_size=3,\n            stride=2,\n            padding=1,\n            conv_cfg=self.conv_cfg,","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/models/backbones/mobilenet_v2.py#L68-L104","documentation":"MobileNetV2.__init__ requires frozen_stages to be an int in range(-1, 8): -1 means no freezing, 0 freezes the stem, and k (1..7) freezes stages up to k. Values outside that range are meaningless for this 8-stage backbone and raise ValueError.","triggerScenarios":"MobileNetV2(frozen_stages=8) or frozen_stages=-2; passing a non-int like frozen_stages='1' (would also fail the range check via `in` on range with TypeError for str).","commonSituations":"Copying frozen_stages=4 from a ResNet-based config (where it is valid) into MobileNetV2; freezing all stages by guessing the total count.","solutions":["Use frozen_stages in -1..7 (e.g. -1 for no freezing, 1..7 for progressive freezing)","If you meant to freeze everything through the last stage, use frozen_stages=7"],"exampleFix":"// before\nbackbone=dict(type='MobileNetV2', frozen_stages=9)\n// after\nbackbone=dict(type='MobileNetV2', frozen_stages=2)","handlingStrategy":"validation","validationCode":"assert frozen_stages in range(-1, 8), 'frozen_stages must be in range(-1, 8)'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember MobileNetV2 has 8 stages (-1..7 valid)","Do not copy frozen_stages values across different backbones"],"tags":["mmdet","mobilenetv2","frozen-stages","validation","fine-tuning"],"backgroundTag":"value-out-of-valid-range","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}