ixxi-dante/nw2vec

View on GitHub
projects/correctness/gae-reproduction-citeseer-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('citeseer')\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": "bfae6639dffd435ab0608c333abf78f8",
       "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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dAJtRfeXA13lDGBmcbwX8UHn3HcAnHMnnXN551wB+BozvDvR+TjnuvzrU8B3/WWfHNtlx78+Va48eB8SzzvnTvq5Als3vlLrIpD3kpl9EPgV4Ded8w4Y83dFO+vffg7vmLo3zGaO87wugW1jZhYD3gt8uyjnrK+b6bZpQva+CalQrIsw1WTV4wsK1XYVlnrsLytUNVn1eE4KfH2EqR77y1ZNPr9QbVthqclhq8ew8GryfGtg7ADWmlm738W8C9hWroWbmQF/B7zknPtC0fTi43veA7w4+W9nKU+VmdWM3cY7Ac6LeOvkg/5sHwS+X448vgndwaDWTZFS62Ib8FvmuQHoG9sdaraY2a3AHwPvds4NF01fZGZR//ZqYC1waJazlHpdtgF3mVmFmbX7WZ6ZzSxF3gHsc851FuWc1XVTapsmRO+bEAu0HkO4arLq8UUJzXYVpnrsLytsNVn1eO7RGHliHtXkCwvNthWmmhzCegwLrSa7WTozaVAXvDOcvozXZfp0mZd9E96uMLuBnf5lC/BPwC/86duAljLlWY13NtxdwJ6x9QE0AT8GXvGvG8uUJwWcBeqKppVt3eB9KBwHsnhdwHtKrQu83Zzu999HvwA2lSHLAbxjw8beO1/x532f//rtAp4HfrUMWUq+LsCn/fWyH7itHK+TP/0bwP+YNO9sr5tS23Qg75u5dgmyHl/g9St7TVY9nrJ81eNLyxNITVY9nl+XIGtymOqxn0c1eeLyVZMvPovGyC7Ymmz+E4qIiIiIiIiIhNZ8O4REREREREREROYhNTBEREREREREJPTUwBARERERERGR0FMDQ0RERERERERCTw0MEREREREREQk9NTBEREREREREJPTUwBARERERERGR0Pv/eAngwO0+PQMAAAAASUVORK5CYII=\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.9147397657287767, 0.9252000189904395)"
      ]
     },
     "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
}