Commit 1f7470b3 authored by joegomes's avatar joegomes
Browse files

Update QM7 example and add QM7b

parent cc222811
Loading
Loading
Loading
Loading
+64 −34
Original line number Diff line number Diff line
@@ -12,55 +12,85 @@ import deepchem as dc
import scipy.io
import csv

def load_qm7_from_mat(featurizer=None, split=0):
def load_qm7_from_mat(featurizer=None, split='stratified'):

  if not os.path.exists('qm7.mat'): os.system('wget http://www.quantum-machine.org/data/qm7.mat')
  dataset = scipy.io.loadmat('qm7.mat')
  
  P = dataset['P'][list(range(0,split))+list(range(split+1,5))].flatten()
  X = dataset['X'][P]
  y = dataset['T'][0,P]
  X = dataset['X']
  y = dataset['T']
  w = np.ones_like(y)
  train_dataset = dc.data.NumpyDataset(X, y, w, ids=None)
  dataset = dc.data.DiskDataset.from_numpy(X, y, w, ids=None) 
  print(len(dataset))
  
  Ptest = dataset['P'][split]
  X = dataset['X'][Ptest]
  y = dataset['T'][0,Ptest]
  w = np.ones_like(y)
  test_dataset = dc.data.NumpyDataset(X, y, w, ids=None)
  current_dir = os.path.dirname(os.path.realpath(__file__))
  split_file = os.path.join(
      current_dir, "./qm7_splits.csv")

  split_indices = []
  with open(split_file, 'r') as f:
    reader = csv.reader(f)
    for row in reader:
      row_int = (np.asarray(list(map(int, row)))).tolist()
      split_indices.append(row_int)
  
  splitters = {'index': dc.splits.IndexSplitter(),
               'random': dc.splits.RandomSplitter(),
               'indice': dc.splits.IndiceSplitter(valid_indices=split_indices[1]),
               'stratified': dc.splits.SingletaskStratifiedSplitter(task_number=0)}
  splitter = splitters[split]
  train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(dataset)
  print(len(train_dataset))
  print(len(valid_dataset))
  print(len(test_dataset))

  transformers = [dc.trans.NormalizationTransformer(transform_y=True, dataset=train_dataset)]

  for transformer in transformers:
    train_dataset = transformer.transform(train_dataset)
    valid_dataset = transformer.transform(valid_dataset)
    test_dataset = transformer.transform(test_dataset)

  qm7_tasks = ["atomization_energy"]
  return qm7_tasks, (train_dataset, test_dataset), transformers
  qm7_tasks = np.arange(y.shape[1])
  return qm7_tasks, (train_dataset, valid_dataset, test_dataset), transformers

def load_qm7b_from_mat(featurizer=None, split='stratified'):

  if not os.path.exists('qm7b.mat'): os.system('wget http://www.quantum-machine.org/data/qm7b.mat')
  dataset_b = scipy.io.loadmat('qm7b.mat')
  dataset = scipy.io.loadmat('qm7b.mat')
  
  X = dataset_b['X']
  y = dataset_b['T']
  X = dataset['X']
  y = dataset['T']
  w = np.ones_like(y)
  dataset = dc.data.NumpyDataset(X, y, w, ids=None)
  dataset = dc.data.DiskDataset.from_numpy(X, y, w, ids=None)

  transformers = [dc.trans.NormalizationTransformer(transform_y=True, dataset=dataset)]
  current_dir = os.path.dirname(os.path.realpath(__file__))
  split_file = os.path.join(
      current_dir, "./qm7_splits.csv")

  for transformer in transformers:
    dataset = transformer.transform(dataset)
  split_indices = []
  with open(split_file, 'r') as f:
    reader = csv.reader(f)
    for row in reader:
      row_int = (np.asarray(list(map(int, row)))).tolist()
      split_indices.append(row_int)
  
  splitters = {'index': dc.splits.IndexSplitter(),
               'random': dc.splits.RandomSplitter(),
               'stratified': dc.splits.SingletaskStratifiedSplitter()}
               'indice': dc.splits.IndiceSplitter(valid_indices=split_indices[1]),
               'stratified': dc.splits.SingletaskStratifiedSplitter(task_number=0)}
  splitter = splitters[split]
  train_dataset, test_dataset = splitter.train_test_split(dataset)
  train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(dataset)

  transformers = [dc.trans.NormalizationTransformer(transform_y=True, dataset=train_dataset)]

  for transformer in transformers:
    train_dataset = transformer.transform(train_dataset)
    valid_dataset = transformer.transform(valid_dataset)
    test_dataset = transformer.transform(test_dataset)

  qm7_tasks = np.arange(y.shape[1])
  return qm7_tasks, (train_dataset, test_dataset), transformers
  return qm7_tasks, (train_dataset, valid_dataset, test_dataset), transformers

