Commit 71aaf8aa authored by Ubuntu's avatar Ubuntu
Browse files

error bars and fixes

parent aeba3e66
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
CHANGES
=======

* for now..
* yapfed lots of stuff
* Upgrade Yapf to 0.16.2
* yapf
+30 −27
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@ from deepchem.models.tensorgraph.tensor_graph import TensorGraph
from deepchem.trans import undo_transforms
from deepchem.utils.evaluate import GeneratorEvaluator
from deepchem.data import NumpyDataset
from deepchem.data.data_loader import featurize_smiles_np
from deepchem.feat.graph_features import ConvMolFeaturizer

class WeaveTensorGraph(TensorGraph):

@@ -578,6 +580,7 @@ class GraphConvTensorGraph(TensorGraph):

    """
    self.n_tasks = n_tasks
    self.error_bars = True if 'error_bars' in kwargs and kwargs['error_bars'] else False    
    kwargs['use_queue'] = False
    super(GraphConvTensorGraph, self).__init__(**kwargs)
    self.build_graph()
@@ -617,6 +620,7 @@ class GraphConvTensorGraph(TensorGraph):
        in_layers=[batch_norm3, self.degree_slice, self.membership] +
        self.deg_adjs)

    if self.error_bars == True:
      readout = Dropout(in_layers=[readout], dropout_prob=0.2)

    costs = []
@@ -717,46 +721,45 @@ class GraphConvTensorGraph(TensorGraph):
        labels=self.my_labels,
        weights=[self.my_task_weights])

  def bayesian_predict(self, dataset, transformers=[], n_passes=4):
    max_index = dataset.shape[0]
    num_batches = max_index // self.batch_size
  def bayesian_predict(self, X, transformers=[], n_passes=4, untransform=False):
    max_index = X.shape[0] - 1
    num_batches = (max_index // self.batch_size) + 1

    mus = []
    sigmas = []
    for i in range(num_batches + 1): # think about edge cases here
    for i in range(num_batches):
      start = i * self.batch_size
      end = min( (i+1)*self.batch_size, max_index)
      batch = dataset[start:end]
      end = min((i+1)*self.batch_size, max_index + 1)
      batch = X[start:end]
      mu, sigma = self.bayesian_predict_on_batch(batch, transformers=[], n_passes=n_passes)
      mus.append(mu)
      sigmas.append(sigma)
    mu = np.concatenate(mus, axis=0)
    sigma = np.concatenate(sigmas, axis=0)
    sigma = np.concatenate(sigmas, axis=0) + 0.55
    
    if untransform:
      mu = undo_transforms(mu, transformers)
      for i in range(sigma.shape[1]):
        sigma[:,i] = sigma[:,i] * transformers[0].y_stds[i]
      
    return mu[:max_index], sigma[:max_index]
    return mu[:max_index + 1], sigma[:max_index + 1]
  
  def predict_on_smiles(self, smiles, transformers):
    max_index = len(smiles)
    num_batches = max_index // self.batch_size
  def predict_on_smiles(self, smiles, transformers=[], untransform=False):
    max_index = len(smiles) - 1
    n_tasks = len(self.outputs)
    num_batches = (max_index // self.batch_size) + 1
    featurizer = ConvMolFeaturizer()
    
    y_ = []
    for i in range(num_batches):
      smiles_batch = smiles[i * self.batch_size:(i + 1) * self.batch_size]
      y_.append(self.predict_on_smiles_batch(smiles_batch, transformers, featurizer))
    smiles_batch = smiles[num_batches * self.batch_size:max_index]
    y_.append(self.predict_on_smiles_batch(smiles_batch, transformers))

    return np.concatenate(y_, axis=1) # wrong axis?

  def predict_on_smiles_batch(self, smiles, transformers=[]):
    convmols = featurize_smiles_np(smiles, featurizer)

    n_smiles = convmols.shape[0]
    n_tasks = len(self.outputs)
      start = i * self.batch_size
      end = min((i+1)*self.batch_size, max_index + 1)
      smiles_batch = smiles[start:end]
      y_.append(self.predict_on_smiles_batch(smiles_batch, featurizer, transformers))
    y_ = np.concatenate(y_, axis=0)[:max_index + 1]
    y_ = y_.reshape(-1, n_tasks)

    dataset = NumpyDataset(X=convmols, y=None, n_tasks=n_tasks)
    generator = self.default_generator(dataset, predict=True, pad_batches=False)
    y_ = self.predict_on_generator(generator, transformers)
    if untransform:
      y_ = undo_transforms(y_, transformers)

    return y_.reshape(-1, n_tasks)[:n_smiles]
    return y_
+12 −5
Original line number Diff line number Diff line
@@ -15,7 +15,8 @@ from deepchem.models.models import Model
from deepchem.models.tensorgraph.layers import InputFifoQueue, Label, Feature, Weights
from deepchem.trans import undo_transforms
from deepchem.utils.evaluate import GeneratorEvaluator

from deepchem.feat.graph_features import ConvMolFeaturizer
from deepchem.data.data_loader import featurize_smiles_np

class TensorGraph(Model):

@@ -278,11 +279,11 @@ class TensorGraph(Model):
          results.append(result)
        return np.concatenate(results, axis=0)

  def bayesian_predict_on_batch(self, X, sess=None, transformers=[], n_passes=4):
  def bayesian_predict_on_batch(self, X, transformers=[], n_passes=4):
    """
    Returns:
      mu: SHAPE
      sigma: SHAPE
      mu: numpy ndarray of shape (n_samples, n_tasks)
      sigma: numpy ndarray of shape (n_samples, n_tasks)
    """
    dataset = NumpyDataset(X=X, y=None, n_tasks=len(self.outputs))
    y_ = []
@@ -296,6 +297,13 @@ class TensorGraph(Model):
    
    return mu, sigma

  def predict_on_smiles_batch(self, smiles, featurizer, n_tasks, transformers=[]):
    convmols = featurize_smiles_np(smiles, featurizer)

    dataset = NumpyDataset(X=convmols, y=None, n_tasks=len(self.outputs))
    generator = self.default_generator(dataset, predict=True, pad_batches=True)
    return self.predict_on_generator(generator, transformers)

  def predict_on_batch(self, X, sess=None, transformers=[]):
    """Generates output predictions for the input samples,
      processing the samples in a batched way.
