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
- Use frozen_stages in 0..num_stages (check len(layer_settings[arch]) in efficientnet.py); do not use -1 for EfficientNet
- Lower the value until construction succeeds
- 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
- EfficientNet here does not accept -1; use 0 for no freezing
- Keep frozen_stages <= number of stages
- Validate before constructing in scripted config tools
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
- frozen_stages must be in range(-1, len(arch_setting) + 1). B
- frozen_stages must be in range(-1, len(arch_setting) + 1). B
- the item in out_indices must in range(0, {len(self.layer_set
- invalid depth {depth} for darknet
- Invalid text mode "{self.text_mode}".
AI-assisted analysis of open-mmlab/mmdetection@cfd5d3a985 (2026-08-27).
Data as JSON: /api/errors/1474a87220295fc5.
Report an issue: GitHub.