ultralytics/yolov5 · error · NotImplementedError
Optimizer {name} not implemented.
Error message
Optimizer {name} not implemented. What it means
Raised by utils/torch_utils.py smart_optimizer() when the --optimizer argument does not match one of the four supported names: 'Adam', 'AdamW', 'RMSProp', or 'SGD'. The function builds a parameter-group optimizer via an if/elif chain, so any other string falls through to NotImplementedError.
Source
Thrown at utils/torch_utils.py:282
for v in model.modules():
for p_name, p in v.named_parameters(recurse=0):
if p_name == "bias": # bias (no decay)
g[2].append(p)
elif p_name == "weight" and isinstance(v, bn): # weight (no decay)
g[1].append(p)
else:
g[0].append(p) # weight (with decay)
if name == "Adam":
optimizer = torch.optim.Adam(g[2], lr=lr, betas=(momentum, 0.999)) # adjust beta1 to momentum
elif name == "AdamW":
optimizer = torch.optim.AdamW(g[2], lr=lr, betas=(momentum, 0.999), weight_decay=0.0)
elif name == "RMSProp":
optimizer = torch.optim.RMSprop(g[2], lr=lr, momentum=momentum)
elif name == "SGD":
optimizer = torch.optim.SGD(g[2], lr=lr, momentum=momentum, nesterov=True)
else:
raise NotImplementedError(f"Optimizer {name} not implemented.")
optimizer.add_param_group({"params": g[0], "weight_decay": decay}) # add g0 with weight_decay
optimizer.add_param_group({"params": g[1], "weight_decay": 0.0}) # add g1 (BatchNorm2d weights)
LOGGER.info(
f"{colorstr('optimizer:')} {type(optimizer).__name__}(lr={lr}) with parameter groups "
f"{len(g[1])} weight(decay=0.0), {len(g[0])} weight(decay={decay}), {len(g[2])} bias"
)
return optimizer
def smart_resume(ckpt, optimizer, ema=None, weights="yolov5s.pt", epochs=300, resume=True):
"""Resumes training from a checkpoint, updating optimizer, ema, and epochs, with optional resume verification."""
best_fitness = 0.0
start_epoch = ckpt["epoch"] + 1
if ckpt["optimizer"] is not None:
optimizer.load_state_dict(ckpt["optimizer"]) # optimizer
best_fitness = ckpt["best_fitness"]
if ema and ckpt.get("ema"):View on GitHub (pinned to 20d1d78a08)
Solutions
- Use one of the four exact names: --optimizer SGD, --optimizer Adam, --optimizer AdamW, or --optimizer RMSProp (note capital 'P' in RMSProp).
- If you need a different optimizer, subclass/patch smart_optimizer in utils/torch_utils.py to add an elif branch constructing your torch.optim optimizer over g[2] with lr and momentum.
- Check for stray whitespace/casing in scripts or hyperparameter-evolution configs that pass opt.optimizer.
Example fix
# before python train.py --optimizer adamw # NotImplementedError # after python train.py --optimizer AdamW
Defensive patterns
Strategy: validation
Validate before calling
SUPPORTED_OPTIMIZERS = {"SGD", "Adam", "AdamW", "RMSProp"}
assert opt.optimizer in SUPPORTED_OPTIMIZERS, (
f"--optimizer must be one of {sorted(SUPPORTED_OPTIMIZERS)} (case-sensitive), got {opt.optimizer!r}"
) Type guard
def is_supported_optimizer(name: str) -> bool:
"""YOLOv5 smart_optimizer accepts exactly these names, case-sensitive."""
return isinstance(name, str) and name in {"SGD", "Adam", "AdamW", "RMSProp"} Try / catch
try:
optimizer = smart_optimizer(model, name=opt.optimizer, lr=opt.lr0, momentum=opt.momentum, decay=opt.weight_decay)
except NotImplementedError:
LOGGER.warning(f"Optimizer {opt.optimizer} unsupported; defaulting to SGD")
optimizer = smart_optimizer(model, name="SGD", lr=opt.lr0, momentum=opt.momentum, decay=opt.weight_decay) Prevention
- Copy optimizer names verbatim from train.py's argparse choices rather than typing them.
- Treat casing as significant: 'adamw', 'rmsprop' are invalid.
- In wrapper scripts, whitelist and normalize optimizer strings before invoking train.py.
When it happens
Trigger: Running train.py with --optimizer set to an unsupported value, e.g. --optimizer adam (lowercase), --optimizer Adamw (wrong casing), --optimizer adagrad, --optimizer LBFGS, or --optimizer NONE. The match is case-sensitive and exact.
Common situations: Typos and casing mistakes ('adamw', 'rmsprop', 'SGD ' with whitespace); copying a command from a tutorial that used a different framework's optimizer name (e.g. 'adamw_torch' from PyTorch Lightning); trying to use a newer torch optimizer (Lion, Adafactor) that YOLOv5's smart_optimizer does not wrap.
Related errors
- {prefix}{p} does not exist
- {prefix}Error loading data from {path}: {e}\n{HELP_URL}
- Dataset not found ❌
- --task {opt.task} not in ("train", "val", "test", "speed", "
AI-assisted analysis of ultralytics/yolov5@20d1d78a08 (2026-08-15).
Data as JSON: /api/errors/2717d9f1ca211b73.
Report an issue: GitHub.