Commit 2dd25e25 authored by miaecle's avatar miaecle
Browse files

refinement and debug

parent 685c97f5
Loading
Loading
Loading
Loading
+38 −36
Original line number Diff line number Diff line
@@ -75,15 +75,15 @@ class WeaveLayer(Layer):
    """
    Parameters
    ----------
        n_atom_input_feat: int
    n_atom_input_feat: int, optional
      Number of features for each atom in input.
        n_pair_input_feat: int
    n_pair_input_feat: int, optional
      Number of features for each pair of atoms in input.
        n_atom_output_feat: int
    n_atom_output_feat: int, optional
      Number of features for each atom in output.
        n_pair_output_feat: int
    n_pair_output_feat: int, optional
      Number of features for each pair of atoms in output.
        n_hidden_XX: int
    n_hidden_XX: int, optional
      Number of units(convolution depths) in corresponding hidden layer
    update_pair: bool, optional
      Whether to calculate for pair features, 
@@ -96,6 +96,7 @@ class WeaveLayer(Layer):
      Dropout probability, not supported here

    """
    super(WeaveLayer, self).__init__(**kwargs)
    self.init = initializations.get(init)  # Set weight initialization
    self.activation = activations.get(activation)  # Get activations
    self.update_pair = update_pair  # last weave layer does not need to update
