Optimization: initialize and update weights
一。mxnet优化器主要有三个API组成:
可以看到由初始化、优化器、学习率规划三部分组成。
首先是一个symbol训练demo,同时利用这三个api :
1)首先建立symbol模型
>>> data = mx.symbol.Variable('data') >>> label = mx.symbol.Variable('softmax_label') >>> fc = mx.symbol.FullyConnected(data, name='fc', num_hidden=10) >>> loss = mx.symbol.SoftmaxOutput(fc, label, name='softmax') >>> mod = mx.mod.Module(loss) # 建立module >>> mod.bind(data_shapes=[('data', (128,20))], label_shapes=[('softmax_label', (128,))]) # 执行
2)初始化权重参数,正态分布[-1,1]
>>> mod.init_params(mx.initializer.Uniform(scale=1.0))
3)利用sgd和每一百步学习率*0.9的策略来训练
lr_sch = mx.lr_scheduler.FactorScheduler(step=100, factor=0.9) # 学习策略 mod.init_optimizer( optimizer='sgd', optimizer_params=(('learning_rate', 0.1), ('lr_scheduler', lr_sch))) # sgd优化器
4)然后利用mod.fit来训练
二。 初始化包介绍
mxnet.initializer
class mxnet.initializer.
Initializer
(**kwargs)[source] 是所有初始化器的基类。
例如: class mxnet.initializer.
Uniform
(scale=0.07)[source]
# Given 'module', an instance of 'mxnet.module.Module', initialize weights # to random values uniformly sampled between -0.1 and 0.1. init = mx.init.Uniform(0.1) module.init_params(init) for dictionary in module.get_params(): for key in dictionary: print(key) print(dictionary[key].asnumpy())
三。 优化器包介绍
例如adam:
class mxnet.optimizer.
Adam
(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, lazy_update=True, **kwargs)[source]
这些optimizer都继承自类class mxnet.optimizer.
Optimizer
(rescale_grad=1.0, param_idx2name=None, wd=0.0, clip_gradient=None, learning_rate=0.01, lr_scheduler=None, sym=None, begin_num_update=0, multi_precision=False, param_dict=None)[source]
可以这样建立一个优化器:
>>> sgd = mx.optimizer.Optimizer.create_optimizer('sgd') >>> type(sgd) >>> adam = mx.optimizer.create('adam', learning_rate=.1) >>> type(adam)
主要方法:
set_learning_rate
(lr)[source] 为当前的优化器设置一个新的学习率set_lr_mult
(args_lr_mult) 为每个参数设置一个独立的学习率乘子set_wd_mult
(args_wd_mult)[source] 为每个参数设置一个独立的权重衰减-
update
(index, weight, grad, state)[source] 根据对应的梯度和状态来更新给定的参数
四。学习率规划介绍
所有规划的基类:class mxnet.lr_scheduler.
LRScheduler
(base_lr=0.01, warmup_steps=0, warmup_begin_lr=0, warmup_mode='linear')[source]
根据返回一个新的学习率。基类中的参数:
- base_lr(float,可选)-初始学习速率。
- warmup_steps(int)– 该scheduler开始衰减之前所经过的warmup步数
- warmup_begin_lr(float)-如果使用warmup,开始warmup的学习速度
- warmup_mode(字符串)-预热可以在两种模式下进行。“线性”模式以相等的增量逐渐增加。“恒定”模式保持lr不变
最常见的有根据step来进行学习率变化:
class mxnet.lr_scheduler.
FactorScheduler
(step, factor=1, stop_factor_lr=1e-08, base_lr=0.01, warmup_steps=0, warmup_begin_lr=0, warmup_mode='linear')
每隔step步,给学习率乘以factor后返回新的学习率。