Unverified Commit ee6954ca authored by Bharath Ramsundar's avatar Bharath Ramsundar Committed by GitHub
Browse files

Merge pull request #2071 from peastman/torchmodel

Support for PyTorch based models with TorchModel
parents 17c31ef8 7db1a9a0
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -131,9 +131,9 @@ class MAML(object):
    # Create the optimizers for meta-optimization and task optimization.

    self._global_step = tf.Variable(0, trainable=False)
    self._tf_optimizer = optimizer._create_optimizer(self._global_step)
    self._tf_optimizer = optimizer._create_tf_optimizer(self._global_step)
    task_optimizer = GradientDescent(learning_rate=self.learning_rate)
    self._tf_task_optimizer = task_optimizer._create_optimizer(
    self._tf_task_optimizer = task_optimizer._create_tf_optimizer(
        self._global_step)

    # Create a Checkpoint for saving.
+5 −0
Original line number Diff line number Diff line
@@ -25,6 +25,11 @@ from deepchem.models.text_cnn import TextCNNModel
from deepchem.models.atomic_conv import AtomicConvModel
from deepchem.models.chemnet_models import Smiles2Vec, ChemCeption

try:
  from deepchem.models.torch_model import TorchModel
except ModuleNotFoundError:
  pass

#################### Compatibility imports for renamed TensorGraph models. Remove below with DeepChem 3.0. ####################

from deepchem.models.text_cnn import TextCNNTensorGraph
+2 −2
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ from deepchem.metrics import to_one_hot
from tensorflow.keras.layers import Input, Dense, Reshape, Softmax, Dropout, Activation, Lambda

from typing import Any, Callable, Iterable, List, Optional, Sequence, Tuple, Union
from deepchem.utils.typing import KerasActivationFn, KerasLossFn, OneOrMany
from deepchem.utils.typing import KerasActivationFn, LossFn, OneOrMany

logger = logging.getLogger(__name__)

@@ -299,7 +299,7 @@ class MultitaskRegressor(KerasModel):
            stddev=weight_init_stddevs[-1]),
        bias_initializer=tf.constant_initializer(
            value=bias_init_consts[-1]))(prev_layer))
    loss: Union[dc.models.losses.Loss, KerasLossFn]
    loss: Union[dc.models.losses.Loss, LossFn]
    if uncertainty:
      log_var = Reshape((n_tasks, 1))(Dense(
          n_tasks,
+7 −7
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ import numpy as np
import tensorflow as tf

from typing import List, Union, Tuple, Iterable, Dict
from deepchem.utils.typing import OneOrMany, KerasLossFn, KerasActivationFn
from deepchem.utils.typing import OneOrMany, LossFn, KerasActivationFn
from deepchem.data import Dataset, NumpyDataset, pad_features
from deepchem.feat.graph_features import ConvMolFeaturizer
from deepchem.feat.mol_graphs import ConvMol
@@ -901,7 +901,7 @@ class GraphConvModel(KerasModel):
        batch_size=batch_size)
    if mode == "classification":
      output_types = ['prediction', 'loss', 'embedding']
      loss: Union[Loss, KerasLossFn] = SoftmaxCrossEntropy()
      loss: Union[Loss, LossFn] = SoftmaxCrossEntropy()
    else:
      if self.uncertainty:
        output_types = ['prediction', 'variance', 'loss', 'loss', 'embedding']
+20 −9
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ from deepchem.trans import Transformer, undo_transforms
from deepchem.utils.evaluate import GeneratorEvaluator

from typing import Any, Callable, Dict, Iterable, List, Optional, Sequence, Tuple, Union
from deepchem.utils.typing import KerasLossFn, OneOrMany
from deepchem.utils.typing import LossFn, OneOrMany

try:
  import wandb
@@ -57,6 +57,16 @@ class KerasModel(Model):
     Keras Model class, such as uncertainty prediction and
     saliency mapping.

  Here is a simple example of code that uses KerasModel to train
  a Keras model on a DeepChem dataset.

  >> keras_model = tf.keras.Sequential([
  >>    tf.keras.layers.Dense(1000, activation='tanh'),
  >>    tf.keras.layers.Dense(1)
  >> ])
  >> model = KerasModel(keras_model, loss=dc.models.losses.L2Loss())
  >> model.fit(dataset)

  The loss function for a model can be defined in two different
  ways.  For models that have only a single output and use a
  standard loss function, you can simply provide a
@@ -118,7 +128,7 @@ class KerasModel(Model):

  def __init__(self,
               model: tf.keras.Model,
               loss: Union[Loss, KerasLossFn],
               loss: Union[Loss, LossFn],
               output_types: Optional[List[str]] = None,
               batch_size: int = 100,
               model_dir: Optional[str] = None,
@@ -157,7 +167,8 @@ class KerasModel(Model):
    log_frequency: int
      The frequency at which to log data. Data is logged using
      `logging` by default. If `tensorboard` is set, data is also
      logged to TensorBoard. Logging happens at global steps. Roughly,
      logged to TensorBoard. If `wandb` is set, data is also logged
      to Weights & Biases. Logging happens at global steps. Roughly,
      a global step corresponds to one batch of training. If you'd
      like a printout every 10 batch steps, you'd set
      `log_frequency=10` for example.
@@ -166,7 +177,7 @@ class KerasModel(Model):
        model_instance=model, model_dir=model_dir, **kwargs)
    self.model = model
    if isinstance(loss, Loss):
      self._loss_fn: KerasLossFn = _StandardLoss(model, loss)
      self._loss_fn: LossFn = _StandardLoss(model, loss)
    else:
      self._loss_fn = loss
    self.batch_size = batch_size
@@ -227,7 +238,7 @@ class KerasModel(Model):
      return
    self._built = True
    self._global_step = tf.Variable(0, trainable=False)
    self._tf_optimizer = self.optimizer._create_optimizer(self._global_step)
    self._tf_optimizer = self.optimizer._create_tf_optimizer(self._global_step)
    self._checkpoint = tf.train.Checkpoint(
        optimizer=self._tf_optimizer, model=self.model)

@@ -271,7 +282,7 @@ class KerasModel(Model):
          deterministic: bool = False,
          restore: bool = False,
          variables: Optional[List[tf.Variable]] = None,
          loss: Optional[KerasLossFn] = None,
          loss: Optional[LossFn] = None,
          callbacks: Union[Callable, List[Callable]] = [],
          all_losses: Optional[List[float]] = None) -> float:
    """Train this model on a dataset.
@@ -324,7 +335,7 @@ class KerasModel(Model):
                    checkpoint_interval: int = 1000,
                    restore: bool = False,
                    variables: Optional[List[tf.Variable]] = None,
                    loss: Optional[KerasLossFn] = None,
                    loss: Optional[LossFn] = None,
                    callbacks: Union[Callable, List[Callable]] = [],
                    all_losses: Optional[List[float]] = None) -> float:
    """Train this model on data from a generator.
@@ -480,7 +491,7 @@ class KerasModel(Model):
                   y: Sequence,
                   w: Sequence,
                   variables: Optional[List[tf.Variable]] = None,
                   loss: Optional[KerasLossFn] = None,
                   loss: Optional[LossFn] = None,
                   callbacks: Union[Callable, List[Callable]] = [],
                   checkpoint: bool = True,
                   max_checkpoints_to_keep: int = 5) -> float:
@@ -1203,7 +1214,7 @@ class _StandardLoss(object):
      raise ValueError(
          "Loss functions expects exactly one each of outputs, labels, and weights"
      )
    losses = self.loss(outputs[0], labels[0])
    losses = self.loss._compute_tf_loss(outputs[0], labels[0])
    w = weights[0]
    if len(w.shape) < len(losses.shape):
      if isinstance(w, tf.Tensor):
Loading