mxnet 更新学习率方式

                              mxnet 更新学习率方式

https://github.com/gengyanlei/insightFace-gluon/blob/master/main.py   代码使用mxnet.gluon

1. 采用mxnet官方函数API 自动更改学习率 (按照epoch更新,mxnet.gluon)

mxnet.lr_scheduler 模块下面就可以;但是这里都是按照step执行的,如何按照pytorch那样在epoch下执行,每个epoch执行一次类似pytorch那样的lr_scheduler.step(),代码如下:

optimizer = gluon.Trainer(params=model.collect_params(), optimizer='sgd', optimizer_params={'learning_rate': args.lr, 'wd': 0.0001, 'momentum': 0.9, } )  # 不能在这里设置 'lr_shceduler': lr_scheduler,这里不是在epoch里面执行

lr_scheduler = mx.lr_scheduler.FactorScheduler(step=10, factor=0.1, base_lr=0.1)
for epoch in range(40):
    lr_scheduler.__call__(num_update=epoch)
    print(lr_scheduler.base_lr)
    optimizer.set_learning_rate(lr_scheduler.base_lr)

2. 采用自定义的更新学习率函数 (按照epoch更新,mxnet.gluon)

代码如下:

def lr_scheduler(base_lr, epoch, optimiser, steps, rate=0.1):
    '''
    :param base_lr:    float baseline learning rate
    :param epoch:      int, current epoch
    :param optimiser:  optimiser,
    :param steps:      int, every steps's epoches
    :param rate:       float, lr update rate
    :return:  update lr
    '''  #个人喜欢自定义学习率设置函数,当然可以使用mxnet自带的update_lr_func, pytorch也是如此
    lr = base_lr * (rate ** (epoch // steps))
    optimiser.set_learning_rate(lr)
    return  # 不需要返回optimiser,仍然会更新lr

3. 采用半官方半自定义的函数 (按照epoch更新,mxnet.symbol)

在model.fit( epoch_end_callback= )设置更新学习率,保存模型参数

opt = optimizer.SGD(learning_rate=base_lr, momentum=base_mom, wd=base_wd)
def epoch_end_callback(param):
    '''
    :param param: BatchParams [epoch=epoch, nbatch=nbatch, eval_metric=eval_metric, locals=locals()]
    :return:
    '''
    epoch = param.epoch
    opt.lr = base_lr * rate**(epoch // epoch_steps)
    #optimizer是直接对其本身操作,是地址操作,并不是表面上看到的值传递,因此不需要返回!#

4. 若是按照step操作,那么直接设置params,再传给optimizer就可以了

optimizer_params = {'wd': wd, 'momentum': momentum, 'lr_scheduler': lr_scheduler}

猜你喜欢

转载自blog.csdn.net/LEILEI18A/article/details/103682433
今日推荐