예제 #1
0
def run_cora():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    feat_data, labels, adj_lists = load_cora()
    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    # features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)
    #    graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    times = []
    for batch in range(100):
        batch_nodes = train[:256]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(
            batch_nodes,
            Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(batch, loss.item())

    val_output = graphsage.forward(val)
    print(
        "Validation F1:",
        f1_score(labels[val],
                 val_output.data.numpy().argmax(axis=1),
                 average="micro"))
    print("Average batch time:", np.mean(times))
예제 #2
0
def run_bc_test(adj_lists_test, feat_data, test, model_name, output,
                edge_count):
    num_nodes = 10312
    feature_dim = 128
    embed_dim = 128

    features = nn.Embedding(num_nodes, feature_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features,
                   feature_dim,
                   embed_dim,
                   adj_lists_test,
                   agg1,
                   gcn=False,
                   cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   embed_dim,
                   adj_lists_test,
                   agg2,
                   base_model=enc1,
                   gcn=False,
                   cuda=False)
    enc1.num_sample = edge_count
    enc2.num_sample = edge_count
    graphsage = RegressionGraphSage(enc2)

    graphsage.load_state_dict(torch.load(model_name))
    graphsage.eval()

    # test data based on degree (group)
    test_data = []
    with open("../BlogCatalog-data/data_id0.txt", "r") as f:
        vecs = f.readline().split(" ")
        for x in vecs:
            test.append(x)

    embed_output = graphsage.forward(test_data)
    cos = nn.CosineSimilarity(dim=1, eps=1e-6)
    print("Average Validation Cosine Similarity:",
          cos(embed_output, torch.FloatTensor(feat_data[test])).mean(0).item())

    #Save Embedding to file
    np.savetxt(output, embed_output.data.numpy())

    with open("test_id" + str(edge_count) + ".txt", "w") as f:
        for item in test:
            f.write(str(item) + " ")
예제 #3
0
def run_pubmed():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 19717
    feat_data, labels, adj_lists = load_pubmed()
    features = Embedding(19717, 500)
    features.weight = Parameter(torch.tensor(feat_data, dtype=torch.float),
                                requires_grad=False)

    agg1 = MeanAggregator(features)
    enc1 = Encoder(features, 500, 128, adj_lists, agg1, gcn=True)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t())
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True)
    enc1.num_samples = 10
    enc2.num_samples = 25

    graphsage = SupervisedGraphSage(3, enc2)
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])

    all_grad_params = filter(lambda p: p.requires_grad, graphsage.parameters())
    optimizer = torch.optim.SGD(all_grad_params, lr=0.7)
    times = []
    for batch in range(200):
        batch_nodes = train[:1024]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(batch_nodes,
                              torch.tensor(labels[np.array(batch_nodes)]))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(batch, loss.item())

    val_output = graphsage.forward(val)
    print(
        "Validation F1:",
        f1_score(labels[val],
                 val_output.data.numpy().argmax(axis=1),
                 average="micro"))
    print("Average batch time:", np.mean(times))
예제 #4
0
def run_pubmed_incremental(feat_data, labels, adj_lists, args):
    evaluation_metrics = []
    features = nn.Embedding(19717, 500)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    # features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 500, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 10
    enc2.num_samples = 25

    graphsage = IncrementSupervisedGraphSage(3, enc2, labels, args)
    val_data = Continuum(name="pubmed", data_type='val', download=True)

    val = val_data.nodes()
    for t in range(val_data.num_class):
        incremental_data = Continuum(name="pubmed",
                                     data_type='train',
                                     download=True,
                                     task_type=t)
        train = incremental_data.nodes()
        random.shuffle(train)
        print("the size of task: %i" % len(train))
        for i in range(0, len(train), args.batch_size):
            if i + args.batch_size <= len(train):
                batch_nodes = train[i:i + args.batch_size]
            else:
                batch_nodes = train[i:len(train)]
            graphsage.observe(batch_nodes)

        val_output = graphsage.forward(val)
        evaluation_metrics.append([
            i,
            len(train),
            f1_score(labels[val],
                     val_output.data.numpy().argmax(axis=1),
                     average="micro")
        ])
    return evaluation_metrics
예제 #5
0
def run_cora():
    np.random.seed(1) #可复现随机种子
    random.seed(1)
    num_nodes = 2708
    feat_data, labels, adj_lists = load_cora()#载入数据集
    features = nn.Embedding(2708, 1433) #初试特征维度
    features.weight = nn.Parameter(torch.FloatTensor(feat_data), requires_grad=False)
    #features.cuda()

    agg1 = MeanAggregator(features, cuda=True)#mean聚合
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)#gcn聚合嵌入到128维
    agg2 = MeanAggregator(lambda nodes : enc1(nodes).t(), cuda=False) #用gcn嵌入后的节点特征做mean聚合
    enc2 = Encoder(lambda nodes : enc1(nodes).t(), enc1.embed_dim, 128, adj_lists, agg2,
            base_model=enc1, gcn=True, cuda=False) #agg2后再gcn聚合嵌入
    enc1.num_samples = 5 #一阶和二阶的邻居采样数
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)#cora数据集7分类
    #graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)#打乱数据集(新的数组)
    test = rand_indices[:1000] #划分数据集为3个部分
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])

    optimizer = torch.optim.SGD(filter(lambda p : p.requires_grad, graphsage.parameters()), lr=0.7)
    times = []
    for batch in range(100):
        batch_nodes = train[:256] #每次取前256个
        random.shuffle(train) #会在train数组本身打乱,所以每次256个会不同
        start_time = time.time()
        optimizer.zero_grad() #梯度清零
        loss = graphsage.loss(batch_nodes, 
                Variable(torch.LongTensor(labels[np.array(batch_nodes)])))#loss
        loss.backward() #反向传播
        optimizer.step() #梯度更新
        end_time = time.time()
        times.append(end_time-start_time)
        print batch, loss.data[0]

    val_output = graphsage.forward(val) #验证集
    print "Validation F1:", f1_score(labels[val], val_output.data.numpy().argmax(axis=1), average="micro")
    print "Average batch time:", np.mean(times)
예제 #6
0
def run_cora():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    feat_data, labels, adj_lists, adj, degrees, edges = load_cora()
    neg_adj_list = [
        list(set(range(num_nodes)).intersection(adj_lists[node]))
        for node in range(num_nodes)
    ]
    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    adj = Variable(torch.FloatTensor(adj), requires_grad=False)
    if torch.cuda.is_available():
        features, adj = features.cuda(), adj.cuda()

# features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)
    if torch.cuda.is_available():
        graphsage = graphsage.cuda()
    # rand_indices = np.random.permutation(num_nodes)
    # test = rand_indices[:1000]
    # val = rand_indices[1000:1500]
    # train = list(rand_indices[1500:])

    train = list(range(140))
    val = np.array(range(200, 500))
    test = np.array(range(500, 1500))

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)

    times = []
    for batch in range(100):
        batch_edges = edges[:256]
        random.shuffle(batch_edges)
        nodes1, nodes2 = batch_edges[:, 0], batch_edges[:, 1]
        # neg_nodes = fixed_unigram_candidate_sampler(
        #     num_sampled=NUM_SAMPLED,
        #     unique=False,
        #     range_max=len(degrees),
        #     distortion=0.75,
        #     unigrams=degrees
        # )
        neg_nodes = sample_negative(nodes1, neg_adj_list)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.unsup_loss(nodes1, nodes2, neg_nodes)
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        if batch % 100 == 0:
            embeds, _ = graphsage.forward(list(range(num_nodes)))
            accs = classify(embeds.detach().cpu().numpy(), labels, 0.5)
            print(batch, loss.item(), accs)

    times = []
    for batch in range(100):
        batch_nodes = train[:256]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        batch_labels = Variable(torch.LongTensor(
            labels[np.array(batch_nodes)]))
        if torch.cuda.is_available():
            batch_labels = batch_labels.cuda()
        loss = graphsage.loss(batch_nodes, batch_labels)
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(batch, loss.item())

    _, test_output = graphsage.forward(test)
    print(
        "Testing F1:",
        f1_score(labels[test],
                 test_output.detach().cpu().numpy().argmax(axis=1),
                 average="micro"))
    print("Average batch time:", np.mean(times))
