def lr_scheduler_exponential(optimizer, epoch, init_lr, epoch_start, base_factor, verbose=False, printfct=print):
    """
    Decay initial learning rate exponentially starting after epoch_start epochs
    The learning rate is multiplied with base_factor every lr_decay_epoch epochs
    :param optimizer: the optimizer inheriting from torch.optim.Optimizer
    :param epoch: the current epoch
    :param init_lr: initial learning rate before decaying
    :param epoch_start: epoch after which the learning rate is decayed exponentially. Constant lr before epoch_start
    :param base_factor: factor by which the learning rate is decayed in each epoch after epoch_start
    :param verbose: print current learning rate
    """
    if epoch <= epoch_start:
        lr = init_lr
    else:
        lr = init_lr * (base_factor**(epoch - epoch_start))
    if verbose:
        printfct('learning rate = {:6f}'.format(lr))
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr
    return optimizer, lr