Commit 050dac26 authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Adding in mse loss.

parent 2a62b791
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ from deepchem.models.tensorgraph.layers import Feature
from deepchem.models.tensorgraph.layers import Label
from deepchem.models.tensorgraph.layers import SoftMaxCrossEntropy
from deepchem.models.tensorgraph.layers import ReduceMean
from deepchem.models.tensorgraph.layers import ReduceSquareDifference


class Sequential(TensorGraph):
@@ -53,7 +54,7 @@ class Sequential(TensorGraph):
    dataset: dc.data.Dataset
      Dataset with data
    loss: string
      Only "binary_crossentropy" for now.
      Only "binary_crossentropy" or "mse" for now.
    """
    X_shape, y_shape, _, _ = dataset.get_shape()
    # Calling fit() for first time
@@ -69,6 +70,8 @@ class Sequential(TensorGraph):

      # Add in all layers
      prev_layer = features
      if len(self._layer_list) == 0:
        raise ValueError("No layers have been added to model.")
      for ind, layer in enumerate(self._layer_list):
        if not len(layer.in_layers) == 0:
          raise ValueError("Cannot specify in_layers for Sequential.")
@@ -82,6 +85,10 @@ class Sequential(TensorGraph):
        smce = SoftMaxCrossEntropy(in_layers=[labels, prev_layer])
        self._add_layer(smce)
        self.set_loss(ReduceMean(in_layers=[smce]))
      elif loss == "mse":
        mse = ReduceSquareDifference(in_layers=[prev_layer, labels])
        self._add_layer(mse)
        self.loss = mse
      else:
        # TODO(rbharath): Add in support for additional losses.
        raise ValueError("Unsupported loss.")
+12 −0
Original line number Diff line number Diff line
@@ -36,3 +36,15 @@ class TestSequential(unittest.TestCase):
    # Should be able to call fit twice without failure.
    model.fit(dataset, loss="binary_crossentropy", nb_epoch=1000)
    model.fit(dataset, loss="binary_crossentropy", nb_epoch=1000)

  def test_single_task_regressor(self):
    n_data_points = 20
    n_features = 2
    X = np.random.rand(n_data_points, n_features)
    y = [0.5 for x in range(n_data_points)]
    dataset = dc.data.NumpyDataset(X, y)
    model = dc.models.Sequential(learning_rate=0.01)
    model.add(Dense(out_channels=1))
    model.fit(dataset, loss="mse", nb_epoch=1000)
    prediction = np.squeeze(model.predict_on_batch(X))
    assert_true(np.all(np.isclose(prediction, y, atol=3.0)))