Unverified Commit c5a7c6ff authored by peastman's avatar peastman Committed by GitHub
Browse files

Merge pull request #1567 from peastman/layers

Replaced uses of deprecated layers
parents 358a54eb 91d325de
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -101,6 +101,9 @@ class MAML(object):
    """
    # Record inputs.

    raise Exception(
        'MAML does not currently work correctly.  It needs to be rewritten to be compatible with modern TensorFlow'
    )
    self.learner = learner
    if isinstance(learner.loss, Layer):
      self._loss = learner.loss.out_tensor
+89 −90
Original line number Diff line number Diff line
@@ -6,93 +6,92 @@ import numpy as np
import tensorflow as tf
import unittest


class TestMAML(unittest.TestCase):

  @flaky
  def test_sine(self):
    """Test meta-learning for sine function."""

    # This is a MetaLearner that learns to generate sine functions with variable
    # amplitude and phase.

    class SineLearner(dc.metalearning.MetaLearner):

      def __init__(self):
        self.batch_size = 10
        self.tg = dc.models.TensorGraph(use_queue=False)
        self.features = Feature(shape=(None, 1))
        self.labels = Label(shape=(None, 1))
        hidden1 = Dense(
            in_layers=self.features, out_channels=40, activation_fn=tf.nn.relu)
        hidden2 = Dense(
            in_layers=hidden1, out_channels=40, activation_fn=tf.nn.relu)
        output = Dense(in_layers=hidden2, out_channels=1)
        loss = L2Loss(in_layers=[output, self.labels])
        self.tg.add_output(output)
        self.tg.set_loss(loss)
        with self.tg._get_tf("Graph").as_default():
          self.tg.build()

      @property
      def loss(self):
        return self.tg.loss

      def select_task(self):
        self.amplitude = 5.0 * np.random.random()
        self.phase = np.pi * np.random.random()

      def get_batch(self):
        x = np.random.uniform(-5.0, 5.0, (self.batch_size, 1))
        feed_dict = {}
        feed_dict[self.features.out_tensor] = x
        feed_dict[self.labels.out_tensor] = self.amplitude * np.sin(
            x + self.phase)
        return feed_dict

    # Optimize it.

    learner = SineLearner()
    maml = dc.metalearning.MAML(learner, meta_batch_size=4)
    maml.fit(12000)

    # Test it out on some new tasks and see how it works.

    loss1 = []
    loss2 = []
    for i in range(50):
      learner.select_task()
      feed_dict = learner.get_batch()
      for key, value in learner.get_batch().items():
        feed_dict[maml._meta_placeholders[key]] = value
      loss1.append(
          np.average(
              np.sqrt(maml._session.run(maml._loss, feed_dict=feed_dict))))
      loss2.append(
          np.average(
              np.sqrt(maml._session.run(maml._meta_loss, feed_dict=feed_dict))))

    # Initially the model should do a bad job of fitting the sine function.

    assert np.average(loss1) > 1.0

    # After one step of optimization it should do much better.

    assert np.average(loss2) < 1.0

    # Verify that we can create a new MAML object, reload the parameters from the first one, and
    # get the same result.

    new_maml = dc.metalearning.MAML(learner, model_dir=maml.model_dir)
    new_maml.restore()
    new_loss = np.average(
        np.sqrt(new_maml._session.run(new_maml._loss, feed_dict=feed_dict)))
    assert new_loss == loss1[-1]

    # Do the same thing, only using the "restore" argument to fit().

    new_maml = dc.metalearning.MAML(learner, model_dir=maml.model_dir)
    new_maml.fit(0, restore=True)
    new_loss = np.average(
        np.sqrt(new_maml._session.run(new_maml._loss, feed_dict=feed_dict)))
    assert new_loss == loss1[-1]
# class TestMAML(unittest.TestCase):
#
#   @flaky
#   def test_sine(self):
#     """Test meta-learning for sine function."""
#
#     # This is a MetaLearner that learns to generate sine functions with variable
#     # amplitude and phase.
#
#     class SineLearner(dc.metalearning.MetaLearner):
#
#       def __init__(self):
#         self.batch_size = 10
#         self.tg = dc.models.TensorGraph(use_queue=False)
#         self.features = Feature(shape=(None, 1))
#         self.labels = Label(shape=(None, 1))
#         hidden1 = Dense(
#             in_layers=self.features, out_channels=40, activation_fn=tf.nn.relu)
#         hidden2 = Dense(
#             in_layers=hidden1, out_channels=40, activation_fn=tf.nn.relu)
#         output = Dense(in_layers=hidden2, out_channels=1)
#         loss = L2Loss(in_layers=[output, self.labels])
#         self.tg.add_output(output)
#         self.tg.set_loss(loss)
#         with self.tg._get_tf("Graph").as_default():
#           self.tg.build()
#
#       @property
#       def loss(self):
#         return self.tg.loss
#
#       def select_task(self):
#         self.amplitude = 5.0 * np.random.random()
#         self.phase = np.pi * np.random.random()
#
#       def get_batch(self):
#         x = np.random.uniform(-5.0, 5.0, (self.batch_size, 1))
#         feed_dict = {}
#         feed_dict[self.features.out_tensor] = x
#         feed_dict[self.labels.out_tensor] = self.amplitude * np.sin(
#             x + self.phase)
#         return feed_dict
#
#     # Optimize it.
#
#     learner = SineLearner()
#     maml = dc.metalearning.MAML(learner, meta_batch_size=4)
#     maml.fit(12000)
#
#     # Test it out on some new tasks and see how it works.
#
#     loss1 = []
#     loss2 = []
#     for i in range(50):
#       learner.select_task()
#       feed_dict = learner.get_batch()
#       for key, value in learner.get_batch().items():
#         feed_dict[maml._meta_placeholders[key]] = value
#       loss1.append(
#           np.average(
#               np.sqrt(maml._session.run(maml._loss, feed_dict=feed_dict))))
#       loss2.append(
#           np.average(
#               np.sqrt(maml._session.run(maml._meta_loss, feed_dict=feed_dict))))
#
#     # Initially the model should do a bad job of fitting the sine function.
#
#     assert np.average(loss1) > 1.0
#
#     # After one step of optimization it should do much better.
#
#     assert np.average(loss2) < 1.0
#
#     # Verify that we can create a new MAML object, reload the parameters from the first one, and
#     # get the same result.
#
#     new_maml = dc.metalearning.MAML(learner, model_dir=maml.model_dir)
#     new_maml.restore()
#     new_loss = np.average(
#         np.sqrt(new_maml._session.run(new_maml._loss, feed_dict=feed_dict)))
#     assert new_loss == loss1[-1]
#
#     # Do the same thing, only using the "restore" argument to fit().
#
#     new_maml = dc.metalearning.MAML(learner, model_dir=maml.model_dir)
#     new_maml.fit(0, restore=True)
#     new_loss = np.average(
#         np.sqrt(new_maml._session.run(new_maml._loss, feed_dict=feed_dict)))
#     assert new_loss == loss1[-1]
+4 −4
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ class IRVLayer(Layer):
    out_tensor = tf.concat(outputs, axis=1)

    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

@@ -72,12 +72,12 @@ class IRVLayer(Layer):
    V, W, b, b2 = self.V, self.W, self.b, self.b2
    self.V, self.W, self.b, self.b2 = None, None, None, None

    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return V, W, b, b2, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.V, self.W, self.b, self.b2, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.V, self.W, self.b, self.b2, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class IRVRegularize(Layer):
+36 −36
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ class WeaveLayer(Layer):

    self.out_tensors = [A, P]
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = A
    return self.out_tensors

@@ -177,8 +177,8 @@ class WeaveLayer(Layer):
    W_AA, b_AA, W_PA, b_PA, W_A, b_A = self.W_AA, self.b_AA, self.W_PA, self.b_PA, self.W_A, self.b_A
    self.W_AA, self.b_AA, self.W_PA, self.b_PA, self.W_A, self.b_A = None, None, None, None, None, None

    out_tensor, out_tensors, trainable_weights, variables = self.out_tensor, self.out_tensors, self.trainable_weights, self.variables
    self.out_tensor, self.out_tensors, self.trainable_weights, self.variables = None, [], [], []
    out_tensor, out_tensors, trainable_weights, variables = self.out_tensor, self.out_tensors, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.out_tensors, self.trainable_weights, self.trainable_variables = None, [], [], []

    return W_AP, b_AP, W_PP, W_PP, W_P, b_P, \
           W_AA, b_AA, W_PA, b_PA, W_A, b_A, \
@@ -187,7 +187,7 @@ class WeaveLayer(Layer):
  def set_tensors(self, tensor):
    self.W_AP, self.b_AP, self.W_PP, self.W_PP, self.W_P, self.b_P, \
    self.W_AA, self.b_AA, self.W_PA, self.b_PA, self.W_A, self.b_A, \
    self.out_tensor, self.out_tensors, self.trainable_weights, self.variables = tensor
    self.out_tensor, self.out_tensors, self.trainable_weights, self.trainable_variables = tensor


def WeaveLayerFactory(**kwargs):
@@ -266,7 +266,7 @@ class WeaveGather(Layer):

    out_tensor = output_molecules
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

@@ -290,12 +290,12 @@ class WeaveGather(Layer):
    W, b = self.W, self.b
    self.W, self.b = None, None

    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return W, b, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.W, self.b, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.W, self.b, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class DTNNEmbedding(Layer):
@@ -341,19 +341,19 @@ class DTNNEmbedding(Layer):
    atom_features = tf.nn.embedding_lookup(self.embedding_list, atom_number)
    out_tensor = atom_features
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = atom_features
    return out_tensor

  def none_tensors(self):
    embedding_list = self.embedding_list
    self.embedding_list = None
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return embedding_list, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.embedding_list, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.embedding_list, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class DTNNStep(Layer):
@@ -436,19 +436,19 @@ class DTNNStep(Layer):
                             distance_membership_i) - output_ii + atom_features
    out_tensor = outputs
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

  def none_tensors(self):
    W_cf, W_df, W_fc, b_cf, b_df = self.W_cf, self.W_df, self.W_fc, self.b_cf, self.b_df
    self.W_cf, self.W_df, self.W_fc, self.b_cf, self.b_df = None, None, None, None, None
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return W_cf, W_df, W_fc, b_cf, b_df, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.W_cf, self.W_df, self.W_fc, self.b_cf, self.b_df, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.W_cf, self.W_df, self.W_fc, self.b_cf, self.b_df, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class DTNNGather(Layer):
@@ -524,19 +524,19 @@ class DTNNGather(Layer):
    output = tf.segment_sum(output, atom_membership)
    out_tensor = output
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

  def none_tensors(self):
    W_list, b_list = self.W_list, self.b_list
    self.W_list, self.b_list = [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return W_list, b_list, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.W_list, self.b_list, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.W_list, self.b_list, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class DTNNExtract(Layer):
@@ -694,7 +694,7 @@ class DAGLayer(Layer):

    out_tensor = batch_outputs
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

@@ -711,12 +711,12 @@ class DAGLayer(Layer):
  def none_tensors(self):
    W_list, b_list = self.W_list, self.b_list
    self.W_list, self.b_list = [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return W_list, b_list, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.W_list, self.b_list, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.W_list, self.b_list, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class DAGGather(Layer):
@@ -803,7 +803,7 @@ class DAGGather(Layer):
                                 **kwargs)
    out_tensor = outputs
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

@@ -820,12 +820,12 @@ class DAGGather(Layer):
  def none_tensors(self):
    W_list, b_list = self.W_list, self.b_list
    self.W_list, self.b_list = [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return W_list, b_list, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.W_list, self.b_list, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.W_list, self.b_list, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor


class MessagePassing(Layer):
@@ -898,19 +898,19 @@ class MessagePassing(Layer):
    out_tensor = out

    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

  def none_tensors(self):
    message_tensors = self.message_function.none_tensors()
    update_tensors = self.update_function.none_tensors()
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return message_tensors, update_tensors, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    message_tensors, update_tensors, self.out_tensor, self.trainable_weights, self.variables = tensor
    message_tensors, update_tensors, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor
    self.message_function.set_tensors(message_tensors)
    self.update_function.set_tensors(update_tensors)

@@ -1048,7 +1048,7 @@ class SetGather(Layer):

    out_tensor = q_star
    if set_tensors:
      self.variables = self.trainable_weights
      self.trainable_variables = self.trainable_weights
      self.out_tensor = out_tensor
    return out_tensor

@@ -1067,9 +1067,9 @@ class SetGather(Layer):
  def none_tensors(self):
    U, b, c, h = self.U, self.b, self.c, self.h
    self.U, self.b, self.c, self.h = None, None, None, None
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.variables
    self.out_tensor, self.trainable_weights, self.variables = None, [], []
    out_tensor, trainable_weights, variables = self.out_tensor, self.trainable_weights, self.trainable_variables
    self.out_tensor, self.trainable_weights, self.trainable_variables = None, [], []
    return U, b, c, h, out_tensor, trainable_weights, variables

  def set_tensors(self, tensor):
    self.U, self.b, self.c, self.h, self.out_tensor, self.trainable_weights, self.variables = tensor
    self.U, self.b, self.c, self.h, self.out_tensor, self.trainable_weights, self.trainable_variables = tensor
+124 −234

File changed.

Preview size limit exceeded, changes collapsed.

Loading