Ejemplo n.º 1
0
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')
Ejemplo n.º 2
0
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))