code: def training_step(self, batch, batch_idx):
      views = batch[0]
      high_resolution, low_resolution = views[:2], views[2:]
      self.prototypes.normalize()
  
      high_resolution_features = [
          self._subforward(x) for x in high_resolution
      ]
      low_resolution_features = [
          self._subforward(x) for x in low_resolution
      ]
  
      high_resolution_prototypes = [
          self.prototypes(x, self.current_epoch)
          for x in high_resolution_features
      ]
      low_resolution_prototypes = [
          self.prototypes(x, self.current_epoch)
          for x in low_resolution_features
      ]
      queue_prototypes = self._get_queue_prototypes(
          high_resolution_features
      )
      loss = self.criterion(
          high_resolution_prototypes,
          low_resolution_prototypes,
          queue_prototypes,
      )
      return loss
  
file_path: lightly/examples/pytorch_lightning/swav_queue.py
imports: import pytorch_lightning
  import torch
  import torchvision
  from torch import nn
  from lightly.loss import SwaVLoss
  from lightly.models.modules import SwaVProjectionHead, SwaVPrototypes
  from lightly.models.modules.memory_bank import MemoryBankModule
  from lightly.transforms.swav_transform import SwaVTransform
label_desc: Use image node_id 2 for calling the SwaV obj's underlying member method code with example usage: obj.training_step(batch, batch_idx) and returns: loss