Commit 41dea7db authored by peastman's avatar peastman
Browse files

Finished refactoring graph models

parent 6877fed6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -286,7 +286,7 @@ class WeaveGather(Layer):
    dist_max = [dist[i].prob(gaussian_memberships[i][0]) for i in range(11)]
    outputs = [dist[i].prob(x) / dist_max[i] for i in range(11)]
    outputs = tf.stack(outputs, axis=2)
    outputs = outputs / tf.reduce_sum(outputs, axis=2, keep_dims=True)
    outputs = outputs / tf.reduce_sum(outputs, axis=2, keepdims=True)
    outputs = tf.reshape(outputs, [-1, self.n_input * 11])
    return outputs

+23 −35
Original line number Diff line number Diff line
@@ -156,8 +156,6 @@ class WeaveModel(TensorGraph):
                        pad_batches=True):
    """TensorGraph style implementation """
    for epoch in range(epochs):
      if not predict:
        print('Starting epoch %i' % epoch)
      for (X_b, y_b, w_b, ids_b) in dataset.iterbatches(
          batch_size=self.batch_size,
          deterministic=deterministic,
@@ -221,6 +219,7 @@ class DTNNModel(TensorGraph):
               distance_max=18,
               output_activation=True,
               mode="regression",
               dropout=0.0,
               **kwargs):
    """
    Parameters
@@ -240,6 +239,8 @@ class DTNNModel(TensorGraph):
      maximum distance of atom pairs, default = 18 Angstorm
    mode: str
      Either "classification" or "regression" for type of model.
    dropout: float
      the dropout probablity to use.
    """
    if mode not in ['classification', 'regression']:
      raise ValueError("mode must be either 'classification' or 'regression'")
@@ -255,6 +256,7 @@ class DTNNModel(TensorGraph):
    self.steps = np.expand_dims(self.steps, 0)
    self.output_activation = output_activation
    self.mode = mode
    self.dropout = dropout
    super(DTNNModel, self).__init__(**kwargs)
    assert self.mode == "regression"
    self.build_graph()
