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專欄文章分類索引