Commit bb86fa8f authored by miaecle's avatar miaecle
Browse files

BPSymmetryFunction change

parent 2c33ff1a
Loading
Loading
Loading
Loading
+18 −37
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ from deepchem.models.tensorgraph.symmetry_functions import DistanceMatrix, \

class BPSymmetryFunctionRegression(TensorGraph):

  def __init__(self, n_tasks, max_atoms, n_hidden=40, n_embedding=10, **kwargs):
  def __init__(self, n_tasks, max_atoms, n_feat=96, layer_structures=[128, 64], **kwargs):
    """
    Parameters
    ----------
@@ -32,49 +32,30 @@ class BPSymmetryFunctionRegression(TensorGraph):
    """
    self.n_tasks = n_tasks
    self.max_atoms = max_atoms
    self.n_hidden = n_hidden
    self.n_embedding = n_embedding
    self.n_feat = n_feat
    self.layer_structures = layer_structures
    super(BPSymmetryFunctionRegression, self).__init__(**kwargs)
    self.build_graph()

  def build_graph(self):
    self.atom_numbers = Feature(shape=(None, self.max_atoms), dtype=tf.int32)
    self.atom_flags = Feature(shape=(None, self.max_atoms, self.max_atoms))
    self.atom_coordinates = Feature(shape=(None, self.max_atoms, 3))

    distance_matrix = DistanceMatrix(
        self.max_atoms, in_layers=[self.atom_coordinates, self.atom_flags])
    distance_cutoff = DistanceCutoff(
        self.max_atoms,
        cutoff=6 / 0.52917721092,
        in_layers=[distance_matrix, self.atom_flags])
    radial_symmetry = RadialSymmetry(
        self.max_atoms, in_layers=[distance_cutoff, distance_matrix])
    angular_symmetry = AngularSymmetry(
        self.max_atoms,
        in_layers=[distance_cutoff, distance_matrix, self.atom_coordinates])
    atom_embedding = DTNNEmbedding(
        n_embedding=self.n_embedding, in_layers=[self.atom_numbers])

    feature_merge = BPFeatureMerge(
        self.max_atoms,
        in_layers=[
            atom_embedding, radial_symmetry, angular_symmetry, self.atom_flags
        ])
    self.atom_feats = Feature(shape=(None, self.max_atoms, self.n_feat))
    previous_layer = self.atom_feats

    Hiddens = []
    for n_hidden in self.layer_structures:
      Hidden = Dense(
        out_channels=self.n_hidden,
        activation_fn=tf.nn.tanh,
        in_layers=[feature_merge])
    Hidden2 = Dense(
        out_channels=self.n_hidden,
          out_channels=n_hidden,
          activation_fn=tf.nn.tanh,
        in_layers=[Hidden])
          in_layers=[previous_layer])
      Hiddens.append(Hidden)
      previous_layer = Hiddens[-1]

    costs = []
    self.labels_fd = []
    for task in range(self.n_tasks):
      regression = Dense(
          out_channels=1, activation_fn=None, in_layers=[Hidden2])
          out_channels=1, activation_fn=None, in_layers=[Hiddens[-1]])
      output = BPGather(self.max_atoms, in_layers=[regression, self.atom_flags])
      self.add_output(output)

