open-mmlab/mmdetection · error · ValueError

frozen_stages must be in range(0, {len(self.layer_setting) +

Error message

frozen_stages must be in range(0, {len(self.layer_setting) + 1}). But received {frozen_stages}

What it means

EfficientNet validates frozen_stages is an integer in [0, len(layer_setting)] (note: unlike CSPDarknet there is no -1 sentinel documented in this check, since range(len+1) starts at 0). Out-of-range values raise this ValueError at construction.

Source

Thrown at mmdet/models/backbones/efficientnet.py:285

                     dict(
                         type='Constant',
                         layer=['_BatchNorm', 'GroupNorm'],
                         val=1)
                 ]):
        super(EfficientNet, self).__init__(init_cfg)
        assert arch in self.arch_settings, \
            f'"{arch}" is not one of the arch_settings ' \
            f'({", ".join(self.arch_settings.keys())})'
        self.arch_setting = self.arch_settings[arch]
        self.layer_setting = self.layer_settings[arch[:1]]
        for index in out_indices:
            if index not in range(0, len(self.layer_setting)):
                raise ValueError('the item in out_indices must in '
                                 f'range(0, {len(self.layer_setting)}). '
                                 f'But received {index}')

        if frozen_stages not in range(len(self.layer_setting) + 1):
            raise ValueError('frozen_stages must be in range(0, '
                             f'{len(self.layer_setting) + 1}). '
                             f'But received {frozen_stages}')
        self.drop_path_rate = drop_path_rate
        self.out_indices = out_indices
        self.frozen_stages = frozen_stages
        self.conv_cfg = conv_cfg
        self.norm_cfg = norm_cfg
        self.act_cfg = act_cfg
        self.norm_eval = norm_eval
        self.with_cp = with_cp

        self.layer_setting = model_scaling(self.layer_setting,
                                           self.arch_setting)
        block_cfg_0 = self.layer_setting[0][0]
        block_cfg_last = self.layer_setting[-1][0]
        self.in_channels = make_divisible(block_cfg_0[1], 8)
        self.out_channels = block_cfg_last[1]
        self.layers = nn.ModuleList()

View on GitHub (pinned to cfd5d3a985)

Solutions

  1. Use frozen_stages in 0..num_stages (check len(layer_settings[arch]) in efficientnet.py); do not use -1 for EfficientNet
  2. Lower the value until construction succeeds
  3. If no freezing is desired, set frozen_stages=0

Example fix

# before
backbone=dict(type='EfficientNet', arch='b0', frozen_stages=-1)
# after
backbone=dict(type='EfficientNet', arch='b0', frozen_stages=0)
Defensive patterns

Strategy: validation

Validate before calling

n = len(backbone.layer_setting)
assert isinstance(frozen_stages, int) and 0 <= frozen_stages <= n, 'EfficientNet frozen_stages must be in [0, n_stages]'

Type guard

def valid_effnet_fs(v, n: int) -> bool:
    return isinstance(v, int) and 0 <= v <= n

Prevention

When it happens

Trigger: Setting frozen_stages=-1 on EfficientNet (not in range(0, len+1) here, so it raises); setting frozen_stages greater than the number of stages; non-integer values.

Common situations: Copy-pasting frozen_stages=-1 from ResNet/CSPDarknet configs; counting stages of a different arch variant when tuning fine-tuning depth.

Related errors


AI-assisted analysis of open-mmlab/mmdetection@cfd5d3a985 (2026-08-27). Data as JSON: /api/errors/1474a87220295fc5. Report an issue: GitHub.