关于程序员:送你5个MindSpore算子使用经验

1次阅读

共计 2212 个字符,预计需要花费 6 分钟才能阅读完成。

MindSpore 给大家提供了很多算子进行应用,明天给大家简略介绍下罕用的一些算子应用时须要留神的内容。

应用 mindspore.nn.BatchNorm 留神 momentum 参数

Batch Normalization 里有一个 momentum 参数,该参数作用于 mean 和 variance 的计算上,保留了历史 Batch 里的 mean 和 variance 值,即 moving_mean 和 moving_variance,借鉴优化算法里的 Momentum 算法将历史 Batch 里的 mean 和 variance 的作用连续到以后 Batch。
经验总结:
MindSpore 中 BatchNorm1d、BatchNorm2d 的 momentum 参数(定义该参数的变量名称为 momentum_ms),该参数与 PyTorch 里 BN 的 momentum 参数(定义该参数的变量名称为 momentum_py)的关系为:

momentum_ms = 1−momentum_py

应用 mindspore.nn.Dropout 留神概率参数

dropout 算子的 prob 参数是用来设置节点值为 0 的概率

经验总结:

MindSpore 中 dropout 的 keep_prob 参数,该参数与 PyTorch 里 dropout 的 p 参数的关系为:keep_prob=1−p

应用 mindspore.nn.SmoothL1Loss 留神问题

在网络训练中,个别会把 Loss 的后果对 Batch Size 求均匀;PyTorch 的 Loss 算子个别会有是否求均匀的参数,而 MindSpore 外面的 Loss 算子没有这个参数。
经验总结:
Mindspore.nn.SmoothL1Loss(beta=1.0)没有做均匀,须要本人做求均值操作,否则可能会呈现:

ERROR, updateOutputDesc, Update output desc failed, unknown output shape type

具体示例代码如下:

import numpy as np
import mindspore.nn as nnfrom mindspore.nn.loss.loss
import _Lossfrom mindspore
import Tensorfrom mindspore.ops
import operations as Pfrom mindspore.common
import dtype as mstype
class CheckSmoothL1(_Loss):
 def __init__(self, mean_dim=0):
        super(CheckSmoothL1, self).__init__()
        self.smooth_l1_loss = nn.SmoothL1Loss(beta=1.0)
        self.mean = P.ReduceMean(keep_dims=False)
        self.mean_dim = mean_dim
 def construct(self, input, target):
        out = self.smooth_l1_loss(input, target)
        mean_loss = self.mean(out, self.mean_dim)    #须要本人做求均值的操作
 return mean_loss
loss_op = CheckSmoothL1(mean_dim=0)
input_data = Tensor(np.array([1, 2, 3]), mstype.float32)
target_data = Tensor(np.array([1, 2, 2]), mstype.float32)
loss = loss_op(input_data, target_data)

应用 mindspore.ops.operations.L2Normalize 留神 axis 参数的指定

L2Normalize 算子须要指定 axis 来决定须要解决的轴。

经验总结:

mindspore.ops.operations.L2Normalize# 默认 axis=0,nn.functional.normalize(input, p=2, dim=1, eps=1e-12, out=None)# 默认 dim=1,

两者有很大差别;

迁徙 PyTorch 网络应用 L2Normalize 算子时,请指定 axis 参数,示例如下:

norm = P.L2Normalize(axis=1)

在测试的时候应用 mindspore.nn.Dropout

dropout 算子只在训练中应用,测试的时候须要去掉。
经验总结:
PyTorch 预测模式下 Dropout 主动不失效,而 MindSpore 预测模式下如果网络结构中有 Dropout 层,依然会做 drop。所以须要在测试的代码中手动去掉 dropout, 示例代码如下:

class Cut(nn.Cell):
 def __init__(self):
        super(Cut, self).__init__()
 def construct(self, x):
 return x
class CheckDrop(Cell):
 def __init__(self, use_drop=1, keep_prob=0.6):
        super(CheckDrop, self).__init__()
 if use_drop == 1:
            self.drop = nn.Dropout(keep_prob=keep_prob)
 else:
            self.drop = Cut()
 def construct(self, x):
        x = self.drop(x)
 return x
正文完
 0