Commit 51730d4e authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

First graph-conv example on large dataset.

parent 335545f1
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
"""
Imports all submodules 
"""
from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals

import deepchem.datasets
import deepchem.featurizers
import deepchem.hyperparameters
import deepchem.metrics
import deepchem.models
import deepchem.nn
import deepchem.splits
import deepchem.transformers
import deepchem.utils
+25 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ import joblib
import os
import tempfile
import sklearn

from deepchem.datasets import Dataset, pad_features
from deepchem.transformers import undo_transforms
from deepchem.transformers import undo_grad_transforms
@@ -21,6 +22,7 @@ from deepchem.utils.save import load_from_disk
from deepchem.utils.save import save_to_disk
from deepchem.utils.save import log
from deepchem.datasets import pad_batch
from deepchem.utils.evaluate import Evaluator


class Model(object):
@@ -175,6 +177,29 @@ class Model(object):
      y_pred = np.reshape(y_pred, (n_samples,)) 
    return y_pred

  def evaluate(self, dataset, metrics, transformers=[]):
    """
    Evaluates the performance of this model on specified dataset.
  
    Parameters
    ----------
    dataset: deepchem.datasets.Dataset
      Dataset object.
    metric: deepchem.metrics.Metric
      Evaluation metric
    transformers: list
      List of deepchem.transformers.Transformer

    Returns
    -------
    dict
      Maps tasks to scores under metric.
    """
    evaluator = Evaluator(self, dataset, transformers,
                          verbosity=self.verbosity)
    scores = evaluator.compute_model_performance(metrics)
    return scores

  def predict_grad(self, dataset, transformers=[], batch_size=50):
    """
    Uses self to calculate gradient on provided Dataset object.
+11 −4
Original line number Diff line number Diff line
@@ -176,9 +176,12 @@ class MultitaskGraphClassifier(Model):
    # 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)
    #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)
@@ -192,9 +195,13 @@ class MultitaskGraphClassifier(Model):
        self.sess.run(
            self.train_op,
            feed_dict=self.construct_feed_dict(X_b, y_b, w_b))
      saver.save(self.sess, self._save_path, global_step=epoch)
      ############################################################# 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)
    #saver.save(self.sess, self._save_path, global_step=epoch+1)
    ############################################################# DEBUG

  def save(self):
    """
+11 −0
Original line number Diff line number Diff line
"""
Imports a number of useful deep learning primitives into one place.
"""
from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals

from keras.layers import Dense, BatchNormalization
from deepchem.models.tf_keras_models.keras_layers import GraphConv
from deepchem.models.tf_keras_models.keras_layers import GraphPool
from deepchem.models.tf_keras_models.keras_layers import GraphGather
+65 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ import numpy as np
import shutil
from deepchem.utils.save import load_from_disk
from deepchem.featurizers.featurize import DataLoader
from deepchem.featurizers.graph_features import ConvMolFeaturizer
from deepchem.featurizers.fingerprints import CircularFingerprint
from deepchem.datasets import DiskDataset
from deepchem.transformers import BalancingTransformer
@@ -78,3 +79,67 @@ def load_tox21(base_dir, reload=True, num_train=7200):
                                     w_valid, ids_valid, tox21_tasks)
  
  return tox21_tasks, (train_dataset, valid_dataset), transformers

def load_tox21_convmol(base_dir=None, num_train=7200):
  """Load Tox21 datasets with conv feat. Does not do train/test split"""
  # Set some global variables up top
  verbosity = "high"
  if base_dir is None:
    base_dir = tempfile.mkdtemp()

  # Create some directories for analysis
  # The base_dir holds the results of all analysis
  if os.path.exists(base_dir):
    shutil.rmtree(base_dir)
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)
  current_dir = os.path.dirname(os.path.realpath(__file__))
  #Make directories to store the raw and featurized datasets.
  data_dir = os.path.join(base_dir, "dataset")
  train_dir = os.path.join(base_dir, "train")
  valid_dir = os.path.join(base_dir, "valid")

  # Load Tox21 dataset
  print("About to load Tox21 dataset.")
  dataset_file = os.path.join(
      current_dir, "../../datasets/tox21.csv.gz")
  dataset = load_from_disk(dataset_file)
  print("Columns of dataset: %s" % str(dataset.columns.values))
  print("Number of examples in dataset: %s" % str(dataset.shape[0]))

  # Featurize Tox21 dataset
  print("About to featurize Tox21 dataset.")
  featurizer = ConvMolFeaturizer()
  tox21_tasks = ['NR-AR', 'NR-AR-LBD', 'NR-AhR', 'NR-Aromatase', 'NR-ER',
                 'NR-ER-LBD', 'NR-PPAR-gamma', 'SR-ARE', 'SR-ATAD5',
                 'SR-HSE', 'SR-MMP', 'SR-p53']

  loader = DataLoader(tasks=tox21_tasks,
                      smiles_field="smiles",
                      featurizer=featurizer,
                      verbosity=verbosity)
  dataset = loader.featurize(
      dataset_file, data_dir, shard_size=8192)

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

  print("About to transform data")
  for transformer in transformers:
      dataset = transformer.transform(dataset)

  X, y, w, ids = (dataset.X, dataset.y, dataset.w, dataset.ids)
  X_train, X_valid = X[:num_train], X[num_train:]
  y_train, y_valid = y[:num_train], y[num_train:]
  w_train, w_valid = w[:num_train], w[num_train:]
  ids_train, ids_valid = ids[:num_train], ids[num_train:]

  train_dataset = DiskDataset.from_numpy(
      train_dir, X_train, y_train, w_train, ids_train, tox21_tasks,
      compute_feature_statistics=False)
  valid_dataset = DiskDataset.from_numpy(
      valid_dir, X_valid, y_valid, w_valid, ids_valid, tox21_tasks,
      compute_feature_statistics=False)
  
  return tox21_tasks, (train_dataset, valid_dataset), transformers
Loading