Unverified Commit c03dfa29 authored by Bharath Ramsundar's avatar Bharath Ramsundar Committed by GitHub
Browse files

Merge pull request #1295 from peastman/tensorboard

Fixed Estimators that log to Tensorboard
parents 93422613 f781e633
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -230,7 +230,7 @@ class Layer(object):
    self.collections = collections
    self.tensorboard = True

  def add_summary_to_tg(self, layer_vars):
  def add_summary_to_tg(self, layer_output, layer_vars):
    """
    Create the summary operation for this layer, if set_summary() has been called on it.

@@ -238,6 +238,8 @@ class Layer(object):

    Parameters
    ----------
    layer_output: tensor
      the output tensor to log to Tensorboard
    layer_vars: list of variables
      the list of variables to log to Tensorboard
    """
@@ -245,20 +247,20 @@ class Layer(object):
      return

    if self.summary_op == "tensor_summary":
      tf.summary.tensor_summary(self.name, self.out_tensor,
      tf.summary.tensor_summary(self.name, layer_output,
                                self.summary_description, self.collections)
      if self.include_variables:
        for var in layer_vars:
          tf.summary.tensor_summary(var.name, var, self.summary_description,
                                    self.collections)
    elif self.summary_op == 'scalar':
      tf.summary.scalar(self.name, self.out_tensor, self.collections)
      tf.summary.scalar(self.name, layer_output, self.collections)
      if self.include_variables:
        for var in layer_vars:
          tf.summary.tensor_summary(var.name, var, self.collections,
                                    self.collections)
    elif self.summary_op == 'histogram':
      tf.summary.histogram(self.name, self.out_tensor, self.collections)
      tf.summary.histogram(self.name, layer_output, self.collections)
      if self.include_variables:
        for var in layer_vars:
          tf.summary.histogram(var.name, var, self.collections)
+6 −3
Original line number Diff line number Diff line
@@ -668,7 +668,8 @@ class TensorGraph(Model):
          self.rnn_initial_states += layer.rnn_initial_states
          self.rnn_final_states += layer.rnn_final_states
          self.rnn_zero_states += layer.rnn_zero_states
          layer.add_summary_to_tg(self.get_layer_variables(layer))
          layer.add_summary_to_tg(layer.out_tensor,
                                  self.get_layer_variables(layer))
      self.session = tf.Session(config=self.configproto)

      # Ensure all training operators have been created.
@@ -1184,7 +1185,9 @@ class TensorGraph(Model):
      tensor = layer.create_tensor(
          in_layers=inputs, set_tensors=False, training=training)
      tensors[layer] = tensor
      layer.add_summary_to_tg(tensor)
      vars = tf.get_collection(
          tf.GraphKeys.TRAINABLE_VARIABLES, scope=layer.name)
      layer.add_summary_to_tg(tensor, vars)
      return tensor

    # Define the model function.
@@ -1195,7 +1198,7 @@ class TensorGraph(Model):
      tensors = self.create_estimator_inputs(feature_columns, weight_column,
                                             features, labels, mode)
      for layer, tensor in tensors.items():
        layer.add_summary_to_tg(tensor)
        layer.add_summary_to_tg(tensor, [])

      # Create the correct outputs, based on the mode.

+40 −2
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@ import unittest
import numpy as np
import tensorflow as tf
import deepchem as dc
import deepchem.models.tensorgraph.layers as layers
from deepchem.data import NumpyDataset
from deepchem.models.tensorgraph.layers import Dense


class TestEstimators(unittest.TestCase):
@@ -212,7 +212,7 @@ class TestEstimators(unittest.TestCase):
    # Create the model.

    model = dc.models.Sequential(loss="mse", learning_rate=0.01)
    model.add(Dense(out_channels=1))
    model.add(layers.Dense(out_channels=1))

    # Create an estimator from it.

@@ -329,3 +329,41 @@ class TestEstimators(unittest.TestCase):
    results = estimator.evaluate(input_fn=lambda: input_fn(1))
    assert results['loss'] < 0.5
    assert results['accuracy'] > 0.6

  def test_tensorboard(self):
    """Test creating an Estimator from a TensorGraph that logs information to TensorBoard."""
    n_samples = 10
    n_features = 3
    n_tasks = 2

    # Create a dataset and an input function for processing it.

    np.random.seed(123)
    X = np.random.rand(n_samples, n_features)
    y = np.zeros((n_samples, n_tasks))
    dataset = dc.data.NumpyDataset(X, y)

    def input_fn(epochs):
      x, y, weights = dataset.make_iterator(
          batch_size=n_samples, epochs=epochs).get_next()
      return {'x': x, 'weights': weights}, y

    # Create a TensorGraph model.

    model = dc.models.TensorGraph()
    features = layers.Feature(shape=(None, n_features))
    dense = layers.Dense(out_channels=n_tasks, in_layers=features)
    dense.set_summary('histogram')
    model.add_output(dense)
    labels = layers.Label(shape=(None, n_tasks))
    loss = layers.ReduceMean(layers.L2Loss(in_layers=[labels, dense]))
    model.set_loss(loss)

    # Create an estimator from it.

    x_col = tf.feature_column.numeric_column('x', shape=(n_features,))
    estimator = model.make_estimator(feature_columns=[x_col])

    # Train the model.

    estimator.train(input_fn=lambda: input_fn(100))