def load_best_model(best_model_info, device, config_str, model_type, model_name,  load_filename=None):
    if load_filename is None:
        savename = best_model_info['savename']
        split = savename.split('/')
        split[-1] = 'best_' + split[-1]
        load_filename = '/'.join(split)
    
    try:
        _iter = checkpoint['_iter']
    except:
        _iter = checkpoint['_epoch']
    print("Loaded checkpoint (trained for {} iterations)".format(_iter))
    
    try:
        params = best_model_info[["momentum", "seed", "lr", "batch_size", "augmentation"]]
    except:
        params = best_model_info[["seed", "lr", "batch_size", "augmentation"]]

    params = params.to_dict()
    
    params_alt = {}
    
    for key, value in params.items():
        if (type(value) == str):
            params_alt[key] = [eval(value)]
        else:
            params_alt[key] = [value]

    exp = Experiment(None, device, config_str, model_type, model_name, params_alt, None, None)

    model, criterion, optimizer = exp._get_model(best_model_info['seed'], params)
    model = nn.DataParallel(model)
    model.load_state_dict(checkpoint['state_dict'])
    
    model.to(device)
    
    return checkpoint, model, criterion,exp