code: # Code referenced from https://gist.github.com/gyglim/1f8dfb1b5c82627ae3efcfbbadb9f514
  import tensorflow as tf
  import numpy as np
  import scipy.misc
  import logging
  
  try:
      from StringIO import StringIO  # Python 2.7
  except ImportError:
      from io import BytesIO  # Python 3.5+
  
  
  class Logger(object):
  
      def __init__(self, config):
          """Create a summary writer logging to log_dir."""
          self.config = config
          self.writer = tf.summary.FileWriter(config.summary_dir)
  
      def scalar_summary(self, tag, value, step):
          """Log a scalar variable."""
          summary = tf.Summary(value=[tf.Summary.Value(tag=tag, simple_value=value)])
          self.writer.add_summary(summary, step)
  
      def image_summary(self, tag, images, step):
          """Log a list of images."""
  
          img_summaries = []
          for i, img in enumerate(images):
              # Write the image to a string
              try:
                  s = StringIO()
              except:
                  s = BytesIO()
              scipy.misc.toimage(img).save(s, format="png")
  
              # Create an Image object
              img_sum = tf.Summary.Image(encoded_image_string=s.getvalue(),
                                         height=img.shape[0],
                                         width=img.shape[1])
              # Create a Summary value
              img_summaries.append(tf.Summary.Value(tag='%s/%d' % (tag, i), image=img_sum))
  
          # Create and write Summary
          summary = tf.Summary(value=img_summaries)
          self.writer.add_summary(summary, step)
  
      def histo_summary(self, tag, values, step, bins=1000):
          """Log a histogram of the tensor of values."""
  
          # Create a histogram using numpy
          counts, bin_edges = np.histogram(values, bins=bins)
  
          # Fill the fields of the histogram proto
          hist = tf.HistogramProto()
          hist.min = float(np.min(values))
          hist.max = float(np.max(values))
          hist.num = int(np.prod(values.shape))
          hist.sum = float(np.sum(values))
          hist.sum_squares = float(np.sum(values ** 2))
  
          # Drop the start of the first bin
          bin_edges = bin_edges[1:]
  
          # Add bin edges and counts
          for edge in bin_edges:
              hist.bucket_limit.append(edge)
          for c in counts:
              hist.bucket.append(c)
  
          # Create and write Summary
          summary = tf.Summary(value=[tf.Summary.Value(tag=tag, histo=hist)])
          self.writer.add_summary(summary, step)
          self.writer.flush()
  
      def set_logger(self, log_path):
          """Sets the logger to log info in terminal and file `log_path`.
          In general, it is useful to have a logger so that every output to the terminal is saved
          in a permanent file. Here we save it to `model_dir/train.log`.
          Example:
          ```
          logging.info("Starting training...")
          ```
          Args:
              log_path: (string) where to log
          """
          logger = logging.getLogger()
          logger.setLevel(logging.INFO)
  
          if not logger.handlers:
              # Logging to a file
              file_handler = logging.FileHandler(log_path)
              file_handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s: %(message)s'))
              logger.addHandler(file_handler)
  
              # Logging to console
              stream_handler = logging.StreamHandler()
              stream_handler.setFormatter(logging.Formatter('%(message)s'))
              logger.addHandler(stream_handler)
  
apis: numpy.sum tensorflow.Summary.Value numpy.histogram numpy.max tensorflow.HistogramProto numpy.min numpy.prod tensorflow.summary.FileWriter tensorflow.Summary