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

Merge pull request #2538 from peastman/uncertainty

Fixed errors in training models with uncertainty
parents 595d13b2 9af6acf3
Loading
Loading
Loading
Loading
+39 −6
Original line number Diff line number Diff line
@@ -692,8 +692,19 @@ class DAGModel(KerasModel):
        output_types = ['prediction', 'variance', 'loss', 'loss']

        def loss(outputs, labels, weights):
          diff = labels[0] - outputs[0]
          return tf.reduce_mean(diff * diff / tf.exp(outputs[1]) + outputs[1])
          output, labels = dc.models.losses._make_tf_shapes_consistent(
              outputs[0], labels[0])
          output, labels = dc.models.losses._ensure_float(output, labels)
          losses = tf.square(output - labels) / tf.exp(outputs[1]) + outputs[1]
          w = weights[0]
          if len(w.shape) < len(losses.shape):
            if tf.is_tensor(w):
              shape = tuple(w.shape.as_list())
            else:
              shape = w.shape
            shape = tuple(-1 if x is None else x for x in shape)
            w = tf.reshape(w, shape + (1,) * (len(losses.shape) - len(w.shape)))
          return tf.reduce_mean(losses * w) + sum(self.model.losses)
      else:
        outputs = [output]
        output_types = ['prediction']
@@ -960,8 +971,19 @@ class GraphConvModel(KerasModel):
        output_types = ['prediction', 'variance', 'loss', 'loss', 'embedding']

        def loss(outputs, labels, weights):
          diff = labels[0] - outputs[0]
          return tf.reduce_mean(diff * diff / tf.exp(outputs[1]) + outputs[1])
          output, labels = dc.models.losses._make_tf_shapes_consistent(
              outputs[0], labels[0])
          output, labels = dc.models.losses._ensure_float(output, labels)
          losses = tf.square(output - labels) / tf.exp(outputs[1]) + outputs[1]
          w = weights[0]
          if len(w.shape) < len(losses.shape):
            if tf.is_tensor(w):
              shape = tuple(w.shape.as_list())
            else:
              shape = w.shape
            shape = tuple(-1 if x is None else x for x in shape)
            w = tf.reshape(w, shape + (1,) * (len(losses.shape) - len(w.shape)))
          return tf.reduce_mean(losses * w) + sum(self.model.losses)
      else:
        output_types = ['prediction', 'embedding']
        loss = L2Loss()
@@ -1101,8 +1123,19 @@ class MPNNModel(KerasModel):
        output_types = ['prediction', 'variance', 'loss', 'loss']

        def loss(outputs, labels, weights):
          diff = labels[0] - outputs[0]
          return tf.reduce_mean(diff * diff / tf.exp(outputs[1]) + outputs[1])
          output, labels = dc.models.losses._make_tf_shapes_consistent(
              outputs[0], labels[0])
          output, labels = dc.models.losses._ensure_float(output, labels)
          losses = tf.square(output - labels) / tf.exp(outputs[1]) + outputs[1]
          w = weights[0]
          if len(w.shape) < len(losses.shape):
            if tf.is_tensor(w):
              shape = tuple(w.shape.as_list())
            else:
              shape = w.shape
            shape = tuple(-1 if x is None else x for x in shape)
            w = tf.reshape(w, shape + (1,) * (len(losses.shape) - len(w.shape)))
          return tf.reduce_mean(losses * w) + sum(self.model.losses)
      else:
        outputs = [output]
        output_types = ['prediction']
+11 −0
Original line number Diff line number Diff line
@@ -769,6 +769,17 @@ def test_multitask_regressor_uncertainty():
  assert noise < np.mean(std) < 1.0


def test_multitask_regressor_delaney_uncertainty():
  """Test computing uncertainty on a larger dataset."""
  tasks, datasets, transformers = dc.molnet.load_delaney('ECFP')
  train_dataset, valid_dataset, test_dataset = datasets
  model = dc.models.MultitaskRegressor(len(tasks), 1024, uncertainty=True)
  model.fit(train_dataset, nb_epoch=20)
  metric = dc.metrics.Metric(dc.metrics.pearsonr)
  scores = model.evaluate(test_dataset, [metric], transformers)
  assert scores['pearsonr'] > 0.5


@pytest.mark.slow
def test_DAG_singletask_regression_overfit():
  """Test DAG regressor multitask overfits tiny data."""