NotFoundError: No Output(X@GRAD) found for BatchNormGrad operator.

  • 这几天在学习paddle的过程中遇到一个问题,写了一个网络,前向传播很nice,加上优化器、损失啥啥的反向传播就GG了,报错的行在.backward()这个地方,内容如下
----------------------
Error Message Summary:
----------------------
NotFoundError: No Output(X@GRAD) found for BatchNormGrad operator.
[Hint: Expected ctx->HasOutput(framework::GradVarName("X")) == true, but received ctx->HasOutput(framework::GradVarName("X")):0 != true:1.] at (/paddle/paddle/fluid/operators/batch_norm_op.cc:466)
  • 粗看应该是BatchNorm出了什么问题。回到网络中两个BatchNorm,注释一个留下一个进行测试,发现是第一个BatchNorm出了问题,只要注释掉就能正常反向传播了
  • 检查num_channels,没问题,百思不得其解。最后终于发现了,由于我是在测试,只传入了一张图片,Tensor的形状是[1,1,256,256],网络的顺序是BN+ReLU+CONV+······在第一个BatchNorm,传入的通道数为1,这时BatchNorm反向就会报错,只要在forward()中,在使用第一个BatchNorm时进行一个判断就行了
_, c, h, w = x.shape
if c != 1:
	x = self.bn1(x)

你可能感兴趣的:(paddle,paddlepaddle)