code: def forward(
      self,
      student_scores: List[List[torch.Tensor]],
      target: torch.Tensor,
  ):
      # Extract local and global views
      error_message = (
          "Two outputs expected: student global and local views"
      )
      assert len(student_scores) == 2, error_message
      student_global_out, student_local_out = student_scores
      teacher_global_out = self.teacher_scores
  
      # Extract class token and positional tokens
      error_message = (
          "Two outputs expected: class tokens and patch tokens"
      )
      assert len(student_global_out) == 2, error_message
      assert len(teacher_global_out) == 2, error_message
      assert len(student_local_out) == 1
  
      # Change the shape of the student mask to fit the need for
      # the iBOT official criterion: list of tensors of shape (B, H, W)
      student_mask = target
      student_mask_list = list(
          student_mask.chunk(self.num_global_crops)
      )
  
      # Compute the loss and its sub-components (returns a dict)
      loss = self.criterion(
          student_global_out,
          teacher_global_out,
          student_local_cls=student_local_out[0],
          student_mask=student_mask_list,
      )
      return loss["loss"]
  
file_path: vissl/vissl/losses/ibot_distillation_loss.py
imports: import pprint
  from typing import List, Optional
  import torch
  import torch.nn.functional
  from classy_vision.losses import ClassyLoss, register_loss
  from vissl.config import AttrDict
label_desc: Use image node_id 4 for calling the IBOTDistillationLoss obj's underlying member method code with example usage: obj.forward(student_scores, target) and returns: loss