def load_qm7(featurizer=None, split='random'):

@@ -77,14 +107,6 @@ def load_qm7(featurizer=None, split='random'):
                             mol_field="mol", featurizer=featurizer)
  dataset = loader.featurize(dataset_file)
 
  # Initialize transformers 
  transformers = [
      dc.trans.NormalizationTransformer(transform_y=True, dataset=dataset)]

  print("About to transform data")
  for transformer in transformers:
    dataset = transformer.transform(dataset)
  
  split_file = os.path.join(
      current_dir, "./qm7_splits.csv")

@@ -95,10 +117,18 @@ def load_qm7(featurizer=None, split='random'):
      row_int = (np.asarray(list(map(int, row)))).tolist()
      split_indices.append(row_int)
  
  
  splitters = {'index': dc.splits.IndexSplitter(),
               'random': dc.splits.RandomSplitter(),
               'indice': dc.splits.IndiceSplitter(valid_indices=split_indices[1])}
               'indice': dc.splits.IndiceSplitter(valid_indices=split_indices[1]),
               'stratified': dc.splits.SingletaskStratifiedSplitter(task_number=0)}
  splitter = splitters[split]
  train, valid, test = splitter.train_valid_test_split(dataset)
  return qm7_tasks, (train, valid, test), transformers
  train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(dataset)

  transformers = [dc.trans.NormalizationTransformer(transform_y=True, dataset=train_dataset)]

  for transformer in transformers:
    train_dataset = transformer.transform(train_dataset)
    valid_dataset = transformer.transform(valid_dataset)
    test_dataset = transformer.transform(test_dataset)

  return qm7_tasks, (train_dataset, valid_dataset, test_dataset), transformers
+6 −6
Original line number Diff line number Diff line
@@ -11,12 +11,8 @@ import numpy as np
from qm7_datasets import load_qm7_from_mat

np.random.seed(123)
split = 0
num_atoms = 23

qm7_tasks, datasets, transformers = load_qm7_from_mat(split)
train_dataset, test_dataset = datasets

qm7_tasks, datasets, transformers = load_qm7_from_mat(split='stratified')
train_dataset, valid_dataset, test_dataset = datasets
fit_transformers = [dc.trans.CoulombFitTransformer(train_dataset)]
regression_metric = [dc.metrics.Metric(dc.metrics.mean_absolute_error, mode="regression"), 
              dc.metrics.Metric(dc.metrics.pearson_r2_score, mode="regression")]
@@ -34,6 +30,10 @@ train_scores = model.evaluate(train_dataset, regression_metric, transformers)
print("Train scores [kcal/mol]")
print(train_scores)

valid_scores = model.evaluate(valid_dataset, regression_metric, transformers)
print("Valid scores [kcal/mol]")
print(valid_scores)

test_scores = model.evaluate(test_dataset, regression_metric, transformers)
print("Test scores [kcal/mol]")
print(test_scores)
+39 −0
Original line number Diff line number Diff line
"""
Script that trains Tensorflow singletask models on QM7 dataset.
"""
from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals

import os
import deepchem as dc
import numpy as np
from qm7_datasets import load_qm7b_from_mat

np.random.seed(123)
qm7_tasks, datasets, transformers = load_qm7b_from_mat(split='stratified')
train_dataset, valid_dataset, test_dataset = datasets
fit_transformers = [dc.trans.CoulombFitTransformer(train_dataset)]
regression_metric = [dc.metrics.Metric(dc.metrics.mean_absolute_error, mode="regression"), 
              dc.metrics.Metric(dc.metrics.pearson_r2_score, mode="regression")]
model = dc.models.TensorflowMultiTaskFitTransformRegressor(
    n_tasks=len(qm7_tasks), n_features=[23, 23], learning_rate=0.001 , momentum=.8, batch_size=25,
    weight_init_stddevs=[1/np.sqrt(400),1/np.sqrt(100),1/np.sqrt(100)],
    bias_init_consts=[0.,0.,0.], layer_sizes=[400,100,100], 
    dropouts=[0.01,0.01,0.01], fit_transformers=fit_transformers, n_evals=10, seed=123)

# Fit trained model
model.fit(train_dataset, nb_epoch=50)
model.save()

train_scores = model.evaluate(train_dataset, regression_metric, transformers)
print("Train scores [kcal/mol]")
print(train_scores)

valid_scores = model.evaluate(valid_dataset, regression_metric, transformers)
print("Valid scores [kcal/mol]")
print(valid_scores)

test_scores = model.evaluate(test_dataset, regression_metric, transformers)
print("Test scores [kcal/mol]")
print(test_scores)