class_docstr: Tacotron 2 Model that is used to generate mel spectrograms from text
code: def on_validation_epoch_end(self):
      if self.logger is not None and self.logger.experiment is not None:
          logger = self.logger.experiment
          for logger in self.trainer.loggers:
              if isinstance(logger, TensorBoardLogger):
                  logger = logger.experiment
                  break
          if isinstance(logger, TensorBoardLogger):
              tacotron2_log_to_tb_func(
                  logger,
                  self.validation_step_outputs[0].values(),
                  self.global_step,
                  tag="val",
                  log_images=True,
                  add_audio=False,
              )
          elif isinstance(logger, WandbLogger):
              tacotron2_log_to_wandb_func(
                  logger,
                  self.validation_step_outputs[0].values(),
                  self.global_step,
                  tag="val",
                  log_images=True,
                  add_audio=False,
              )
      avg_loss = torch.stack(
          [x["val_loss"] for x in self.validation_step_outputs]
      ).mean()  # This reduces across batches, not workers!
      self.log("val_loss", avg_loss)
      self.validation_step_outputs.clear()
  
imports: import contextlib
  from dataclasses import dataclass, field
  from typing import Any, Dict, List, Optional
  import torch
  from hydra.utils import instantiate
  from omegaconf import MISSING, DictConfig, OmegaConf, open_dict
  from omegaconf.errors import ConfigAttributeError
  from pytorch_lightning.loggers import TensorBoardLogger, WandbLogger
  from torch import nn
  from nemo.collections.common.parts.preprocessing import parsers
  from nemo.collections.tts.losses.tacotron2loss import Tacotron2Loss
  from nemo.collections.tts.models.base import SpectrogramGenerator
  from nemo.collections.tts.parts.utils.helpers import g2p_backward_compatible_support, get_mask_from_lengths, tacotron2_log_to_tb_func, tacotron2_log_to_wandb_func
  from nemo.core.classes.common import PretrainedModelInfo, typecheck
  from nemo.core.neural_types.elements import AudioSignal, EmbeddedTextType, LengthsType, LogitsType, MelSpectrogramType, SequenceToSequenceAlignmentType
  from nemo.core.neural_types.neural_type import NeuralType
  from nemo.utils import logging, model_utils
label_desc: Use image node_id 10 for calling the Tacotron2Model obj's underlying member method code with example usage: obj.on_validation_epoch_end() without return types