# scheduler.step() hidden_emb = mu.cpu().data.numpy() # roc_curr, ap_curr = get_roc_score(hidden_emb, adj_bs) # print('cur_loss_list: ') # print(cur_loss_list) # print(len(cur_loss_list)) # one epoch one mean loss # total training samples num: len(adj_feat_list) # sum up all the batch losses and average them to get current epoch mean loss mean_loss = sum(cur_loss_list) / len(adj_feat_list) print('Epoch '+ str(epoch)+' mean_loss: ') print(mean_loss) loss_record.append(mean_loss) print('loss record by epoch: ') print(loss_record) fout = open(model_out+'loss_by_epochs.txt', 'w') fout.writelines(["%s\n" % item for item in loss_record]) # draw_loss_curve(loss_record) end_time = time.time() print('time elapse is : ' + str(end_time-start_time)) model_file = 'model_'+str(batch_size)+'_'+str(epochs)+'_'+str(lr)+'.pkl' print(model.cpu()) # of = open(model_file, 'w') model_cpu = model.cpu() torch.save(model_cpu.state_dict(), model_out + model_file) ### load model dict # model = GCNModelVAE(batch_size, args.hidden1, args.hidden2, args.dropout) # model.load_state_dict(torch.load(model_file)) # print(model)
mu=mu, logvar=logvar, n_nodes=n_nodes, norm=norm, pos_weight=pos_weight) cpu_loss = loss.cpu() cur_loss_list.append(cpu_loss.data.numpy().tolist()) loss.backward() # cur_loss = loss.item() optimizer.step() hidden_emb = mu.cpu().data.numpy() print(cur_loss_list) print(len(cur_loss_list)) # one epoch one mean loss # total training samples num: len(adj_feat_list) # sum up all the batch losses and average them to get current epoch mean loss mean_loss = sum(cur_loss_list) / len(adj_feat_list) print('epoch ' + str(epoch) + 'the mean loss:', end=' ') print(mean_loss) loss_record.append(mean_loss) fout = open('./loss_by_epochs.txt', 'w') fout.writelines(["%s\n" % item for item in loss_record]) # draw_loss_curve(loss_record) model_file = 'model_' + str(batch_size) + '_' + str(epochs) + '_' + str( lr) + '.pkl' print(model.cpu()) of = open(model_file, 'wb') pickle.dump(model.cpu(), of)
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()