docstr: Gets called at the end of a epoch.
docstr_tok: ["Gets","called","at","the","end","of","a","epoch","."]
code: def on_stage_end(self, stage, stage_loss, epoch):
      """Gets called at the end of a epoch."""
      if hasattr(self.hparams, "switch_training_type"):
          if not hasattr(self.hparams, "switch_training_epoch"):
              raise ValueError(
                  "Please specify `switch_training_epoch` in `params`"
              )
          if (
              self.hparams.epoch_counter.current
              == self.hparams.switch_training_epoch
          ) and stage == sb.Stage.VALID:
              self.training_type = self.hparams.switch_training_type
              print("Switching to training type", self.training_type)
  
      if stage == sb.Stage.TRAIN:
          self.train_loss = stage_loss
      else:
          acc = self.accuracy_metrics.summarize("average")
  
      if stage == sb.Stage.VALID:
          old_lr, new_lr = self.hparams.lr_annealing(acc)
          sb.nnet.schedulers.update_learning_rate(
              self.optimizer, new_lr
          )
  
          self.hparams.train_logger.log_stats(
              stats_meta={"epoch": epoch, "lr": old_lr},
              train_stats={"loss": self.train_loss},
              valid_stats={"loss": stage_loss, "accuracy": acc},
          )
          self.checkpointer.save_and_keep_only(
              meta={"accuracy": acc},
              max_keys=["accuracy"],
          )
  
      elif stage == sb.Stage.TEST:
          self.hparams.train_logger.log_stats(
              stats_meta={
                  "Epoch loaded": self.hparams.epoch_counter.current
              },
              test_stats={"loss": stage_loss, "accuracy": acc},
          )
  
file_path: speechbrain/recipes/TIMIT/Alignment/train.py
imports: import os
  import sys
  import torch
  import speechbrain
  from hyperpyyaml import load_hyperpyyaml
  from speechbrain.utils.distributed import run_on_main
label_desc: Use image node_id 4 for calling the AlignBrain obj's underlying member method code with example usage: obj.on_stage_end(stage, stage_loss, epoch) without return types