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

Merge pull request #274 from rbharath/tox21_fixes

Some minor fixes to Tox21 models
parents 1b94fc18 1a0a14ac
Loading
Loading
Loading
Loading
+2 −18
Original line number Diff line number Diff line
@@ -177,37 +177,21 @@ class MultitaskGraphClassifier(Model):
        softmax.append(tf.nn.softmax(logits, name='softmax_%d' % i))
    return softmax

  def fit(self, dataset, nb_epoch=10, pad_batches=False,
  def fit(self, dataset, nb_epoch=10, 
          max_checkpoints_to_keep=5, log_every_N_batches=50, **kwargs):
    # Perform the optimization
    log("Training for %d epochs" % nb_epoch, self.verbosity)
  
    # TODO(rbharath): Disabling saving for now to try to debug.
    ############################################################# DEBUG
    # Save an initial checkpoint.
    #saver = tf.train.Saver(max_to_keep=max_checkpoints_to_keep)
    #saver.save(self.sess, self._save_path, global_step=0)
    ############################################################# DEBUG
    for epoch in range(nb_epoch):
      # TODO(rbharath): This decay shouldn't be hard-coded.
      lr = self.learning_rate / (1 + float(epoch) / self.T)

      log("Starting epoch %d" % epoch, self.verbosity)
      # ToDo(hraut->rbharath) : what is the ids_b for? Is it the zero's? 
      for batch_num, (X_b, y_b, w_b, ids_b) in enumerate(dataset.iterbatches(
          self.batch_size, pad_batches=pad_batches)):
          self.batch_size, pad_batches=True)):
        if batch_num % log_every_N_batches == 0:
          log("On batch %d" % batch_num, self.verbosity)
        self.sess.run(
            self.train_op,
            feed_dict=self.construct_feed_dict(X_b, y_b, w_b))
      ############################################################# DEBUG
      #saver.save(self.sess, self._save_path, global_step=epoch)
      ############################################################# DEBUG
    ############################################################# DEBUG
    # Always save a final checkpoint when complete.
    #saver.save(self.sess, self._save_path, global_step=epoch+1)
    ############################################################# DEBUG

  def save(self):
    """
+24 −5
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ from deepchem.data import get_task_dataset_minus_support
class SupportGraphClassifier(Model):
  def __init__(self, sess, model,
               test_batch_size=10, support_batch_size=10,
               learning_rate=.001, similarity="cosine",
               beta1=.9, beta2=.999, **kwargs):
               learning_rate=.001, decay_steps=20, decay_rate=1.,
               similarity="cosine", **kwargs):
    """Builds a support-based classifier.

    See https://arxiv.org/pdf/1606.04080v1.pdf for definition of support.
