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