问题背景
在分割模型中引入了自定义loss(例如kl_loss),训练过程中新loss几乎不会下降,未被正常优化。
原因分析
在官方文档的角落里有这么一句话:
If you want this loss item to be included into the backward graph, loss_ must be the prefix of the name.
也就是损失函数的命名必须以loss_
开头。例如,kl散度损失记为loss_kl
是可以正常优化的,而kl_loss
则不会被优化。
解决方案
这个loss命名的问题一般存在config或者loss的具体实现代码中。对于config处:
# wrong
# dict(type='KLLoss', loss_name='kl_loss', loss_weight=1.0)
# correct
dict(type='KLLoss', loss_name='loss_kl', loss_weight=1.0)
对于具体实现处:
# wrong
# losses['kl_loss'] = self.get_kl_loss(pred, gt)
# correct
losses['loss_kl'] = self.get_kl_loss(pred, gt)
return losses