mmdetection2.6 自定義losses

首先介紹mdmetection的loss的計算pipeline,然後逐步介紹如何自定義loss function。主要的修改包括調整與加權兩種。

一、 loss的計算pipeline

給定輸入的預測結果與真實值目標,還有loss函數的權重,loss函數將輸入tensor映射為最終的loss張量,步驟如下:

  1. 按照loss函數的計算得到element-wise或者sample-wise的損失
  2. 利用一個權重tensor按照element-wise的方式加權損失函數
  3. 將loss的tensor降維為一個標量
  4. 加權這個標量損失

二、 調整損失

這種方式主要與上述的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的方式

可選的有summean,可以直接在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_weightsbbox回歸損失。您可以get_target在相應頭的方法中找到它們。在這裡我們以ATSSHead為例,它繼承了AnchorHead,但是覆蓋了它的get_targets方法,產生了label_weightsbbox_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專欄文章分類索引