写点什么

送你 5 个 MindSpore 算子使用经验

  • 2022 年 9 月 16 日
    中国香港
  • 本文字数:1517 字

    阅读完需:约 5 分钟

送你5个MindSpore算子使用经验

本文分享自华为云社区《【MindSpore易点通】算子使用经验总结》,作者:Skytier。


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 npimport mindspore.nn as nnfrom mindspore.nn.loss.lossimport _Lossfrom mindsporeimport Tensorfrom mindspore.opsimport operations as Pfrom mindspore.commonimport dtype as mstypeclass 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_lossloss_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 xclass 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
复制代码


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 6
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
送你5个MindSpore算子使用经验_人工智能_华为云开发者联盟_InfoQ写作社区