예제 #7
0
def run_bc(sample_count, model_name, output):
    # np.random.seed(1)
    #random.seed(1)
    num_nodes = 10312
    feature_dim = 128
    embed_dim = 128
    # Select training&test set from qualified nodes
    selected_id = get_partial_list(1500)

    # Load node2vec features
    adj_lists, adj_lists_empty, features_node2vec = load_blog_catalog(
        selected_id)

    # Build the graph
    adj_lists_train, adj_lists_test, train, test, adj_lists = preprocessing(
        selected_id, 300, sample_count, adj_lists, adj_lists_empty, True)

    # Init the input feature of every node into all-one vector
    feat_data = np.ones((num_nodes, feature_dim))

    features = nn.Embedding(num_nodes, feature_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features,
                   feature_dim,
                   embed_dim,
                   adj_lists_train,
                   agg1,
                   gcn=False,
                   cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   embed_dim,
                   adj_lists_train,
                   agg2,
                   base_model=enc1,
                   gcn=False,
                   cuda=False)

    # Possible additional layers
    # agg3 = MeanAggregator(lambda nodes: enc2(nodes).t(), cuda=False)
    # enc3 = Encoder(lambda nodes: enc2(nodes).t(), enc2.embed_dim, embed_dim, adj_lists_train, agg3,
    #                base_model=enc2, gcn=False, cuda=False)
    # agg4 = MeanAggregator(lambda nodes: enc3(nodes).t(), cuda=False)
    # enc4 = Encoder(lambda nodes: enc3(nodes).t(), enc3.embed_dim, embed_dim, adj_lists_train, agg4,
    #                base_model=enc3, gcn=False, cuda=False)

    enc1.num_sample = sample_count
    enc2.num_sample = 10
    # enc3.num_sample = 15
    # enc4.num_sample = 20

    # Initialize the Graph-SAGE model
    graphsage = RegressionGraphSage(enc2)

    # Prepare the input data for the testing model
    feat_data_test = np.ones((10312, 128))
    features_test = nn.Embedding(num_nodes, feature_dim)
    features_test.weight = nn.Parameter(torch.FloatTensor(feat_data_test),
                                        requires_grad=False)

    # Set up the model with testing graph structure
    agg1_test = MeanAggregator(features_test, cuda=True)
    enc1_test = Encoder(features_test,
                        feature_dim,
                        embed_dim,
                        adj_lists_test,
                        agg1_test,
                        gcn=False,
                        cuda=False)
    agg2_test = MeanAggregator(lambda nodes: enc1_test(nodes).t(), cuda=False)
    enc2_test = Encoder(lambda nodes: enc1_test(nodes).t(),
                        enc1_test.embed_dim,
                        embed_dim,
                        adj_lists_test,
                        agg2_test,
                        base_model=enc1_test,
                        gcn=False,
                        cuda=False)

    # agg3_test = MeanAggregator(lambda nodes: enc2_test(nodes).t(), cuda=False)
    # enc3_test = Encoder(lambda nodes: enc2_test(nodes).t(), enc2_test.embed_dim, embed_dim, adj_lists_test, agg3_test,
    #                base_model=enc2_test, gcn=False, cuda=False)
    # agg4_test = MeanAggregator(lambda nodes: enc3_test(nodes).t(), cuda=False)
    # enc4_test = Encoder(lambda nodes: enc3_test(nodes).t(), enc3_test.embed_dim, embed_dim, adj_lists_test, agg4_test,
    #                     base_model=enc3_test, gcn=False, cuda=False)
    enc1_test.num_sample = sample_count
    enc2_test.num_sample = 10
    # enc3_test.num_sample = 10
    # enc4_test.num_sample = 10

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.3)
    times = []
    for epoch in range(1000):
        batch_nodes = train[:256]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()

        # Select a random number of the sample size of the first layer and build the training graph according to this
        sample_count_epoch = random.randint(1, sample_count)
        adj_lists_train_1, _, _, _, _ = preprocessing(selected_id, 300,
                                                      sample_count_epoch,
                                                      adj_lists,
                                                      adj_lists_empty, False)
        # adj_lists_train_2, _, _, _, _ = preprocessing(selected_id, 300, 10, adj_lists, adj_lists_empty, True)

        # Configure the hyperparameters in each epoch
        enc1.adj_lists = adj_lists_train_1
        enc2.adj_lists = adj_lists_train_1
        enc1.num_sample = sample_count_epoch

        # Calculate the loss and back propagate it
        loss = graphsage.loss(
            batch_nodes,
            Variable(
                torch.FloatTensor(features_node2vec[np.array(batch_nodes)])))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(epoch, loss)

        # Every 10 epochs, use the model to run the test graph and data, and compute the current cosine similarity
        if epoch % 10 == 9:
            graphsage_test = RegressionGraphSage(enc2_test)
            graphsage_test.load_state_dict(graphsage.state_dict())
            graphsage_test.eval()

            embed_output = graphsage_test.forward(test)
            cos = nn.CosineSimilarity(dim=1, eps=1e-6)
            print(
                "Cosine similarity: ",
                cos(embed_output,
                    torch.FloatTensor(features_node2vec[test])).mean(0).item())

    # Save model
    torch.save(graphsage.state_dict(), model_name)
    # run_bc_test_based_on_group(adj_lists_test, feat_data, test, model_name, output, sample_count)

    # embed_output = graphsage.forward(test)
    # cos = nn.CosineSimilarity(dim=1, eps=1e-6)
    # print("Average Validation Cosine Similarity:", cos(embed_output, torch.FloatTensor(feat_data[test])).mean(0).item())
    # # print("Validation F1:", f1_score(labels[val], val_output.data.numpy().argmax(axis=1), average="micro"))
    print("Average batch time:", np.mean(times))
