Commit dcec083c authored by miaecle's avatar miaecle
Browse files

old-style implementation of BP

parent e1ca2abc
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -524,9 +524,10 @@ class DTNNGather(Layer):
    self.build()
    output = in_layers[0].out_tensor
    atom_membership = in_layers[1].out_tensor
    for i, W in enumerate(self.W_list):
    for i, W in enumerate(self.W_list[:-1]):
      output = tf.matmul(output, W) + self.b_list[i]
      output = self.activation(output)
    output = tf.matmul(output, self.W_list[-1]) + self.b_list[-1]
    output = tf.segment_sum(output, atom_membership)
    out_tensor = output
    if set_tensors:
@@ -535,6 +536,22 @@ class DTNNGather(Layer):
    return out_tensor


class DTNNExtract(Layer):

  def __init__(self, task_id, **kwargs):
    self.task_id = task_id
    super(DTNNExtract, self).__init__(**kwargs)

  def create_tensor(self, in_layers=None, set_tensors=True, **kwargs):
    if in_layers is None:
      in_layers = self.in_layers
    in_layers = convert_to_layers(in_layers)
    output = in_layers[0].out_tensor
    out_tensor = output[:, self.task_id:self.task_id + 1]
    self.out_tensor = out_tensor
    return out_tensor


class DAGLayer(Layer):
  """ TensorGraph style implementation
    The same as deepchem.nn.DAGLayer
+4 −4
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ import tensorflow as tf
from deepchem.feat.mol_graphs import ConvMol
from deepchem.metrics import to_one_hot, from_one_hot
from deepchem.models.tensorgraph.graph_layers import WeaveLayer, WeaveGather, \
    Combine_AP, Separate_AP, DTNNEmbedding, DTNNStep, DTNNGather, DAGLayer, DAGGather
    Combine_AP, Separate_AP, DTNNEmbedding, DTNNStep, DTNNGather, DAGLayer, DAGGather, DTNNExtract
from deepchem.models.tensorgraph.layers import Dense, Concat, SoftMax, SoftMaxCrossEntropy, GraphConv, BatchNorm, \
    GraphPool, GraphGather, WeightedError
from deepchem.models.tensorgraph.layers import L2Loss, Label, Weights, Feature
@@ -273,14 +273,14 @@ class DTNNTensorGraph(TensorGraph):
        ])
    dtnn_gather = DTNNGather(
        n_embedding=self.n_embedding,
        n_outputs=self.n_hidden,
        layer_sizes=[self.n_hidden],
        n_outputs=self.n_tasks,
        in_layers=[dtnn_layer2, self.atom_membership])

    costs = []
    self.labels_fd = []
    for task in range(self.n_tasks):
      regression = Dense(
          out_channels=1, activation_fn=None, in_layers=[dtnn_gather])
      regression = DTNNExtract(task, in_layers=[dtnn_gather])
      self.add_output(regression)

      label = Label(shape=(None, 1))
+1 −7
Original line number Diff line number Diff line
@@ -20,9 +20,6 @@ from deepchem.models.tensorgraph.layers import convert_to_layers


class DistanceMatrix(Layer):
  """ TensorGraph style implementation
    The same as deepchem.nn.WeaveGather
    """

  def __init__(self, max_atoms, **kwargs):
    """
@@ -54,9 +51,6 @@ class DistanceMatrix(Layer):


class DistanceCutoff(Layer):
  """ TensorGraph style implementation
    The same as deepchem.nn.WeaveGather
    """

  def __init__(self, max_atoms, cutoff=6 / 0.52917721092, **kwargs):
    """
+37 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ __license__ = "MIT"

import tensorflow as tf
from deepchem.nn.layers import GraphGather
from deepchem.models.tf_new_models.graph_topology import GraphTopology, DTNNGraphTopology, DAGGraphTopology, WeaveGraphTopology, AlternateWeaveGraphTopology
from deepchem.models.tf_new_models.graph_topology import GraphTopology, DTNNGraphTopology, DAGGraphTopology, WeaveGraphTopology, AlternateWeaveGraphTopology, BPSymmetryFunctionGraphTopology


class SequentialGraph(object):
@@ -120,6 +120,42 @@ class SequentialDTNNGraph(SequentialGraph):
      self.layers.append(layer)


class BPSymmetryFunctionGraph(SequentialGraph):

  def __init__(self, max_atoms):
    self.graph = tf.Graph()
    with self.graph.as_default():
      self.graph_topology = BPSymmetryFunctionGraphTopology(max_atoms)
    self.layers = []

  def add(self, layer):
    """Adds a new layer to model."""
    with self.graph.as_default():
      if type(layer).__name__ in ['DistanceMatrix']:
        self.d = layer(self.graph_topology.inputs)
      elif type(layer).__name__ in ['DistanceCutoff']:
        self.d_cutoff = layer(
            [self.d, self.graph_topology.atom_flag_placeholder])
      elif type(layer).__name__ in ['RadialSymmetry']:
        self.symmetry1 = layer([self.d_cutoff, self.d])
      elif type(layer).__name__ in ['AngularSymmetry']:
        self.symmetry2 = layer(
            [self.d_cutoff, self.d, self.graph_topology.atom_coordinates])
      elif type(layer).__name__ in ['DTNNEmbedding']:
        self.atom_embedding = layer(self.graph_topology.atom_number_placeholder)
      elif type(layer).__name__ in ['BPFeatureMerge']:
        self.output = layer([
            self.atom_embedding, self.symmetry1, self.symmetry2,
            self.graph_topology.atom_flag_placeholder
        ])
      elif type(layer).__name__ in ['BPGather']:
        self.output = layer(
            [self.output, self.graph_topology.atom_flag_placeholder])
      else:
        self.output = layer(self.output)
      self.layers.append(layer)


class SequentialDAGGraph(SequentialGraph):
  """SequentialGraph for DAG models
  """
+39 −0
Original line number Diff line number Diff line
@@ -260,6 +260,45 @@ class DTNNGraphTopology(GraphTopology):
    return dict_DTNN


class BPSymmetryFunctionGraphTopology(GraphTopology):

  def __init__(self, max_atoms, name='DTNN_topology'):
    self.name = name
    self.max_atoms = max_atoms

    self.atom_number_placeholder = tf.placeholder(
        dtype='int32',
        shape=(None, self.max_atoms),
        name=self.name + '_atom_number')
    self.atom_flag_placeholder = tf.placeholder(
        dtype='float32',
        shape=(None, self.max_atoms, self.max_atoms),
        name=self.name + '_atom_flag')
    self.atom_coordinates = tf.placeholder(
        dtype='float32',
        shape=(None, self.max_atoms, 3),
        name=self.name + '_coordinates')

    # Define the list of tensors to be used as topology
    self.topology = [self.atom_coordinates, self.atom_flag_placeholder]
    self.inputs = [self.atom_number_placeholder]
    self.inputs += self.topology

  def get_atom_number_placeholder(self):
    return self.atom_number_placeholder

  def batch_to_feed_dict(self, batch):

    feed_dict = dict()
    flags = np.sign(np.array(batch[:, :, 0]))
    feed_dict[self.atom_flag_placeholder] = np.stack([flags]*self.max_atoms, axis=2)*\
            np.stack([flags]*self.max_atoms, axis=1)
    feed_dict[self.atom_number_placeholder] = np.array(
        batch[:, :, 0], dtype=int)
    feed_dict[self.atom_coordinates] = np.array(batch[:, :, 1:], dtype=float)
    return feed_dict


class DAGGraphTopology(GraphTopology):
  """GraphTopology for DAG models
  """
Loading