adj_feat_list = load_list(args.dataset, args.K)

    partition = {"train": adj_feat_list}

    # Parameters
    train_params = {'dim': dim,
                    'adj_dim': (dim, dim),
                    'feature_dim': (dim, 1),
                    'batch_size': batch_size,
                    'shuffle': False,
                    'path': path}
    training_generator = DataGenerator(partition['train'], **train_params)
    print("the training data is ready")
    model = GCNModelVAE(batch_size, args.hidden1, args.hidden2, args.dropout)
    model.cuda()  ###################################################################
    optimizer = optim.Adam(model.parameters(), lr=args.lr)
    # scheduler = ReduceLROnPlateau(optimizer, 'min')
    scheduler = MultiStepLR(optimizer, milestones=[50, 80], gamma=0.1)
    loss_record = []
    start_time = time.time()

    for epoch in range(epochs):
        scheduler.step()
        # Training
        #     numm=0
        cur_loss_list = []
        for adj_bs, features_bs in training_generator:
            # Transfer to GPU

            #   print(int(adj_bs.shape[1]/dim))
Beispiel #2
0
            adj_label = adj_bs + sp.eye(adj_bs.shape[0])
            # adj_label = sparse_to_tuple(adj_label)
            adj_label = torch.FloatTensor(adj_label.toarray())
            # adj_label = torch.LongTensor(adj_label.toarray())

            pos_weight = float(adj_bs.shape[0] * adj_bs.shape[0] -
                               adj_bs.sum()) / adj_bs.sum()
            norm = adj_bs.shape[0] * adj_bs.shape[0] / float(
                (adj_bs.shape[0] * adj_bs.shape[0] - adj_bs.sum()) * 2)

            model = GCNModelVAE(feat_dim, args.hidden1, args.hidden2,
                                args.dropout)
            model = torch.nn.DataParallel(
                model, device_ids=[0]
            )  ###################################################################
            model.cuda()
            # parallel_model = DataParallelModel(model, device_ids=[0])
            # parallel_loss = DataParallelCriterion(loss_function, device_ids=[0])
            # optimizer = optim.Adam(model.parameters(), lr=args.lr)
            # parallel_model.train()
            # optimizer.zero_grad()
            # recovered, mu, logvar = parallel_model(features_bs, adj_norm)
            # loss = loss_function(preds=recovered,
            #                      labels=adj_label,
            #                      mu=mu,
            #                      logvar=logvar,
            #                      n_nodes=n_nodes,
            #                      norm=norm,
            #                      pos_weight=pos_weight)
            #
            # cpu_loss = loss.cpu()
Beispiel #3
0
def gae_for(args):
    print("Using {} dataset".format(args.dataset_str))
    #得到原始邻接矩阵和特征
    adj, features = load_data(args.dataset_str)
    n_nodes, feat_dim = features.shape
    # Store original adjacency matrix (without diagonal entries) for later
    adj_orig = adj
    adj_orig = adj_orig - sp.dia_matrix(
        (adj_orig.diagonal()[np.newaxis, :], [0]), shape=adj_orig.shape)
    adj_orig.eliminate_zeros()
    print(adj.shape)
    adj_train, train_edges, val_edges, val_edges_false, test_edges, test_edges_false = mask_test_edges(
        adj)
    adj = adj_train
    print('adj.shape:{}'.format(adj.shape))
    print("np.sum(adj):{}".format(np.sum(adj)))
    print("len(train_edges):{}".format(len(train_edges)))
    print("len(test_edges):{}".format(len(test_edges)))
    print("len(val_edges):{}".format(len(val_edges)))
    # Some preprocessing
    adj_norm = preprocess_graph(adj)
    adj_label = adj_train + sp.eye(adj_train.shape[0])
    # adj_label = sparse_to_tuple(adj_label)
    adj_label = torch.FloatTensor(adj_label.toarray())

    pos_weight = float(adj.shape[0] * adj.shape[0] - adj.sum()) / adj.sum()
    # pos_weight=torch.from_numpy(pos_weight)
    norm = adj.shape[0] * adj.shape[0] / float(
        (adj.shape[0] * adj.shape[0] - adj.sum()) * 2)

    model = GCNModelVAE(feat_dim, args.hidden1, args.hidden2, args.dropout)
    if cuda:
        model = model.cuda()
        features = features.cuda()
        adj_norm = adj_norm.cuda()
    optimizer = optim.Adam(model.parameters(), lr=args.lr)
    hidden_emb = None
    for epoch in range(args.epochs):
        t = time.time()
        model.train()
        optimizer.zero_grad()
        #每次将整个图放入到模型中训练
        recovered, mu, logvar = model(features, adj_norm)
        loss = loss_function(preds=recovered,
                             labels=adj_label,
                             mu=mu,
                             logvar=logvar,
                             n_nodes=n_nodes,
                             norm=norm)
        loss.backward()
        cur_loss = loss.item()
        optimizer.step()

        hidden_emb = mu.cpu().data.numpy()
        roc_curr, ap_curr = get_roc_score(hidden_emb, adj_orig, val_edges,
                                          val_edges_false)

        print("Epoch:", '%04d' % (epoch + 1), "train_loss=",
              "{:.5f}".format(cur_loss), "val_ap=", "{:.5f}".format(ap_curr),
              "time=", "{:.5f}".format(time.time() - t))

    print("Optimization Finished!")
    roc_score, ap_score = get_roc_score(hidden_emb, adj_orig, test_edges,
                                        test_edges_false)
    print('Test ROC score: ' + str(roc_score))
    print('Test AP score: ' + str(ap_score))
    model = model.cpu()