1.系统环境
1.1 硬件环境:
(Ascend/GPU/CPU): CPU
1.2 软件环境:
MindSpore 版本: 1.7.0
执行模式: 静态图(GRAPH)
Python 版本: 3.7.0
操作系统平台: linux
2. 报错信息
2.1 问题描述
执行网络代码时,报错提示DropoutGrad的反向未定义。
2.2 报错信息
Illegal primitive: Primitive DropoutGrad’s bprop not defined.
2.3 脚本代码
import numpy as np
import mindspore.nn as nn
import mindspore.ops as ops
from mindspore import Tensor
from mindspore import context
from mindspore import dtype as mstype
from mindspore.ops.operations import _grad_ops as P
context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
class Net(nn.Cell):
def __init__(self, keep_prob=0.5):
super(Net, self).__init__()
self.dropout_grad = P.DropoutGrad(keep_prob)
def construct(self, output, mask):
return self.dropout_grad(output, mask)
class GradSec(nn.Cell):
def __init__(self, network):
super(GradSec, self).__init__()
self.grad = ops.GradOperation()
self.network = network
def construct(self, x, mask):
gout = self.grad(self.network)(x, mask)
return gout
in_tensor = Tensor(np.array([[[3., 1., 2.]], [[4., 1., 4.]]]), mstype.float16)
in_mask = Tensor(np.array([[[1., 0, 0]], [[0., 0., 1.]]]), mstype.float16)
dropout_grad = Net(0.3333333333)
second_grad = GradSec(dropout_grad)
output = second_grad(in_tensor, in_mask)
print(output)
3. 根因分析
MindSpore 1.7.0版本执行网络代码时,报错Illegal primitive: Primitive DropoutGrad’s bprop not defined
。
分析报错信息,发现是未定义DropoutGrad的反向,即Dropout的二阶反向。需要在MindSpore源码中补齐该功能。
4. 解决方案
通过社区提需求的方式,反馈该问题。开发人员在MindSpore源码中增加Dropout的二阶反向。
相关代码可查阅:https://gitee.com/mindspore/mindspore/pulls/36778
修复后,执行该用例,可以正常打印出结果。
[[[3. 0. 0.]]
[[0. 0. 3.]]]
该问题已在MindSpore 1.7.0版本解决,后续版本不再复现。