Unverified Commit 704bcaf6 authored by Hongzhi (Steve), Chen's avatar Hongzhi (Steve), Chen Committed by GitHub
Browse files
parent 6bc82161
...@@ -10,6 +10,7 @@ import torch.nn.functional as F ...@@ -10,6 +10,7 @@ import torch.nn.functional as F
from dgl.data import CoraGraphDataset from dgl.data import CoraGraphDataset
from torch.optim import Adam from torch.optim import Adam
################################################################################ ################################################################################
# (HIGHLIGHT) Take the advantage of DGL sparse APIs to implement the feature # (HIGHLIGHT) Take the advantage of DGL sparse APIs to implement the feature
# pre-computation. # pre-computation.
......
...@@ -13,6 +13,7 @@ import torch.nn.functional as F ...@@ -13,6 +13,7 @@ import torch.nn.functional as F
from dgl.data import CoraGraphDataset from dgl.data import CoraGraphDataset
from torch.optim import Adam from torch.optim import Adam
################################################################################ ################################################################################
# (HIGHLIGHT) Take the advantage of DGL sparse APIs to implement the feature # (HIGHLIGHT) Take the advantage of DGL sparse APIs to implement the feature
# diffusion in SIGN laconically. # diffusion in SIGN laconically.
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
This code was copied from the GCN implementation in DGL examples. This code was copied from the GCN implementation in DGL examples.
""" """
import tensorflow as tf import tensorflow as tf
from tensorflow.keras import layers
from dgl.nn.tensorflow import GraphConv from dgl.nn.tensorflow import GraphConv
from tensorflow.keras import layers
class GCN(layers.Layer): class GCN(layers.Layer):
......
import argparse import argparse
import time import time
import dgl
import networkx as nx import networkx as nx
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
from dgi import DGI, Classifier from dgi import Classifier, DGI
from tensorflow.keras import layers
import dgl
from dgl.data import ( from dgl.data import (
CiteseerGraphDataset, CiteseerGraphDataset,
CoraGraphDataset, CoraGraphDataset,
PubmedGraphDataset, PubmedGraphDataset,
register_data_args, register_data_args,
) )
from tensorflow.keras import layers
def evaluate(model, features, labels, mask): def evaluate(model, features, labels, mask):
......
...@@ -7,11 +7,10 @@ Author's code: https://github.com/PetarV-/GAT ...@@ -7,11 +7,10 @@ Author's code: https://github.com/PetarV-/GAT
Pytorch implementation: https://github.com/Diego999/pyGAT Pytorch implementation: https://github.com/Diego999/pyGAT
""" """
import tensorflow as tf
from tensorflow.keras import layers
import dgl.function as fn import dgl.function as fn
import tensorflow as tf
from dgl.nn import GATConv from dgl.nn import GATConv
from tensorflow.keras import layers
class GAT(tf.keras.Model): class GAT(tf.keras.Model):
......
...@@ -13,19 +13,19 @@ Pytorch implementation: https://github.com/Diego999/pyGAT ...@@ -13,19 +13,19 @@ Pytorch implementation: https://github.com/Diego999/pyGAT
import argparse import argparse
import time import time
import dgl
import networkx as nx import networkx as nx
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
from gat import GAT
from utils import EarlyStopping
import dgl
from dgl.data import ( from dgl.data import (
CiteseerGraphDataset, CiteseerGraphDataset,
CoraGraphDataset, CoraGraphDataset,
PubmedGraphDataset, PubmedGraphDataset,
register_data_args, register_data_args,
) )
from gat import GAT
from utils import EarlyStopping
def accuracy(logits, labels): def accuracy(logits, labels):
...@@ -174,7 +174,6 @@ def main(args): ...@@ -174,7 +174,6 @@ def main(args):
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description="GAT") parser = argparse.ArgumentParser(description="GAT")
register_data_args(parser) register_data_args(parser)
parser.add_argument( parser.add_argument(
......
...@@ -6,9 +6,9 @@ References: ...@@ -6,9 +6,9 @@ References:
- Code: https://github.com/tkipf/gcn - Code: https://github.com/tkipf/gcn
""" """
import tensorflow as tf import tensorflow as tf
from tensorflow.keras import layers
from dgl.nn.tensorflow import GraphConv from dgl.nn.tensorflow import GraphConv
from tensorflow.keras import layers
class GCN(tf.keras.Model): class GCN(tf.keras.Model):
......
import argparse import argparse
import time
import math import math
import numpy as np import time
import dgl
import dgl.function as fn
import networkx as nx import networkx as nx
import numpy as np
import tensorflow as tf import tensorflow as tf
import dgl.function as fn from dgl.data import (
import dgl CiteseerGraphDataset,
from dgl.data import register_data_args CoraGraphDataset,
from dgl.data import CoraGraphDataset, CiteseerGraphDataset, PubmedGraphDataset PubmedGraphDataset,
register_data_args,
)
from tensorflow.keras import layers from tensorflow.keras import layers
class GCNLayer(layers.Layer): class GCNLayer(layers.Layer):
def __init__(self, def __init__(self, g, in_feats, out_feats, activation, dropout, bias=True):
g,
in_feats,
out_feats,
activation,
dropout,
bias=True):
super(GCNLayer, self).__init__() super(GCNLayer, self).__init__()
self.g = g self.g = g
w_init = tf.keras.initializers.VarianceScaling( w_init = tf.keras.initializers.VarianceScaling(
scale=1.0, mode="fan_out", distribution="uniform") scale=1.0, mode="fan_out", distribution="uniform"
self.weight = tf.Variable(initial_value=w_init(shape=(in_feats, out_feats), )
dtype='float32'), self.weight = tf.Variable(
trainable=True) initial_value=w_init(shape=(in_feats, out_feats), dtype="float32"),
trainable=True,
)
if dropout: if dropout:
self.dropout = layers.Dropout(rate=dropout) self.dropout = layers.Dropout(rate=dropout)
else: else:
self.dropout = 0. self.dropout = 0.0
if bias: if bias:
b_init = tf.zeros_initializer() b_init = tf.zeros_initializer()
self.bias = tf.Variable(initial_value=b_init(shape=(out_feats,), self.bias = tf.Variable(
dtype='float32'), initial_value=b_init(shape=(out_feats,), dtype="float32"),
trainable=True) trainable=True,
)
else: else:
self.bias = None self.bias = None
self.activation = activation self.activation = activation
...@@ -43,11 +45,10 @@ class GCNLayer(layers.Layer): ...@@ -43,11 +45,10 @@ class GCNLayer(layers.Layer):
def call(self, h): def call(self, h):
if self.dropout: if self.dropout:
h = self.dropout(h) h = self.dropout(h)
self.g.ndata['h'] = tf.matmul(h, self.weight) self.g.ndata["h"] = tf.matmul(h, self.weight)
self.g.ndata['norm_h'] = self.g.ndata['h'] * self.g.ndata['norm'] self.g.ndata["norm_h"] = self.g.ndata["h"] * self.g.ndata["norm"]
self.g.update_all(fn.copy_u('norm_h', 'm'), self.g.update_all(fn.copy_u("norm_h", "m"), fn.sum("m", "h"))
fn.sum('m', 'h')) h = self.g.ndata["h"]
h = self.g.ndata['h']
if self.bias is not None: if self.bias is not None:
h = h + self.bias h = h + self.bias
if self.activation: if self.activation:
...@@ -56,24 +57,19 @@ class GCNLayer(layers.Layer): ...@@ -56,24 +57,19 @@ class GCNLayer(layers.Layer):
class GCN(layers.Layer): class GCN(layers.Layer):
def __init__(self, def __init__(
g, self, g, in_feats, n_hidden, n_classes, n_layers, activation, dropout
in_feats, ):
n_hidden,
n_classes,
n_layers,
activation,
dropout):
super(GCN, self).__init__() super(GCN, self).__init__()
self.layers = [] self.layers = []
# input layer # input layer
self.layers.append( self.layers.append(GCNLayer(g, in_feats, n_hidden, activation, dropout))
GCNLayer(g, in_feats, n_hidden, activation, dropout))
# hidden layers # hidden layers
for i in range(n_layers - 1): for i in range(n_layers - 1):
self.layers.append( self.layers.append(
GCNLayer(g, n_hidden, n_hidden, activation, dropout)) GCNLayer(g, n_hidden, n_hidden, activation, dropout)
)
# output layer # output layer
self.layers.append(GCNLayer(g, n_hidden, n_classes, None, dropout)) self.layers.append(GCNLayer(g, n_hidden, n_classes, None, dropout))
...@@ -95,14 +91,14 @@ def evaluate(model, features, labels, mask): ...@@ -95,14 +91,14 @@ def evaluate(model, features, labels, mask):
def main(args): def main(args):
# load and preprocess dataset # load and preprocess dataset
if args.dataset == 'cora': if args.dataset == "cora":
data = CoraGraphDataset() data = CoraGraphDataset()
elif args.dataset == 'citeseer': elif args.dataset == "citeseer":
data = CiteseerGraphDataset() data = CiteseerGraphDataset()
elif args.dataset == 'pubmed': elif args.dataset == "pubmed":
data = PubmedGraphDataset() data = PubmedGraphDataset()
else: else:
raise ValueError('Unknown dataset: {}'.format(args.dataset)) raise ValueError("Unknown dataset: {}".format(args.dataset))
g = data[0] g = data[0]
if args.gpu < 0: if args.gpu < 0:
...@@ -112,24 +108,29 @@ def main(args): ...@@ -112,24 +108,29 @@ def main(args):
g = g.to(device) g = g.to(device)
with tf.device(device): with tf.device(device):
features = g.ndata['feat'] features = g.ndata["feat"]
labels = g.ndata['label'] labels = g.ndata["label"]
train_mask = g.ndata['train_mask'] train_mask = g.ndata["train_mask"]
val_mask = g.ndata['val_mask'] val_mask = g.ndata["val_mask"]
test_mask = g.ndata['test_mask'] test_mask = g.ndata["test_mask"]
in_feats = features.shape[1] in_feats = features.shape[1]
n_classes = data.num_labels n_classes = data.num_labels
n_edges = data.graph.number_of_edges() n_edges = data.graph.number_of_edges()
print("""----Data statistics------' print(
"""----Data statistics------'
#Edges %d #Edges %d
#Classes %d #Classes %d
#Train samples %d #Train samples %d
#Val samples %d #Val samples %d
#Test samples %d""" % #Test samples %d"""
(n_edges, n_classes, % (
train_mask.numpy().sum(), n_edges,
val_mask.numpy().sum(), n_classes,
test_mask.numpy().sum())) train_mask.numpy().sum(),
val_mask.numpy().sum(),
test_mask.numpy().sum(),
)
)
# add self loop # add self loop
g = dgl.remove_self_loop(g) g = dgl.remove_self_loop(g)
...@@ -140,22 +141,24 @@ def main(args): ...@@ -140,22 +141,24 @@ def main(args):
norm = tf.math.pow(degs, -0.5) norm = tf.math.pow(degs, -0.5)
norm = tf.where(tf.math.is_inf(norm), tf.zeros_like(norm), norm) norm = tf.where(tf.math.is_inf(norm), tf.zeros_like(norm), norm)
g.ndata['norm'] = tf.expand_dims(norm, -1) g.ndata["norm"] = tf.expand_dims(norm, -1)
# create GCN model # create GCN model
model = GCN(g, model = GCN(
in_feats, g,
args.n_hidden, in_feats,
n_classes, args.n_hidden,
args.n_layers, n_classes,
tf.nn.relu, args.n_layers,
args.dropout) tf.nn.relu,
args.dropout,
optimizer = tf.keras.optimizers.Adam( )
learning_rate=args.lr)
optimizer = tf.keras.optimizers.Adam(learning_rate=args.lr)
loss_fcn = tf.keras.losses.SparseCategoricalCrossentropy( loss_fcn = tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=True) from_logits=True
)
# initialize graph # initialize graph
dur = [] dur = []
for epoch in range(args.n_epochs): for epoch in range(args.n_epochs):
...@@ -170,8 +173,9 @@ def main(args): ...@@ -170,8 +173,9 @@ def main(args):
# of Adam(W) optimizer with PyTorch. And this results in worse results. # of Adam(W) optimizer with PyTorch. And this results in worse results.
# Manually adding weights to the loss to do weight decay solves this problem. # Manually adding weights to the loss to do weight decay solves this problem.
for weight in model.trainable_weights: for weight in model.trainable_weights:
loss_value = loss_value + \ loss_value = loss_value + args.weight_decay * tf.nn.l2_loss(
args.weight_decay*tf.nn.l2_loss(weight) weight
)
grads = tape.gradient(loss_value, model.trainable_weights) grads = tape.gradient(loss_value, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights)) optimizer.apply_gradients(zip(grads, model.trainable_weights))
...@@ -180,31 +184,41 @@ def main(args): ...@@ -180,31 +184,41 @@ def main(args):
dur.append(time.time() - t0) dur.append(time.time() - t0)
acc = evaluate(model, features, labels, val_mask) acc = evaluate(model, features, labels, val_mask)
print("Epoch {:05d} | Time(s) {:.4f} | Loss {:.4f} | Accuracy {:.4f} | " print(
"ETputs(KTEPS) {:.2f}". format(epoch, np.mean(dur), loss_value.numpy().item(), "Epoch {:05d} | Time(s) {:.4f} | Loss {:.4f} | Accuracy {:.4f} | "
acc, n_edges / np.mean(dur) / 1000)) "ETputs(KTEPS) {:.2f}".format(
epoch,
np.mean(dur),
loss_value.numpy().item(),
acc,
n_edges / np.mean(dur) / 1000,
)
)
acc = evaluate(model, features, labels, test_mask) acc = evaluate(model, features, labels, test_mask)
print("Test Accuracy {:.4f}".format(acc)) print("Test Accuracy {:.4f}".format(acc))
if __name__ == '__main__': if __name__ == "__main__":
parser = argparse.ArgumentParser(description='GCN') parser = argparse.ArgumentParser(description="GCN")
register_data_args(parser) register_data_args(parser)
parser.add_argument("--dropout", type=float, default=0.5, parser.add_argument(
help="dropout probability") "--dropout", type=float, default=0.5, help="dropout probability"
parser.add_argument("--gpu", type=int, default=-1, )
help="gpu") parser.add_argument("--gpu", type=int, default=-1, help="gpu")
parser.add_argument("--lr", type=float, default=1e-2, parser.add_argument("--lr", type=float, default=1e-2, help="learning rate")
help="learning rate") parser.add_argument(
parser.add_argument("--n-epochs", type=int, default=200, "--n-epochs", type=int, default=200, help="number of training epochs"
help="number of training epochs") )
parser.add_argument("--n-hidden", type=int, default=16, parser.add_argument(
help="number of hidden gcn units") "--n-hidden", type=int, default=16, help="number of hidden gcn units"
parser.add_argument("--n-layers", type=int, default=1, )
help="number of hidden gcn layers") parser.add_argument(
parser.add_argument("--weight-decay", type=float, default=5e-4, "--n-layers", type=int, default=1, help="number of hidden gcn layers"
help="Weight for L2 loss") )
parser.add_argument(
"--weight-decay", type=float, default=5e-4, help="Weight for L2 loss"
)
args = parser.parse_args() args = parser.parse_args()
print(args) print(args)
......
...@@ -2,18 +2,18 @@ import argparse ...@@ -2,18 +2,18 @@ import argparse
import math import math
import time import time
import dgl
import networkx as nx import networkx as nx
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
from tensorflow.keras import layers
import dgl
from dgl.data import ( from dgl.data import (
CiteseerGraphDataset, CiteseerGraphDataset,
CoraGraphDataset, CoraGraphDataset,
PubmedGraphDataset, PubmedGraphDataset,
register_data_args, register_data_args,
) )
from tensorflow.keras import layers
def gcn_msg(edge): def gcn_msg(edge):
......
import argparse import argparse
import time import time
import dgl
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
from gcn import GCN
import dgl
from dgl.data import CiteseerGraphDataset, CoraGraphDataset, PubmedGraphDataset from dgl.data import CiteseerGraphDataset, CoraGraphDataset, PubmedGraphDataset
from gcn import GCN
def evaluate(model, features, labels, mask): def evaluate(model, features, labels, mask):
......
...@@ -12,14 +12,14 @@ import argparse ...@@ -12,14 +12,14 @@ import argparse
import time import time
from functools import partial from functools import partial
import dgl
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
from model import BaseRGCN
from tensorflow.keras import layers
import dgl
from dgl.data.rdf import AIFBDataset, AMDataset, BGSDataset, MUTAGDataset from dgl.data.rdf import AIFBDataset, AMDataset, BGSDataset, MUTAGDataset
from dgl.nn.tensorflow import RelGraphConv from dgl.nn.tensorflow import RelGraphConv
from model import BaseRGCN
from tensorflow.keras import layers
class EntityClassify(BaseRGCN): class EntityClassify(BaseRGCN):
......
...@@ -5,11 +5,10 @@ https://github.com/MichSchli/RelationPrediction ...@@ -5,11 +5,10 @@ https://github.com/MichSchli/RelationPrediction
""" """
import dgl
import numpy as np import numpy as np
import tensorflow as tf import tensorflow as tf
import dgl
####################################################################### #######################################################################
# #
# Utility function for building training and testing graphs # Utility function for building training and testing graphs
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment