Commit b5095e80 authored by miaecle's avatar miaecle
Browse files

Merge remote-tracking branch 'remotes/origin/master' into BP2

parents 865c186d fbd977ac
Loading
Loading
Loading
Loading
+32 −4
Original line number Diff line number Diff line
@@ -141,17 +141,45 @@ def convert_to_layers(in_layers):


class Conv1D(Layer):
  """A 1D convolution on the input.

  def __init__(self, width, out_channels, **kwargs):
  This layer expects its input to be a three dimensional tensor of shape (batch size, width, # channels).
  """

  def __init__(self,
               width,
               out_channels,
               stride=1,
               padding='SAME',
               activation_fn=tf.nn.relu,
               **kwargs):
    """Create a Conv1D layer.

    Parameters
    ----------
    width: int
      the width of the convolutional kernel
    out_channels: int
      the number of outputs produced by the convolutional kernel
    stride: int
      the stride between applications of the convolutional kernel
    padding: str
      the padding method to use, either 'SAME' or 'VALID'
    activation_fn: object
      the Tensorflow activation function to apply to the output
    """
    self.width = width
    self.out_channels = out_channels
    self.stride = stride
    self.padding = padding
    self.activation_fn = activation_fn
    self.out_tensor = None
    super(Conv1D, self).__init__(**kwargs)

  def create_tensor(self, in_layers=None, set_tensors=True, **kwargs):
    inputs = self._get_input_tensors(in_layers)
    if len(inputs) != 1:
      raise ValueError("Only One Parent to conv1D over")
      raise ValueError("Conv1D layer must have exactly one parent")
    parent = inputs[0]
    if len(parent.get_shape()) != 3:
      raise ValueError("Parent tensor must be (batch, width, channel)")
@@ -160,9 +188,9 @@ class Conv1D(Layer):
    f = tf.Variable(
        tf.random_normal([self.width, parent_channel_size, self.out_channels]))
    b = tf.Variable(tf.random_normal([self.out_channels]))
    t = tf.nn.conv1d(parent, f, stride=1, padding="SAME")
    t = tf.nn.conv1d(parent, f, stride=self.stride, padding=self.padding)
    t = tf.nn.bias_add(t, b)
    out_tensor = tf.nn.relu(t)
    out_tensor = self.activation_fn(t)
    if set_tensors:
      self._record_variable_scope(self.name)
      self.out_tensor = out_tensor
+3.34 KiB (13.4 KiB)

File changed.

No diff preview for this file type.

+99 −2
Original line number Diff line number Diff line
@@ -940,7 +940,6 @@ class TestOverfit(test_util.TensorFlowTestCase):
    np.random.seed(123)
    tf.set_random_seed(123)

    # Load mini log-solubility dataset.
    input_file = os.path.join(self.current_dir, "example_DTNN.mat")
    dataset = scipy.io.loadmat(input_file)
    X = dataset['X']
@@ -983,7 +982,6 @@ class TestOverfit(test_util.TensorFlowTestCase):
    np.random.seed(123)
    tf.set_random_seed(123)

    # Load mini log-solubility dataset.
    input_file = os.path.join(self.current_dir, "example_DTNN.mat")
    dataset = scipy.io.loadmat(input_file)
    X = dataset['X']
