送你5个MindSpore算子使用经验

简介: 送你5个MindSpore算子使用经验

1.png
使用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)的关系为:

使用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)没有做平均,需要自己做求均值操作,否则可能会出现:

具体示例代码如下:

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来决定需要处理的轴。

经验总结:

nn.functional.normalize(input, p=2, dim=1, eps=1e-12, out=None)#默认dim=1,

两者有很大差异;

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

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

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

 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
相关文章
|
4月前
|
存储 机器学习/深度学习 人工智能
极智AI | 从部署的角度看bn和in算子
本文介绍一下从部署角度来看 bn 和 in 的实现与对比。
104 1
|
4月前
|
机器学习/深度学习 人工智能 算法
极智AI | 教你简化onnx upsample算子
本文介绍了简化 onnx upsample 算子的方法。
214 0
|
11月前
|
机器学习/深度学习 人工智能 前端开发
MindSpore基础介绍
本文将会整体对华为AI全栈进行介绍,并介绍MindSpore在其中的位置等内容。
254 1
|
机器学习/深度学习 并行计算 算法
昇思MindSpore“自动向量化Vmap”介绍与示例
昇思MindSpore“自动向量化Vmap”介绍与示例
162 0
|
机器学习/深度学习 人工智能 供应链
AI驱动运筹优化「光刻机」!中科大等提出分层序列模型,大幅提升数学规划求解效率|ICLR 2023
AI驱动运筹优化「光刻机」!中科大等提出分层序列模型,大幅提升数学规划求解效率|ICLR 2023
301 0
|
机器学习/深度学习 人工智能 算法
AI算子开发需要什么技能
AI算子开发需要什么技能?
|
机器学习/深度学习 算法 数据可视化
|
机器学习/深度学习 分布式计算 算法
系列小作文之企业级机器学习pipline总结
系列小作文之企业级机器学习pipline总结
|
机器学习/深度学习 C++ Python
【机器学习】向量化计算 -- 机器学习路上必经路
【机器学习】向量化计算 -- 机器学习路上必经路
【机器学习】向量化计算 -- 机器学习路上必经路