Commit 719e4bc9 authored by evanfeinberg's avatar evanfeinberg
Browse files

Fixed previous commit. Now crashing on 3D CNN's

parent 658c0b91
Loading
Loading
Loading
Loading
+67 −3
Original line number Diff line number Diff line
@@ -5,8 +5,72 @@ import numpy as np
from keras.models import Graph
from keras.layers.core import Dense, Dropout
from keras.optimizers import SGD
from deep_chem.utils.preprocess import to_one_hot
from deep_chem.models import Model

#TODO(rbharath/enf): Make this real. It's a dummy now.
class SingleTaskDNN(Model):
  """
  Abstract base class for different ML models.
  """
  def __init__(self, task_types, model_params, initialize_raw_model=True):
    self.task_types = task_types
    self.model_params = model_params
    self.raw_model = None

  def fit_on_batch(self, X, y, w):
    """
    Updates existing model with new information.
    """
    raise NotImplementedError(
        "Each model is responsible for its own fit_on_batch method.")

  def predict_on_batch(self, X):
    """
    Makes predictions on given batch of new data.
    """
    raise NotImplementedError(
        "Each model is responsible for its own predict_on_batch method.")    

#TODO(rbharath/enf): Make this real. It's a dummy now.
class MultiTaskDNN(Model):
  """
  Abstract base class for different ML models.
  """
  def __init__(self, task_types, model_params, initialize_raw_model=True):
    self.task_types = task_types
    self.model_params = model_params
    self.raw_model = None

  def fit_on_batch(self, X, y, w):
    """
    Updates existing model with new information.
    """
    raise NotImplementedError(
        "Each model is responsible for its own fit_on_batch method.")

  def predict_on_batch(self, X):
    """
    Makes predictions on given batch of new data.
    """
    raise NotImplementedError(
        "Each model is responsible for its own predict_on_batch method.")   

def to_one_hot(y):
  """Transforms label vector into one-hot encoding.

  Turns y into vector of shape [n_samples, 2] (assuming binary labels).

  y: np.ndarray
    A vector of shape [n_samples, 1]
  """
  n_samples = np.shape(y)[0]
  y_hot = np.zeros((n_samples, 2))
  for index, val in enumerate(y):
    if val == 0:
      y_hot[index] = np.array([1, 0])
    elif val == 1:
      y_hot[index] = np.array([0, 1])
  return y_hot

def fit_multitask_mlp(train_data, task_types, **training_params):
  """
@@ -62,7 +126,7 @@ def fit_singletask_mlp(train_data, task_types, **training_params):

def train_multitask_model(X, y, W, task_types, learning_rate=0.01,
                          decay=1e-6, momentum=0.9, nesterov=True, activation="relu",
                          dropout=0.5, nb_epoch=20, batch_size=50, n_hidden=500,
                          dropout=0.5, nb_epoch=20, batch_size=50, nb_hidden=500,
                          validation_split=0.1):
  """
  Perform stochastic gradient descent optimization for a keras multitask MLP.
