mmdetection2.6 自定义losses
首先介绍mdmetection的loss的计算pipeline,然后逐步介绍如何自定义loss function。主要的修改包括调整与加权两种。
一、 loss的计算pipeline
给定输入的预测结果与真实值目标,还有loss函数的权重,loss函数将输入tensor映射为最终的loss张量,步骤如下:
- 按照loss函数的计算得到element-wise或者sample-wise的损失
- 利用一个权重tensor按照element-wise的方式加权损失函数
- 将loss的tensor降维为一个标量
- 加权这个标量损失
二、 调整损失
这种方式主要与上述的1,3,4步骤相关。大多数修改都在config文件中进行,以focal loss为例。
# focal loss 的代码定义
@LOSSES.register_module()
class FocalLoss(nn.Module):
def __init__(self,
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
reduction='mean',
loss_weight=1.0):
# config文件中focal loss函数的使用
loss_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=1.0)
2.1 调整超参数
在focal loss 中gamma与beta是一种超参数。可以在config文件中直接修改
loss_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=1.5,
alpha=0.5,
loss_weight=1.0)
2.2 调整reduction的方式
可选的有sum
与mean
,可以直接在config文件中修改
loss_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=1.0,
reduction='sum')
2.3 调整loss的权重
这个权重是一个标量,多任务中控制不同人物的loss函数的权重表示。
loss_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=0.5)
三、 加权loss
加权loss意味着按照element-wise的方式重新加权loss值,具体操作就是直接采用与loss唯独相同的权重tensor与loss tensor相乘。这样不同的位置的loss就会被不同程度的放缩。损失权重在不同模型之间有所不同,并且与上下文高度相关,但是总的来说,存在两种损失权重:label_weights
分类损失和bbox_weights
bbox回归损失。您可以get_target
在相应头的方法中找到它们。在这里我们以ATSSHead为例,它继承了AnchorHead,但是覆盖了它的get_targets
方法,产生了label_weights
和bbox_weights
。
class ATSSHead(AnchorHead):
...
def get_targets(self,
anchor_list,
valid_flag_list,
gt_bboxes_list,
img_metas,
gt_bboxes_ignore_list=None,
gt_labels_list=None,
label_channels=1,
unmap_outputs=True):
专栏所有文章请点击下列文章列表查看:
知乎专栏:小哲AI专栏文章分类索引跳转查看
AI研习社专栏:小哲AI专栏文章分类索引