{
"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
}