Commit 5dc8300b authored by Bharath Ramsundar's avatar Bharath Ramsundar Committed by GitHub
Browse files

Merge pull request #719 from galenxing/tg_summary

Add tg.summaries to tensorboard layers
parents 638f32c2 66c65068
Loading
Loading
Loading
Loading
+43 −4
Original line number Diff line number Diff line
@@ -16,10 +16,6 @@ class Layer(object):
      self.name = kwargs['name']
    else:
      self.name = None
    if "tensorboard" not in kwargs:
      self.tensorboard = False
    else:
      self.tensorboard = kwargs['tensorboard']
    if in_layers is None:
      in_layers = list()
    if not isinstance(in_layers, Sequence):
@@ -30,6 +26,8 @@ class Layer(object):
    self.rnn_initial_states = []
    self.rnn_final_states = []
    self.rnn_zero_states = []
    self.tensorboard = False
    self.tb_input = None

  def _get_layer_number(self):
    class_name = self.__class__.__name__
@@ -114,6 +112,47 @@ class Layer(object):
    else:
      self.variable_scope = local_scope

  def set_summary(self, summary_op, summary_description=None, collections=None):
    """Annotates a tensor with a tf.summary operation
    Collects data from self.out_tensor by default but can be changed by setting 
    self.tb_input to another tensor in create_tensor


    Parameters
    ----------
    summary_op: str
      summary operation to annotate node
    summary_description: object, optional
      Optional summary_pb2.SummaryDescription()
    collections: list of graph collections keys, optional
      New summary op is added to these collections. Defaults to [GraphKeys.SUMMARIES]
    """
    supported_ops = {'tensor_summary', 'scalar', 'histogram'}
    if summary_op not in supported_ops:
      raise ValueError(
          "Invalid summary_op arg. Only 'tensor_summary', 'scalar', 'histogram' supported"
      )
    self.summary_op = summary_op
    self.summary_description = summary_description
    self.collections = collections
    self.tensorboard = True

  def add_summary_to_tg(self):
    """
    Can only be called after self.create_layer to gaurentee that name is not none
    """
    if self.tensorboard == False:
      return
    if self.tb_input == None:
      self.tb_input = self.out_tensor
    if self.summary_op == "tensor_summary":
      tf.summary.tensor_summary(self.name, self.tb_input,
                                self.summary_description, self.collections)
    elif self.summary_op == 'scalar':
      tf.summary.scalar(self.name, self.tb_input, self.collections)
    elif self.summary_op == 'histogram':
      tf.summary.histogram(self.name, self.tb_input, self.collections)


class TensorWrapper(Layer):
  """Used to wrap a tensorflow tensor."""
+2 −0
Original line number Diff line number Diff line
@@ -375,6 +375,8 @@ class TensorGraph(Model):
          self.rnn_initial_states += node_layer.rnn_initial_states
          self.rnn_final_states += node_layer.rnn_final_states
          self.rnn_zero_states += node_layer.rnn_zero_states
          node_layer.add_summary_to_tg()

      self.built = True

    for layer in self.layers.values():