mindspore.nn.thor
- mindspore.nn.thor(net, learning_rate, damping, momentum, weight_decay=0.0, loss_scale=1.0, batch_size=32, use_nesterov=False, decay_filter=lambda x: ..., split_indices=None, enable_clip_grad=False, frequency=100)[源代码]
通过二阶算法THOR更新参数。
更新公式如下:
表示第 层的输入,它是上一层的激活。 表示第 层输出的loss函数的导数。 代表单位矩阵。 表示 参数, 表示第 层的梯度。 表示克罗内克尔积, 表示学习率。说明
在分离参数组时,每个组的 weight_decay 将应用于对应参数。当不分离参数组时,优化器中的 weight_decay 将应用于名称中没有'beta'或 'gamma'的参数。
在分离参数组时,如果要集中梯度,请将grad_centralization设置为True,但集中梯度只能应用于卷积层的参数。 如果非卷积层的参数设置为
True
,则会报错。为了提高参数组的性能,可以支持自定义参数的顺序。
- 参数:
net (Cell) - 训练网络。
learning_rate (Tensor) - 学习率的值。
damping (Tensor) - 阻尼值。
momentum (float) - float类型的超参数,表示移动平均的动量。至少为0.0。
weight_decay (int, float) - 权重衰减(L2 penalty)。必须等于或大于0.0。默认值:
0.0
。loss_scale (float) - loss损失缩放系数。必须大于0.0。一般情况下,使用默认值。默认值:
1.0
。batch_size (int) - batch的大小。默认值:
32
。use_nesterov (bool) - 启用Nesterov动量。默认值:
False
。decay_filter (function) - 用于确定权重衰减应用于哪些层的函数,只有在weight_decay>0时才有效。默认值:lambda x: x.name not in []。
split_indices (list) - 按A/G层(A/G含义见上述公式)索引设置allreduce融合策略。仅在分布式计算中有效。以ResNet50为例,A/G的层数分别为54层,当split_indices设置为[26,53]时,表示A/G被分成两组allreduce,一组为0~26层,另一组是27~53层。默认值:
None
。enable_clip_grad (bool) - 是否剪切梯度。默认值:
False
。frequency (int) - A/G和
的更新间隔。当frequency等于N(N必须大于1),每隔frequency个step,A/G和 将更新一次。其他step将使用之前的A/G和 来更新权重。默认值:100
。
- 输入:
gradients (tuple[Tensor]) - 训练参数的梯度,矩阵维度与训练参数相同。
- 输出:
tuple[bool],所有元素都为
True
。- 异常:
TypeError - learning_rate 不是张量。
TypeError - loss_scale 、 momentum 或 frequency 不是浮点数。
TypeError - weight_decay 既不是浮点数也不是整数。
TypeError - use_nesterov 不是布尔值。
TypeError - frequency 不是整数。
ValueError - loss_scale 小于或等于0。
ValueError - weight_decay 或 momentum 小于0。
ValueError - frequency 小于2。
- 支持平台:
Ascend
GPU
样例:
>>> import mindspore as ms >>> from mindspore import nn >>> from mindspore import Tensor >>> >>> # Define the network structure of LeNet5. Refer to >>> # https://gitee.com/mindspore/docs/blob/r2.4.0/docs/mindspore/code/lenet.py >>> net = LeNet5() >>> # Create the dataset taking MNIST as an example. Refer to >>> # https://gitee.com/mindspore/docs/blob/r2.4.0/docs/mindspore/code/mnist.py >>> dataset = create_dataset() >>> temp = Tensor([4e-4, 1e-4, 1e-5, 1e-5], mstype.float32) >>> optim = nn.thor(net, learning_rate=temp, damping=temp, momentum=0.9, loss_scale=128, frequency=4) >>> loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') >>> loss_scale = ms.FixedLossScaleManager(128, drop_overflow_update=False) >>> model = ms.Model(net, loss_fn=loss, optimizer=optim, loss_scale_manager=loss_scale, metrics={'acc'}, ... amp_level="O2", keep_batchnorm_fp32=False) >>> model = ms.ConvertModelUtils.convert_to_thor_model(model=model, network=net, loss_fn=loss, optimizer=optim, ... loss_scale_manager=loss_scale, metrics={'acc'}, ... amp_level="O2", keep_batchnorm_fp32=False)