@@ -1012,6 +1010,105 @@ class TestOverfit(test_util.TensorFlowTestCase):

    assert scores[regression_metric.name] > .9

  def test_ANI_multitask_regression_overfit(self):
    """Test ANI-1 regression overfits tiny data."""
    input_file = os.path.join(self.current_dir, "example_DTNN.mat")
    np.random.seed(123)
    tf.set_random_seed(123)
    dataset = scipy.io.loadmat(input_file)
    X = np.concatenate([np.expand_dims(dataset['Z'], 2), dataset['R']], axis=2)
    X = X[:, :13, :]
    y = dataset['T']
    w = np.ones_like(y)
    dataset = dc.data.DiskDataset.from_numpy(X, y, w, ids=None)
    regression_metric = dc.metrics.Metric(
        dc.metrics.pearson_r2_score, mode="regression")
    n_tasks = y.shape[1]
    batch_size = 10

    transformers = [
        dc.trans.NormalizationTransformer(transform_y=True, dataset=dataset),
        dc.trans.ANITransformer(
            max_atoms=13,
            atom_cases=[1, 6, 7, 8],
            radial_cutoff=8.,
            angular_cutoff=5.,
            radial_length=8,
            angular_length=4)
    ]

    for transformer in transformers:
      dataset = transformer.transform(dataset)

    n_feat = transformers[-1].get_num_feats() - 1
    model = dc.models.ANIRegression(
        n_tasks,
        13,
        n_feat,
        atom_number_cases=[1, 6, 7, 8],
        batch_size=batch_size,
        learning_rate=0.001,
        use_queue=False,
        mode="regression")

    # Fit trained model
    model.fit(dataset, nb_epoch=50)

    # Eval model on train
    scores = model.evaluate(dataset, [regression_metric], transformers[0:1])

    assert scores[regression_metric.name] > .8

  def test_BP_symmetry_function_overfit(self):
    """Test ANI-1 regression overfits tiny data."""
    input_file = os.path.join(self.current_dir, "example_DTNN.mat")
    np.random.seed(123)
    tf.set_random_seed(123)
    dataset = scipy.io.loadmat(input_file)
    X = np.concatenate([np.expand_dims(dataset['Z'], 2), dataset['R']], axis=2)
    X = X[:, :13, :]
    y = dataset['T']
    w = np.ones_like(y)
    dataset = dc.data.DiskDataset.from_numpy(X, y, w, ids=None)
    regression_metric = dc.metrics.Metric(
        dc.metrics.pearson_r2_score, mode="regression")
    n_tasks = y.shape[1]
    batch_size = 10

    transformers = [
        dc.trans.NormalizationTransformer(transform_y=True, dataset=dataset),
        dc.trans.ANITransformer(
            max_atoms=13,
            atom_cases=[1, 6, 7, 8],
            atomic_number_differentiated=False,
            radial_cutoff=8.,
            angular_cutoff=5.,
            radial_length=8,
            angular_length=4)
    ]

    for transformer in transformers:
      dataset = transformer.transform(dataset)

    n_feat = transformers[-1].get_num_feats() - 1
    model = dc.models.ANIRegression(
        n_tasks,
        13,
        n_feat,
        atom_number_cases=[1, 6, 7, 8],
        batch_size=batch_size,
        learning_rate=0.001,
        use_queue=False,
        mode="regression")

    # Fit trained model
    model.fit(dataset, nb_epoch=50)

    # Eval model on train
    scores = model.evaluate(dataset, [regression_metric], transformers[0:1])

    assert scores[regression_metric.name] > .8

  def test_DAG_singletask_regression_overfit(self):
    """Test DAG regressor multitask overfits tiny data."""
    np.random.seed(123)
+3 −2
Original line number Diff line number Diff line
@@ -965,11 +965,11 @@ class ANITransformer(Transformer):
  def transform_array(self, X, y, w):
    if self.transform_X:
      n_samples = X.shape[0]
      batches = np.linspace(0, n_samples, int(n_samples / 100)).astype(int)
      batches = np.linspace(0, n_samples, int(n_samples / 100) + 1).astype(int)
      X_out = []
      sess = tf.Session(graph=self.compute_graph)
      num_transformed = 0
      for i, start in enumerate(batches[:-1]):
      for i, start in enumerate(batches):
        if start == batches[-1]:
          X_batch = X[start:]
        else:
@@ -978,6 +978,7 @@ class ANITransformer(Transformer):
        X_out.append(output)
        num_transformed = num_transformed + X_batch.shape[0]
        print('%i samples transformed' % num_transformed)

      X_new = np.concatenate(X_out, axis=0)
      assert X_new.shape[0] == X.shape[0]
    return (X_new, y, w)