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后返回新的学习率。

posted @ 2020-06-28 12:44  三年一梦  阅读(385)  评论(0编辑  收藏  举报