首页 Paddle框架 帖子详情
BatchNorm反向传播出问题
收藏
快速回复
Paddle框架 问答模型训练 1111 18
BatchNorm反向传播出问题
收藏
快速回复
Paddle框架 问答模型训练 1111 18

RuntimeError: (NotFound) 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:467)

 

看到别人说channel=1出的问题,但是,我的模型中并没有出现BatchNorm的channel为1.

0
收藏
回复
全部评论(18)
时间顺序
酒墨茗棋妙了
#2 回复于2021-06

我也遇到这个问题了,我觉得代码逻辑结构上没有错的,我3维的BatchNorm1D和4维的BatchNorm都试了,都报这个错,怀疑这个API是不是有问题。Keras上用相同的结构是没问题的。

0
回复
花花的疯人院
#3 回复于2021-06
我也遇到这个问题了,我觉得代码逻辑结构上没有错的,我3维的BatchNorm1D和4维的BatchNorm都试了,都报这个错,怀疑这个API是不是有问题。Keras上用相同的结构是没问题的。

别说keras,pytorch代码都基本一样都没问题

0
回复
FutureSI
#4 回复于2021-06

我经常用BN、IN没发现过问题啊

0
回复
FutureSI
#5 回复于2021-06

BN上一句接的什么语句呢?

0
回复
花花的疯人院
#6 回复于2021-06
BN上一句接的什么语句呢?

class conv_bn_relu(nn.Layer):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, act=True):
        super(conv_bn_relu, self).__init__()
        self.conv = Conv2D(in_channels=in_channels, out_channels=out_channels,
                           kernel_size=kernel_size, stride=stride, padding=padding)
        self.bn = BatchNorm(num_channels=out_channels)
        # self.bn = BatchNorm2D(num_features = out_channels)
        if act:
            self.relu = ReLU()
        else:
            self.relu = None

    def forward(self, inputs):
        x = self.conv(inputs)
        x = self.bn(x)
        if self.relu is not None:
            x = self.relu(x)
        return x

0
回复
花花的疯人院
#7 回复于2021-06

怎么说呢,就是有时候运行一轮了是正常的,第二轮开始就出错。感觉是我的模型有问题,就是找不到问题所在

0
回复
FutureSI
#8 回复于2021-06
class conv_bn_relu(nn.Layer):     def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, act=True):         super(conv_bn_relu, self).__init__()         self.conv = Conv2D(in_channels=in_channels, out_channels=out_channels,                            kernel_size=kernel_size, stride=stride, padding=padding)         self.bn = BatchNorm(num_channels=out_channels)         # self.bn = BatchNorm2D(num_features = out_channels)         if act:             self.relu = ReLU()         else:             self.relu = None     def forward(self, inputs):         x = self.conv(inputs)         x = self.bn(x)         if self.relu is not None:             x = self.relu(x)         return x
展开

还是推荐使用2D系列的api,包括各种卷积和正则化层

0
回复
FutureSI
#9 回复于2021-06
怎么说呢,就是有时候运行一轮了是正常的,第二轮开始就出错。感觉是我的模型有问题,就是找不到问题所在

如果第一轮没出错,第二轮出错,这可能和代码重复执行有关,检查下是否有些变量重用了

0
回复
FutureSI
#10 回复于2021-06

比如包括这句的cell执行两次就会出错

0
回复
FutureSI
#11 回复于2021-06

data = paddle.to_tensor(data)

这句第一次将numpy转为tensor了,就不能再执行一次转换了

0
回复
FutureSI
#12 回复于2021-06

或者也可以检查一下是否内存\显存溢出

0
回复
FutureSI
#13 回复于2021-06

还有就是如果给某些子层指定了 name 名称,同一个模型类就不能二次实例化了

0
回复
花花的疯人院
#14 回复于2021-06

你说的基本不可能。BactNorm2D也用过,甚至fluid的BN api都用过了;至于内存溢出也不太可能,因为有时候batchsize设置为2,刚开始就报错了;关于名称,给每个层加名称这个习惯还没养成。由于观察到不是每一轮,每个batch都会报错,所以,现在我都用上try..except..来控制了,这样勉强还是可以运行的,也发现有些epoch一轮下来512个batch都没问题,而有些epoch,有4、5个batch的backward出现问题。

      try:
            loss.backward()
            # 更新参数
            optimizer.step()
            # 梯度清零
            optimizer.clear_grad()
        except:
            print()

0
回复
FutureSI
#15 回复于2021-06

             # 梯度清零
            optimizer.clear_grad()

           loss.backward()
            # 更新参数
            optimizer.step()

0
回复
FutureSI
#16 回复于2021-06

换成先清除梯度再反向试试

0
回复
花花的疯人院
#17 回复于2021-06
FutureSI #16
换成先清除梯度再反向试试

这个应该没问题,因为在paddle的官网的一些使用文档就是先反向传播,然后在更新参数和清除梯度的。https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/05_train_eval_predict_cn.html

0
回复
FutureSI
#18 回复于2021-06
这个应该没问题,因为在paddle的官网的一些使用文档就是先反向传播,然后在更新参数和清除梯度的。https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/05_train_eval_predict_cn.html
展开

如果是单个网络的模型两种写法没区别,如果包含多个网络最好还是先清梯度

0
回复
FutureSI
#19 回复于2021-06
这个应该没问题,因为在paddle的官网的一些使用文档就是先反向传播,然后在更新参数和清除梯度的。https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/05_train_eval_predict_cn.html
展开

我写的cyclegan就踩过那个坑。。。

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户