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}