예제 #8
0
def main():
    np.random.seed(1)
    random.seed(1)
    feat_data, train_label, test_label, adj_lists, train, test = load_cora()
    num_nodes = feat_data.shape[0]
    feat_dim = feat_data.shape[1]
    hidden_dim = 15
    features = nn.Embedding(num_nodes, feat_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    #features.cuda()

    agg1 = MeanAggregator(features, cuda=False)
    enc1 = Encoder(features,
                   feat_dim,
                   hidden_dim,
                   adj_lists,
                   agg1,
                   gcn=False,
                   cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   hidden_dim,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=False,
                   cuda=False)
    agg3 = MeanAggregator(lambda nodes: enc2(nodes).t(), cuda=False)
    enc3 = Encoder(lambda nodes: enc2(nodes).t(),
                   enc2.embed_dim,
                   hidden_dim,
                   adj_lists,
                   agg3,
                   base_model=enc2,
                   gcn=False,
                   cuda=False)
    enc1.num_samples = 10
    enc2.num_samples = 10
    enc3.num_samples = 10

    graphsage = SupervisedGraphSage(hidden_dim, enc3)
    #graphsage.cuda()

    optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad,
                                        graphsage.parameters()),
                                 lr=0.01,
                                 weight_decay=1e-5)
    times = []
    epoch = 5
    batch_size = 5120
    num_batch = len(train) // batch_size
    best = 1e9
    cnt_wait = 0
    patience = 25
    best_epoch = 0
    best_batch = 0

    train_pair1 = []
    train_pair2 = []
    test_pair1 = []
    test_pair2 = []
    for x in train:
        train_pair1.append(x[0])
        train_pair2.append(x[1])
    for x in test:
        test_pair1.append(x[0])
        test_pair2.append(x[1])
    # shuffle training set
    fused_train = [
        list(x) for x in shuffle_list(train_pair1, train_pair2, train_label)
    ]
    train_pair1 = fused_train[0]
    train_pair2 = fused_train[1]
    train_label = fused_train[2]
    for e in range(epoch):
        for i in range(num_batch):
            if i < num_batch - 1:
                pair1 = train_pair1[i * batch_size:i * batch_size + batch_size]
                pair2 = train_pair2[i * batch_size:i * batch_size + batch_size]
                sub_label = train_label[i * batch_size:i * batch_size +
                                        batch_size]
            else:
                pair1 = train_pair1[i * batch_size:len(train_pair1)]
                pair2 = train_pair2[i * batch_size:len(train_pair2)]
                sub_label = train_label[i * batch_size:len(train_pair1)]
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(pair1, pair2,\
                Variable(torch.FloatTensor(np.asarray(sub_label))))
            '''
            if loss < best:
                best = loss
                best_epoch = e
                best_batch = i
                cnt_wait = 0
                torch.save(graphsage.state_dict(), 'best_model.pkl')

            else:
                cnt_wait += 1

            if cnt_wait == patience:
                print('Early stopping!')
                break
            '''

            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
            print("The {}-th epoch, The {}-th batch, ".format(e, i), "Loss: ",
                  loss.item())

    #print('Loading {}th epoch {}th batch'.format(best_epoch, best_batch))
    #graphsage.load_state_dict(torch.load('best_model.pkl'))

    if len(test) < 100000:
        test_output = torch.sigmoid(graphsage.forward(test_pair1, test_pair2))
        pred = np.where(test_output.data.numpy() < 0.5, 0, 1)

    ### Inference on large graph, avoid out of memory
    else:
        chunk_size = 5120
        pred = []
        for j in range(len(test) // chunk_size):
            if j < (len(test) // chunk_size - 1):
                pair1 = test_pair1[j * chunk_size:(j + 1) * chunk_size]
                pair2 = test_pair2[j * chunk_size:(j + 1) * chunk_size]
            else:
                pair1 = test_pair1[j * chunk_size:len(test_pair1)]
                pair2 = test_pair2[j * chunk_size:len(test_pair2)]
            test_output = torch.sigmoid(graphsage.forward(pair1, pair2))
            pred = np.concatenate(
                (pred, np.where(test_output.data.numpy() < 0.5, 0, 1)),
                axis=None)
            print("Inference on the {}-th chunk".format(j))
    #print("Test F1:", f1_score(np.asarray(test_label), pred, average="micro", labels=[1]))
    print(
        "True Positive Rate:",
        recall_score(np.asarray(test_label), pred, average="micro",
                     labels=[1]))
    #print("Test Precision:", precision_score(np.asarray(test_label), pred, average="micro", labels=[1]))
    print(
        "False Positive Rate:", 1 - recall_score(
            np.asarray(test_label), pred, average="micro", labels=[0]))
    plot_confusion_matrix(np.asarray(test_label),
                          pred,
                          np.array([0, 1]),
                          title='Confusion matrix, without normalization')

    print("Average batch time:", np.mean(times))
def run_pubmed():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 19717
    feat_data, labels, adj_lists = load_pubmed()
    features = nn.Embedding(19717, 500)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    # features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 500, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 10
    enc2.num_samples = 25

    graphsage = SupervisedGraphSage(3, enc2)
    #    graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    times = []

    ##################################################################################################
    train_loss = list()  # inicializa o vetor

    for batch in range(200):
        batch_nodes = train[:1024]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(
            batch_nodes,
            Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        ##################################################################################################
        train_loss.append(loss.data[0])  # armazena o erro
        print batch, loss.data[0]

    val_output = graphsage.forward(val)
    score = f1_score(labels[val],
                     val_output.data.numpy().argmax(axis=1),
                     average="micro")
    print "Validation F1:", score
    print "Average batch time:", np.mean(times)

    return train_loss, score
예제 #10
0
def main():
    np.random.seed(1)
    random.seed(1)
    feat_data, labels, adj_lists, train, test = load_cora()
    num_nodes = feat_data.shape[0]
    feat_dim = feat_data.shape[1]
    hidden_dim = 15
    features = nn.Embedding(num_nodes, feat_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    #features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features,
                   feat_dim,
                   hidden_dim,
                   adj_lists,
                   agg1,
                   gcn=False,
                   cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   hidden_dim,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=False,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(2, enc2)
    #graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)
    #train = rand_indices[:400]
    #val = rand_indices[1000:1500]
    #test = rand_indices[400:]

    optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad,
                                        graphsage.parameters()),
                                 lr=0.001)
    times = []
    epoch = 10
    batch_size = 512
    num_batch = len(train) // batch_size
    best_loss = 1e9
    cnt_wait = 0
    patience = 50
    flag = 0
    for e in range(epoch):
        for i in range(num_batch):
            if i < num_batch - 1:
                batch_nodes = train[i * batch_size:i * batch_size + batch_size]
            else:
                batch_nodes = train[i * batch_size:len(train)]
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(batch_nodes,\
                Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
            print("The {}-th epoch ".format(e), "{}-th batch".format(i),
                  "Loss: ", loss.item())
            '''
            if loss.item() < best_loss:
                best_loss = loss.item()
                cnt_wait = 0
            else:
                cnt_wait += 1

            if cnt_wait == patience:
                print("early stopping!")
                flag = 1
                break
            '''
        '''
        if flag == 1:
            break
        '''

    if len(test) < 100000:
        test_output = graphsage.forward(test)
        print(
            "Test F1:",
            f1_score(labels[test],
                     test_output.data.numpy().argmax(axis=1),
                     average="micro",
                     labels=[1]))
        print(
            "Test Recall:",
            recall_score(labels[test],
                         test_output.data.numpy().argmax(axis=1),
                         average="micro",
                         labels=[1]))
        print(
            "Test Precision:",
            precision_score(labels[test],
                            test_output.data.numpy().argmax(axis=1),
                            average="micro",
                            labels=[1]))
        plot_confusion_matrix(labels[test],
                              test_output.data.numpy().argmax(axis=1),
                              np.array([0, 1]),
                              title='Confusion matrix, without normalization')

    ### Inference on large graph, avoid out of memory
    else:
        chunk_size = 512
        pred = []
        for j in range(len(test) // chunk_size):
            if j < (len(test) // chunk_size - 1):
                test_output = graphsage.forward(test[j * chunk_size:(j + 1) *
                                                     chunk_size])
            else:
                test_output = graphsage.forward(test[j * chunk_size:len(test)])
            pred += (test_output.data.numpy().argmax(axis=1)).tolist()
            print("Inference on the {}-th chunk".format(j))
        print(
            "Test F1:",
            f1_score(labels[test],
                     np.asarray(pred),
                     average="micro",
                     labels=[1]))
        print(
            "Test Recall:",
            recall_score(labels[test],
                         np.asarray(pred),
                         average="micro",
                         labels=[1]))
        print(
            "Test Precision:",
            precision_score(labels[test],
                            np.asarray(pred),
                            average="micro",
                            labels=[1]))
        plot_confusion_matrix(labels[test],
                              np.asarray(pred),
                              np.array([0, 1]),
                              title='Confusion matrix, without normalization')

    print("Average batch time:", np.mean(times))
예제 #11
0
def run_hate(gcn,
             features,
             weights,
             edges,
             flag_index="hate",
             num_features=320,
             lr=0.01,
             batch_size=128):
    # torch.manual_seed(1)
    # np.random.seed(1)
    # random.seed(1)
    num_nodes = 100386
    feat_data, labels, adj_lists = load_hate(features, edges, num_features)
    features = nn.Embedding(num_nodes, num_features)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)

    agg1 = MeanAggregator(features, cuda=False)
    enc1 = Encoder(features,
                   num_features,
                   256,
                   adj_lists,
                   agg1,
                   gcn=gcn,
                   cuda=False)
    # agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    # enc2 = Encoder(lambda nodes: enc1(nodes).t(), enc1.embed_dim, 256, adj_lists, agg2,
    #                base_model=enc1, gcn=gcn, cuda=False)
    enc1.num_samples = 25
    # enc2.num_samples = 10

    # graphsage = SupervisedGraphSage(len(weights), enc2, torch.FloatTensor(weights))
    graphsage = SupervisedGraphSage(len(weights), enc1,
                                    torch.FloatTensor(weights))

    if flag_index == "hate":
        df = pd.read_csv("hate/users_neighborhood_anon.csv")
        df = df[df.hate != "other"]
        y = np.array([1 if v == "hateful" else 0 for v in df["hate"].values])
        x = np.array(df["user_id"].values)
        del df

    else:
        df = pd.read_csv("suspended/users_anon.csv")
        np.random.seed(321)
        df2 = df[df["is_63_2"] == True].sample(668, axis=0)
        df3 = df[df["is_63_2"] == False].sample(5405, axis=0)
        df = pd.concat([df2, df3])
        y = np.array([1 if v else 0 for v in df["is_63_2"].values])
        x = np.array(df["user_id"].values)
        del df, df2, df3

    skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=123)

    f1_test = []
    accuracy_test = []
    auc_test = []
    recall_test = []
    precision_test = []
    for train_index, test_index in skf.split(x, y):
        train, test = x[train_index], x[test_index]
        print("=================begin train test======================")
        # optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, graphsage.parameters()))
        optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                           graphsage.parameters()),
                                    lr=lr)
        graphsage = SupervisedGraphSage(len(weights), enc1,
                                        torch.FloatTensor(weights))
        times = []
        cum_loss = 0

        for batch in range(1000):
            batch_nodes = train[:batch_size]
            train = np.roll(train, batch_size)
            # random.shuffle(train)
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(
                batch_nodes,
                Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
            # cum_loss += loss.data[0]
            cum_loss += loss.data.item()
            if batch % 50 == 0:
                val_output = graphsage.forward(test)
                labels_pred_validation = val_output.data.numpy().argmax(axis=1)
                labels_true_validation = labels[test].flatten()
                if flag_index == "hate":
                    y_true = [
                        1 if v == 2 else 0 for v in labels_true_validation
                    ]
                    y_pred = [
                        1 if v == 2 else 0 for v in labels_pred_validation
                    ]
                else:
                    y_true = [
                        1 if v == 1 else 0 for v in labels_true_validation
                    ]
                    y_pred = [
                        1 if v == 1 else 0 for v in labels_pred_validation
                    ]
                print(len(y_true))
                fscore = f1_score(y_true,
                                  y_pred,
                                  labels=None,
                                  pos_label=1,
                                  average='binary',
                                  sample_weight=None)
                recall = recall_score(y_true,
                                      y_pred,
                                      labels=None,
                                      pos_label=1,
                                      average='binary',
                                      sample_weight=None)
                precision = precision_score(y_true,
                                            y_pred,
                                            labels=None,
                                            pos_label=1,
                                            average='binary',
                                            sample_weight=None)
                accuracy = accuracy_score(y_true, y_pred)
                print(confusion_matrix(y_true, y_pred))
                print("F-score, recall, precision, accuracy: ", fscore, recall,
                      precision, accuracy)

                print(batch, cum_loss / 50, fscore)
                cum_loss = 0

                if fscore > 0.65 and flag_index == "hate":
                    break
                if fscore >= 0.50 and recall > 0.8 and flag_index != "hate":
                    break
        print(
            "=========================================================================="
        )
        val_output = graphsage.forward(test)
        labels_pred_test = val_output.data.numpy().argmax(axis=1)
        if flag_index == "hate":
            labels_pred_score = val_output.data.numpy()[:, 2].flatten(
            ) - val_output.data.numpy()[:, 0].flatten()
        else:
            labels_pred_score = val_output.data.numpy()[:, 1].flatten(
            ) - val_output.data.numpy()[:, 0].flatten()

        labels_true_test = labels[test].flatten()

        if flag_index == "hate":
            y_true = [1 if v == 2 else 0 for v in labels_true_test]
            y_pred = [1 if v == 2 else 0 for v in labels_pred_test]

        else:
            y_true = [1 if v else 0 for v in labels_true_test]
            y_pred = [1 if v else 0 for v in labels_pred_test]
        fpr, tpr, _ = roc_curve(y_true, labels_pred_score)

        auc_test.append(auc(fpr, tpr))
        accuracy_test.append(accuracy_score(y_true, y_pred))
        f1_test.append(f1_score(y_true, y_pred))
        recall_test.append(recall_score(y_true, y_pred))
        precision_test.append(precision_score(y_true, y_pred))
        print(confusion_matrix(y_true, y_pred))

    accuracy_test = np.array(accuracy_test)
    f1_test = np.array(f1_test)
    recall_test = np.array(recall_test)
    auc_test = np.array(auc_test)
    precision_test = np.array(precision_test)
    print("Accuracy   %0.4f +-  %0.4f" %
          (accuracy_test.mean(), accuracy_test.std()))
    print("F1    %0.4f +-  %0.4f" % (f1_test.mean(), f1_test.std()))
    print("Recall    %0.4f +-  %0.4f" %
          (recall_test.mean(), recall_test.std()))
    print("AUC    %0.4f +-  %0.4f" % (auc_test.mean(), auc_test.std()))
    print("Precision %0.4f +-  %0.4f" %
          (precision_test.mean(), precision_test.std()))
예제 #12
0
def run_cora(printout = True):
    
    begin = timeit.default_timer()
    
    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    feat_data, labels, adj_lists = load_cora()
    
    ################################################################################################################
    # TESTAR AS DUAS FORMAS: INCLUIR NA MATRIZ DE FEATURES AS INFORMACOES
    #                        (talvez isso nao seja necessario ja que o graphsage faz os embeddings por agregacao)
    #                                                    OU
    #                        APENAS USAR O RESULTADO DO K-MEANS PARA SEPARAR OS LOTES
    ################################################################################################################
    
    # Metodo Elbow para encontrar o numero de classes
    if True:
        wcss = [] # Within Cluster Sum of Squares
        for i in range(2, 11):
            kmeans = KMeans(n_clusters = i, init = 'random')
            kmeans.fit(feat_data)
            if printout:
                print 'kmeans wcss: ', i, kmeans.inertia_
            wcss.append(kmeans.inertia_)  
        #plt.plot(range(2, 11), wcss)
        #plt.title('O Metodo Elbow')
        #plt.xlabel('Numero de Clusters')
        #plt.ylabel('WCSS')
        #plt.show()
        #return None, None
        
    
    # Metodo Elbow encontrou 7 classes
    kmeans = KMeans(n_clusters = 7, init = 'random')
    kmeans.fit(feat_data)
    kmeans.fit_transform(feat_data)
    klabels = kmeans.labels_
    if False:
        return labels, klabels
    ######################################################################################################################
    ######################################################################################################################
    
    
    ###################################################################################################################
    # AQUI EU ATRIBUO INDICES AOS CONJUNTOS USANDO AS QUANTIDADES PROPORCIONAIS DE CADA K-MEANS CLUSTER
    ###################################################################################################################
    #test = rand_indices[:1000]        # 1000 exemplos
    #val = rand_indices[1000:1500]     #  500 exemplos
    #train = list(rand_indices[1500:]) # 1208 exemplos
    
    train, val, test, ratio = _processes_set(klabels, num_clusters = 7, num_examples = num_nodes)
    
    # normalization
    ind_train = list()
    for key in train:
        ind_train.extend(train[key])

    scaler = preprocessing.StandardScaler().fit(feat_data[ind_train]) # only fit in the train examples
    feat_data = scaler.transform(feat_data)
    ###################################################################################################################
    ###################################################################################################################

    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data), requires_grad=False)
    # features.cuda()

    # MeanAggregator params
    #  features, cuda=False, gcn=False

    # Encoder params
    #  features, feature_dim, embed_dim, adj_lists, aggregator, num_sample=10, base_model=None, 
    #  gcn=False, cuda=False, feature_transform=False
    
    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes : enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes : enc1(nodes).t(), enc1.embed_dim, 128, adj_lists, agg2,
            base_model=enc1, gcn=True, cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)
