{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cuda\n" ] } ], "source": [ "from GSNN import utils\n", "import numpy as np\n", "import scipy.sparse as sp\n", "from tqdm import tqdm\n", "import torch\n", "\n", "from GSNN.GSNNmodel import GSNN, GCN\n", "from GSNN.GSNNTrain import GSNNTrainer, GCNTrainer\n", "\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "print(device)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "dataset = 'cora'\n", "seed = 15\n", "ratio = 0.05 # ratio of training set\n", "unlabeled_share = 0.8\n", "train_share = ratio \n", "val_share = 1 - unlabeled_share - train_share\n", "weight_decay = 5e-4\n", "lr = 1e-2\n", "hidden_dim = 16\n", "attack = None\n", "epochs = 200\n", "earlystopping = False" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Selecting 1 largest connected components\n", "Number of trainging set: 124\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/whb/anaconda3/envs/tf-gpu-cuda8/lib/python3.6/site-packages/scipy/sparse/compressed.py:708: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.\n", " self[i, j] = values\n" ] } ], "source": [ "_A_obs, _X_obs, _z_obs = utils.load_npz('data/' + dataset + '.npz')\n", "\n", "if _X_obs is None:\n", " _X_obs = sp.eye(_A_obs.shape[0]).tocsr()\n", "lcc = utils.largest_connected_components(_A_obs)\n", "\n", "\n", "if attack=='meta_self':\n", " _A_obs = sp.csr_matrix(np.load('data/' + dataset + '_0.05edges_Meta-Self.npy'))\n", "elif attack=='meta_train':\n", " _A_obs = sp.csr_matrix(np.load('data/' + dataset + '_0.05edges_Meta-Train.npy'))\n", "elif attack=='minmax':\n", " _A_obs = sp.csr_matrix(np.load('data/' + dataset + '_0.05_minmax.npy'))\n", "else:\n", " _A_obs = _A_obs[lcc][:,lcc]\n", "\n", "_A_obs = _A_obs + _A_obs.T\n", "_A_obs[_A_obs > 1] = 1\n", "\n", "\n", "_A_obs.setdiag(0)\n", "_A_obs = _A_obs.astype(\"float32\")\n", "_A_obs.eliminate_zeros()\n", "_X_obs = _X_obs.astype(\"float32\")\n", "\n", "_X_obs = _X_obs[lcc]\n", "_z_obs = _z_obs[lcc]\n", "_N = _A_obs.shape[0]\n", "_K = _z_obs.max()+1\n", "_Z_obs = np.eye(_K)[_z_obs]\n", "\n", "#normalized adj\n", "_An = utils.preprocess_graph(_A_obs)\n", "degrees = _A_obs.sum(0).A1\n", "\n", "np.random.seed(seed)\n", "\n", "split_train, split_val, split_test = utils.train_val_test_split_tabular(np.arange(_N),\n", " train_size=train_share,\n", " val_size=val_share,\n", " test_size=unlabeled_share,\n", " stratify=_z_obs)\n", "print('Number of trainging set: {}'.format(split_train.shape[0]))\n", "split_unlabeled = np.union1d(split_val, split_test)\n", "\n", "utils.set_seed(42, torch.cuda.is_available())\n", "adj = utils.sparse_mx_to_torch_sparse_tensor(_An).float()\n", "adj_cuda = adj.cuda()\n", "\n", "feature_cuda, label_cuda, idx_train_cuda, idx_val_cuda, idx_test_cuda = utils.convert_to_Tensor([_X_obs, _Z_obs, split_train, split_val, split_test])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# An instantiation of GSNN-M model\n", "x_dim = feature_cuda.shape[1]\n", "y_dim = label_cuda.shape[1]\n", "h_dim, z_dim, r_dim = utils.get_h_dim(hidden_dim)\n", "\n", "gcn = GCN(x_dim, h_dim, y_dim, True, False)\n", "gsnn = GSNN(x_dim, y_dim, h_dim, r_dim, z_dim, gcn)\n", "\n", "optimizer = torch.optim.Adam(gsnn.parameters(), lr=lr, weight_decay=weight_decay)\n", "gsnntrainer = GSNNTrainer(gsnn, optimizer)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/whb/anaconda3/envs/tf-gpu-cuda8/lib/python3.6/site-packages/torch/nn/functional.py:1332: UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\n", " warnings.warn(\"nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.\")\n", "/home/whb/cx/GSNN-master/GSNN/GSNNTrain.py:102: UserWarning: Implicit dimension choice for log_softmax has been deprecated. Change the call to include dim=X as an argument.\n", " kl_pq += (F.gumbel_softmax(y_encode[non_label].detach(), tau=1.0, hard=True) * (-F.log_softmax(y_pred_total[i][non_label]))).sum()/len(non_label)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0, Train_loss: 13.858444213867188.\n", "--------------------------------------------------\n", "Epoch: 10, Train_loss: 5.221202850341797.\n", "--------------------------------------------------\n", "Epoch: 20, Train_loss: 3.815887928009033.\n", "--------------------------------------------------\n", "Epoch: 30, Train_loss: 2.999713659286499.\n", "--------------------------------------------------\n", "Epoch: 40, Train_loss: 2.3898627758026123.\n", "--------------------------------------------------\n", "Epoch: 50, Train_loss: 2.207118034362793.\n", "--------------------------------------------------\n", "Epoch: 60, Train_loss: 2.0307657718658447.\n", "--------------------------------------------------\n", "Epoch: 70, Train_loss: 1.8835062980651855.\n", "--------------------------------------------------\n", "Epoch: 80, Train_loss: 1.9842537641525269.\n", "--------------------------------------------------\n", "Epoch: 90, Train_loss: 1.973174810409546.\n", "--------------------------------------------------\n", "Epoch: 100, Train_loss: 1.8750896453857422.\n", "--------------------------------------------------\n", "Epoch: 110, Train_loss: 1.6767644882202148.\n", "--------------------------------------------------\n", "Epoch: 120, Train_loss: 1.5475802421569824.\n", "--------------------------------------------------\n", "Epoch: 130, Train_loss: 1.615576982498169.\n", "--------------------------------------------------\n", "Epoch: 140, Train_loss: 1.5237687826156616.\n", "--------------------------------------------------\n", "Epoch: 150, Train_loss: 1.4325405359268188.\n", "--------------------------------------------------\n", "Epoch: 160, Train_loss: 1.4331215620040894.\n", "--------------------------------------------------\n", "Epoch: 170, Train_loss: 1.5242900848388672.\n", "--------------------------------------------------\n", "Epoch: 180, Train_loss: 1.4480408430099487.\n", "--------------------------------------------------\n", "Epoch: 190, Train_loss: 1.216697096824646.\n", "--------------------------------------------------\n", "Test_mean_acc: 0.8274647887323944\n", "--------------------------------------------------\n" ] } ], "source": [ "res = gsnntrainer.train(adj_cuda, feature_cuda, label_cuda, idx_train_cuda, idx_val_cuda, idx_test_cuda, epochs, earlystopping=earlystopping)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 4 }