@@ -106,7 +170,7 @@ def train_multitask_model(X, y, W, task_types, learning_rate=0.01,
  #model.add_input(name="input", ndim=n_inputs)
  model.add_input(name="input", input_shape=(n_inputs,))
  model.add_node(
      Dense(n_hidden, init='uniform', activation=activation),
      Dense(nb_hidden, init='uniform', activation=activation),
      name="dense", input="input")
  model.add_node(Dropout(dropout), name="dropout", input="dense")
  top_layer = "dropout"
+1 −2
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ class DockingDNN(Model):
  """
  def __init__(self, task_types, model_params, initialize_raw_model=True):
    if initialize_raw_model:
      (_, axis_length, _, _, n_channels) = model_params["data_shape"]
      (axis_length, _, _, n_channels) = model_params["data_shape"]

      learning_rate = model_params["learning_rate"]
      loss_function = model_params["loss_function"]
@@ -88,4 +88,3 @@ class DockingDNN(Model):
    y_pred = self.raw_model.predict_on_batch(X)
    y_pred = np.squeeze(y_pred)
    return(y_pred)
    
 No newline at end of file
+13 −5
Original line number Diff line number Diff line
"""
Factory function to construct models.
"""

from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals

#from deep_chem.models.deep import SingleTaskDNN
#from deep_chem.models.deep import MultiTaskDNN
from deep_chem.models.deep3D import DockingDNN
from deep_chem.models.deep import SingleTaskDNN
from deep_chem.models.deep import MultiTaskDNN
from deep_chem.models.deep3d import DockingDNN
from deep_chem.models.standard import SklearnModel

def model_builder(model_type, task_types, model_params):
  """
  Factory function to construct model.
  """
  if model_type == "singletask_deep_network":
    model = SingleTaskDNN(task_types, model_params)
  elif model_type == "multitask_deep_network":
    model = MultiTaskDNN(task_types, model_params)
  elif model_type== "3D_cnn":
  elif model_type == "convolutional_3D_regressor":
    model = DockingDNN(task_types, model_params)
  else:
    model = SklearnModel(task_types, model_params)
  return(model)
  return model
+24 −0
Original line number Diff line number Diff line
@@ -9,6 +9,30 @@ from sklearn.linear_model import RidgeCV
from sklearn.linear_model import LassoCV
from sklearn.linear_model import ElasticNetCV
from sklearn.linear_model import LassoLarsCV
from deep_chem.models import Model

class SklearnModel(Model):
  """
  Abstract base class for different ML models.
  """
  def __init__(self, task_types, model_params, initialize_raw_model=True):
    self.task_types = task_types
    self.model_params = model_params
    self.raw_model = None

  def fit_on_batch(self, X, y, w):
    """
    Updates existing model with new information.
    """
    raise NotImplementedError(
        "Each model is responsible for its own fit_on_batch method.")

  def predict_on_batch(self, X):
    """
    Makes predictions on given batch of new data.
    """
    raise NotImplementedError(
        "Each model is responsible for its own predict_on_batch method.")   

def fit_singletask_models(train_data, modeltype):
  """Fits singletask linear regression models to potency.
+14 −9
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ def add_featurize_group(featurize_cmd):
      "--threshold", type=float, default=None,
      help="If specified, will be used to binarize real-valued target-fields.")
  featurize_group.add_argument(
      "--feature-dir", type=str, required=1,
      "--feature-dir", type=str, required=0,
      help="Directory where featurized dataset will be stored. \n"
           "Will be created if does not exist")
  featurize_group.set_defaults(func=featurize_inputs_wrapper)
@@ -192,6 +192,9 @@ def add_model_command(subparsers):
  model_cmd.add_argument(
      "--skip-fit", action="store_true",
      help="If set, skip model fit step.")
  model_cmd.add_argument(
      "--base-dir", type=str, required=1,
      help="The base directory for the model.")
  add_featurize_group(model_cmd)

  train_test_group = model_cmd.add_argument_group("train_test_group")
@@ -231,17 +234,19 @@ def extract_model_params(args):
  model_params = {param : getattr(args, param) for param in params}
  return(model_params)

def ensure_exists(dirs):
  for directory in dirs:
    if not os.path.exists(directory):
      os.makedirs(directory)

def create_model(args):
  """Creates a model"""
  feature_dir = args.feature_dir
  if not os.path.exists(feature_dir):
    os.makedirs(feature_dir)

  data_dir = args.data_dir
  if not os.path.exists(data_dir):
    os.makedirs(data_dir)
  base_dir = args.base_dir
  feature_dir = os.path.join(base_dir, "features")
  data_dir = os.path.join(base_dir, "data")
  model_dir = os.path.join(base_dir, "model")
  ensure_exists([base_dir, feature_dir, data_dir, model_dir])

  model_dir = args.model_dir
  model_name = args.model

  print("+++++++++++++++++++++++++++++++++")
Loading