#    graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes) # len(rand_indices) = 2708

    optimizer = torch.optim.SGD(filter(lambda p : p.requires_grad, graphsage.parameters()), lr=0.7)
    times = []
    
    ###################################################################################################################
    # quantidade proporcional do batch, inicializacao do vetor de erro
    ###################################################################################################################
    quantity = np.empty((7,1), dtype=int)
    quantity[:,0] = ratio * 256
    quantity = list(quantity.flatten())
    
    train_loss = list()
    ###################################################################################################################
    ###################################################################################################################
    
    for batch in range(100):
        ##################################################################################################
        # O QUE EU POSSO FAZER AQUI EH EMBARALHAR OS VERTICES SEPARADAMENTE DENTRO DOS CLUSTERS
        # PARA MONTAR BATCH_NODES, PEGAR AS QUANTIDADES PROPORCIONAIS 
        ##################################################################################################
        batch_nodes = list()
        for key in train:
            batch_nodes.extend(train[key][:quantity[key]])
            random.shuffle(train[key])
        random.shuffle(batch_nodes)
        ##################################################################################################
        ##################################################################################################
        
        # pega os primeiros 255 exemplos
        #batch_nodes = train[:256]
        # embaralha os exemplos para que o proximo batch_nodes tenha outros vertices
        # a amostragem, nesse caso, eh com reposicao
        #random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(batch_nodes, 
                Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time-start_time)
        ##################################################################################################
        train_loss.append(loss.data[0])    # armazena o erro
        if printout:
            print batch, loss.data[0]
        
    end = timeit.default_timer()
    elapsed = end - begin
        
    val_output = graphsage.forward(val)
    score = f1_score(labels[val], val_output.data.numpy().argmax(axis=1), average="micro")
    if printout:
        print "Validation F1:", score
        print "Average batch time:", np.mean(times)
    
    return train_loss, score, elapsed
예제 #13
0
def run_cora():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    feat_data, labels, adj_lists, adj = load_cora()
    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    adj = Variable(torch.FloatTensor(adj), requires_grad=False)
    if torch.cuda.is_available():
        features, adj = features.cuda(), adj.cuda()

# features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)
    if torch.cuda.is_available():
        graphsage = graphsage.cuda()
    # rand_indices = np.random.permutation(num_nodes)
    # test = rand_indices[:1000]
    # val = rand_indices[1000:1500]
    # train = list(rand_indices[1500:])

    train = list(range(140))
    val = np.array(range(200, 500))
    test = np.array(range(500, 1500))

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    temp = TEMP
    for batch in range(000):
        batch_nodes = list(range(num_nodes))
        optimizer.zero_grad()
        loss = graphsage.nmincut_loss(batch_nodes, adj, temp=temp, beta=BETA)
        loss.backward()
        optimizer.step()
        if batch % 100 == 0:
            accs = classify(graphsage.embeds.detach().cpu().numpy(), labels,
                            0.5)
            print(batch, loss.item(), accs)
        # if batch % 1000:
        #     temp = max(0.1, TEMP*np.exp(-0.0003*batch))

    times = []
    for batch in range(100):
        batch_nodes = train[:256]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        batch_labels = Variable(torch.LongTensor(
            labels[np.array(batch_nodes)]))
        if torch.cuda.is_available():
            batch_labels = batch_labels.cuda()
        loss = graphsage.loss(batch_nodes, batch_labels)
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(batch, loss.item())

    _, test_output = graphsage.forward(test)
    print(
        "Testing F1:",
        f1_score(labels[test],
                 test_output.detach().cpu().numpy().argmax(axis=1),
                 average="micro"))
    print("Average batch time:", np.mean(times))
