77 def losses(self, outs):
78 r"""
79 Compute loss from modeling's outputs, the loss function input arguments
80 must be the same as the outputs of the model forwarding.
81 """
82
83 outputs = outs["outputs"]
84 gt_labels = outs["targets"]
85
86 pred_class_logits = outputs['pred_class_logits'].detach()
87 cls_outputs = outputs['cls_outputs']
88 pred_features = outputs['features']
89
90
91
92 log_accuracy(pred_class_logits, gt_labels)
93
94 loss_dict = {}
95 loss_names = self._cfg.MODEL.LOSSES.NAME
96
97 if "CrossEntropyLoss" in loss_names:
98 loss_dict['loss_cls'] = cross_entropy_loss(
99 cls_outputs,
100 gt_labels,
101 self._cfg.MODEL.LOSSES.CE.EPSILON,
102 self._cfg.MODEL.LOSSES.CE.ALPHA,
103 ) * self._cfg.MODEL.LOSSES.CE.SCALE
104
105 if "TripletLoss" in loss_names:
106 loss_dict['loss_triplet'] = triplet_loss(
107 pred_features,
108 gt_labels,
109 self._cfg.MODEL.LOSSES.TRI.MARGIN,
110 self._cfg.MODEL.LOSSES.TRI.NORM_FEAT,
111 self._cfg.MODEL.LOSSES.TRI.HARD_MINING,
112 ) * self._cfg.MODEL.LOSSES.TRI.SCALE
113
114 if "CircleLoss" in loss_names:
115 loss_dict['loss_circle'] = circle_loss(
116 pred_features,
117 gt_labels,
118 self._cfg.MODEL.LOSSES.CIRCLE.MARGIN,
119 self._cfg.MODEL.LOSSES.CIRCLE.ALPHA,
120 ) * self._cfg.MODEL.LOSSES.CIRCLE.SCALE
121
122 return loss_dict