Hi @glenn.jocher,  I’ve also encountered the same error in https://github.com/ultralytics/yolov3 2 when resuming training. But I examined the source code of torch.optim.lr_scheduler.LambdaLR, and found that the reason your code works is that LambdaLR takes the default value last_epoch = -1 and reset the lr. Thus lr isn’t loaded from last.pt, but reset as a new optimizer.
https://s0pytorch0org.icopy.site/docs/0.2.0/_modules/torch/optim/lr_scheduler.html 10
class LambdaLR(_LRScheduler):
    """Sets the learning rate of each parameter group to the initial lr
    times a given function. When last_epoch=-1, sets initial lr as lr.
    ......

Why initial_lr is missing in last.pt is because the optimizer will not be saved in the last epoch. I think that the mechanism of resume training is designed for the scheme that the training is interrupted, not for continuing after the last epoch.
If we want to continue training after the last epoch, we may modify the line
'optimizer': None if final_epoch else optimizer.state_dict()
to
'optimizer': optimizer.state_dict()
in train.py.
I’m not sure but it seems to work for me.
# Save training results
        save = (not opt.nosave) or (final_epoch and not opt.evolve)
        if save:
            with open(results_file, 'r') as f:
                # Create checkpoint
                chkpt = {'epoch': epoch,
                         'best_fitness': best_fitness,
                         'training_results': f.read(),
                         'model': model.module.state_dict() if hasattr(model, 'module') else model.state_dict(),
                         'optimizer': None if final_epoch else optimizer.state_dict()}