【经验贴】参数直接参与运算,会影响loss.backward()的回传 已解决
收藏
快速回复
【经验贴】参数直接参与运算,会影响loss.backward()的回传 已解决
收藏
快速回复

 一、坑

        Keras采用self.kernel = (self.kernelself*it_weights)这种方式可以运算,Paddle中采用这种方式会影响梯度回传。

二、解决过程:

在GitHub上就这个问题 loss.backward() RuntimeError 提了 Issue #38062 ,

(1)百度同学帮忙检查后发现,运行时先报这个信息:

RuntimeError: (NotFound) Inputs and outputs of reshape2_grad do not exist. This may be because:
1. You use some output variables of the previous batch as the inputs of the current batch. Please try to call "stop_gradient = True" or "detach()" for these variables.
2. You calculate backward twice for the same subgraph without setting retain_graph=True. Please set retain_graph=True in the first backward call.


[Hint: Expected ins_.empty() && outs_.empty() != true, but received ins_.empty() && outs_.empty():1 == true:1.] (at /paddle/paddle/fluid/imperative/op_base.h:164)

(2)再次执行时,才报:

RuntimeError: (AlreadyExists) Accumulators are not empty before preparing it for backward network execution.
[Hint: Expected accumulators_.empty() == true, but received accumulators_.empty():0 != true:1.] (at /paddle/paddle/fluid/imperative/basic_engine.cc:55)

(3)百度同学给出的建议:

后续的测试报错应该不是真正的报错,只是测试不是一个干净的 paddle 环境导致的。建议先排查一下模型,可以根据上述第一个报错,试着逐渐增加模型的复杂度试试。

我这边做了如下修改之后可以正常训练,但是不一定是您需要的。

loss.backward(retain_graph=True)这样可正常训练。

(4)排查后发现前面提到的问题

self.kernel = (self.kernel*self.it_weights).reshape([64,64,-1,1]),改为k = (self.kernel*self.it_weights).reshape([64,64,-1,1])

就可以正常训练。

 

为百度同学的效率点个赞

 

 

Jordan2020
已解决
3# 回复于2021-12
项目已经开源了,跑起来没问题: 去除摩尔纹,治愈强迫症, 来卷网盘赛 https://aistudio.baidu.com/aistudio/projectdetail/3204731 欢迎来卷,哈哈哈哈哈
展开
2
收藏
回复
全部评论(9)
时间顺序
帝王爷
#2 回复于2021-12

兄弟,开源出来做基线呗?

0
回复
Jordan2020
#3 回复于2021-12

项目已经开源了,跑起来没问题:

去除摩尔纹,治愈强迫症, 来卷网盘赛

https://aistudio.baidu.com/aistudio/projectdetail/3204731

欢迎来卷,哈哈哈哈哈

0
回复
熔岩巨兽
#4 回复于2022-01

感谢大佬的baseline,我发现baseline里有两处问题:

1,dataset部分:以下操作对input_data和label的作用会有差别,会导致input_data或label中的一个翻转,而不是实际需要的同时翻转或同时不翻转

transforms.RandomHorizontalFlip()

2,mbcnn部分:以下代码块中,_t1_global_block的名字重复使用了,按照论文中,应分别命名为_t1_global_block1和_t1_global_block2

self._t1_conv_rl=conv_rl(self.nFilters*2+3,self.nFilters*2, 1)
self._t1_global_block = global_block(self.nFilters)
self._t1_pre_block = pre_block( d_list_a, self.nFilters,True)
self._t1_global_block = global_block(self.nFilters)
self._t1_pos_block = pos_block( d_list_a,self.nFilters)
self._t1_conv = conv(self.nFilters*2,12,3)
self.dts3=depth_to_space(scale_factor=2)

0
回复
Jordan2020
#5 回复于2022-01
感谢大佬的baseline,我发现baseline里有两处问题: 1,dataset部分:以下操作对input_data和label的作用会有差别,会导致input_data或label中的一个翻转,而不是实际需要的同时翻转或同时不翻转 transforms.RandomHorizontalFlip() 2,mbcnn部分:以下代码块中,_t1_global_block的名字重复使用了,按照论文中,应分别命名为_t1_global_block1和_t1_global_block2 self._t1_conv_rl=conv_rl(self.nFilters*2+3,self.nFilters*2, 1) self._t1_global_block = global_block(self.nFilters) self._t1_pre_block = pre_block( d_list_a, self.nFilters,True) self._t1_global_block = global_block(self.nFilters) self._t1_pos_block = pos_block( d_list_a,self.nFilters) self._t1_conv = conv(self.nFilters*2,12,3) self.dts3=depth_to_space(scale_factor=2)
展开

感谢发现的问题,我核对一下

0
回复
Jordan2020
#6 回复于2022-01
感谢大佬的baseline,我发现baseline里有两处问题: 1,dataset部分:以下操作对input_data和label的作用会有差别,会导致input_data或label中的一个翻转,而不是实际需要的同时翻转或同时不翻转 transforms.RandomHorizontalFlip() 2,mbcnn部分:以下代码块中,_t1_global_block的名字重复使用了,按照论文中,应分别命名为_t1_global_block1和_t1_global_block2 self._t1_conv_rl=conv_rl(self.nFilters*2+3,self.nFilters*2, 1) self._t1_global_block = global_block(self.nFilters) self._t1_pre_block = pre_block( d_list_a, self.nFilters,True) self._t1_global_block = global_block(self.nFilters) self._t1_pos_block = pos_block( d_list_a,self.nFilters) self._t1_conv = conv(self.nFilters*2,12,3) self.dts3=depth_to_space(scale_factor=2)
展开

确实存在问题,已修复,待测试后,会发一个新版本

0
回复
Jordan2020
#7 回复于2022-01

已发布一个新版1.2,调了一下,榜评0.55623。

继续提点方法:

1.加大训练轮次;

2.大尺度训练,多尺度预测

0
回复
Jordan2020
#8 回复于2022-01
感谢大佬的baseline,我发现baseline里有两处问题: 1,dataset部分:以下操作对input_data和label的作用会有差别,会导致input_data或label中的一个翻转,而不是实际需要的同时翻转或同时不翻转 transforms.RandomHorizontalFlip() 2,mbcnn部分:以下代码块中,_t1_global_block的名字重复使用了,按照论文中,应分别命名为_t1_global_block1和_t1_global_block2 self._t1_conv_rl=conv_rl(self.nFilters*2+3,self.nFilters*2, 1) self._t1_global_block = global_block(self.nFilters) self._t1_pre_block = pre_block( d_list_a, self.nFilters,True) self._t1_global_block = global_block(self.nFilters) self._t1_pos_block = pos_block( d_list_a,self.nFilters) self._t1_conv = conv(self.nFilters*2,12,3) self.dts3=depth_to_space(scale_factor=2)
展开

已发布一个新版1.2,调了一下,榜评0.55623

继续提点方法:

1.加大训练轮次;

2.大尺度训练,多尺度预测
 

来卷吧

1
回复
熔岩巨兽
#9 回复于2022-01
已发布一个新版1.2,调了一下,榜评0.55623 继续提点方法: 1.加大训练轮次; 2.大尺度训练,多尺度预测   来卷吧

大佬,有个问题想请教,请问你知道怎样把别的框架的项目转成paddle的吗

0
回复
熔岩巨兽
#10 回复于2022-01
大佬,有个问题想请教,请问你知道怎样把别的框架的项目转成paddle的吗

我实了X2Paddle,报了很多unsupport,真的难受啊

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户