class_docstr: Perform SmoothGrad algorithm for a given input
  
  Paper: [SmoothGrad: removing noise by adding noise](https://arxiv.org/abs/1706.03825)
docstr: Draw SmoothGrad outputs at each epoch end to Tensorboard.
  
  Args:
      epoch (int): Epoch index
      logs (dict): Additional information on epoch
code: def on_epoch_end(self, epoch, logs=None):
      """
      Draw SmoothGrad outputs at each epoch end to Tensorboard.
  
      Args:
          epoch (int): Epoch index
          logs (dict): Additional information on epoch
      """
      explainer = SmoothGrad()
      grid = explainer.explain(
          self.validation_data,
          self.model,
          self.class_index,
          self.num_samples,
          self.noise,
      )
  
      # Using the file writer, log the reshaped image.
      with self.file_writer.as_default():
          tf.summary.image(
              "SmoothGrad", np.expand_dims([grid], axis=-1), step=epoch
          )
  
file_path: tf-explain/tf_explain/callbacks/smoothgrad.py
imports: from datetime import datetime
  from pathlib import Path
  import numpy
  import tensorflow
  from tensorflow.keras.callbacks import Callback
  from tf_explain.core.smoothgrad import SmoothGrad
label_desc: Use image node_id 2 for calling the SmoothGradCallback obj's underlying member method code with example usage: obj.on_epoch_end(epoch, logs) without return types