ixxi-dante/nw2vec

View on GitHub
projects/correctness/gae-reproduction-cora-nw2vec-gae_arch.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Train nw2vec with the original VGAE architecture for Cora embeddings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "# Train on CPU (hide GPU) due to memory constraints\n",
    "os.environ['CUDA_VISIBLE_DEVICES'] = \"\"\n",
    "\n",
    "import contextlib\n",
    "\n",
    "import numpy as np\n",
    "import keras\n",
    "from keras_tqdm import TQDMNotebookCallback as TQDMCallback\n",
    "\n",
    "from nw2vec import layers\n",
    "from nw2vec import ae\n",
    "from nw2vec import utils\n",
    "from nw2vec import batching\n",
    "import settings\n",
    "\n",
    "from gae.input_data import load_data\n",
    "from gae.preprocessing import sparse_to_tuple, mask_test_edges"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "@contextlib.contextmanager\n",
    "def gae_directory():\n",
    "    working_directory = os.path.abspath(os.curdir)\n",
    "    try:\n",
    "        # Move to the GAE directory\n",
    "        os.chdir('../../gae')\n",
    "        yield\n",
    "    finally:\n",
    "        # Move back\n",
    "        os.chdir(working_directory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load data\n",
    "with gae_directory():\n",
    "    adj, features = load_data('cora')\n",
    "    features = features.toarray()\n",
    "\n",
    "#adj_train = mask_test_edges(adj)[0]\n",
    "adj_train, train_edges, val_edges, val_edges_false, test_edges, test_edges_false = mask_test_edges(adj)\n",
    "assert adj_train.diagonal().sum() == 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "dims = (features.shape[1], 32, 8, 8)\n",
    "n_ξ_samples =1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_p_builder(dims, adj_kernel=None, use_bias=False, with_l1=True):\n",
    "\n",
    "    # Extract the dimensions we use.\n",
    "    dim_data, dim_l1, _, _ = dims\n",
    "\n",
    "    def p_builder(p_input):\n",
    "        if with_l1:\n",
    "            # Unshared intermediate layer.\n",
    "            p_penultimate_adj = keras.layers.Dense(\n",
    "                dim_l1, use_bias=use_bias, activation='relu',\n",
    "                kernel_regularizer='l2', bias_regularizer='l2',\n",
    "                name='p_layer1_adj'\n",
    "            )(p_input)\n",
    "        else:\n",
    "            # No intermediate layer.\n",
    "            p_penultimate_adj = p_input\n",
    "\n",
    "        # Prepare kwargs for the Bilinear adj decoder, then build it.\n",
    "        adj_kwargs = {}\n",
    "        if adj_kernel is not None:\n",
    "            adj_kwargs['fixed_kernel'] = adj_kernel\n",
    "        else:\n",
    "            adj_kwargs['kernel_regularizer'] = 'l2'\n",
    "        p_adj = layers.Bilinear(0, use_bias=use_bias, name='p_adj',\n",
    "                                bias_regularizer='l2',\n",
    "                                **adj_kwargs)([p_penultimate_adj, p_penultimate_adj])\n",
    "\n",
    "        return ([p_adj], ('SigmoidBernoulliScaledAdjacency',))\n",
    "\n",
    "    return p_builder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "q_model, q_codecs = ae.build_q(dims, fullbatcher=batching.fullbatches)\n",
    "p_builder = build_p_builder(dims, adj_kernel=np.eye(16), with_l1=False)\n",
    "\n",
    "vae, vae_codecs = ae.build_vae(\n",
    "    (q_model, q_codecs),\n",
    "    p_builder,\n",
    "    n_ξ_samples,\n",
    "    [1.0, 1.0]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def target_func(batch_adj, required_nodes, final_nodes):\n",
    "    return [\n",
    "        np.zeros(1),  # ignored\n",
    "        utils.expand_dims_tile(\n",
    "            utils.expand_dims_tile(batch_adj + np.eye(batch_adj.shape[0]),\n",
    "                                   0, n_ξ_samples),\n",
    "            0, 1\n",
    "        )\n",
    "    ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/slerique/anaconda3/envs/base36/lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py:100: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1f8cf30359394702aa5e0fc3a1dffb48",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, description='Training', max=200), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "n_epochs = 200\n",
    "\n",
    "history = vae.fit_fullbatches(batcher_kws={'adj': adj_train, 'features': features, 'target_func': target_func},\n",
    "                              epochs=n_epochs,\n",
    "                              verbose=0, callbacks=[TQDMCallback(show_inner=False)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = {'history': history.history}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, len(history['history']), figsize=(len(history['history']) * 5, 4))\n",
    "for i, (title, values) in enumerate(history['history'].items()):\n",
    "    axes[i].plot(np.array(values))\n",
    "    axes[i].set_title(title)\n",
    "fig.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Precision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import scipy\n",
    "from sklearn.metrics import roc_auc_score\n",
    "from sklearn.metrics import average_precision_score\n",
    "from keras import backend as K"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_roc_score(edges_pos, edges_neg, adj_pred):\n",
    "    # Predict on test set of edges\n",
    "    preds = []\n",
    "    pos = []\n",
    "    for e in edges_pos:\n",
    "        preds.append(adj_pred[e[0], e[1]])\n",
    "        pos.append(adj[e[0], e[1]])\n",
    "\n",
    "    preds_neg = []\n",
    "    neg = []\n",
    "    for e in edges_neg:\n",
    "        preds_neg.append(adj_pred[e[0], e[1]])\n",
    "        neg.append(adj[e[0], e[1]])\n",
    "\n",
    "    preds_all = np.hstack([preds, preds_neg])\n",
    "    labels_all = np.hstack([np.ones(len(preds)), np.zeros(len(preds))])\n",
    "    roc_score = roc_auc_score(labels_all, preds_all)\n",
    "    ap_score = average_precision_score(labels_all, preds_all)\n",
    "\n",
    "    return roc_score, ap_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "q_preds, adj_preds = zip(*[vae.predict_fullbatch(adj=adj_train, features=features) for _ in range(10)])\n",
    "\n",
    "q_preds = np.array(q_preds)\n",
    "adj_preds = np.array(adj_preds)\n",
    "\n",
    "q_pred = q_preds.mean(0)\n",
    "adj_pred = scipy.special.expit(adj_preds[:, 0, :, :, :]).mean(1).mean(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.9033518285810989, 0.9101242349344631)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_roc_score(test_edges, test_edges_false, adj_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for layer in vae.layers:\n",
    "    if hasattr(layer, 'kernel'):\n",
    "        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 4))#, sharey=True)\n",
    "        im1 = ax1.imshow(K.eval(layer.kernel).T)\n",
    "        ax1.set_title('{} kernel'.format(layer.name))\n",
    "        plt.colorbar(im1, ax=ax1)\n",
    "        if hasattr(layer, 'bias') and layer.bias is not None:\n",
    "            im2 = ax2.imshow(K.eval(K.expand_dims(layer.bias, -1)))\n",
    "            ax2.set_title('{} bias'.format(layer.name))\n",
    "            plt.colorbar(im2, ax=ax2)\n",
    "        else:\n",
    "            ax2.set_visible(False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot the embeddings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy\n",
    "import scipy.sparse as sp\n",
    "import seaborn as sb\n",
    "\n",
    "from sklearn.manifold import MDS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Downscale the embeddings\n",
    "mds = MDS(n_jobs=-2, )\n",
    "mds.fit(q_pred[:, :dims[-1]].astype(np.float64))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the ground truth labels\n",
    "\n",
    "def parse_index_file(filename):\n",
    "    index = []\n",
    "    for line in open(filename):\n",
    "        index.append(int(line.strip()))\n",
    "    return index\n",
    "\n",
    "with gae_directory():\n",
    "    ty = pickle.load(open(\"data/ind.cora.ty\", 'rb'), encoding='latin1')\n",
    "    ally = pickle.load(open(\"data/ind.cora.ally\", 'rb'), encoding='latin1')\n",
    "    test_idx_reorder = parse_index_file(\"data/ind.cora.test.index\")\n",
    "test_idx_range = np.sort(test_idx_reorder)\n",
    "\n",
    "labels = sp.vstack((ally, ty)).toarray()\n",
    "labels[test_idx_reorder, :] = labels[test_idx_range, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Turn labels into colors\n",
    "palette = sb.color_palette(n_colors=labels.shape[1])\n",
    "colors = np.array(palette)[np.argmax(labels, axis=1)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Plot the downscaled embeddings and the links\n",
    "fig, ax = plt.subplots(figsize=(15, 15))\n",
    "edges = np.array([[mds.embedding_[i], mds.embedding_[j]] for (i, j) in sparse_to_tuple(sp.triu(adj))[0]])\n",
    "edges = edges.transpose([2, 1, 0])\n",
    "ax.plot(edges[0], edges[1], color='lightgrey', zorder=1)\n",
    "ax.scatter(mds.embedding_[:, 0], mds.embedding_[:, 1], c=colors, zorder=2)"
   ]
  }
 ],
 "metadata": {
  "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.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}