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

  1. Use one of the four exact names: --optimizer SGD, --optimizer Adam, --optimizer AdamW, or --optimizer RMSProp (note capital 'P' in RMSProp).
  2. 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.
  3. 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

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


AI-assisted analysis of ultralytics/yolov5@20d1d78a08 (2026-08-15). Data as JSON: /api/errors/2717d9f1ca211b73. Report an issue: GitHub.