@@ -40,6 +40,10 @@ class SupportGraphClassifier(Model):
      Number of positive examples in support.
    n_neg: int
      Number of negative examples in support.
    decay_steps: int, optional
      Corresponds to argument decay_steps in tf.train.exponential_decay
    decay_rate: float, optional
      Corresponds to argument decay_rate in tf.train.exponential_decay
    """
    self.sess = sess
    self.similarity = similarity
@@ -48,6 +52,8 @@ class SupportGraphClassifier(Model):
    self.support_batch_size = support_batch_size

    self.learning_rate = learning_rate
    self.decay_steps = decay_steps
    self.decay_rate = decay_rate
    self.epsilon = K.epsilon()

    self.add_placeholders()
@@ -61,9 +67,17 @@ class SupportGraphClassifier(Model):

  def get_training_op(self, loss):
    """Attaches an optimizer to the graph."""
    opt = tf.train.AdamOptimizer(self.learning_rate)
    ################################################################# DEBUG
    global_step = tf.Variable(0, trainable=False)
    learning_rate = tf.train.exponential_decay(
        self.learning_rate, global_step,
        self.decay_steps, self.decay_rate, staircase=True)
    opt = tf.train.AdamOptimizer(learning_rate)
    # Get train function
    return opt.minimize(self.loss_op, name="train")
    return opt.minimize(self.loss_op, name="train", global_step=global_step)
    #opt = tf.train.AdamOptimizer(self.learning_rate)
    #return opt.minimize(self.loss_op, name="train")
    ################################################################# DEBUG

  def add_placeholders(self):
    """Adds placeholders to graph."""
@@ -139,6 +153,7 @@ class SupportGraphClassifier(Model):
    # Create different support sets
    support_generator = SupportGenerator(dataset, range(n_tasks),
        n_pos, n_neg, n_trials, replace)
    recent_losses = []
    for ind, (task, support) in enumerate(support_generator):
      if ind % log_every_n_samples == 0:
        print("Sample %d from task %s" % (ind, str(task)))
@@ -150,7 +165,11 @@ class SupportGraphClassifier(Model):
        ############################################################## DEBUG
        _, loss = self.sess.run([self.train_op, self.loss_op], feed_dict=feed_dict)
        if ind % log_every_n_samples == 0:
          print("\tloss is %s" % str(loss))
          mean_loss = np.mean(np.array(recent_losses))
          print("\tmean loss is %s" % str(mean_loss))
          recent_losses = []
        else:
          recent_losses.append(loss)
        ############################################################## DEBUG

  def save(self):
+6 −3
Original line number Diff line number Diff line
@@ -6,11 +6,15 @@ from __future__ import division
from __future__ import unicode_literals

import os
import sys
import shutil
import tempfile
import numpy as np
import deepchem as dc

#sys.path.append("..")
#from muv.muv_datasets import load_muv

def load_tox21_ecfp(num_train=7200):
  """Load Tox21 datasets. Does not do train/test split"""
  # Set some global variables up top
@@ -33,7 +37,7 @@ def load_tox21_ecfp(num_train=7200):

  # Initialize transformers 
  transformers = [
      dc.transformers.BalancingTransformer(transform_w=True, dataset=dataset)]
      dc.trans.BalancingTransformer(transform_w=True, dataset=dataset)]

  print("About to transform data")
  for transformer in transformers:
@@ -48,7 +52,6 @@ def load_tox21_convmol(base_dir=None, num_train=7200):
  current_dir = os.path.dirname(os.path.realpath(__file__))
  dataset_file = os.path.join(
      current_dir, "../../datasets/tox21.csv.gz")
  #Make directories to store the raw and featurized datasets.

  # Featurize Tox21 dataset
  print("About to featurize Tox21 dataset.")
@@ -65,7 +68,7 @@ def load_tox21_convmol(base_dir=None, num_train=7200):

  # Initialize transformers 
  transformers = [
      dc.transformers.BalancingTransformer(transform_w=True, dataset=dataset)]
      dc.trans.BalancingTransformer(transform_w=True, dataset=dataset)]

  print("About to transform data")
  for transformer in transformers:
+10 −8
Original line number Diff line number Diff line
@@ -14,14 +14,14 @@ from datasets import load_tox21_convmol
# Number of folds for split 
K = 4 
# Depth of attention module
max_depth = 4
max_depth = 8
# number positive/negative ligands
n_pos = 5 
n_pos = 1 
n_neg = 10
# Set batch sizes for network
test_batch_size = 100
test_batch_size = 128
support_batch_size = n_pos + n_neg
n_train_trials = 2000 
n_train_trials = 5000
n_eval_trials = 20
n_steps_per_trial = 1
# Sample supports without replacement (all pos/neg should be different)
@@ -51,18 +51,20 @@ support_model = dc.nn.SequentialSupportGraph(n_feat)
# Adding 1st layer 
# output will be (n_atoms, 64)
support_model.add(dc.nn.GraphConv(64, activation='relu'))
# output will be (n_atoms, 64)
support_model.add_test(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
# output will be (n_atoms, 64)
support_model.add_support(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add(dc.nn.GraphPool())
# Addding 2nd layer
# output will be (n_atoms, 64)
support_model.add(dc.nn.GraphConv(64, activation='relu'))
support_model.add_test(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add_support(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add(dc.nn.GraphPool())
# Adding 3rd layer
support_model.add(dc.nn.GraphConv(64, activation='relu'))
support_model.add_support(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add_test(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add(dc.nn.GraphPool())

# Gather into molecules
support_model.add_test(dc.nn.GraphGather(test_batch_size))
+14 −6
Original line number Diff line number Diff line
@@ -16,12 +16,12 @@ K = 4
# Depth of attention module
max_depth = 4
# num positive/negative ligands
n_pos = 5 
n_pos = 1 
n_neg = 10
# Set batch sizes for network
test_batch_size = 100
test_batch_size = 128
support_batch_size = n_pos + n_neg
n_train_trials = 4000
n_train_trials = 11000
n_eval_trials = 20
n_steps_per_trial = 1
# Sample supports without replacement (all pos/neg should be different)
@@ -46,14 +46,22 @@ test_dataset = fold_datasets[-1]
support_model = dc.nn.SequentialSupportGraph(n_feat)

# Add layers
# 1st conv layer + batchnorm
# output will be (n_atoms, 64)
support_model.add(dc.nn.GraphConv(64, activation='relu'))
# Need to add batch-norm separately to test/support due to differing
# shapes.
support_model.add_test(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add_support(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
# 2nd conv layer + batchnorm
# output will be (n_atoms, 64)
support_model.add(dc.nn.GraphConv(64, activation='relu'))
support_model.add_test(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add_support(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
# 3nd conv layer + batchnorm
# output will be (n_atoms, 64)
support_model.add(dc.nn.GraphConv(64, activation='relu'))
support_model.add_test(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))
support_model.add_support(dc.nn.BatchNormalization(epsilon=1e-5, mode=1))

support_model.add(dc.nn.GraphPool())
support_model.add_test(dc.nn.GraphGather(test_batch_size))
support_model.add_support(dc.nn.GraphGather(support_batch_size))
Loading