Commit e9b15fcd authored by peastman's avatar peastman
Browse files

Removed ANIRegression's nonstandard saving mechanism

parent 84398f9f
Loading
Loading
Loading
Loading
+0 −61
Original line number Diff line number Diff line
@@ -432,64 +432,3 @@ class ANIRegression(TensorGraph):
        tensors[self.labels[0]] = labels

    return tensors

  def save_numpy(self):
    """
    Save to a portable numpy file. Note that this relies on the names to be consistent
    across different versions. The file is saved as save_pickle.npz under the model_dir.

    """
    path = os.path.join(self.model_dir, "save_pickle.npz")

    with self._get_tf("Graph").as_default():
      all_vars = tf.trainable_variables()
      all_vals = self.session.run(all_vars)
      save_dict = {}
      for idx, _ in enumerate(all_vars):
        save_dict[all_vars[idx].name] = all_vals[idx]

      save_dict["_kwargs"] = np.array(
          [json.dumps(self._kwargs)], dtype=np.string_)

      np.savez(path, **save_dict)

  @classmethod
  def load_numpy(cls, model_dir):
    """
    Load from a portable numpy file.

    Parameters
    ----------
    model_dir: str
      Location of the model directory.

    """
    path = os.path.join(model_dir, "save_pickle.npz")
    npo = np.load(path)

    json_blob = npo["_kwargs"][0].decode('UTF-8')

    kwargs = json.loads(json_blob)

    obj = cls(**kwargs)
    obj.build()

    all_ops = []

    g = obj._get_tf("Graph")

    with g.as_default():
      all_vars = tf.trainable_variables()
      for k in npo.keys():

        if k == "_kwargs":
          continue

        val = npo[k]
        tensor = g.get_tensor_by_name(k)
        if tensor.dtype != tf.resource:  # workaround for save_counter incorrectly being marked as a trainable variable
          all_ops.append(tf.assign(tensor, val))

      obj.session.run(all_ops)

    return obj
+0 −31
Original line number Diff line number Diff line
@@ -122,37 +122,6 @@ class TestANIRegression(unittest.TestCase):
    assert min_coords[2][1] == new_x[7]
    assert min_coords[2][2] == new_x[8]

  def test_numpy_save_load(self):

    self.model.save_numpy()
    restored_model = ANIRegression.load_numpy(self.model_dir)

    new_x = np.array([
        -2.0,
        1.2,
        2.1,
        1.3,
        -6.4,
        3.1,
        -2.5,
        2.4,
        5.6,
    ])

    new_atomic_nums = np.array([1, 1, 6])

    expected = self.model.pred_one(new_x, new_atomic_nums)
    predicted = restored_model.pred_one(new_x, new_atomic_nums)

    assert self.model.n_tasks == restored_model.n_tasks
    assert self.model.max_atoms == restored_model.max_atoms
    assert self.model.layer_structures == restored_model.layer_structures
    assert self.model.atom_number_cases == restored_model.atom_number_cases
    assert self.model.batch_size == restored_model.batch_size
    assert self.model.use_queue == restored_model.use_queue

    assert expected == predicted


if __name__ == '__main__':
  unittest.main()
+53 −61
Original line number Diff line number Diff line
@@ -202,10 +202,6 @@ if __name__ == "__main__":
      dc.metrics.Metric(dc.metrics.pearson_r2_score, mode="regression")
  ]

  if os.path.exists(model_dir):
    print("Restoring existing model...")
    model = dc.models.ANIRegression.load_numpy(model_dir=model_dir)
  else:
  print("Fitting new model...")

  train_valid_dataset, test_dataset, all_groups = load_roiterberg_ANI(
@@ -245,10 +241,6 @@ if __name__ == "__main__":
  for i in range(10):
    model.fit(train_dataset, nb_epoch=1, checkpoint_interval=100)

      print("Saving model...")
      model.save_numpy()
      print("Done.")

  print("Evaluating model")
  train_scores = model.evaluate(train_dataset, metric, transformers)
  valid_scores = model.evaluate(valid_dataset, metric, transformers)