@@ -271,6 +273,8 @@ class DTNNModel(TensorGraph):

    dtnn_embedding = DTNNEmbedding(
        n_embedding=self.n_embedding, in_layers=[self.atom_number])
    if self.dropout > 0.0:
      dtnn_embedding = Dropout(self.dropout, in_layers=dtnn_embedding)
    dtnn_layer1 = DTNNStep(
        n_embedding=self.n_embedding,
        n_distance=self.n_distance,
@@ -278,6 +282,8 @@ class DTNNModel(TensorGraph):
            dtnn_embedding, self.distance, self.distance_membership_i,
            self.distance_membership_j
        ])
    if self.dropout > 0.0:
      dtnn_layer1 = Dropout(self.dropout, in_layers=dtnn_layer1)
    dtnn_layer2 = DTNNStep(
        n_embedding=self.n_embedding,
        n_distance=self.n_distance,
@@ -285,27 +291,26 @@ class DTNNModel(TensorGraph):
            dtnn_layer1, self.distance, self.distance_membership_i,
            self.distance_membership_j
        ])
    if self.dropout > 0.0:
      dtnn_layer2 = Dropout(self.dropout, in_layers=dtnn_layer2)
    dtnn_gather = DTNNGather(
        n_embedding=self.n_embedding,
        layer_sizes=[self.n_hidden],
        n_outputs=self.n_tasks,
        output_activation=self.output_activation,
        in_layers=[dtnn_layer2, self.atom_membership])
    if self.dropout > 0.0:
      dtnn_gather = Dropout(self.dropout, in_layers=dtnn_gather)

    costs = []
    self.labels_fd = []
    for task in range(self.n_tasks):
      regression = DTNNExtract(task, in_layers=[dtnn_gather])
      self.add_output(regression)
      label = Label(shape=(None, 1))
      self.labels_fd.append(label)
      cost = L2Loss(in_layers=[label, regression])
      costs.append(cost)

    all_cost = Stack(in_layers=costs, axis=1)
    self.weights = Weights(shape=(None, self.n_tasks))
    loss = WeightedError(in_layers=[all_cost, self.weights])
    self.set_loss(loss)
    n_tasks = self.n_tasks
    weights = Weights(shape=(None, n_tasks))
    labels = Label(shape=(None, n_tasks))
    output = Reshape(
        shape=(None, n_tasks),
        in_layers=[Dense(in_layers=dtnn_gather, out_channels=n_tasks)])
    self.add_output(output)
    weighted_loss = ReduceSum(L2Loss(in_layers=[labels, output, weights]))
    self.set_loss(weighted_loss)

  def default_generator(self,
                        dataset,
@@ -315,8 +320,6 @@ class DTNNModel(TensorGraph):
                        pad_batches=True):
    """TensorGraph style implementation"""
    for epoch in range(epochs):
      if not predict:
        print('Starting epoch %i' % epoch)
      for (X_b, y_b, w_b, ids_b) in dataset.iterbatches(
          batch_size=self.batch_size,
          deterministic=deterministic,
@@ -324,10 +327,9 @@ class DTNNModel(TensorGraph):

        feed_dict = dict()
        if y_b is not None:
          for index, label in enumerate(self.labels_fd):
            feed_dict[label] = y_b[:, index:index + 1]
          feed_dict[self.labels[0]] = y_b
        if w_b is not None:
          feed_dict[self.weights] = w_b
          feed_dict[self.task_weights[0]] = w_b
        distance = []
        atom_membership = []
        distance_membership_i = []
@@ -363,18 +365,6 @@ class DTNNModel(TensorGraph):

        yield feed_dict

  def predict(self, dataset, transformers=[], outputs=None):
    if outputs is None:
      outputs = self.outputs
    if transformers != [] and not isinstance(outputs, collections.Sequence):
      raise ValueError(
          "DTNN does not support single tensor output with transformers")
    retval = super(DTNNModel, self).predict(dataset, outputs=outputs)
    if not isinstance(outputs, collections.Sequence):
      return retval
    retval = np.concatenate(retval, axis=-1)
    return undo_transforms(retval, transformers)


class DAGModel(TensorGraph):

@@ -877,8 +867,6 @@ class MPNNModel(TensorGraph):
                        pad_batches=True):
    """ Same generator as Weave models """
    for epoch in range(epochs):
      if not predict:
        print('Starting epoch %i' % epoch)
      for (X_b, y_b, w_b, ids_b) in dataset.iterbatches(
          batch_size=self.batch_size,
          deterministic=deterministic,
+29 −2
Original line number Diff line number Diff line
import unittest

import os
import numpy as np
import scipy

import deepchem as dc
from deepchem.data import NumpyDataset
@@ -193,7 +194,7 @@ class TestGraphModels(unittest.TestCase):

    model = WeaveModel(len(tasks), mode='regression')

    model.fit(dataset, nb_epoch=70)
    model.fit(dataset, nb_epoch=80)
    scores = model.evaluate(dataset, [metric], transformers)
    assert all(s < 0.1 for s in scores['mean_absolute_error'])

@@ -203,6 +204,7 @@ class TestGraphModels(unittest.TestCase):
    assert np.allclose(scores['mean_absolute_error'],
                       scores2['mean_absolute_error'])

  @attr("slow")
  def test_dag_model(self):
    tasks, dataset, transformers, metric = self.get_dataset(
        'classification', 'GraphConv')
@@ -353,3 +355,28 @@ class TestGraphModels(unittest.TestCase):
    assert mean_error < 0.5 * mean_value
    assert mean_std > 0.5 * mean_error
    assert mean_std < mean_value

  def test_dtnn_regression_model(self):
    current_dir = os.path.dirname(os.path.abspath(__file__))
    input_file = os.path.join(current_dir, "example_DTNN.mat")
    dataset = scipy.io.loadmat(input_file)
    X = dataset['X']
    y = dataset['T']
    w = np.ones_like(y)
    dataset = dc.data.NumpyDataset(X, y, w, ids=None)
    n_tasks = y.shape[1]

    model = dc.models.DTNNModel(
        n_tasks,
        n_embedding=20,
        n_distance=100,
        learning_rate=1.0,
        mode="regression")

    # Fit trained model
    model.fit(dataset, nb_epoch=200)

    # Eval model on train
    pred = model.predict(dataset)
    mean_rel_error = np.mean(np.abs(1 - pred / y))
    assert mean_rel_error < 0.1
−13.4 KiB

File deleted.

+0 −33
Original line number Diff line number Diff line
@@ -524,39 +524,6 @@ class TestOverfit(test_util.TensorFlowTestCase):
    scores = model.evaluate(dataset, [regression_metric])
    assert scores[regression_metric.name] < .2

  def test_tensorgraph_DTNN_multitask_regression_overfit(self):
    """Test deep tensor neural net overfits tiny data."""
    np.random.seed(123)
    tf.set_random_seed(123)

    input_file = os.path.join(self.current_dir, "example_DTNN.mat")
    dataset = scipy.io.loadmat(input_file)
    X = dataset['X']
    y = dataset['T']
    w = np.ones_like(y)
    dataset = dc.data.DiskDataset.from_numpy(X, y, w, ids=None)
    regression_metric = dc.metrics.Metric(
        dc.metrics.pearson_r2_score, task_averager=np.mean)
    n_tasks = y.shape[1]
    batch_size = 10

    model = dc.models.DTNNModel(
        n_tasks,
        n_embedding=20,
        n_distance=100,
        batch_size=batch_size,
        learning_rate=0.001,
        use_queue=False,
        mode="regression")

    # Fit trained model
    model.fit(dataset, nb_epoch=20)

    # Eval model on train
    scores = model.evaluate(dataset, [regression_metric])

    assert scores[regression_metric.name] > .9

  @attr('slow')
  def test_ANI_multitask_regression_overfit(self):
    """Test ANI-1 regression overfits tiny data."""