{"record":{"id":"2717d9f1ca211b73","repo":"ultralytics/yolov5","slug":"optimizer-name-not-implemented","errorCode":null,"errorMessage":"Optimizer {name} not implemented.","messagePattern":"Optimizer (.+?) not implemented\\.","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"utils/torch_utils.py","lineNumber":282,"sourceCode":"    for v in model.modules():\n        for p_name, p in v.named_parameters(recurse=0):\n            if p_name == \"bias\":  # bias (no decay)\n                g[2].append(p)\n            elif p_name == \"weight\" and isinstance(v, bn):  # weight (no decay)\n                g[1].append(p)\n            else:\n                g[0].append(p)  # weight (with decay)\n\n    if name == \"Adam\":\n        optimizer = torch.optim.Adam(g[2], lr=lr, betas=(momentum, 0.999))  # adjust beta1 to momentum\n    elif name == \"AdamW\":\n        optimizer = torch.optim.AdamW(g[2], lr=lr, betas=(momentum, 0.999), weight_decay=0.0)\n    elif name == \"RMSProp\":\n        optimizer = torch.optim.RMSprop(g[2], lr=lr, momentum=momentum)\n    elif name == \"SGD\":\n        optimizer = torch.optim.SGD(g[2], lr=lr, momentum=momentum, nesterov=True)\n    else:\n        raise NotImplementedError(f\"Optimizer {name} not implemented.\")\n\n    optimizer.add_param_group({\"params\": g[0], \"weight_decay\": decay})  # add g0 with weight_decay\n    optimizer.add_param_group({\"params\": g[1], \"weight_decay\": 0.0})  # add g1 (BatchNorm2d weights)\n    LOGGER.info(\n        f\"{colorstr('optimizer:')} {type(optimizer).__name__}(lr={lr}) with parameter groups \"\n        f\"{len(g[1])} weight(decay=0.0), {len(g[0])} weight(decay={decay}), {len(g[2])} bias\"\n    )\n    return optimizer\n\n\ndef smart_resume(ckpt, optimizer, ema=None, weights=\"yolov5s.pt\", epochs=300, resume=True):\n    \"\"\"Resumes training from a checkpoint, updating optimizer, ema, and epochs, with optional resume verification.\"\"\"\n    best_fitness = 0.0\n    start_epoch = ckpt[\"epoch\"] + 1\n    if ckpt[\"optimizer\"] is not None:\n        optimizer.load_state_dict(ckpt[\"optimizer\"])  # optimizer\n        best_fitness = ckpt[\"best_fitness\"]\n    if ema and ckpt.get(\"ema\"):","sourceCodeStart":264,"sourceCodeEnd":300,"githubUrl":"https://github.com/ultralytics/yolov5/blob/20d1d78a08277e365d57bfa3a2cce752772d9e59/utils/torch_utils.py#L264-L300","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"# before\npython train.py --optimizer adamw  # NotImplementedError\n# after\npython train.py --optimizer AdamW","handlingStrategy":"validation","validationCode":"SUPPORTED_OPTIMIZERS = {\"SGD\", \"Adam\", \"AdamW\", \"RMSProp\"}\nassert opt.optimizer in SUPPORTED_OPTIMIZERS, (\n    f\"--optimizer must be one of {sorted(SUPPORTED_OPTIMIZERS)} (case-sensitive), got {opt.optimizer!r}\"\n)","typeGuard":"def is_supported_optimizer(name: str) -> bool:\n    \"\"\"YOLOv5 smart_optimizer accepts exactly these names, case-sensitive.\"\"\"\n    return isinstance(name, str) and name in {\"SGD\", \"Adam\", \"AdamW\", \"RMSProp\"}","tryCatchPattern":"try:\n    optimizer = smart_optimizer(model, name=opt.optimizer, lr=opt.lr0, momentum=opt.momentum, decay=opt.weight_decay)\nexcept NotImplementedError:\n    LOGGER.warning(f\"Optimizer {opt.optimizer} unsupported; defaulting to SGD\")\n    optimizer = smart_optimizer(model, name=\"SGD\", lr=opt.lr0, momentum=opt.momentum, decay=opt.weight_decay)","preventionTips":["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."],"tags":["optimizer","training","cli-args","torch"],"backgroundTag":null,"analyzedSha":"20d1d78a08277e365d57bfa3a2cce752772d9e59","analyzedAt":"2026-08-15T02:56:15.443Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}