@@ -308,7 +316,6 @@ class TensorGraph(Model):
    # Returns
        A Numpy array of predictions.
    """
    print('inside tensorgraph predict_on_batch')
    dataset = NumpyDataset(X=X, y=None)
    generator = self.default_generator(dataset, predict=True, pad_batches=False)
    return self.predict_on_generator(generator, transformers)
+6 −5
Original line number Diff line number Diff line
@@ -113,11 +113,6 @@ class NormalizationTransformer(Transformer):
               dataset=None,
               transform_gradients=False):
    """Initialize normalization transformation."""
    super(NormalizationTransformer, self).__init__(
        transform_X=transform_X,
        transform_y=transform_y,
        transform_w=transform_w,
        dataset=dataset)
    if transform_X:
      X_means, X_stds = dataset.get_statistics(X_stats=True, y_stats=False)
      self.X_means = X_means
@@ -135,6 +130,12 @@ class NormalizationTransformer(Transformer):
      self.grad = np.reshape(true_grad, (true_grad.shape[0], -1, 3))
      self.ydely_means = ydely_means

    super(NormalizationTransformer, self).__init__(
              transform_X=transform_X,
              transform_y=transform_y,
              transform_w=transform_w,
              dataset=dataset)
      
  def transform(self, dataset, parallel=False):
    return super(NormalizationTransformer, self).transform(
        dataset, parallel=parallel)
+0 −51
Original line number Diff line number Diff line
"""
Script that trains graphconv models on delaney dataset.
"""
from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals

import numpy as np
np.random.seed(123)
import tensorflow as tf
tf.set_random_seed(123)
import deepchem as dc

from sklearn.metrics import r2_score

# Load Delaney dataset
delaney_tasks, delaney_datasets, transformers = dc.molnet.load_lipo(
    featurizer='GraphConv', split='scaffold')
train_dataset, valid_dataset, test_dataset = delaney_datasets

# Fit models
metric = dc.metrics.Metric(dc.metrics.pearson_r2_score, np.mean)

n_atom_feat = 75
n_pair_feat = 14
# Batch size of models
batch_size = 48
n_feat = 128

model = dc.models.GraphConvTensorGraph(
    len(delaney_tasks),
    batch_size=batch_size,
    learning_rate=1e-3,
    use_queue=False,
    mode='regression')

for i in xrange(0, 50):
  model.fit(train_dataset, nb_epoch=1)
  valid_scores = model.evaluate(valid_dataset, [metric], transformers)
  mu, sigma = model.bayesian_predict(valid_dataset.X, transformers)
  y = valid_dataset.y
  print(r2_score(y, mu))

  tmp = sigma
  amax = np.amax(tmp.reshape(-1, 1))
  amin = np.amin(tmp.reshape(-1, 1))
  print('max uncrt [%.4f] min uncrt [%.4f]' % (amin, amax))

  mu = mu.reshape(-1, 1).tolist()
  if i, estimate in enumerate(mu):
    
 No newline at end of file
Loading