class_docstr: From DETR source: https://github.com/facebookresearch/detr
  (detr/models/detr.py)
class_docstr_tok: ["From","DETR","source",":","https",":","\/\/github.com\/facebookresearch\/detr","(","detr\/models\/detr.py",")"]
docstr: This performs the loss computation.
  Parameters:
      outputs: dict of tensors, see the output specification of the model for the format
      targets: list of dicts, such that len(targets) == batch_size.
              The expected keys in each dict depends on the losses applied, see each loss' doc
docstr_tok: ["This","performs","the","loss","computation",".","Parameters",":","outputs",":","dict","of","tensors",",","see","the","output","specification","of","the","model","for","the","format","targets",":","list","of","dicts",",","such","that","len","(","targets",")","==","batch_size",".","The","expected","keys","in","each","dict","depends","on","the","losses","applied",",","see","each","loss","'","doc"]
code: def forward(self, outputs, targets):
      """This performs the loss computation.
      Parameters:
          outputs: dict of tensors, see the output specification of the model for the format
          targets: list of dicts, such that len(targets) == batch_size.
                  The expected keys in each dict depends on the losses applied, see each loss' doc
      """
  
      outputs_without_aux = {
          k: v for k, v in outputs.items() if k != "aux_outputs"
      }
  
      # Retrieve the matching between the outputs of the last layer and the targets
      with torch.no_grad():
          indices = self.matcher(outputs_without_aux, targets)
  
      # Compute the average number of target boxes accross all nodes, for normalization purposes
      num_boxes = sum(len(t["labels"]) for t in targets)
      num_boxes = torch.as_tensor(
          [num_boxes],
          dtype=torch.float,
          device=next(iter(outputs.values())).device,
      )
      num_boxes = torch.clamp(num_boxes, min=1).item()
  
      # Compute all the requested losses
      losses = {}
      for loss in self.losses:
          losses.update(
              self.get_loss(loss, outputs, targets, indices, num_boxes)
          )
  
      # In case of auxiliary losses, we repeat this process with the output of each intermediate layer.
      if "aux_outputs" in outputs:
          for i, aux_outputs in enumerate(outputs["aux_outputs"]):
              with torch.no_grad():
                  indices = self.matcher(aux_outputs, targets)
              for loss in self.losses:
                  l_dict = self.get_loss(
                      loss, aux_outputs, targets, indices, num_boxes
                  )
                  l_dict = {k + f"_{i}": v for k, v in l_dict.items()}
                  losses.update(l_dict)
  
      return losses
  
imports: from typing import List, Optional, Tuple, Union
  import torch
label_desc: Use image node_id 11 for calling the SetCriterion obj's underlying member method code with example usage: obj.forward(outputs, targets) and returns: losses