예제 #14
0
def main():
    np.random.seed(1)
    random.seed(1)
    feat_data, labels, adj_lists, train, test, edge_map = load_cora()
    num_nodes = feat_data.shape[0]
    feat_dim = feat_data.shape[1]
    hidden_dim = 15
    features = nn.Embedding(num_nodes, feat_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    #features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features,
                   feat_dim,
                   hidden_dim,
                   adj_lists,
                   agg1,
                   gcn=False,
                   cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   hidden_dim,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=False,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(1, enc2, edge_map)
    #graphsage.cuda()

    optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad,
                                        graphsage.parameters()),
                                 lr=0.001,
                                 weight_decay=1e-5)
    times = []
    epoch = 10
    batch_size = 512
    num_batch = len(train) // batch_size
    best = 1e9
    cnt_wait = 0
    patience = 20
    best_t = 0
    for e in range(epoch):
        for i in range(num_batch):
            if i < num_batch - 1:
                batch_nodes = train[i * batch_size:i * batch_size + batch_size]
            else:
                batch_nodes = train[i * batch_size:len(train)]
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(batch_nodes,\
                Variable(torch.FloatTensor(labels[np.array(batch_nodes)])))
            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
            print("The {}-th epoch ".format(e), "{}-th batch".format(i),
                  "Loss: ", loss.item())

            if loss.item() < best:
                best_loss = loss.item()
                cnt_wait = 0
                best_t = e
                torch.save(graphsage.state_dict(), 'best_model.pkl')
            else:
                cnt_wait += 1

            if cnt_wait == patience:
                print("early stopping!")
                break

    print('Loading {}th epoch'.format(best_t))
    graphsage.load_state_dict(torch.load('best_model.pkl'))

    if len(test) < 100000:
        test_output = torch.sigmoid(graphsage.forward(test))
        pred = (np.where(test_output.data.numpy() < 0.5, 0, 1))
        print("Test F1:",
              f1_score(labels[test], pred, labels=[1], average="micro"))
        print("Test Recall:",
              recall_score(labels[test], pred, labels=[1], average="micro"))
        print("Test Precision:",
              precision_score(labels[test], pred, labels=[1], average="micro"))
        cm = plot_confusion_matrix(
            labels[test],
            pred,
            np.array([0, 1]),
            title='Confusion matrix, without normalization')
        #recall = cm[1][1]/(cm[1][0]+cm[1][1])
        #precision = cm[1][1]/(cm[1][1]+cm[0][1])
        #f1 = 2*recall*precision/(recall+precision)
        #print("Test F1 micro:", f1)
        #print("Test Recall micro:", recall)
        #print("Test Precision micro:", precision)

    ### Inference on large graph, avoid out of memory
    else:
        chunk_size = 5120
        pred = []
        for j in range(len(test) // chunk_size):
            if j < (len(test) // chunk_size - 1):
                test_output = torch.sigmoid(
                    graphsage.forward(test[j * chunk_size:(j + 1) *
                                           chunk_size]))
            else:
                test_output = torch.sigmoid(
                    graphsage.forward(test[j * chunk_size:len(test)]))
            pred += (np.where(test_output.data.numpy() < 0.5, 0, 1)).tolist()
            print("Inference on the {}-th chunk".format(j))
        cm = plot_confusion_matrix(
            labels[test],
            np.asarray(pred),
            np.array([0, 1]),
            title='Confusion matrix, without normalization')
        print(
            "Test F1:",
            f1_score(labels[test],
                     np.asarray(pred),
                     labels=[1],
                     average="micro"))
        print(
            "Test Recall:",
            recall_score(labels[test],
                         np.asarray(pred),
                         labels=[1],
                         average="micro"))
        print(
            "Test Precision:",
            precision_score(labels[test],
                            np.asarray(pred),
                            labels=[1],
                            average="micro"))

    print("Average batch time:", np.mean(times))
예제 #15
0
def run_model(dataset,
              initializer,
              seed,
              epochs,
              batch_size=128,
              feature_dim=100,
              identity_dim=50,
              lr=0.01,
              agg_type="mean"):
    # merge run_cora and run_pubmed
    num_nodes_map = {
        "cora": 2708,
        "pubmed": 19717,
        "citeseer": 3312,
        "usa-airport": 1190,
        "brazil-airport": 131,
        'europe-airport': 399
    }
    num_classes_map = {
        "cora": 7,
        "pubmed": 3,
        "citeseer": 6,
        "usa-airport": 4,
        "brazil-airport": 4,
        "europe-airport": 4
    }
    # enc1_dim_map = {"cora": 128, "pubmed": 128, "citeseer": 128,  "brazil-airport": 32}
    enc2_dim_map = {
        "cora": 32,
        "pubmed": 32,
        "citeseer": 32,
        "usa-airport": 32,
        "brazil-airport": 32,
        "europe-airport": 32
    }
    enc1_num_samples_map = {
        "cora": 5,
        "pubmed": 10,
        "citeseer": 5,
        "usa-airport": 30,
        "brazil-airport": 30,
        "europe-airport": 15
    }
    enc2_num_samples_map = {
        "cora": 5,
        "pubmed": 25,
        "citeseer": 5,
        "usa-airport": 30,
        "brazil-airport": 30,
        "europe-airport": 15
    }
    attribute_dim = {"cora": 1433, "pubmed": 500, "citeseer": 3703}

    np.random.seed(seed)
    random.seed(seed)
    feat_data = []
    labels = []
    adj_lists = []
    num_nodes = num_nodes_map[dataset]
    num_classes = num_classes_map[dataset]
    # enc1_dim = enc1_dim_map[dataset]
    enc2_dim = enc2_dim_map[dataset]
    # enc2_dim = 32

    if dataset == "cora":
        feat_data, labels, train_idx, test_idx, val_idx, adj_lists = load_cora(
            feature_dim, initializer)
    elif dataset == "pubmed":
        feat_data, labels, train_idx, test_idx, val_idx, adj_lists = load_pubmed(
            feature_dim, initializer)
    elif dataset == "citeseer":
        feat_data, labels, train_idx, test_idx, val_idx, adj_lists = load_citeseer(
            feature_dim, initializer)
    elif dataset == "usa-airport":
        feat_data, labels, train_idx, val_idx, adj_lists = load_usa_airport(
            feature_dim, initializer)
    elif dataset == "brazil-airport":
        feat_data, labels, train_idx, val_idx, adj_lists = load_brazil_airport(
            feature_dim, initializer)
    elif dataset == "europe-airport":
        feat_data, labels, train_idx, val_idx, adj_lists = load_europe_airport(
            feature_dim, initializer)

    # feat_data, labels, adj_lists = load_data(dataset, feature_dim, initializer)
    # print(feat_data)
    print("feature dim is", feature_dim)
    if initializer == "1hot":
        features = nn.Embedding(num_nodes, feature_dim)
    else:
        features = nn.Embedding(num_nodes, feature_dim).requires_grad_(False)
    if "degree" in initializer:
        if "degree_bucket" in initializer:
            degree_1hot_embedding = nn.Embedding(10, feature_dim)
        elif initializer == "node_degree":
            max_degree = feat_data.shape[1]
            degree_1hot_embedding = nn.Embedding(max_degree, feature_dim)
        indices = [np.where(a == 1)[0][0] for a in feat_data]
        indices = torch.LongTensor(indices)
        feat_data_embedded = degree_1hot_embedding(indices)
        feat_data = feat_data_embedded
    if initializer != "1hot":
        features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                       requires_grad=False)
    # features.cuda()

    if agg_type == "sum":
        agg1 = SumAggregator(features,
                             cuda=True,
                             feature_dim=feature_dim,
                             num_nodes=num_nodes,
                             initializer=initializer)
        enc1 = Encoder(
            features,
            feature_dim if initializer != "None" else attribute_dim[dataset],
            identity_dim,
            adj_lists,
            agg1,
            gcn=False,
            cuda=False,
            initializer=initializer)
        agg2 = SumAggregator(lambda nodes: enc1(nodes).t(),
                             num_nodes=num_nodes,
                             cuda=False)
        enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                       enc1.embed_dim,
                       enc2_dim,
                       adj_lists,
                       agg2,
                       base_model=enc1,
                       gcn=False,
                       cuda=False)
    elif agg_type == "mean":
        agg1 = MeanAggregator(features,
                              cuda=True,
                              feature_dim=feature_dim,
                              num_nodes=num_nodes,
                              initializer=initializer)
        enc1 = Encoder(
            features,
            feature_dim if initializer != "None" else attribute_dim[dataset],
            identity_dim,
            adj_lists,
            agg1,
            gcn=True,
            cuda=False,
            initializer=initializer)
        agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(),
                              num_nodes=num_nodes,
                              cuda=False)
        enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                       enc1.embed_dim,
                       enc2_dim,
                       adj_lists,
                       agg2,
                       base_model=enc1,
                       gcn=True,
                       cuda=False)
    else:
        raise ("agg type not supported")
        exit()
    enc1.num_samples = enc1_num_samples_map[dataset]
    enc2.num_samples = enc2_num_samples_map[dataset]

    graphsage = SupervisedGraphSage(num_classes, enc2)

    optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad,
                                        graphsage.parameters()),
                                 lr=lr)
    times = []

    for epoch in range(epochs):
        random.shuffle(train_idx)
        train_labels = labels[np.array(train_idx)]
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(train_idx,
                              Variable(torch.LongTensor(train_labels)))
        # loss = graphsage.loss(train,
        #         Variable(torch.LongTensor(labels[np.array(train)])))

        # train_output = graphsage.forward(train_idx)
        # print("Validation F1 micro:", f1_score(labels[train_idx], train_output.data.numpy().argmax(axis=1), average="micro"))

        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print("Epoch:", epoch + 1, "Loss:", loss.item())

    val_output = graphsage.forward(val_idx)
    '''
    train_labels_distribution = [0] * 4
    for idx in train_idx:
        train_labels_distribution[labels[idx][0]] += 1
    print(train_labels_distribution)
    '''

    with open(
            f"results/{dataset}/{dataset}_{agg_type}_{initializer}_{feature_dim}.csv",
            mode="a") as csv_file:
        writer = csv.writer(csv_file, delimiter=",")
        micro = f1_score(labels[val_idx],
                         val_output.data.numpy().argmax(axis=1),
                         average="micro")
        macro = f1_score(labels[val_idx],
                         val_output.data.numpy().argmax(axis=1),
                         average="macro")
        writer.writerow(["%.4f" % micro, "%.4f" % macro])

    # for i in range(len(val_idx)):
    #     print("gt:", labels[i], "prediction:", np.argmax(val_output[i].data.numpy()))
    print(
        "Validation F1 micro:",
        f1_score(labels[val_idx],
                 val_output.data.numpy().argmax(axis=1),
                 average="micro"))
    print(
        "Validation F1 macro:",
        f1_score(labels[val_idx],
                 val_output.data.numpy().argmax(axis=1),
                 average="macro"))
    print("Average batch time:", np.mean(times))
예제 #16
0
def run_cora(initializer,
             seed,
             epochs,
             batch_size=128,
             feature_dim=100,
             identity_dim=50):
    np.random.seed(seed)
    random.seed(seed)
    num_nodes = 2708
    feat_data, labels, adj_lists = load_cora(num_nodes, feature_dim,
                                             initializer)
    print(feat_data, initializer)
    # if initializer == "1hot":
    #     feature_dim = num_nodes
    if initializer == "node_degree":
        feature_dim = feat_data.shape[1]
        print(feat_data.shape)
    print("feature dim is", feature_dim)
    features = nn.Embedding(num_nodes, feature_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    # features.cuda()

    agg1 = MeanAggregator(features, cuda=True, feature_dim=feature_dim)
    enc1 = Encoder(features,
                   feature_dim,
                   identity_dim,
                   adj_lists,
                   agg1,
                   gcn=True,
                   cuda=False,
                   initializer=initializer)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)
    #    graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:271]
    val = rand_indices[271:542]
    train = list(rand_indices[542:])
    train_num = len(train)

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.6)
    times = []

    for epoch in range(epochs):
        print("Epoch:", epoch)
        random.shuffle(train)
        for batch in range(0, train_num, batch_size):
            batch_nodes = train[batch:max(train_num, batch + batch_size)]
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(
                batch_nodes,
                Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
            if (batch == 0):
                print("Batch", batch, "Loss:", loss.item())

    val_output = graphsage.forward(val)
    print(
        "Validation F1 micro:",
        f1_score(labels[val],
                 val_output.data.numpy().argmax(axis=1),
                 average="micro"))
    print(
        "Validation F1 macro:",
        f1_score(labels[val],
                 val_output.data.numpy().argmax(axis=1),
                 average="macro"))
    print("Average batch time:", np.mean(times))
예제 #17
0
def run_cora(seed):
    np.random.seed(seed)
    random.seed(seed)
    num_nodes = 2708
    feat_data, labels, adj_lists, dataset_split = load_cora()

    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 1433, 16, adj_lists, agg1, gcn=True, cuda=True)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=True)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   16,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=True)
    enc1.num_samples = 10
    enc2.num_samples = 25
    # enc1.num_samples = None
    # enc2.num_samples = None

    graphsage = SupervisedGraphSage(7, enc2)
    graphsage.cuda()
    '''
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])
    '''

    test = dataset_split['test']
    val = dataset_split['val']
    train = dataset_split['train']

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    times = []

    for epoch in range(100):
        for batch in range(int(len(train) / 256)):
            batch_nodes = train[:256]
            random.shuffle(train)
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(
                batch_nodes,
                Variable(torch.LongTensor(
                    labels[np.array(batch_nodes)])).cuda())
            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
        print(epoch + 1, loss.data)

    print('')
    os.system("nvidia-smi")

    val_output = graphsage.forward(test)
    print(
        "Validation F1:",
        f1_score(labels[test],
                 val_output.cpu().data.numpy().argmax(axis=1),
                 average="micro"))
    print("Total time:", np.sum(times))
    print("Average batch time:", np.sum(times) / (epoch + 1))
    print('')

    return f1_score(labels[test],
                    val_output.cpu().data.numpy().argmax(axis=1),
                    average="micro"), np.sum(times)
