bubbliiiing / efficientdet-pytorch

这是一个efficientdet-pytorch的源码,可以用于训练自己的模型。
MIT License
305 stars 61 forks source link

bifpn中加权聚合时(简单的注意力机制),权重参数不更新问题 #37

Open YHaooo-4508 opened 2 years ago

YHaooo-4508 commented 2 years ago

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

bubbliiiing commented 2 years ago

麻烦分享一下查看的方法,看看是否是查看方法错误

YHaooo-4508 commented 2 years ago

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

bubbliiiing commented 2 years ago

是否是freeze了?

bubbliiiing commented 2 years ago

我提供的有freeze主干

YHaooo-4508 commented 2 years ago

是的是按照你提供的代码进行训练的,冻结的只是前五十epoch的backbone,而上述所说的是neck中的结构 image 按理来说这w1w2w3w4是不会被冻结的。结算被冻结了50个epoch之后也会解冻的

YHaooo-4508 commented 2 years ago

image 这是在冻结代码后设置断点debug后的结果,model中的w1w2w3w4的requires_grad都是=True

YHaooo-4508 commented 2 years ago

我将断点又设置到了loss.backward()后面,然后查看每迭代一次w1的变化,如下图所示发现w1的requires_gard=True,梯度gard也是一直有的,并且每次迭代后gard的值是在变化的,但是问题还是一样,w1的值没有更新一直都是【1,1】 image 下面是进一步迭代后的结果,可以看到gard在变化,但w1未更新 image

YHaooo-4508 commented 2 years ago

最后发现应该是权重参数w不在optimizer.param_groups中,您有些代码中optimizer的初始化是optim.Adam(model.parameters()....),包含了model中所有的参数。但在目前我使用的这个代码中是进行筛选了的如下图 image 我知道的是这样筛选应该是剔除了我设定的权重参数w,但我没搞清楚您这样设置的目的是什么呢,为什么不直接用model.parameters()?

bubbliiiing commented 2 years ago

噢噢……确实是这个问题,你很厉害,这样设定是为了给不同的目标设置不同的衰减系数

bubbliiiing commented 2 years ago

像BN什么的不衰减