class_docstr: This class calculates Viterbi alignments in the forward method.
  
  It also records alignments and creates batches of them for use
  in Viterbi training.
  
  Arguments
  ---------
  states_per_phoneme : int
      Number of hidden states to use per phoneme.
  output_folder : str
      It is the folder that the alignments will be stored in when
      saved to disk. Not yet implemented.
  neg_inf : float
      The float used to represent a negative infinite log probability.
      Using `-float("Inf")` tends to give numerical instability.
      A number more negative than -1e5 also sometimes gave errors when
      the `genbmm` library was used (currently not in use). (default: -1e5)
  batch_reduction : string
      One of "none", "sum" or "mean".
      What kind of batch-level reduction to apply to the loss calculated
      in the forward method.
  input_len_norm : bool
      Whether to normalize the loss in the forward method by the length of
      the inputs.
  target_len_norm : bool
      Whether to normalize the loss in the forward method by the length of
      the targets.
  lexicon_path : string
      The location of the lexicon.
  
  Example
  -------
  >>> log_posteriors = torch.tensor([[[ -1., -10., -10.],
  ...                                 [-10.,  -1., -10.],
  ...                                 [-10., -10.,  -1.]],
  ...
  ...                                [[ -1., -10., -10.],
  ...                                 [-10.,  -1., -10.],
  ...                                 [-10., -10., -10.]]])
  >>> lens = torch.tensor([1., 0.66])
  >>> phns = torch.tensor([[0, 1, 2],
  ...                      [0, 1, 0]])
  >>> phn_lens = torch.tensor([1., 0.66])
  >>> aligner = HMMAligner()
  >>> forward_scores = aligner(
  ...        log_posteriors, lens, phns, phn_lens, 'forward'
  ... )
  >>> forward_scores.shape
  torch.Size([2])
  >>> viterbi_scores, alignments = aligner(
  ...        log_posteriors, lens, phns, phn_lens, 'viterbi'
  ... )
  >>> alignments
  [[0, 1, 2], [0, 1]]
  >>> viterbi_scores.shape
  torch.Size([2])
docstr: Applies reduction to loss as specified during object initialization.
  
  Arguments
  ---------
  loss : torch.Tensor (batch)
      The loss tensor to be reduced.
  input_lens : torch.Tensor (batch)
      The absolute durations of the inputs.
  target_lens : torch.Tensor (batch)
      The absolute durations of the targets.
  
  Returns
  -------
  loss : torch.Tensor (batch, or scalar)
      The loss with reduction applied if it is specified.
docstr_tok: ["Applies","reduction","to","loss","as","specified","during","object","initialization",".","Arguments","--","--","--","--","-","loss",":","torch.Tensor","(","batch",")","The","loss","tensor","to","be","reduced",".","input_lens",":","torch.Tensor","(","batch",")","The","absolute","durations","of","the","inputs",".","target_lens",":","torch.Tensor","(","batch",")","The","absolute","durations","of","the","targets",".","Returns","--","--","--","-","loss",":","torch.Tensor","(","batch",",","or","scalar",")","The","loss","with","reduction","applied","if","it","is","specified","."]
code: def _loss_reduction(self, loss, input_lens, target_lens):
      """Applies reduction to loss as specified during object initialization.
  
      Arguments
      ---------
      loss : torch.Tensor (batch)
          The loss tensor to be reduced.
      input_lens : torch.Tensor (batch)
          The absolute durations of the inputs.
      target_lens : torch.Tensor (batch)
          The absolute durations of the targets.
  
      Returns
      -------
      loss : torch.Tensor (batch, or scalar)
          The loss with reduction applied if it is specified.
  
      """
      if self.input_len_norm is True:
          loss = torch.div(loss, input_lens)
  
      if self.target_len_norm is True:
          loss = torch.div(loss, target_lens)
  
      if self.batch_reduction == "none":
          pass
      elif self.batch_reduction == "sum":
          loss = loss.sum()
      elif self.batch_reduction == "mean":
          loss = loss.mean()
      else:
          raise ValueError(
              "`batch_reduction` parameter must be one of 'none', 'sum' or 'mean'"
          )
  
      return loss
  
imports: import torch
  import random
  from speechbrain.utils.checkpoints import register_checkpoint_hooks
  from speechbrain.utils.checkpoints import mark_as_saver
  from speechbrain.utils.checkpoints import mark_as_loader
  from speechbrain.utils.data_utils import undo_padding
label_desc: Use image node_id 9 for calling the HMMAligner obj's underlying member method code with example usage: obj._loss_reduction(loss, input_lens, target_lens) and returns: loss