• 送你5个MindSpore算子使用经验


    摘要: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注意prob参数

    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

     

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

  • 相关阅读:
    5、依赖倒转原则
    4、开放-封闭原则
    3、单一职责原则
    2013年工作生活总结
    2、策略模式
    1、简单工厂模式
    Unity3D笔记四 基础知识概念
    PythonStudy——PyCharm使用技巧 Column Selection Mode(列选择模式)
    PythonStudy——函数对象的案例
    PythonStudy——函数嵌套定义 Function nesting definition
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/16699088.html
Copyright © 2020-2023  润新知