def main(dataset_name, yang_splits, nheads, hidden_units, feat_drop_rate, coefs_drop_rate, l2_weight, data_seed, checkpoint_path, verbose, tsne): # reproducibility np.random.seed(data_seed) if yang_splits: features, o_h_labels, graph, mask_train, mask_val, mask_test = read_dataset( dataset_name, yang_splits=True) labels = np.array([np.argmax(l) for l in o_h_labels], dtype=np.int32) else: if verbose > 0: print("reading dataset") features, neighbors, labels, o_h_labels, keys = read_dataset( dataset_name) num_classes = len(set(labels)) if verbose > 0: print("shuffling dataset") features, neighbors, labels, o_h_labels, keys = permute( features, neighbors, labels, o_h_labels, keys) if verbose > 0: print("obtaining masks") mask_train, mask_val, mask_test = split(dataset_name, labels) if verbose > 0: print("calculating adjacency matrix") graph = adjacency_matrix(neighbors) # add self loops to adj matrix graph = graph + sp.eye(graph.shape[0]) num_classes = get_num_classes(dataset_name) features = normalize_features(features) y_test = np.multiply(o_h_labels, np.broadcast_to(mask_test.T, o_h_labels.T.shape).T) if verbose > 0: print("defining model") model = GAT(graph, num_classes, hidden_units, nheads, feat_drop_rate, coefs_drop_rate) model.compile(loss=lambda y_true, y_pred: masked_loss( y_true, y_pred) + l2_weight * tf.reduce_sum( [tf.nn.l2_loss(w) for w in model.weights if not 'bias' in w.name]), metrics=[masked_accuracy]) if verbose > 0: print("load model from checkpoint") wpath = os.path.join(checkpoint_path, 'cp.ckpt') model.load_weights(wpath).expect_partial() if verbose > 0: print("test the model on test set") t_loss, t_accuracy = model.evaluate(features, y_test, batch_size=len(features), verbose=0) print("accuracy on test: " + str(t_accuracy)) if tsne: if verbose > 0: print("calculating t-SNE plot") intermediate_output = model.call(features, training=False, intermediate=True) plot_tsne(intermediate_output[mask_test], labels[mask_test], len(o_h_labels[0]), 'GAT')
def main(dataset_name, yang_splits, nheads, hidden_units, feat_drop_rate, coefs_drop_rate, epochs, learning_rate, l2_weight, patience, data_seed, net_seed, checkpoint_path, verbose): # reproducibility np.random.seed(data_seed) tf.random.set_seed(net_seed) if yang_splits: features, o_h_labels, graph, mask_train, mask_val, mask_test = read_dataset(dataset_name, yang_splits=True) labels = np.array([np.argmax(l) for l in o_h_labels], dtype=np.int32) else: if verbose > 0: print("reading dataset") features, neighbors, labels, o_h_labels, keys = read_dataset(dataset_name) num_classes = len(set(labels)) if verbose > 0: print("shuffling dataset") features, neighbors, labels, o_h_labels, keys = permute(features, neighbors, labels, o_h_labels, keys) if verbose > 0: print("obtaining masks") mask_train, mask_val, mask_test = split(dataset_name, labels) if verbose > 0: print("calculating adjacency matrix") graph = adjacency_matrix(neighbors) # add self loops to adj matrix graph = graph + sp.eye(graph.shape[0]) num_classes = get_num_classes(dataset_name) features = normalize_features(features) y_train = np.multiply(o_h_labels, np.broadcast_to(mask_train.T, o_h_labels.T.shape).T ) y_val = np.multiply(o_h_labels, np.broadcast_to(mask_val.T, o_h_labels.T.shape).T ) y_test = np.multiply(o_h_labels, np.broadcast_to(mask_test.T, o_h_labels.T.shape).T ) optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate) if verbose > 0: print("defining model") model = GAT(graph, num_classes, hidden_units, nheads, feat_drop_rate, coefs_drop_rate) model.compile(loss=lambda y_true, y_pred: masked_loss(y_true, y_pred)+l2_weight*tf.reduce_sum([tf.nn.l2_loss(w) for w in model.weights if not 'bias' in w.name]), optimizer=optimizer, metrics=[masked_accuracy]) if verbose > 0: print("begin training") tb = TensorBoard(log_dir='logs') if dataset_name == 'cora': monitor = 'acc_loss' elif dataset_name == 'pubmed': monitor = 'loss' else: monitor = 'acc' es = EarlyStoppingAccLoss(patience, monitor, checkpoint_path) model.fit(features, y_train, epochs=epochs, batch_size=len(features), shuffle=False, validation_data=(features, y_val), callbacks=[tb, es], verbose=verbose) file_writer = tf.summary.create_file_writer("./logs/results/") file_writer.set_as_default() # log best performances on train and val set loss, accuracy = model.evaluate(features, y_train, batch_size=len(features), verbose=0) print("accuracy on training: " + str(accuracy)) tf.summary.scalar('bw_loss', data=loss, step=1) tf.summary.scalar('bw_accuracy', data=accuracy, step=1) v_loss, v_accuracy = model.evaluate(features, y_val, batch_size=len(features), verbose=0) print("accuracy on validation: " + str(v_accuracy)) tf.summary.scalar('bw_val_loss', data=v_loss, step=1) tf.summary.scalar('bw_val_accuracy', data=v_accuracy, step=1) tf.summary.scalar('bw_epoch', data=es.stopped_epoch, step=1) if verbose > 0: print("test the model on test set") t_loss, t_accuracy = model.evaluate(features, y_test, batch_size=len(features), verbose=0) print("accuracy on test: " + str(t_accuracy))