@@ -88,6 +69,7 @@ class BPSymmetryFunctionRegression(TensorGraph):
    loss = WeightedError(in_layers=[all_cost, self.weights])
    self.set_loss(loss)


  def default_generator(self,
                        dataset,
                        epochs=1,
@@ -111,8 +93,7 @@ class BPSymmetryFunctionRegression(TensorGraph):
        flags = np.sign(np.array(X_b[:, :, 0]))
        feed_dict[self.atom_flags] = np.stack([flags]*self.max_atoms, axis=2)*\
            np.stack([flags]*self.max_atoms, axis=1)
        feed_dict[self.atom_numbers] = np.array(X_b[:, :, 0], dtype=int)
        feed_dict[self.atom_coordinates] = np.array(X_b[:, :, 1:], dtype=float)
        feed_dict[self.atom_feats] = np.array(X_b[:, :, 1:], dtype=float)
        yield feed_dict

class ANIRegression(TensorGraph):
+26 −18
Original line number Diff line number Diff line
@@ -937,6 +937,7 @@ class ANITransformer(Transformer):
               radial_length=32,
               angular_length=8,
               atom_cases=[1, 6, 7, 8, 16],
               atomic_number_differentiated=True,
               coordinates_in_bohr=True,
               transform_X=True,
               transform_y=False,
@@ -950,6 +951,7 @@ class ANITransformer(Transformer):
    self.radial_length = radial_length
    self.angular_length = angular_length
    self.atom_cases = atom_cases
    self.atomic_number_differentiated = atomic_number_differentiated
    self.coordinates_in_bohr = coordinates_in_bohr
    self.transform_X = transform_X
    self.transform_y = transform_y
@@ -1039,6 +1041,7 @@ class ANITransformer(Transformer):
    ita = tf.to_float(np.reshape(ita, (1, 1, 1, -1)))

    out = tf.exp(-ita * tf.square(d - Rs)) * d_cutoff
    if self.atomic_number_differentiated:
      out_tensors = []
      for atom_type in self.atom_cases:
        selected_atoms = tf.expand_dims(
@@ -1046,6 +1049,8 @@ class ANITransformer(Transformer):
            axis=3)
        out_tensors.append(tf.reduce_sum(out * selected_atoms, axis=2))
      return tf.concat(out_tensors, axis=2)
    else:
      return tf.reduce_sum(out, axis=2)


  def angular_symmetry(self, d_cutoff, d, atom_numbers, coordinates):
@@ -1088,6 +1093,7 @@ class ANITransformer(Transformer):
    out_tensor = tf.pow((1. + tf.cos(theta - thetas))/2., zeta) * \
        tf.exp(-ita * tf.square((R_ij + R_ik)/2. - Rs)) * f_R_ij * f_R_ik
    
    if self.atomic_number_differentiated:
      out_tensors = []
      for id_j, atom_type_j in enumerate(self.atom_cases):
        for atom_type_k in self.atom_cases[id_j:]:
@@ -1098,6 +1104,8 @@ class ANITransformer(Transformer):
          out_tensors.append(
                tf.reduce_sum(out_tensor * selected_atoms, axis=(2, 3)))
      return tf.concat(out_tensors, axis=2)
    else:
      return tf.reduce_sum(out_tensor, axis=(2, 3))

  def get_num_feats(self):
    n_feat = self.outputs.get_shape().as_list()[-1]
+14 −8
Original line number Diff line number Diff line
@@ -14,23 +14,29 @@ tasks, datasets, transformers = dc.molnet.load_qm7_from_mat(
    featurizer='BPSymmetryFunction')
train_dataset, valid_dataset, test_dataset = datasets

# Batch size of models
max_atoms = 23
batch_size = 16
layer_structures = [128, 128, 64]

ANItransformer = dc.trans.ANITransformer(max_atoms=max_atoms,
                                         atomic_number_differentiated=False)
train_dataset = ANItransformer.transform(train_dataset)
valid_dataset = ANItransformer.transform(valid_dataset)
test_dataset = ANItransformer.transform(test_dataset)
n_feat = ANItransformer.get_num_feats() - 1

# Fit models
metric = [
    dc.metrics.Metric(dc.metrics.mean_absolute_error, mode="regression"),
    dc.metrics.Metric(dc.metrics.pearson_r2_score, mode="regression")
]

# Batch size of models
max_atoms = 23
n_hidden = 40
n_embedding = 0
batch_size = 16

model = dc.models.BPSymmetryFunctionRegression(
    len(tasks),
    max_atoms,
    n_hidden=n_hidden,
    n_embedding=n_embedding,
    n_feat,
    layer_structures=layer_structures,
    batch_size=batch_size,
    learning_rate=0.001,
    use_queue=False,