efficientdet-pytorch
efficientdet-pytorch copied to clipboard
bifpn中加权聚合时(简单的注意力机制),权重参数不更新问题
作者您好,我尝试将您这个代码中bifpn中的加权聚合方法移植到别的目标检测框架中看看能不能有作用,我修改后代码成功跑起来了,但在查看训练好的模型字典时,发现权重w初始化值是【1,1】训练好的模型,w仍然是【1,1】,希望大神能帮我看下我的代码是不是哪出现了问题,从而导致该参数完全不更新。

麻烦分享一下查看的方法,看看是否是查看方法错误
好的那我详细说一下,我训练了100多个epoch之后然后将保存好的模型使用torch.load()函数导出,来查看代码图里的所示的w1,w2,w3,w4是否有变化,具体代码如下图
打印结果如下图

是否是freeze了?
我提供的有freeze主干
是的是按照你提供的代码进行训练的,冻结的只是前五十epoch的backbone,而上述所说的是neck中的结构
按理来说这w1w2w3w4是不会被冻结的。结算被冻结了50个epoch之后也会解冻的
这是在冻结代码后设置断点debug后的结果,model中的w1w2w3w4的requires_grad都是=True
我将断点又设置到了loss.backward()后面,然后查看每迭代一次w1的变化,如下图所示发现w1的requires_gard=True,梯度gard也是一直有的,并且每次迭代后gard的值是在变化的,但是问题还是一样,w1的值没有更新一直都是【1,1】
下面是进一步迭代后的结果,可以看到gard在变化,但w1未更新

最后发现应该是权重参数w不在optimizer.param_groups中,您有些代码中optimizer的初始化是optim.Adam(model.parameters()....),包含了model中所有的参数。但在目前我使用的这个代码中是进行筛选了的如下图
我知道的是这样筛选应该是剔除了我设定的权重参数w,但我没搞清楚您这样设置的目的是什么呢,为什么不直接用model.parameters()?
噢噢……确实是这个问题,你很厉害,这样设定是为了给不同的目标设置不同的衰减系数
像BN什么的不衰减