예제 #18
0
def run_pubmed():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 19717
    feat_data, labels, adj_lists = load_pubmed()
    
    ######################################################################################################################
    # TESTAR AS DUAS FORMAS: INCLUIR NA MATRIZ DE FEATURES AS INFORMACOES
    #                        (talvez isso nao seja necessario ja que o graphsage faz os embeddings por agregacao)
    #                                                    OU
    #                        APENAS USAR O RESULTADO DO K-MEANS PARA SEPARAR OS LOTES
    ######################################################################################################################

    # normalization
    scaler = preprocessing.StandardScaler().fit(feat_data)
    feat_data = scaler.transform(feat_data)
    
    # Metodo Elbow para encontrar o numero de classes
    if False:
        wcss = [] # Within Cluster Sum of Squares
        for i in range(2, 11):
            kmeans = KMeans(n_clusters = i, init = 'random')
            kmeans.fit(feat_data)
            print i,kmeans.inertia_
            wcss.append(kmeans.inertia_)  
        plt.plot(range(2, 11), wcss)
        plt.title('O Metodo Elbow')
        plt.xlabel('Numero de Clusters')
        plt.ylabel('WCSS')
        plt.show()
        return None, None
        
    
    # Metodo Elbow encontrou 5 classes
    kmeans = KMeans(n_clusters = 5, init = 'random')
    kmeans.fit(feat_data)
    kmeans.fit_transform(feat_data)
    klabels = kmeans.labels_
    if False:
        return labels, klabels
    
    ######################################################################################################################
    ######################################################################################################################
    
    features = nn.Embedding(19717, 500)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data), requires_grad=False)
   # features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 500, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes : enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes : enc1(nodes).t(), enc1.embed_dim, 128, adj_lists, agg2,
            base_model=enc1, gcn=True, cuda=False)
    enc1.num_samples = 10
    enc2.num_samples = 25

    graphsage = SupervisedGraphSage(3, enc2)
#    graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)
    
    ###################################################################################################################
    # AQUI EU ATRIBUO INDICES AOS CONJUNTOS USANDO AS QUANTIDADES PROPORCIONAIS DE CADA K-MEANS CLUSTER
    ###################################################################################################################
    #test = rand_indices[:1000]
    #val = rand_indices[1000:1500]
    #train = list(rand_indices[1500:])
    
    train, val, test, ratio = _processes_set(klabels, num_clusters = 5, num_examples = num_nodes)
    ###################################################################################################################
    ###################################################################################################################

    optimizer = torch.optim.SGD(filter(lambda p : p.requires_grad, graphsage.parameters()), lr=0.7)
    times = []
    
    ###################################################################################################################
    # quantidade proporcional do batch, inicializacao do vetor de erro
    ###################################################################################################################
    quantity = np.empty((5,1), dtype=int)
    quantity[:,0] = ratio * 1024
    quantity = list(quantity.flatten())
    
    train_loss = list()
    ###################################################################################################################
    ###################################################################################################################
    
    for batch in range(200):
        ##################################################################################################
        # O QUE EU POSSO FAZER AQUI EH EMBARALHAR OS VERTICES SEPARADAMENTE DENTRO DOS CLUSTERS
        # PARA MONTAR BATCH_NODES, PEGAR AS QUANTIDADES PROPORCIONAIS 
        ##################################################################################################
        batch_nodes = list()
        for key in train:
            batch_nodes.extend(train[key][:quantity[key]])
            random.shuffle(train[key])
        random.shuffle(batch_nodes)
        ##################################################################################################
        ##################################################################################################

        #batch_nodes = train[:1024]
        #random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(batch_nodes, 
                Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time-start_time)
        ##################################################################################################
        train_loss.append(loss.data[0])    # armazena o erro
        print batch, loss.data[0]
        
    val_output = graphsage.forward(val) 
    score = f1_score(labels[val], val_output.data.numpy().argmax(axis=1), average="micro")
    print "Validation F1:", score
    print "Average batch time:", np.mean(times)
    
    return train_loss, score
