Commit 6963843d authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Added abstract base KerasModel class.

parent ca7129ec
Loading
Loading
Loading
Loading
+43 −39
Original line number Diff line number Diff line
@@ -8,9 +8,50 @@ from keras.layers.core import Dense, Dropout
from keras.optimizers import SGD
from deepchem.models import Model

class MultiTaskDNN(Model):
class KerasModel(Model)
  """
  Abstract base class for different ML models.
  Abstract base class shared across all Keras models.
  """

  def save(self, out_dir):
    """
    Saves underlying keras model to disk. 
    """
    super(MultiTaskDNN, self).save(out_dir)
    model = self.get_raw_model()
    filename, _ = os.path.splitext(self.get_model_filename(out_dir))

    # Note that keras requires the model architecture and weights to be stored
    # separately. A json file is generated that specifies the model architecture.
    # The weights will be stored in an h5 file. The pkl.gz file with store the
    # target name.
    json_filename = "%s.%s" % (filename, "json")
    h5_filename = "%s.%s" % (filename, "h5")
    # Save architecture
    json_string = model.to_json()
    with open(json_filename, "wb") as file_obj:
      file_obj.write(json_string)
    model.save_weights(h5_filename, overwrite=True)

  def load(self, model_dir):
    """
    Load keras multitask DNN from disk.
    """
    super(MultiTaskDNN, self).load(model_dir)
    filename = self.get_Model_filename(model_dir)
    filename, _ = os.path.splitext(filename)

    json_filename = "%s.%s" % (filename, "json")
    h5_filename = "%s.%s" % (filename, "h5")

    with open(json_filename) as file_obj:
      model = model_from_json(file_obj.read())
    model.load_weights(h5_filename)
    self.raw_model = model

class MultiTaskDNN(KerasModel):
  """
  Model for multitask MLP in keras.
  """
  def __init__(self, task_types, model_params, initialize_raw_model=True):
    super(MultiTaskDNN, self).__init__(model_type, task_types, model_params,
@@ -99,43 +140,6 @@ class MultiTaskDNN(Model):
    y_pred = np.squeeze(y_pred)
    return y_pred

  def save(self, out_dir):
    """
    Saves underlying keras model to disk. 
    """
    super(MultiTaskDNN, self).save(out_dir)
    model = self.get_raw_model()
    filename, _ = os.path.splitext(self.get_model_filename(out_dir))

    # Note that keras requires the model architecture and weights to be stored
    # separately. A json file is generated that specifies the model architecture.
    # The weights will be stored in an h5 file. The pkl.gz file with store the
    # target name.
    json_filename = "%s.%s" % (filename, "json")
    h5_filename = "%s.%s" % (filename, "h5")
    # Save architecture
    json_string = model.to_json()
    with open(json_filename, "wb") as file_obj:
      file_obj.write(json_string)
    model.save_weights(h5_filename, overwrite=True)

  def load(self, model_dir):
    """
    Load keras multitask DNN from disk.
    """
    super(MultiTaskDNN, self).load(model_dir)
    filename = self.get_Model_filename(model_dir)
    filename, _ = os.path.splitext(filename)

    json_filename = "%s.%s" % (filename, "json")
    h5_filename = "%s.%s" % (filename, "h5")

    with open(json_filename) as file_obj:
      model = model_from_json(file_obj.read())
    model.load_weights(h5_filename)
    self.raw_model = model


Model.register_model_type("multitask_deep_regressor", MultiTaskDNN)
Model.register_model_type("multitask_deep_classifier", MultiTaskDNN)

+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ def shuffle_data(X):
  return X


class DockingDNN(Model):
class DockingDNN(KerasModel):
  """
  Wrapper class for fitting 3D convolutional networks for deep docking.
  """

deepchem/models/model.py

deleted100644 → 0
+0 −30
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 deepchem.models.deep import SingleTaskDNN
#from deepchem.models.deep import MultiTaskDNN
#from deepchem.models.deep3d import DockingDNN
#from deepchem.models.standard import SklearnModel

#def model_builder(model_type, task_types, model_params,
#                  initialize_raw_model=True):
#  """
#  Factory function to construct model.
#  """
#  if model_type == "singletask_deep_network":
#    model = SingleTaskDNN(task_types, model_params,
#                          initialize_raw_model)
#  elif model_type == "multitask_deep_network":
#    model = MultiTaskDNN(task_types, model_params,
#                         initialize_raw_model)
#  elif model_type == "convolutional_3D_regressor":
#    model = DockingDNN(task_types, model_params,
#                       initialize_raw_model)
#  else:
#    model = SklearnModel(task_types, model_params)
#  return model