code: def compute_loss(
      self, embeddings, labels, indices_tuple, ref_emb, ref_labels
  ):
      c_f.labels_required(labels)
      c_f.ref_not_supported(embeddings, labels, ref_emb, ref_labels)
      dtype, device = embeddings.dtype, embeddings.device
      self.cast_types(dtype, device)
      miner_weights = lmu.convert_to_weights(
          indices_tuple, labels, dtype=dtype
      )
      logits = self.get_logits(embeddings)
      unweighted_loss = self.cross_entropy(logits, labels)
      miner_weighted_loss = unweighted_loss * miner_weights
      loss_dict = {
          "loss": {
              "losses": miner_weighted_loss,
              "indices": c_f.torch_arange_from_size(embeddings),
              "reduction_type": "element",
          }
      }
      self.add_weight_regularization_to_loss_dict(loss_dict, self.W.t())
      return loss_dict
  
file_path: pytorch-metric-learning/src/pytorch_metric_learning/losses/normalized_softmax_loss.py
imports: import torch
  from ..distances import DotProductSimilarity
  from ..utils import common_functions
  from ..utils import loss_and_miner_utils
  from .base_metric_loss_function import BaseMetricLossFunction
  from .mixins import WeightRegularizerMixin
label_desc: Use image node_id 3 for calling the NormalizedSoftmaxLoss obj's underlying member method code with example usage: obj.compute_loss(embeddings, labels, indices_tuple, ref_emb, ref_labels) and returns: loss_dict