예제 #19
0
def main():

    parser = ArgumentParser()
    parser.add_argument('-e', '--epoch', help='Number of epochs for training', \
            dest='epoch', type=int, required=True)
    parser.add_argument('-b', '--batchsize', help='Training batch size', \
            dest='batch_size', type=int, required=True)
    parser.add_argument('-c', '--chunksize', help='Inference chunk size', \
            dest='chunk_size', type=int, required=True)
    parser.add_argument('-r', '--random_shuffle', action='store_true', \
            help='Shuffle training data set', dest='shuffle', default=False)
    parser.add_argument('-a', '--app for test', help='application name for test', \
            dest='testapp', required=True)

    options = parser.parse_args()
    gl_dir = os.environ.get('GRAPHLEARN')
    #log_dir = 'path..../glog/'
    log_dir = gl_dir + '/glog/'

    #Commented out as per Chenhui's suggestion to introduce randomness
    #in training data via random permutation
    if not options.shuffle:
        np.random.seed(1)
        random.seed(1)
    test_app=options.testapp
    print("before-load-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))
    feat_data, labels, adj_lists, train, test = load_graph_data(test_app)
    num_nodes = feat_data.shape[0]
    feat_dim = feat_data.shape[1]
    #hidden_dim = 64
    hidden_dim = 128
    features = nn.Embedding(num_nodes, feat_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data), requires_grad=False)
    #features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, feat_dim, hidden_dim, adj_lists, agg1, gcn=False, cuda=False)
    agg2 = MeanAggregator(lambda nodes : enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes : enc1(nodes).t(), enc1.embed_dim, hidden_dim, adj_lists, agg2,
            base_model=enc1, gcn=False, cuda=False)
    agg3 = MeanAggregator(lambda nodes : enc2(nodes).t(), cuda=False)
    enc3 = Encoder(lambda nodes : enc2(nodes).t(), enc2.embed_dim, hidden_dim, adj_lists, agg3,base_model=enc2, gcn=False, cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5
    enc3.num_samples = 5

    graphsage = SupervisedGraphSage(3, enc3)

    optimizer = torch.optim.Adam(filter(lambda p : p.requires_grad, graphsage.parameters()), \
            lr=0.001)#,weight_decay=5e-4)

    epoch = options.epoch
    batch_size = options.batch_size
    chunk_size = options.chunk_size
    num_batch = len(train)//batch_size

    if not options.shuffle:
        #NOTE: Train
	print("before-train-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))
        graphsage, times, LOSS = train_graph(epoch, num_batch, batch_size, labels, \
                train, optimizer, graphsage)

        #NOTE: Infer
        print("after-train-time and before-infer-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))
        precision, recall, accuracy, f1, cm = infer_graph(test, graphsage, labels, chunk_size,test_app)

	print("after-infer-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))

        #NOTE: Summarize

        now_time = dt.now().strftime("%m/%d/%Y %H:%M:%S")
        mean_batch_time = np.mean(times)

        print("Average batch time for training:", mean_batch_time)
        print('Final loss at the end of the training: ' + str(LOSS) + '\n\n')
        print("Test Precision: ", precision)
        print("Test Recall: ", recall)
        print("Test Accuracy: ", accuracy)
        print("Test F1: ", f1)

        fh = open(log_dir + '/' + str(epoch) + '_' + str(batch_size) + \
                '_' + str(chunk_size) + '.txt', 'w')

        fh.write('Timestamp: ' + now_time + '\n\n')
        fh.write('Final loss at the end of the training: ' + str(LOSS) + '\n\n')
        fh.write('Average batch time for training: ' + str(mean_batch_time) + '\n\n')
        fh.write("Test Precision: " + str(precision) + '\n')
        fh.write("Test Recall: " + str(recall) + '\n')
        fh.write("Test Accuracy: " + str(accuracy) + '\n')
        fh.write("Test F1: " + str(f1) + '\n')
        fh.write(str(cm))

        fh.close()
    else:
        #NOTE: Introducing randomness
        stability_stat_ = {}
        for i in range(0, 5):
            random.shuffle(train)
            print("Training on the {}-th random shuffled data ".format(i))

            #NOTE: Train
	    print("before-train-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))
            graphsage, times, LOSS = train_graph(epoch, num_batch, batch_size, labels, \
                    train, optimizer, graphsage)

            #NOTE: Infer
	    print("after-train-time and before-infer-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))
            precision, recall, accuracy, f1, cm = infer_graph(test, graphsage, labels, chunk_size,test_app)
            print("after -infer-time stamp:", dt.now().strftime("%m/%d/%Y %H:%M:%S"))

            #NOTE: Store stat
            stability_stat_[str(i)] = [precision, recall, accuracy, f1]
            print('\n\n')

        stability_stat = ODict(sorted(stability_stat_.items(), key=lambda t: t[1][1], reverse=True))
        del stability_stat_

        pp.pprint(stability_stat)

        sh = open(log_dir + '/' + 'stability_stat.table', 'w')
        scontent = printTable1(stability_stat, \
                ['Shuffle No', 'Precision', 'Recall', 'Accuracy', 'F1']
                )
        sh.write(scontent)
        sh.close()

        del stability_stat

    return
예제 #20
0
def run_cora():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    # feat_data: ndarray 2708*1433
    # labels: ndarray 2708*1
    # adj_list: defaultdict
    feat_data, labels, adj_lists = load_cora()
    # 生成2708个嵌入,每一个嵌入1433维度
    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    # features.cuda()

    # forward流 下面的过程始终不会调用forward函数
    # K = 2
    # 调用MeanAggregator构造函数__init__
    agg1 = MeanAggregator(features, cuda=False)
    # 调用Encoder构造函数__init__
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)
    # t()转置,利用lambda表达式,输入是nodes,输出为enc1(nodes).t(),但是此处不会调用执行enc1的forward函数,只是把lambda匿名函数句柄传给构造函数
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    # Encoder接受采样参数,在forward中传递给聚合层forward函数
    enc1.num_samples = 5
    enc2.num_samples = 5

    # 封装为一个整体的model
    graphsage = SupervisedGraphSage(7, enc2)
    # graphsage.cuda()
    # 生成2708的一个全排列,切分训练集,测试集和验证集
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    # 将ndarray转换为list
    train = list(rand_indices[1500:])
    # 初始化优化器,并且给优化器应该优化的参数
    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    times = []
    for batch in range(1):
        # 取256大小的batch_size
        batch_nodes = train[:256]
        # 随机打乱
        random.shuffle(train)
        # 记录训练时间
        start_time = time.time()
        # 初始化梯度为0
        optimizer.zero_grad()
        # forward + loss 得到正向计算结果
        loss = graphsage.loss(
            batch_nodes,
            Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        # backward 计算出梯度
        loss.backward()
        # 优化器
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        # loss是一个torch.Tensor
        print(batch, loss.item())
        # print(type(loss), loss.size())
    '''
예제 #21
0
    cuda_available = False
    if torch.cuda.is_available():
        cuda_available = True
    feat_data, labels, adj_lists = load_cora()
    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    if cuda_available:
        features.cuda()

    agg1 = MeanAggregator(features, cuda=cuda_available)
    enc1 = Encoder(features,
                   1433,
                   128,
                   adj_lists,
                   agg1,
                   gcn=True,
                   cuda=cuda_available)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=cuda_available)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=cuda_available)
    model = SupervisedGraphSage(7, enc2)
    agg1.load_state_dict(
        torch.load(path + "MeanAggregator1.model",
예제 #22
0
def run_ppi():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 56944
    feat_data, labels, adj_lists, dataset_split = load_ppi()

    features = nn.Embedding(56944, 50)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    features.cuda()

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 50, 512, adj_lists, agg1, gcn=True, cuda=True)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=True)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   512,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=True)
    enc1.num_samples = 10
    enc2.num_samples = 25
    # enc1.num_samples = None
    # enc2.num_samples = None

    graphsage = SupervisedGraphSage(121, enc2)
    graphsage.cuda()

    test = dataset_split['test']
    train = dataset_split['train']

    optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad,
                                        graphsage.parameters()),
                                 lr=0.0001)
    times = []
    epoch_num = 400
    for epoch in range(epoch_num):
        for batch in range(int(len(train) / 1024)):
            batch_nodes = train[:1024]
            random.shuffle(train)
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(
                batch_nodes,
                Variable(torch.FloatTensor(
                    labels[np.array(batch_nodes)])).cuda())
            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time - start_time)
        print(epoch + 1, loss.data)

    print('')
    os.system("nvidia-smi")

    agg1.cuda = False
    enc1.cuda = False
    agg2.cuda = False
    enc2.cuda = False

    val_output = graphsage.cpu().forward(test)
    val_output[val_output > 0] = 1
    val_output[val_output <= 0] = 1
    print(
        "Validation F1:",
        f1_score(labels[test], val_output.cpu().data.numpy(), average="micro"))
    print("Total time:", np.sum(times))
    print("Average batch time:", np.sum(times) / epoch_num)
    print('')
예제 #23
0
def run_pubmed():
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    seed = 123
    np.random.seed(seed)
    random.seed(seed)
    torch.manual_seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed(seed)

    num_nodes = 19717
    num_feat = 500
    num_embed = 128
    feat_data, labels, adj_lists = load_pubmed()
    features = nn.Embedding(num_nodes, num_feat)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    features.to(device)

    # use gcn as aggregator
    agg1 = MeanAggregator(features, device)
    enc1 = Encoder(features,
                   num_feat,
                   num_embed,
                   adj_lists,
                   agg1,
                   device,
                   gcn=True)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes), device)
    enc2 = Encoder(lambda nodes: enc1(nodes),
                   num_embed,
                   num_embed,
                   adj_lists,
                   agg2,
                   device,
                   base_model=enc1,
                   gcn=True)
    # use different nums for different layer according to the paper
    enc1.num_samples = 10
    enc2.num_samples = 25

    graphsage = SupervisedGraphSage(3, enc2)
    graphsage.to(device)
    rand_indices = np.random.permutation(num_nodes)
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])

    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    times = []
    for batch in range(200):
        batch_nodes = train[:1024]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(
            batch_nodes,
            torch.LongTensor(labels[np.array(batch_nodes)]).cuda())
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(batch, loss.item())

    val_output = graphsage.forward(val)
    test_output = graphsage.forward(test)
    print(
        "Validation F1:",
        f1_score(labels[val],
                 val_output.cpu().data.numpy().argmax(axis=1),
                 average="micro"))
    print(
        "Test F1:",
        f1_score(labels[test],
                 test_output.cpu().data.numpy().argmax(axis=1),
                 average="micro"))
    print("Average batch time:", np.mean(times))
예제 #24
0
def run_cora():
    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    """
    feat_data 是每篇论文对应的词表
    是一个二维数组,共2708行,1433列。
    
    labels 是论文的类别标签,共分7个不同子领域 
    是一个二维数组,共2708行,1列。每行元素为一个节点对应的label,共7种,从0到6.
    
    adj_lists 论文引用关系表。
    字典的字典,里面共有2708个元素,每个元素的key为节点编号,值为该节点的邻接点组成的字典
    例如其中一个元素为 310: {2513, 74, 747, 668}
    由于监督任务是为了区分子领域,因此这个引用关系表被构造成无向图。
    """

    feat_data, labels, adj_lists = load_cora()


    # 2708个节点,每个节点生成一个1433维的向量.
    # 对于每个节点的1433维上,用高斯分布进行初始化。存储在features.weight中。
    features = nn.Embedding(2708, 1433)
    # 用feat_data的值覆盖掉features.weight,且把features.weight转为可训练的状态
    features.weight = nn.Parameter(torch.FloatTensor(feat_data), requires_grad=False)
    # features.cuda()

    # 初始化agg1对象
    # 初始化传参 features = features,尺寸为(2708, 1433)
    # 在前向传播时,仅仅是对本次batch的每个节点,用其邻接点嵌入的平均来表示它自己,
    # 结果张量 neigh_feats 的尺寸为(batch_size,1433)
    agg1 = MeanAggregator(features, cuda=False)
    # 初始化enc1对象
    # 初始化传参 features = features,尺寸为(2708, 1433),feature_dim=1433,embed_dim=128
    # 在前向传播时,仅仅相当于对 neigh_feats 进行了一层编码映射(矩阵乘法+激活),从1433维到128维
    # 结果张量 combined 的尺寸(128,batch_size)
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)

    # 初始化agg2对象
    # 初始化传参 features = enc1输出的转置,尺寸为(batch_size,128)
    # 在前向传播时,仅仅是对本次batch的每个节点,用其邻接点嵌入的平均来表示它自己,
    # 结果张量 neigh_feats 的尺寸为(batch_size,128)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)

    # 初始化enc2对象
    # 初始化传参 features = enc1输出的转置,尺寸为(batch_size,128)
    # 在前向传播时,仅仅相当于对 neigh_feats 进行了一层编码映射(矩阵乘法+激活),从128维到128维
    # 结果张量 combined 的尺寸(128,batch_size)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(), enc1.embed_dim, 128, adj_lists, agg2,
                   base_model=enc1, gcn=True, cuda=False)

    enc1.num_samples = 5
    enc2.num_samples = 5

    # 通过SupervisedGraphSage类,生成一个完整的计算图,包括前向传播及损失计算
    # enc2可被看做一个几乎已串联完成的计算图,输入为features,输出为经过激活的combined
    graphsage = SupervisedGraphSage(7, enc2)
    #    graphsage.cuda()

    # 随机化一个节点的序列。即生成一个数组,长度为num_nodes,里面所有元素是对[0,num_nodes-1]一个序列的shuffle。
    rand_indices = np.random.permutation(num_nodes)
    """
    500个节点来测试
    2208个节点来训练
    """

    val = rand_indices[:500]
    train = rand_indices[500:]
    # 定义优化器
    # 其中filter与lambda的作用是:
    # 通过判断requires_grad的真假来过滤参数,即SGD只训练那些graphsage.parameters()里需要训练的参数(requires_grad为True)
    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, graphsage.parameters()), lr=0.7)

    for batch in range(120):
        # 每个batch只跑头256个节点,下一个batch的头256个节点又不一样(因为shuffle了)。
        batch_nodes = train[:256]
        random.shuffle(train)

        start_time = time.time()
        optimizer.zero_grad()
        # 计算损失
        # batch_nodes 是节点索引的数组
        # Variable(...) 是把batch_nodes 转换为节点对应label数组,格式为tensor
        loss = graphsage.loss(batch_nodes, Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        # 计算梯度
        loss.backward()
        # 参数更新
        optimizer.step()


    train_output = graphsage.forward(train)
    # 用验证集的节点前向传播一次
    val_output = graphsage.forward(val)


    print("Train:", classification_report(labels[train], train_output.data.numpy().argmax(axis=1)))
    print("Validation:", classification_report(labels[val], val_output.data.numpy().argmax(axis=1)))
    # 打印f1_score,即认为precision和recall同等重要。
    # 因为val是验证集的样本的索引,所以labels[val]即可获得对应的label数组
    print("Validation F1:", f1_score(labels[val], val_output.data.numpy().argmax(axis=1), average="micro"))
예제 #25
0
def run_cora():
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    # setting random seed
    seed = 424
    np.random.seed(seed)
    random.seed(seed)
    torch.manual_seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed(seed)

    num_nodes = 2708
    num_feat = 1433
    num_embed = 128
    num_classes = 7
    feat_data, labels, adj_lists = load_cora()
    features = nn.Embedding(num_nodes, num_feat)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    features.to(device)

    agg1 = MeanAggregator(features, device)
    enc1 = Encoder(features,
                   num_feat,
                   num_embed,
                   adj_lists,
                   agg1,
                   device,
                   gcn=True)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes), device)
    enc2 = Encoder(lambda nodes: enc1(nodes),
                   num_embed,
                   num_embed,
                   adj_lists,
                   agg2,
                   device,
                   base_model=enc1,
                   gcn=True)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(num_classes, enc2)
    graphsage.to(device)
    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    rand_indices = np.random.permutation(num_nodes)  # shuffle index
    test = rand_indices[:1000]
    val = rand_indices[1000:1500]
    train = list(rand_indices[1500:])
    times = []
    for batch in range(100):
        batch_nodes = train[:256]
        # shuffle to random sampling
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        # 1. batch_nodes -> result (num_nodes, num_classes)
        # 2. loss(result, labels)
        loss = graphsage.loss(
            batch_nodes,
            torch.LongTensor(labels[np.array(batch_nodes)]).to(device))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        print(batch, loss.item())

    val_output = graphsage.forward(val)
    test_output = graphsage.forward(test)
    # average:
    #   micro  total F1-score
    #   macro  average of F1 of all classes
    print(
        "Validation F1:",
        f1_score(labels[val],
                 val_output.cpu().data.numpy().argmax(axis=1),
                 average="micro"))
    print(
        "Test F1:",
        f1_score(labels[test],
                 test_output.cpu().data.numpy().argmax(axis=1),
                 average="micro"))
    print("Average batch time:", np.mean(times))  # numpy's param can be list
def run_cora(printout=True):

    begin = timeit.default_timer()

    np.random.seed(1)
    random.seed(1)
    num_nodes = 2708
    feat_data, labels, adj_lists = load_cora()
    features = nn.Embedding(2708, 1433)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data),
                                   requires_grad=False)
    # features.cuda()

    # MeanAggregator params
    #  features, cuda=False, gcn=False

    # Encoder params
    #  features, feature_dim, embed_dim, adj_lists, aggregator, num_sample=10, base_model=None,
    #  gcn=False, cuda=False, feature_transform=False

    agg1 = MeanAggregator(features, cuda=True)
    enc1 = Encoder(features, 1433, 128, adj_lists, agg1, gcn=True, cuda=False)
    agg2 = MeanAggregator(lambda nodes: enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes: enc1(nodes).t(),
                   enc1.embed_dim,
                   128,
                   adj_lists,
                   agg2,
                   base_model=enc1,
                   gcn=True,
                   cuda=False)
    enc1.num_samples = 5
    enc2.num_samples = 5

    graphsage = SupervisedGraphSage(7, enc2)
    #    graphsage.cuda()
    rand_indices = np.random.permutation(num_nodes)  # len(rand_indices) = 2708
    test = rand_indices[:1000]  # 1000 exemplos
    val = rand_indices[1000:1500]  # 1500 exemplos
    train = list(rand_indices[1500:])  # 1208 exemplos

    # De onde saiu graphsage.parameters() ????
    # A classe chama super() . Onde estah super() ????
    optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                       graphsage.parameters()),
                                lr=0.7)
    times = []

    ##################################################################################################
    train_loss = list()  # inicializa o vetor

    for batch in range(100):
        batch_nodes = train[:256]
        random.shuffle(train)
        start_time = time.time()
        optimizer.zero_grad()
        loss = graphsage.loss(
            batch_nodes,
            Variable(torch.LongTensor(labels[np.array(batch_nodes)])))
        loss.backward()
        optimizer.step()
        end_time = time.time()
        times.append(end_time - start_time)
        ##################################################################################################
        train_loss.append(loss.data[0])  # armazena o erro
        if printout:
            print batch, loss.data[0]

    end = timeit.default_timer()
    elapsed = end - begin

    val_output = graphsage.forward(val)
    score = f1_score(labels[val],
                     val_output.data.numpy().argmax(axis=1),
                     average="micro")

    if printout:
        print "Validation F1:", score
        print "Average batch time:", np.mean(times)

    return train_loss, score, elapsed
예제 #27
0
def train():
    np.random.seed(1)
    random.seed(1)
    feat_data, train_label, test_label, adj_lists, train, test = load_cora()
    num_nodes = feat_data.shape[0]
    feat_dim = feat_data.shape[1]
    hidden_dim = 15
    features = nn.Embedding(num_nodes, feat_dim)
    features.weight = nn.Parameter(torch.FloatTensor(feat_data), requires_grad=False)
    #features.cuda()

    agg1 = MeanAggregator(features, cuda=False)
    enc1 = Encoder(features, feat_dim, hidden_dim, adj_lists, agg1, gcn=False, cuda=False)
    agg2 = MeanAggregator(lambda nodes : enc1(nodes).t(), cuda=False)
    enc2 = Encoder(lambda nodes : enc1(nodes).t(), enc1.embed_dim, hidden_dim, adj_lists, agg2,
            base_model=enc1, gcn=False, cuda=False)
    agg3 = MeanAggregator(lambda nodes : enc2(nodes).t(), cuda=False)
    enc3 = Encoder(lambda nodes : enc2(nodes).t(), enc2.embed_dim, hidden_dim, adj_lists, agg3,
            base_model=enc2, gcn=False, cuda=False)
    agg4 = MeanAggregator(lambda nodes : enc3(nodes).t(), cuda=False)
    enc4 = Encoder(lambda nodes : enc3(nodes).t(), enc3.embed_dim, hidden_dim, adj_lists, agg4,
            base_model=enc3, gcn=False, cuda=False)
    enc1.num_samples = 15
    enc2.num_samples = 15
    enc3.num_samples = 15
    enc4.num_samples = 15

    graphsage = SupervisedGraphSage(hidden_dim, enc3)
    #graphsage.cuda()

    optimizer = torch.optim.Adam(filter(lambda p : p.requires_grad, graphsage.parameters()), lr=0.001, weight_decay=1e-5)
    times = []
    epoch = 500
    batch_size = 256
    num_batch = math.ceil(len(train)/batch_size)
    best = 1e9
    cnt_wait = 0
    patience = 100
    best_epoch = 0
    best_batch = 0

    train_pair1 = []
    train_pair2 = []
    test_pair1 = []
    test_pair2 = []
    for x in train:
        train_pair1.append(x[0])
        train_pair2.append(x[1])
    for x in test:
        test_pair1.append(x[0])
        test_pair2.append(x[1])
    # shuffle training set
    fused_train = [list(x) for x in shuffle_list(train_pair1,train_pair2,train_label)]
    train_pair1 = fused_train[0]
    train_pair2 = fused_train[1]
    train_label = fused_train[2]
    for e in range(epoch):
        for i in range(num_batch):
            if i < num_batch - 1:
                pair1 = train_pair1[i*batch_size: i*batch_size + batch_size]
                pair2 = train_pair2[i*batch_size: i*batch_size + batch_size]
                sub_label = train_label[i*batch_size: i*batch_size + batch_size]
            else:
                pair1 = train_pair1[i*batch_size: len(train_pair1)]
                pair2 = train_pair2[i*batch_size: len(train_pair2)]
                sub_label = train_label[i*batch_size: len(train_pair1)]
            start_time = time.time()
            optimizer.zero_grad()
            loss = graphsage.loss(pair1, pair2,\
                Variable(torch.FloatTensor(np.asarray(sub_label))))

            
            if loss < best:
                best = loss
                best_epoch = e
                best_batch = i
                cnt_wait = 0
                torch.save(graphsage.state_dict(), 'best_model.pkl')
            else:
                cnt_wait += 1
            

            loss.backward()
            optimizer.step()
            end_time = time.time()
            times.append(end_time-start_time)
            print("The {}-th epoch, The {}-th batch, ".format(e, i), "Loss: ", loss.item())
        if cnt_wait == patience:
            print('Early stoppping!')
            break

    print('Loading {}th epoch {}th batch'.format(best_epoch, best_batch))
    graphsage.load_state_dict(torch.load('best_model.pkl'))

    return graphsage, test, test_pair1, test_pair2, test_label