# MindSpore 报错提示 DropoutGrad 的bprop反向未定义："Illegal primitive: Primitive DropoutGrad’s bprop not defined."

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): CPU

软件环境: MindSpore 版本: 1.7.0

执行模式（静态图/动态图）： 静态图

Python 版本: 3.7.6

操作系统平台: 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](https://gitee.com/mindspore/mindspore/pulls/36778)

修复后，执行该用例，可以正常打印出结果。

```
[[[3. 0. 0.]]
 [[0. 0. 3.]]]
```

该问题已在MindSpore 1.7.0版本解决，后续版本不再复现。

