如何用mind+进行计算(送你5个MindSpore算子使用经验)

本文分享自华为云社区《华为云论坛_云计算论坛_开发者论坛_技术论坛-华为云》,作者:Skytier,我来为大家科普一下关于如何用mind+进行计算?下面希望有你要的答案,我们一起来看看吧!

如何用mind+进行计算(送你5个MindSpore算子使用经验)

如何用mind+进行计算

本文分享自华为云社区《华为云论坛_云计算论坛_开发者论坛_技术论坛-华为云》,作者: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 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

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

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页