@@ -111,7 +112,6 @@ class WeaveLayer(Layer):
    self.n_atom_output_feat = n_atom_output_feat
    self.n_pair_output_feat = n_pair_output_feat
    self.W_AP, self.b_AP, self.W_PP, self.b_PP, self.W_P, self.b_P = None, None, None, None, None, None
    super(WeaveLayer, self).__init__(**kwargs)

  def build(self):
    """ Construct internal trainable weights.
@@ -200,6 +200,7 @@ class WeaveLayer(Layer):
      P = self.activation(P)
    else:
      P = pair_features
      
    out_tensor = [A, P]
    if set_tensors:
      self.variables = self.trainable_weights
@@ -295,6 +296,7 @@ class WeaveGather(Layer):
    if self.gaussian_expand:
      output_molecules = tf.matmul(output_molecules, self.W) + self.b
      output_molecules = self.activation(output_molecules)
      
    out_tensor = output_molecules
    if set_tensors:
      self.variables = self.trainable_weights
+46 −2
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ from collections import Sequence
import tensorflow as tf
import numpy as np

from deepchem.nn import model_ops, initializations
from deepchem.nn import model_ops, initializations, regularizers, activations


class Layer(object):
@@ -489,7 +489,6 @@ class L2Loss(Layer):
    return out_tensor



class SoftMax(Layer):

  def __init__(self, **kwargs):
@@ -1077,6 +1076,51 @@ class BatchNorm(Layer):
      self.out_tensor = out_tensor
    return out_tensor
  
class BatchNormalization(Layer):
  def __init__(self,
               epsilon=1e-5,
               axis=-1,
               momentum=0.99,
               beta_init='zero',
               gamma_init='one',
               **kwargs):
    self.beta_init = initializations.get(beta_init)
    self.gamma_init = initializations.get(gamma_init)
    self.epsilon = epsilon
    self.axis = axis
    self.momentum = momentum
    super(BatchNormalization, self).__init__(**kwargs)

  def add_weight(self, shape, initializer, name=None):
    initializer = initializations.get(initializer)
    weight = initializer(shape, name=name)
    return weight

  def build(self, input_shape):
    shape = (input_shape[self.axis],)
    self.gamma = self.add_weight(
        shape,
        initializer=self.gamma_init,
        name='{}_gamma'.format(self.name))
    self.beta = self.add_weight(
        shape,
        initializer=self.beta_init,
        name='{}_beta'.format(self.name))

  def create_tensor(self, in_layers=None, set_tensors=True, **kwargs):
    inputs = self._get_input_tensors(in_layers)
    x = inputs[0]
    input_shape = model_ops.int_shape(x)
    self.build(input_shape)
    m = model_ops.mean(x, axis=-1, keepdims=True)
    std = model_ops.sqrt(model_ops.var(x, axis=-1, keepdims=True) + self.epsilon)
    x_normed = (x - m) / (std + self.epsilon)
    x_normed = self.gamma * x_normed + self.beta
    out_tensor = x_normed
    if set_tensors:
      self.out_tensor = out_tensor
    return out_tensor

    
class WeightedError(Layer):

+5 −6
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ 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, DTNNExtract
from deepchem.models.tensorgraph.layers import Dense, Concat, SoftMax, SoftMaxCrossEntropy, GraphConv, BatchNorm, \
    GraphPool, GraphGather, WeightedError
    GraphPool, GraphGather, WeightedError, BatchNormalization
from deepchem.models.tensorgraph.layers import L2Loss, Label, Weights, Feature
from deepchem.models.tensorgraph.tensor_graph import TensorGraph
from deepchem.trans import undo_transforms
@@ -72,9 +72,9 @@ class WeaveTensorGraph(TensorGraph):
    separated = Separate_AP(in_layers=[weave_layer2])
    dense1 = Dense(
        out_channels=self.n_graph_feat,
        activation_fn=tf.nn.relu,
        activation_fn=tf.nn.tanh,
        in_layers=[separated])
    batch_norm1 = BatchNorm(in_layers=[dense1])
    batch_norm1 = BatchNormalization(epsilon=1e-5, mode=1, in_layers=[dense1])
    weave_gather = WeaveGather(
        self.batch_size,
        n_input=self.n_graph_feat,
@@ -103,7 +103,6 @@ class WeaveTensorGraph(TensorGraph):
        self.labels_fd.append(label)
        cost = L2Loss(in_layers=[label, regression])
        costs.append(cost)

    all_cost = Concat(in_layers=costs, axis=1)
    self.weights = Weights(shape=(None, self.n_tasks))
    loss = WeightedError(in_layers=[all_cost, self.weights])
@@ -162,7 +161,7 @@ class WeaveTensorGraph(TensorGraph):

        feed_dict[self.atom_features] = np.concatenate(atom_feat, axis=0)
        feed_dict[self.pair_features] = np.concatenate(pair_feat, axis=0)
        feed_dict[self.pair_split] = np.array(pair_split)
        feed_dict[self.pair_split] = pair_split
        feed_dict[self.atom_split] = np.array(atom_split)
        feed_dict[self.atom_to_pair] = np.concatenate(atom_to_pair, axis=0)
        yield feed_dict
@@ -398,7 +397,7 @@ class DAGTensorGraph(TensorGraph):
        cost = L2Loss(in_layers=[label, regression])
        costs.append(cost)

    all_cost = Concat(in_layers=costs)
    all_cost = Concat(in_layers=costs, axis=1)
    self.weights = Weights(shape=(None, self.n_tasks))
    loss = WeightedError(in_layers=[all_cost, self.weights])
    self.set_loss(loss)
+2 −1
Original line number Diff line number Diff line
@@ -69,7 +69,8 @@ class TensorGraph(Model):
        tf.train.AdamOptimizer,
        learning_rate=learning_rate,
        beta1=0.9,
        beta2=0.999)
        beta2=0.999,
        epsilon=1e-7)

    # Singular place to hold Tensor objects which don't serialize
    # These have to be reconstructed on restoring from pickle
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ model = dc.models.DAGTensorGraph(
    mode='regression')

# Fit trained model
model.fit(train_dataset, nb_epoch=50)
model.fit(train_dataset, nb_epoch=50, checkpoint_interval=100)
print("Evaluating model")
train_scores = model.evaluate(train_dataset, [metric], transformers)
valid_scores = model.evaluate(valid_dataset, [metric], transformers)
Loading