{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Capsule Networks (CapsNets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Based on the paper: [Dynamic Routing Between Capsules](https://arxiv.org/abs/1710.09829), by Sara Sabour, Nicholas Frosst and Geoffrey E. Hinton (NIPS 2017)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Inspired in part from Huadong Liao's implementation: [CapsNet-TensorFlow](https://github.com/naturomics/CapsNet-Tensorflow)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Watch [this video](https://youtu.be/pPN8d0E3900) to understand the key ideas behind Capsule Networks:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/pPN8d0E3900\" frameborder=\"0\" allowfullscreen></iframe>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import HTML\n",
    "HTML(\"\"\"<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/pPN8d0E3900\" frameborder=\"0\" allowfullscreen></iframe>\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You may also want to watch [this video](https://youtu.be/2Kawrd5szHE), which presents the main difficulties in this notebook:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/2Kawrd5szHE\" frameborder=\"0\" allowfullscreen></iframe>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HTML(\"\"\"<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/2Kawrd5szHE\" frameborder=\"0\" allowfullscreen></iframe>\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Imports"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To support both Python 2 and Python 3:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import division, print_function, unicode_literals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To plot pretty figures:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will need NumPy and TensorFlow:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/ageron/.virtualenvs/ml/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6\n",
      "  return f(*args, **kwds)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reproducibility"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's reset the default graph, in case you re-run this notebook without restarting the kernel:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf.reset_default_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's set the random seeds so that this notebook always produces the same output:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.set_random_seed(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load MNIST"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Yes, I know, it's MNIST again. But hopefully this powerful idea will work as well on larger datasets, time will tell."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting /tmp/data/train-images-idx3-ubyte.gz\n",
      "Extracting /tmp/data/train-labels-idx1-ubyte.gz\n",
      "Extracting /tmp/data/t10k-images-idx3-ubyte.gz\n",
      "Extracting /tmp/data/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "\n",
    "mnist = input_data.read_data_sets(\"/tmp/data/\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's look at what these hand-written digit images look like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11c94b668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_samples = 5\n",
    "\n",
    "plt.figure(figsize=(n_samples * 2, 3))\n",
    "for index in range(n_samples):\n",
    "    plt.subplot(1, n_samples, index + 1)\n",
    "    sample_image = mnist.train.images[index].reshape(28, 28)\n",
    "    plt.imshow(sample_image, cmap=\"binary\")\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And these are the corresponding labels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 3, 4, 6, 1], dtype=uint8)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist.train.labels[:n_samples]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's build a Capsule Network to classify these images. Here's the overall architecture, enjoy the ASCII art! ;-)\n",
    "Note: for readability, I left out two arrows: Labels → Mask, and Input Images → Reconstruction Loss."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "                            Loss\n",
    "                              ↑\n",
    "                    ┌─────────┴─────────┐\n",
    "      Labels → Margin Loss      Reconstruction Loss\n",
    "                    ↑                   ↑\n",
    "                  Length             Decoder\n",
    "                    ↑                   ↑ \n",
    "             Digit Capsules ────Mask────┘\n",
    "               ↖↑↗ ↖↑↗ ↖↑↗\n",
    "             Primary Capsules\n",
    "                    ↑      \n",
    "               Input Images\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are going to build the graph starting from the bottom layer, and gradually move up, left side first. Let's go!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Input Images"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start by creating a placeholder for the input images (28×28 pixels, 1 color channel = grayscale)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = tf.placeholder(shape=[None, 28, 28, 1], dtype=tf.float32, name=\"X\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Primary Capsules"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first layer will be composed of 32 maps of 6×6 capsules each, where each capsule will output an 8D activation vector:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps1_n_maps = 32\n",
    "caps1_n_caps = caps1_n_maps * 6 * 6  # 1152 primary capsules\n",
    "caps1_n_dims = 8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To compute their outputs, we first apply two regular convolutional layers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "conv1_params = {\n",
    "    \"filters\": 256,\n",
    "    \"kernel_size\": 9,\n",
    "    \"strides\": 1,\n",
    "    \"padding\": \"valid\",\n",
    "    \"activation\": tf.nn.relu,\n",
    "}\n",
    "\n",
    "conv2_params = {\n",
    "    \"filters\": caps1_n_maps * caps1_n_dims, # 256 convolutional filters\n",
    "    \"kernel_size\": 9,\n",
    "    \"strides\": 2,\n",
    "    \"padding\": \"valid\",\n",
    "    \"activation\": tf.nn.relu\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "conv1 = tf.layers.conv2d(X, name=\"conv1\", **conv1_params)\n",
    "conv2 = tf.layers.conv2d(conv1, name=\"conv2\", **conv2_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: since we used a kernel size of 9 and no padding (for some reason, that's what `\"valid\"` means), the image shrunk by 9-1=8 pixels after each convolutional layer (28×28 to 20×20, then 20×20 to 12×12), and since we used a stride of 2 in the second convolutional layer, the image size was divided by 2. This is how we end up with 6×6 feature maps."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we reshape the output to get a bunch of 8D vectors representing the outputs of the primary capsules. The output of `conv2` is an array containing 32×8=256 feature maps for each instance, where each feature map is 6×6. So the shape of this output is (_batch size_, 6, 6, 256). We want to chop the 256 into 32 vectors of 8 dimensions each. We could do this by reshaping to (_batch size_, 6, 6, 32, 8). However, since this first capsule layer will be fully connected to the next capsule layer, we can simply flatten the 6×6 grids. This means we just need to reshape to (_batch size_, 6×6×32, 8)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps1_raw = tf.reshape(conv2, [-1, caps1_n_caps, caps1_n_dims],\n",
    "                       name=\"caps1_raw\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we need to squash these vectors. Let's define the `squash()` function, based on equation (1) from the paper:\n",
    "\n",
    "$\\operatorname{squash}(\\mathbf{s}) = \\dfrac{\\|\\mathbf{s}\\|^2}{1 + \\|\\mathbf{s}\\|^2} \\dfrac{\\mathbf{s}}{\\|\\mathbf{s}\\|}$\n",
    "\n",
    "The `squash()` function will squash all vectors in the given array, along the given axis (by default, the last axis).\n",
    "\n",
    "**Caution**, a nasty bug is waiting to bite you: the derivative of $\\|\\mathbf{s}\\|$ is undefined when $\\|\\mathbf{s}\\|=0$, so we can't just use `tf.norm()`, or else it will blow up during training: if a vector is zero, the gradients will be `nan`, so when the optimizer updates the variables, they will also become `nan`, and from then on you will be stuck in `nan` land. The solution is to implement the norm manually by computing the square root of the sum of squares plus a tiny epsilon value: $\\|\\mathbf{s}\\| \\approx \\sqrt{\\sum\\limits_i{{s_i}^2}\\,\\,+ \\epsilon}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def squash(s, axis=-1, epsilon=1e-7, name=None):\n",
    "    with tf.name_scope(name, default_name=\"squash\"):\n",
    "        squared_norm = tf.reduce_sum(tf.square(s), axis=axis,\n",
    "                                     keep_dims=True)\n",
    "        safe_norm = tf.sqrt(squared_norm + epsilon)\n",
    "        squash_factor = squared_norm / (1. + squared_norm)\n",
    "        unit_vector = s / safe_norm\n",
    "        return squash_factor * unit_vector"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's apply this function to get the output $\\mathbf{u}_i$ of each primary capsules $i$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps1_output = squash(caps1_raw, name=\"caps1_output\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great! We have the output of the first capsule layer. It wasn't too hard, was it? However, computing the next layer is where the fun really begins."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Digit Capsules"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To compute the output of the digit capsules, we must first compute the predicted output vectors (one for each primary / digit capsule pair). Then we can run the routing by agreement algorithm."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compute the Predicted Output Vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The digit capsule layer contains 10 capsules (one for each digit) of 16 dimensions each:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_n_caps = 10\n",
    "caps2_n_dims = 16"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For each capsule $i$ in the first layer, we want to predict the output of every capsule $j$ in the second layer. For this, we will need a transformation matrix $\\mathbf{W}_{i,j}$ (one for each pair of capsules ($i$, $j$)), then we can compute the predicted output $\\hat{\\mathbf{u}}_{j|i} = \\mathbf{W}_{i,j} \\, \\mathbf{u}_i$ (equation (2)-right in the paper). Since we want to transform an 8D vector into a 16D vector, each transformation matrix $\\mathbf{W}_{i,j}$ must have a shape of (16, 8)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To compute $\\hat{\\mathbf{u}}_{j|i}$ for every pair of capsules ($i$, $j$), we will use a nice feature of the `tf.matmul()` function: you probably know that it lets you multiply two matrices, but you may not know that it also lets you multiply higher dimensional arrays. It treats the arrays as arrays of matrices, and it performs itemwise matrix multiplication. For example, suppose you have two 4D arrays, each containing a 2×3 grid of matrices. The first contains matrices $\\mathbf{A}, \\mathbf{B}, \\mathbf{C}, \\mathbf{D}, \\mathbf{E}, \\mathbf{F}$ and the second contains matrices $\\mathbf{G}, \\mathbf{H}, \\mathbf{I}, \\mathbf{J}, \\mathbf{K}, \\mathbf{L}$. If you multiply these two 4D arrays using the `tf.matmul()` function, this is what you get:\n",
    "\n",
    "$\n",
    "\\pmatrix{\n",
    "\\mathbf{A} & \\mathbf{B} & \\mathbf{C} \\\\\n",
    "\\mathbf{D} & \\mathbf{E} & \\mathbf{F}\n",
    "} \\times\n",
    "\\pmatrix{\n",
    "\\mathbf{G} & \\mathbf{H} & \\mathbf{I} \\\\\n",
    "\\mathbf{J} & \\mathbf{K} & \\mathbf{L}\n",
    "} = \\pmatrix{\n",
    "\\mathbf{AG} & \\mathbf{BH} & \\mathbf{CI} \\\\\n",
    "\\mathbf{DJ} & \\mathbf{EK} & \\mathbf{FL}\n",
    "}\n",
    "$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can apply this function to compute $\\hat{\\mathbf{u}}_{j|i}$ for every pair of capsules ($i$, $j$) like this (recall that there are 6×6×32=1152 capsules in the first layer, and 10 in the second layer):\n",
    "\n",
    "$\n",
    "\\pmatrix{\n",
    "  \\mathbf{W}_{1,1} & \\mathbf{W}_{1,2} & \\cdots & \\mathbf{W}_{1,10} \\\\\n",
    "  \\mathbf{W}_{2,1} & \\mathbf{W}_{2,2} & \\cdots & \\mathbf{W}_{2,10} \\\\\n",
    "  \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
    "  \\mathbf{W}_{1152,1} & \\mathbf{W}_{1152,2} & \\cdots & \\mathbf{W}_{1152,10}\n",
    "} \\times\n",
    "\\pmatrix{\n",
    "  \\mathbf{u}_1 & \\mathbf{u}_1 & \\cdots & \\mathbf{u}_1 \\\\\n",
    "  \\mathbf{u}_2 & \\mathbf{u}_2 & \\cdots & \\mathbf{u}_2 \\\\\n",
    "  \\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
    "  \\mathbf{u}_{1152} & \\mathbf{u}_{1152} & \\cdots & \\mathbf{u}_{1152}\n",
    "}\n",
    "=\n",
    "\\pmatrix{\n",
    "\\hat{\\mathbf{u}}_{1|1} & \\hat{\\mathbf{u}}_{2|1} & \\cdots & \\hat{\\mathbf{u}}_{10|1} \\\\\n",
    "\\hat{\\mathbf{u}}_{1|2} & \\hat{\\mathbf{u}}_{2|2} & \\cdots & \\hat{\\mathbf{u}}_{10|2} \\\\\n",
    "\\vdots & \\vdots & \\ddots & \\vdots \\\\\n",
    "\\hat{\\mathbf{u}}_{1|1152} & \\hat{\\mathbf{u}}_{2|1152} & \\cdots & \\hat{\\mathbf{u}}_{10|1152}\n",
    "}\n",
    "$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The shape of the first array is (1152, 10, 16, 8), and the shape of the second array is (1152, 10, 8, 1). Note that the second array must contain 10 identical copies of the vectors $\\mathbf{u}_1$ to $\\mathbf{u}_{1152}$. To create this array, we will use the handy `tf.tile()` function, which lets you create an array containing many copies of a base array, tiled in any way you want."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Oh, wait a second! We forgot one dimension: _batch size_. Say we feed 50 images to the capsule network, it will make predictions for these 50 images simultaneously. So the shape of the first array must be (50, 1152, 10, 16, 8), and the shape of the second array must be (50, 1152, 10, 8, 1). The first layer capsules actually already output predictions for all 50 images, so the second array will be fine, but for the first array, we will need to use `tf.tile()` to have 50 copies of the transformation matrices."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, let's start by creating a trainable variable of shape (1, 1152, 10, 16, 8) that will hold all the transformation matrices. The first dimension of size 1 will make this array easy to tile. We initialize this variable randomly using a normal distribution with a standard deviation to 0.1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "init_sigma = 0.1\n",
    "\n",
    "W_init = tf.random_normal(\n",
    "    shape=(1, caps1_n_caps, caps2_n_caps, caps2_n_dims, caps1_n_dims),\n",
    "    stddev=init_sigma, dtype=tf.float32, name=\"W_init\")\n",
    "W = tf.Variable(W_init, name=\"W\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can create the first array by repeating `W` once per instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = tf.shape(X)[0]\n",
    "W_tiled = tf.tile(W, [batch_size, 1, 1, 1, 1], name=\"W_tiled\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's it! On to the second array, now. As discussed earlier, we need to create an array of shape (_batch size_, 1152, 10, 8, 1), containing the output of the first layer capsules, repeated 10 times (once per digit, along the third dimension, which is axis=2). The `caps1_output` array has a shape of (_batch size_, 1152, 8), so we first need to expand it twice, to get an array of shape (_batch size_, 1152, 1, 8, 1), then we can repeat it 10 times along the third dimension:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps1_output_expanded = tf.expand_dims(caps1_output, -1,\n",
    "                                       name=\"caps1_output_expanded\")\n",
    "caps1_output_tile = tf.expand_dims(caps1_output_expanded, 2,\n",
    "                                   name=\"caps1_output_tile\")\n",
    "caps1_output_tiled = tf.tile(caps1_output_tile, [1, 1, caps2_n_caps, 1, 1],\n",
    "                             name=\"caps1_output_tiled\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check the shape of the first array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'W_tiled:0' shape=(?, 1152, 10, 16, 8) dtype=float32>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "W_tiled"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Good, and now the second:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps1_output_tiled:0' shape=(?, 1152, 10, 8, 1) dtype=float32>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps1_output_tiled"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Yes! Now, to get all the predicted output vectors $\\hat{\\mathbf{u}}_{j|i}$, we just need to multiply these two arrays using `tf.matmul()`, as explained earlier: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_predicted = tf.matmul(W_tiled, caps1_output_tiled,\n",
    "                            name=\"caps2_predicted\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check the shape:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_predicted:0' shape=(?, 1152, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_predicted"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Perfect, for each instance in the batch (we don't know the batch size yet, hence the \"?\") and for each pair of first and second layer capsules (1152×10) we have a 16D predicted output column vector (16×1). We're ready to apply the routing by agreement algorithm!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Routing by agreement"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First let's initialize the raw routing weights $b_{i,j}$ to zero:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "raw_weights = tf.zeros([batch_size, caps1_n_caps, caps2_n_caps, 1, 1],\n",
    "                       dtype=np.float32, name=\"raw_weights\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will see why we need the last two dimensions of size 1 in a minute."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Round 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's apply the softmax function to compute the routing weights, $\\mathbf{c}_{i} = \\operatorname{softmax}(\\mathbf{b}_i)$ (equation (3) in the paper):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "routing_weights = tf.nn.softmax(raw_weights, dim=2, name=\"routing_weights\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's compute the weighted sum of all the predicted output vectors for each second-layer capsule, $\\mathbf{s}_j = \\sum\\limits_{i}{c_{i,j}\\hat{\\mathbf{u}}_{j|i}}$ (equation (2)-left in the paper):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "weighted_predictions = tf.multiply(routing_weights, caps2_predicted,\n",
    "                                   name=\"weighted_predictions\")\n",
    "weighted_sum = tf.reduce_sum(weighted_predictions, axis=1, keep_dims=True,\n",
    "                             name=\"weighted_sum\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are a couple important details to note here:\n",
    "* To perform elementwise matrix multiplication (also called the Hadamard product, noted $\\circ$), we use the `tf.multiply()` function. It requires `routing_weights` and `caps2_predicted` to have the same rank, which is why we added two extra dimensions of size 1 to `routing_weights`, earlier.\n",
    "* The shape of `routing_weights` is (_batch size_, 1152, 10, 1, 1) while the shape of `caps2_predicted` is (_batch size_, 1152, 10, 16, 1).  Since they don't match on the fourth dimension (1 _vs_ 16), `tf.multiply()` automatically _broadcasts_ the `routing_weights` 16 times along that dimension. If you are not familiar with broadcasting, a simple example might help:\n",
    "\n",
    "  $ \\pmatrix{1 & 2 & 3 \\\\ 4 & 5 & 6} \\circ \\pmatrix{10 & 100 & 1000} = \\pmatrix{1 & 2 & 3 \\\\ 4 & 5 & 6} \\circ \\pmatrix{10 & 100 & 1000 \\\\ 10 & 100 & 1000} = \\pmatrix{10 & 200 & 3000 \\\\ 40 & 500 & 6000} $"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And finally, let's apply the squash function to get the outputs of the second layer capsules at the end of the first iteration of the routing by agreement algorithm, $\\mathbf{v}_j = \\operatorname{squash}(\\mathbf{s}_j)$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_output_round_1 = squash(weighted_sum, axis=-2,\n",
    "                              name=\"caps2_output_round_1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_output_round_1/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_output_round_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Good! We have ten 16D output vectors for each instance, as expected."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Round 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's measure how close each predicted vector $\\hat{\\mathbf{u}}_{j|i}$ is to the actual output vector $\\mathbf{v}_j$ by computing their scalar product $\\hat{\\mathbf{u}}_{j|i} \\cdot \\mathbf{v}_j$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Quick math reminder: if $\\vec{a}$ and $\\vec{b}$ are two vectors of equal length, and $\\mathbf{a}$ and $\\mathbf{b}$ are their corresponding column vectors (i.e., matrices with a single column), then $\\mathbf{a}^T \\mathbf{b}$ (i.e., the matrix multiplication of the transpose of $\\mathbf{a}$, and $\\mathbf{b}$) is a 1×1 matrix containing the scalar product of the two vectors $\\vec{a}\\cdot\\vec{b}$. In Machine Learning, we generally represent vectors as column vectors, so when we talk about computing the scalar product $\\hat{\\mathbf{u}}_{j|i} \\cdot \\mathbf{v}_j$, this actually means computing ${\\hat{\\mathbf{u}}_{j|i}}^T \\mathbf{v}_j$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since we need to compute the scalar product $\\hat{\\mathbf{u}}_{j|i} \\cdot \\mathbf{v}_j$ for each instance, and for each pair of first and second level capsules $(i, j)$, we will once again take advantage of the fact that `tf.matmul()` can multiply many matrices simultaneously. This will require playing around with `tf.tile()` to get all dimensions to match (except for the last 2), just like we did earlier. So let's look at the shape of `caps2_predicted`, which holds all the predicted output vectors $\\hat{\\mathbf{u}}_{j|i}$ for each instance and each pair of capsules:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_predicted:0' shape=(?, 1152, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_predicted"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now let's look at the shape of `caps2_output_round_1`, which holds 10 outputs vectors of 16D each, for each instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_output_round_1/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_output_round_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To get these shapes to match, we just need to tile the `caps2_output_round_1` array 1152 times (once per primary capsule) along the second dimension:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_output_round_1_tiled = tf.tile(\n",
    "    caps2_output_round_1, [1, caps1_n_caps, 1, 1, 1],\n",
    "    name=\"caps2_output_round_1_tiled\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now we are ready to call `tf.matmul()` (note that we must tell it to transpose the matrices in the first array, to get ${\\hat{\\mathbf{u}}_{j|i}}^T$ instead of $\\hat{\\mathbf{u}}_{j|i}$):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "agreement = tf.matmul(caps2_predicted, caps2_output_round_1_tiled,\n",
    "                      transpose_a=True, name=\"agreement\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now update the raw routing weights $b_{i,j}$ by simply adding the scalar product $\\hat{\\mathbf{u}}_{j|i} \\cdot \\mathbf{v}_j$ we just computed: $b_{i,j} \\gets b_{i,j} + \\hat{\\mathbf{u}}_{j|i} \\cdot \\mathbf{v}_j$ (see Procedure 1, step 7, in the paper)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "raw_weights_round_2 = tf.add(raw_weights, agreement,\n",
    "                             name=\"raw_weights_round_2\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The rest of round 2 is the same as in round 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "routing_weights_round_2 = tf.nn.softmax(raw_weights_round_2,\n",
    "                                        dim=2,\n",
    "                                        name=\"routing_weights_round_2\")\n",
    "weighted_predictions_round_2 = tf.multiply(routing_weights_round_2,\n",
    "                                           caps2_predicted,\n",
    "                                           name=\"weighted_predictions_round_2\")\n",
    "weighted_sum_round_2 = tf.reduce_sum(weighted_predictions_round_2,\n",
    "                                     axis=1, keep_dims=True,\n",
    "                                     name=\"weighted_sum_round_2\")\n",
    "caps2_output_round_2 = squash(weighted_sum_round_2,\n",
    "                              axis=-2,\n",
    "                              name=\"caps2_output_round_2\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We could go on for a few more rounds, by repeating exactly the same steps as in round 2, but to keep things short, we will stop here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_output = caps2_output_round_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Static or Dynamic Loop?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the code above, we created different operations in the TensorFlow graph for each round of the routing by agreement algorithm. In other words, it's a static loop.\n",
    "\n",
    "Sure, instead of copy/pasting the code several times, we could have written a `for` loop in Python, but this would not change the fact that the graph would end up containing different operations for each routing iteration. It's actually okay since we generally want less than 5 routing iterations, so the graph won't grow too big.\n",
    "\n",
    "However, you may prefer to implement the routing loop within the TensorFlow graph itself rather than using a Python `for` loop. To do this, you would need to use TensorFlow's `tf.while_loop()` function. This way, all routing iterations would reuse the same operations in the graph, it would be a dynamic loop.\n",
    "\n",
    "For example, here is how to build a small loop that computes the sum of squares from 1 to 100:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(328350, 100)\n"
     ]
    }
   ],
   "source": [
    "def condition(input, counter):\n",
    "    return tf.less(counter, 100)\n",
    "\n",
    "def loop_body(input, counter):\n",
    "    output = tf.add(input, tf.square(counter))\n",
    "    return output, tf.add(counter, 1)\n",
    "\n",
    "with tf.name_scope(\"compute_sum_of_squares\"):\n",
    "    counter = tf.constant(1)\n",
    "    sum_of_squares = tf.constant(0)\n",
    "\n",
    "    result = tf.while_loop(condition, loop_body, [sum_of_squares, counter])\n",
    "    \n",
    "\n",
    "with tf.Session() as sess:\n",
    "    print(sess.run(result))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, the `tf.while_loop()` function expects the loop condition and body to be provided _via_ two functions. These functions will be called only once by TensorFlow, during the graph construction phase, _not_ while executing the graph. The `tf.while_loop()` function stitches together the graph fragments created by `condition()` and `loop_body()` with some additional operations to create the loop.\n",
    "\n",
    "Also note that during training, TensorFlow will automagically handle backpropogation through the loop, so you don't need to worry about that."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Of course, we could have used this one-liner instead! ;-)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "338350"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sum([i**2 for i in range(1, 100 + 1)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Joke aside, apart from reducing the graph size, using a dynamic loop instead of a static loop can help reduce how much GPU RAM you use (if you are using a GPU). Indeed, if you set `swap_memory=True` when calling the `tf.while_loop()` function, TensorFlow will automatically check GPU RAM usage at each loop iteration, and it will take care of swapping memory between the GPU and the CPU when needed. Since CPU memory is much cheaper and abundant than GPU RAM, this can really make a big difference."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Estimated Class Probabilities (Length)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The lengths of the output vectors represent the class probabilities, so we could just use `tf.norm()` to compute them, but as we saw when discussing the squash function, it would be risky, so instead let's create our own `safe_norm()` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "def safe_norm(s, axis=-1, epsilon=1e-7, keep_dims=False, name=None):\n",
    "    with tf.name_scope(name, default_name=\"safe_norm\"):\n",
    "        squared_norm = tf.reduce_sum(tf.square(s), axis=axis,\n",
    "                                     keep_dims=keep_dims)\n",
    "        return tf.sqrt(squared_norm + epsilon)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_proba = safe_norm(caps2_output, axis=-2, name=\"y_proba\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To predict the class of each instance, we can just select the one with the highest estimated probability. To do this, let's start by finding its index using `tf.argmax()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_proba_argmax = tf.argmax(y_proba, axis=2, name=\"y_proba\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's look at the shape of `y_proba_argmax`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'y_proba_1:0' shape=(?, 1, 1) dtype=int64>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_proba_argmax"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "That's what we wanted: for each instance, we now have the index of the longest output vector. Let's get rid of the last two dimensions by using `tf.squeeze()` which removes dimensions of size 1. This gives us the capsule network's predicted class for each instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = tf.squeeze(y_proba_argmax, axis=[1,2], name=\"y_pred\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'y_pred:0' shape=(?,) dtype=int64>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Okay, we are now ready to define the training operations, starting with the losses."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we will need a placeholder for the labels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = tf.placeholder(shape=[None], dtype=tf.int64, name=\"y\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Margin loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The paper uses a special margin loss to make it possible to detect two or more different digits in each image:\n",
    "\n",
    "$ L_k = T_k \\max(0, m^{+} - \\|\\mathbf{v}_k\\|)^2 + \\lambda (1 - T_k) \\max(0, \\|\\mathbf{v}_k\\| - m^{-})^2$\n",
    "\n",
    "* $T_k$ is equal to 1 if the digit of class $k$ is present, or 0 otherwise.\n",
    "* In the paper, $m^{+} = 0.9$, $m^{-} = 0.1$ and $\\lambda = 0.5$.\n",
    "* Note that there was an error in the video (at 15:47): the max operations are squared, not the norms. Sorry about that."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "m_plus = 0.9\n",
    "m_minus = 0.1\n",
    "lambda_ = 0.5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since `y` will contain the digit classes, from 0 to 9, to get $T_k$ for every instance and every class, we can just use the `tf.one_hot()` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "T = tf.one_hot(y, depth=caps2_n_caps, name=\"T\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A small example should make it clear what this does:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.  0.  0.  0.  0.  0.  0.  0.  0.  0.]\n",
      " [ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]\n",
      " [ 0.  0.  1.  0.  0.  0.  0.  0.  0.  0.]\n",
      " [ 0.  0.  0.  1.  0.  0.  0.  0.  0.  0.]\n",
      " [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  1.]]\n"
     ]
    }
   ],
   "source": [
    "with tf.Session():\n",
    "    print(T.eval(feed_dict={y: np.array([0, 1, 2, 3, 9])}))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's compute the norm of the output vector for each output capsule and each instance. First, let's verify the shape of `caps2_output`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_output_round_2/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_output"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The 16D output vectors are in the second to last dimension, so let's use the `safe_norm()` function with `axis=-2`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_output_norm = safe_norm(caps2_output, axis=-2, keep_dims=True,\n",
    "                              name=\"caps2_output_norm\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's compute $\\max(0, m^{+} - \\|\\mathbf{v}_k\\|)^2$, and reshape the result to get a simple matrix of shape (_batch size_, 10):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "present_error_raw = tf.square(tf.maximum(0., m_plus - caps2_output_norm),\n",
    "                              name=\"present_error_raw\")\n",
    "present_error = tf.reshape(present_error_raw, shape=(-1, 10),\n",
    "                           name=\"present_error\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next let's compute $\\max(0, \\|\\mathbf{v}_k\\| - m^{-})^2$ and reshape it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "absent_error_raw = tf.square(tf.maximum(0., caps2_output_norm - m_minus),\n",
    "                             name=\"absent_error_raw\")\n",
    "absent_error = tf.reshape(absent_error_raw, shape=(-1, 10),\n",
    "                          name=\"absent_error\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are ready to compute the loss for each instance and each digit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "L = tf.add(T * present_error, lambda_ * (1.0 - T) * absent_error,\n",
    "           name=\"L\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can sum the digit losses for each instance ($L_0 + L_1 + \\cdots + L_9$), and compute the mean over all instances. This gives us the final margin loss:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "margin_loss = tf.reduce_mean(tf.reduce_sum(L, axis=1), name=\"margin_loss\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reconstruction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's add a decoder network on top of the capsule network. It is a regular 3-layer fully connected neural network which will learn to reconstruct the input images based on the output of the capsule network. This will force the capsule network to preserve all the information required to reconstruct the digits, across the whole network. This constraint regularizes the model: it reduces the risk of overfitting the training set, and it helps generalize to new digits."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mask"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The paper mentions that during training, instead of sending all the outputs of the capsule network to the decoder network, we must send only the output vector of the capsule that corresponds to the target digit. All the other output vectors must be masked out. At inference time, we must mask all output vectors except for the longest one, i.e., the one that corresponds to the predicted digit. You can see this in the paper's figure 2 (at 18:15 in the video): all output vectors are masked out, except for the reconstruction target's output vector."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need a placeholder to tell TensorFlow whether we want to mask the output vectors based on the labels (`True`) or on the predictions (`False`, the default):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "mask_with_labels = tf.placeholder_with_default(False, shape=(),\n",
    "                                               name=\"mask_with_labels\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's use `tf.cond()` to define the reconstruction targets as the labels `y` if `mask_with_labels` is `True`, or `y_pred` otherwise."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "reconstruction_targets = tf.cond(mask_with_labels, # condition\n",
    "                                 lambda: y,        # if True\n",
    "                                 lambda: y_pred,   # if False\n",
    "                                 name=\"reconstruction_targets\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the `tf.cond()` function expects the if-True and if-False tensors to be passed _via_ functions: these functions will be called just once during the graph construction phase (not during the execution phase), similar to `tf.while_loop()`. This allows TensorFlow to add the necessary operations to handle the conditional evaluation of the if-True or if-False tensors. However, in our case, the tensors `y` and `y_pred` are already created by the time we call `tf.cond()`, so unfortunately TensorFlow will consider both `y` and `y_pred` to be dependencies of the `reconstruction_targets` tensor. The `reconstruction_targets` tensor will end up with the correct value, but:\n",
    "1. whenever we evaluate a tensor that depends on `reconstruction_targets`, the `y_pred` tensor will be evaluated (even if `mask_with_layers` is `True`). This is not a big deal because computing `y_pred` adds no computing overhead during training, since we need it anyway to compute the margin loss. And during testing, if we are doing classification, we won't need reconstructions, so `reconstruction_targets` won't be evaluated at all.\n",
    "2. we will always need to feed a value for the `y` placeholder (even if `mask_with_layers` is `False`). This is a bit annoying, but we can pass an empty array, because TensorFlow won't use it anyway (it just does not know it yet when it checks for dependencies)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that we have the reconstruction targets, let's create the reconstruction mask. It should be equal to 1.0 for the target class, and 0.0 for the other classes, for each instance. For this we can just use the `tf.one_hot()` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "reconstruction_mask = tf.one_hot(reconstruction_targets,\n",
    "                                 depth=caps2_n_caps,\n",
    "                                 name=\"reconstruction_mask\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check the shape of `reconstruction_mask`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'reconstruction_mask:0' shape=(?, 10) dtype=float32>"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reconstruction_mask"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's compare this to the shape of `caps2_output`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_output_round_2/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_output"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mmh, its shape is (_batch size_, 1, 10, 16, 1). We want to multiply it by the `reconstruction_mask`, but the shape of the `reconstruction_mask` is (_batch size_, 10). We must reshape it to (_batch size_, 1, 10, 1, 1) to make multiplication possible:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "reconstruction_mask_reshaped = tf.reshape(\n",
    "    reconstruction_mask, [-1, 1, caps2_n_caps, 1, 1],\n",
    "    name=\"reconstruction_mask_reshaped\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "At last! We can apply the mask:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "caps2_output_masked = tf.multiply(\n",
    "    caps2_output, reconstruction_mask_reshaped,\n",
    "    name=\"caps2_output_masked\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'caps2_output_masked:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_output_masked"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One last reshape operation to flatten the decoder's inputs:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "decoder_input = tf.reshape(caps2_output_masked,\n",
    "                           [-1, caps2_n_caps * caps2_n_dims],\n",
    "                           name=\"decoder_input\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This gives us an array of shape (_batch size_, 160):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tf.Tensor 'decoder_input:0' shape=(?, 160) dtype=float32>"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "decoder_input"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Decoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's build the decoder. It's quite simple: two dense (fully connected) ReLU layers followed by a dense output sigmoid layer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_hidden1 = 512\n",
    "n_hidden2 = 1024\n",
    "n_output = 28 * 28"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "with tf.name_scope(\"decoder\"):\n",
    "    hidden1 = tf.layers.dense(decoder_input, n_hidden1,\n",
    "                              activation=tf.nn.relu,\n",
    "                              name=\"hidden1\")\n",
    "    hidden2 = tf.layers.dense(hidden1, n_hidden2,\n",
    "                              activation=tf.nn.relu,\n",
    "                              name=\"hidden2\")\n",
    "    decoder_output = tf.layers.dense(hidden2, n_output,\n",
    "                                     activation=tf.nn.sigmoid,\n",
    "                                     name=\"decoder_output\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Reconstruction Loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's compute the reconstruction loss. It is just the squared difference between the input image and the reconstructed image:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_flat = tf.reshape(X, [-1, n_output], name=\"X_flat\")\n",
    "squared_difference = tf.square(X_flat - decoder_output,\n",
    "                               name=\"squared_difference\")\n",
    "reconstruction_loss = tf.reduce_mean(squared_difference,\n",
    "                                    name=\"reconstruction_loss\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Final Loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The final loss is the sum of the margin loss and the reconstruction loss (scaled down by a factor of 0.0005 to ensure the margin loss dominates training):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "alpha = 0.0005\n",
    "\n",
    "loss = tf.add(margin_loss, alpha * reconstruction_loss, name=\"loss\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Final Touches"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Accuracy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To measure our model's accuracy, we need to count the number of instances that are properly classified. For this, we can simply compare `y` and `y_pred`, convert the boolean value to a float32 (0.0 for False, 1.0 for True), and compute the mean over all the instances:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "correct = tf.equal(y, y_pred, name=\"correct\")\n",
    "accuracy = tf.reduce_mean(tf.cast(correct, tf.float32), name=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training Operations"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The paper mentions that the authors used the Adam optimizer with TensorFlow's default parameters:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = tf.train.AdamOptimizer()\n",
    "training_op = optimizer.minimize(loss, name=\"training_op\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Init and Saver"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And let's add the usual variable initializer, as well as a `Saver`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "init = tf.global_variables_initializer()\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And... we're done with the construction phase! Please take a moment to celebrate. :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Training our capsule network is pretty standard. For simplicity, we won't do any fancy hyperparameter tuning, dropout or anything, we will just run the training operation over and over again, displaying the loss, and at the end of each epoch, measure the accuracy on the validation set, display it, and save the model if the validation loss is the lowest seen found so far (this is a basic way to implement early stopping, without actually stopping). Hopefully the code should be self-explanatory, but here are a few details to note:\n",
    "* if a checkpoint file exists, it will be restored (this makes it possible to interrupt training, then restart it later from the last checkpoint),\n",
    "* we must not forget to feed `mask_with_labels=True` during training,\n",
    "* during testing, we let `mask_with_labels` default to `False` (but we still feed the labels since they are required to compute the accuracy),\n",
    "* the images loaded _via_ `mnist.train.next_batch()` are represented as `float32` arrays of shape \\[784\\], but the input placeholder `X` expects a `float32` array of shape \\[28, 28, 1\\], so we must reshape the images before we feed them to our model,\n",
    "* we evaluate the model's loss and accuracy on the full validation set (5,000 instances). To view progress and support systems that don't have a lot of RAM, the code evaluates the loss and accuracy on one batch at a time, and computes the mean loss and mean accuracy at the end.\n",
    "\n",
    "*Warning*: if you don't have a GPU, training will take a very long time (at least a few hours). With a GPU, it should take just a few minutes per epoch (e.g., 6 minutes on an NVidia GeForce GTX 1080Ti)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./my_capsule_network\n",
      "Epoch: 1  Val accuracy: 99.4400%  Loss: 0.007998 (improved)\n",
      "Epoch: 2  Val accuracy: 99.3400%  Loss: 0.007959 (improved)\n",
      "Epoch: 3  Val accuracy: 99.4000%  Loss: 0.007436 (improved)\n",
      "Epoch: 4  Val accuracy: 99.4000%  Loss: 0.007568\n",
      "Epoch: 5  Val accuracy: 99.2600%  Loss: 0.007464\n",
      "Epoch: 6  Val accuracy: 99.4800%  Loss: 0.006631 (improved)\n",
      "Epoch: 7  Val accuracy: 99.4000%  Loss: 0.006915\n",
      "Epoch: 8  Val accuracy: 99.4200%  Loss: 0.006735\n",
      "Epoch: 9  Val accuracy: 99.2200%  Loss: 0.007709\n",
      "Epoch: 10  Val accuracy: 99.4000%  Loss: 0.007083\n"
     ]
    }
   ],
   "source": [
    "n_epochs = 10\n",
    "batch_size = 50\n",
    "restore_checkpoint = True\n",
    "\n",
    "n_iterations_per_epoch = mnist.train.num_examples // batch_size\n",
    "n_iterations_validation = mnist.validation.num_examples // batch_size\n",
    "best_loss_val = np.infty\n",
    "checkpoint_path = \"./my_capsule_network\"\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    if restore_checkpoint and tf.train.checkpoint_exists(checkpoint_path):\n",
    "        saver.restore(sess, checkpoint_path)\n",
    "    else:\n",
    "        init.run()\n",
    "\n",
    "    for epoch in range(n_epochs):\n",
    "        for iteration in range(1, n_iterations_per_epoch + 1):\n",
    "            X_batch, y_batch = mnist.train.next_batch(batch_size)\n",
    "            # Run the training operation and measure the loss:\n",
    "            _, loss_train = sess.run(\n",
    "                [training_op, loss],\n",
    "                feed_dict={X: X_batch.reshape([-1, 28, 28, 1]),\n",
    "                           y: y_batch,\n",
    "                           mask_with_labels: True})\n",
    "            print(\"\\rIteration: {}/{} ({:.1f}%)  Loss: {:.5f}\".format(\n",
    "                      iteration, n_iterations_per_epoch,\n",
    "                      iteration * 100 / n_iterations_per_epoch,\n",
    "                      loss_train),\n",
    "                  end=\"\")\n",
    "\n",
    "        # At the end of each epoch,\n",
    "        # measure the validation loss and accuracy:\n",
    "        loss_vals = []\n",
    "        acc_vals = []\n",
    "        for iteration in range(1, n_iterations_validation + 1):\n",
    "            X_batch, y_batch = mnist.validation.next_batch(batch_size)\n",
    "            loss_val, acc_val = sess.run(\n",
    "                    [loss, accuracy],\n",
    "                    feed_dict={X: X_batch.reshape([-1, 28, 28, 1]),\n",
    "                               y: y_batch})\n",
    "            loss_vals.append(loss_val)\n",
    "            acc_vals.append(acc_val)\n",
    "            print(\"\\rEvaluating the model: {}/{} ({:.1f}%)\".format(\n",
    "                      iteration, n_iterations_validation,\n",
    "                      iteration * 100 / n_iterations_validation),\n",
    "                  end=\" \" * 10)\n",
    "        loss_val = np.mean(loss_vals)\n",
    "        acc_val = np.mean(acc_vals)\n",
    "        print(\"\\rEpoch: {}  Val accuracy: {:.4f}%  Loss: {:.6f}{}\".format(\n",
    "            epoch + 1, acc_val * 100, loss_val,\n",
    "            \" (improved)\" if loss_val < best_loss_val else \"\"))\n",
    "\n",
    "        # And save the model if it improved:\n",
    "        if loss_val < best_loss_val:\n",
    "            save_path = saver.save(sess, checkpoint_path)\n",
    "            best_loss_val = loss_val"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Training is finished, we reached over 99.4% accuracy on the validation set after just 5 epochs, things are looking good. Now let's evaluate the model on the test set."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Evaluation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./my_capsule_network\n",
      "Final test accuracy: 99.5300%  Loss: 0.006631   \n"
     ]
    }
   ],
   "source": [
    "n_iterations_test = mnist.test.num_examples // batch_size\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, checkpoint_path)\n",
    "\n",
    "    loss_tests = []\n",
    "    acc_tests = []\n",
    "    for iteration in range(1, n_iterations_test + 1):\n",
    "        X_batch, y_batch = mnist.test.next_batch(batch_size)\n",
    "        loss_test, acc_test = sess.run(\n",
    "                [loss, accuracy],\n",
    "                feed_dict={X: X_batch.reshape([-1, 28, 28, 1]),\n",
    "                           y: y_batch})\n",
    "        loss_tests.append(loss_test)\n",
    "        acc_tests.append(acc_test)\n",
    "        print(\"\\rEvaluating the model: {}/{} ({:.1f}%)\".format(\n",
    "                  iteration, n_iterations_test,\n",
    "                  iteration * 100 / n_iterations_test),\n",
    "              end=\" \" * 10)\n",
    "    loss_test = np.mean(loss_tests)\n",
    "    acc_test = np.mean(acc_tests)\n",
    "    print(\"\\rFinal test accuracy: {:.4f}%  Loss: {:.6f}\".format(\n",
    "        acc_test * 100, loss_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We reach 99.53% accuracy on the test set. Pretty nice. :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Predictions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's make some predictions! We first fix a few images from the test set, then we start a session, restore the trained model, evaluate `caps2_output` to get the capsule network's output vectors, `decoder_output` to get the reconstructions, and `y_pred` to get the class predictions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./my_capsule_network\n"
     ]
    }
   ],
   "source": [
    "n_samples = 5\n",
    "\n",
    "sample_images = mnist.test.images[:n_samples].reshape([-1, 28, 28, 1])\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, checkpoint_path)\n",
    "    caps2_output_value, decoder_output_value, y_pred_value = sess.run(\n",
    "            [caps2_output, decoder_output, y_pred],\n",
    "            feed_dict={X: sample_images,\n",
    "                       y: np.array([], dtype=np.int64)})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: we feed `y` with an empty array, but TensorFlow will not use it, as explained earlier."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now let's plot the images and their labels, followed by the corresponding reconstructions and predictions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlMAAACPCAYAAADeIl6VAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAEcNJREFUeJzt3XuMVMWewPFfMeAg8mYErjCAXmAD\nS5BExvGBG5QLiyhCIj6DigiuLwYVhLA+Q1ZRL+qiKCDsjggKMU6AhUWQEBFBjYgiaOSxMDx8oAwg\nyHOQe/aPbsuq43Rzpqsfp7u/n2SSX1Gn61RP0Ycfp6rrKM/zBAAAAImpk+kOAAAAZDOSKQAAAAck\nUwAAAA5IpgAAAByQTAEAADggmQIAAHBAMmVQSq1SSo1I92uRGoxn7mAscwdjmVsYz4icTaaUUjuV\nUn/LdD/8lFL/rZTylFIdM92XbMJ45o6wjaVSapRSqlIpdVgp9blSqlem+5QtwjSWSqm/KKX+Ryn1\nQ/Qz2SHTfco2YRpPUzZcZ3M2mQqj6EX6r5nuB5KD8cx+SqlSEXlWRIaISBMR+S8RWaCUKshox5CI\nf4jIMhG5PtMdQfJky3U2r5IppVQzpdQSpdQ+pdTBaNzWd9hflVKfRf+Xukgp1dx4/SVKqY+VUr8o\npb5SSvWuxbnrisgrIjIqOe8GjGfuyOBYdhCRbzzPW+9FHgfxpogUiUjLZLyvfJSpsfQ87yfP814T\nkXVJfDt5j+tsMHmVTEnk/ZaLSHsRaScix0Vkqu+Y20VkuIj8RUR+E5GXRUSUUm1E5H9F5D9EpLmI\njBWRCqXUuf6TKKXaRf/itDP++CERWe153sakvqP8xnjmjkyN5XsiUqCUKo3ejRouIhtEZG9y315e\nyeTnEsnHdTYIz/Ny8kdEdorI385wTA8ROWiUV4nIs0a5q4hUi0iBiIwXkTm+1y8XkTuM146IcZ5i\nEfk/EWkSLXsi0jHTv6Ns+mE8c+cnZGOpROTfReSURP4RqBKRkkz/jrLlJ0xjaRxfN/qZ7JDp30+2\n/YRpPLPtOptXd6aUUg2UUjOUUruUUodFZLWINPWtj9hjxLtEpJ5Ebvu3F5EbopnzL0qpX0Skl0Qy\n8TP5TxGZ6HneoeS8E4gwnrkkg2N5l4jcKSL/LCJnichQEVmilDrP/V3lpwyOJVKA62wweZVMicgY\nEfknESn1PK+xiPxL9M+VcUyxEbeTyP9YqyTyl2WO53lNjZ9zPM97NsB5+4jI35VSe5VSv08ffKKU\nutXp3YDxzB2ZGsseIrLE87ytnuf9w/O8ZSLyo4hc5vqG8limxhKpwXU2gFxPpuopper//iMizSQy\n3/tLdIHckzW8ZqhSqqtSqoGITBSRdz3POy0ic0VkoFLqX5VSBdE2e9ewEK8mnUXkQolcuHtE/2yg\niCxwfH/5hvHMHWEZy3Uico1S6gIV0Vci4/t1Ut5lfgjLWEr0/IXRYmG0jNoJy3hm1XU215OppRL5\nS/D7T1MROVsiGfOnEvkard8cEXlDIgtQ64tImYiI53l7RGSQRNZX7JNIxv2I1PA7jC6kO/L7QjrP\n8372PG/v7z/Rw6o8zzuepPeZLxjP3BGKsZTIt/fmS2TtxmGJLJz9N8/zNifhPeaLsIylRM9/JBpv\njpZRO6EYz2y7zqrowi4AAAAkINfvTAEAAKQUyRQAAIADkikAAAAHJFMAAAAOSKYAAAAc1E3z+fjq\nYOapMx8SCGOZeckaSxHGMwz4bOYOPpu55YzjyZ0pAAAAByRTAAAADkimAAAAHJBMAQAAOCCZAgAA\ncEAyBQAA4IBkCgAAwAHJFAAAgIN0b9oJAACQsIcfftgqv/HGGzo+cOBAmnsTwZ0pAAAAByRTAAAA\nDkimAAAAHLBmKg3M+VwRkeHDh+t48ODBVt2bb76p44YNG6a0XwAAZIOvvvpKx3PnzrXqbrrppnR3\n50+4MwUAAOCAZAoAAMAB03xp8Nxzz1nlgoICHS9evNiqKysr0/HLL79s1THtlxnmOIwePdqqu/rq\nq3W8dOnStPUJ8e3atUvHQ4cOterWrFmj4y+//NKq69GjR2o7hhqdPn1ax9dcc41Vt337dh2vXbvW\nqmvZsmVqO4bQKC8v1/GxY8esOv/fmUzgzhQAAIADkikAAAAHJFMAAAAOWDOVBlu2bLHK5popvzlz\n5ui4d+/eVt3tt9+e1H4hGPPxBEopq27lypU6XrFihVXXt2/f1HYsz506dUrHs2fPtuoeeeQRHR86\ndMiqM8dw0aJFVh1rpjKjsrJSx+aaNhGRo0eP6nj//v1WHWumctfHH39sladNm6bjTp06WXVhuNZy\nZwoAAMAByRQAAICDrJ/mM3cXnzhxolXneZ6O58+fb9WVlpamtF/mNAOyy6ZNm6zy888/H/PY6upq\nHfunc8Nw6zmXvfLKKzoeO3ZsQm28+OKLVtls55xzzkmsY6i1jh076viqq66y6vzbxyA/zJs3zyqb\n11pzSxoRkcLCwrT0KR7uTAEAADggmQIAAHBAMgUAAOAg69ZMLVy40Co/+OCDOja/QitiP6Lg5MmT\nqe2Yj/8rvEge/5oms+x/eni8bShimTRpklU+ceJEzGMvv/xyHd9www21Phfi+/77763yrFmzdOx/\nTFMifv31V6s8depUHY8fP965fQSzc+dOHX/yySeZ6wgyyrzWxlsr16VLl3R0p1a4MwUAAOCAZAoA\nAMBB1k3zbdiwwSofPnw45rHm1ghmnA7xzm1OPwZtA3/o3r27VTZ3tL744outOvMr10GtX78+8LGD\nBg3ScatWrWp9LvzZ8ePHdVxSUmLV7d27N1Ab99xzj443btxo1fl3VkbmHTt2TMdVVVUxjzO3whFJ\nzlQvwmPy5Mk63rVrl1VXXFysY/9yjjDgzhQAAIADkikAAAAHJFMAAAAOsm7NlLk+RiT+V9/NtUn+\n16Waeb7a9DlWG/ku3iNdzLVlb731llX35JNPBmp/9erVOvavyzHbb9OmjVXHY4Pc+R/D89hjj+k4\n6Bopv2+++UbHX3zxReDXmdti7Nixw6p7+umndVxUVJRQv+DG//mDu99++80qv/322zo+cuSIVTdk\nyBAdt2zZMul9WbduXcy6bt266TiMj3rizhQAAIADkikAAAAHWTfNh/ywbds2q/zEE0/EPNacDk10\nF/KKigod+3fFNtv3P9Ee7latWmWVzbGIp2fPnjq+9957rTpz9+R4O9j7mVutzJw506obNWqUjpnm\ny4y+fftmugs5p6yszCpPmzZNx3Xq2PdbSktLdZyMab5FixZZ5ffffz/mseYUYxhxZwoAAMAByRQA\nAIADkikAAAAHOb1mqnXr1jpu0qRJQm2Y6zn8jzkYN25czNcdOHAgofMhYvPmzVa5uro65rFXXHGF\njjt16hSo/aNHj1rlhQsXxjy2bt0/Pib+x9UgMYcOHdLx1KlTA7+uc+fOOl62bJmO586dax23cuXK\nhPrVoEEDHfvXYV1wwQUJtQk39evX17H5WUTivv76ax2Xl5fHPO7xxx+3yhdddFFS+7F8+XKrbK5v\nbNq0qVUX9vVy3JkCAABwQDIFAADgICvumZrTa/6vUsbTv39/HV944YUxj/PvYr1//34dm08pD7pz\nOdzNmDEj8LGzZs3Scb169QK9ZsWKFVZ5z549MY81p4gfeOCBwP1CbD/88IOOt27dGvh15rHmlO7B\ngwcT6sett95qladMmaLjFi1aJNQmkqtfv346DjqNj/iWLFmi43hbh6RiO4Kff/5Zx3PmzIl53Jgx\nY6xycXFx0vuSTNyZAgAAcEAyBQAA4CArpvnMXa03bNgQ+HXmtxTM6braMB9yaz44OdE2atOO/3W5\nztx9ujZTP0GnYyorK3X8wgsvBG7f3BF9wIABVp25C/fEiRMDt5nvunTpouPrr7/eqps/f36gNhKd\n2jN99tlnVrlhw4bObQJht3v37ph15gOFu3btmvRzT58+Xcf+Bymb3+AbNmxY0s+dStyZAgAAcEAy\nBQAA4IBkCgAAwEEo10yZOxuLiGzcuFHHtdmewFyblOi2BmYbhYWFVt15552n45MnT1p1P/30U41t\n1KYvSqnA/cwF5u9s27ZtgV9nfn33gw8+SGqfROyxfe+996w6s+zfHf3aa69Nel9ykX8H9EsvvVTH\no0ePDtRGUVGRVS4rK9OxuVZOJP6OzwifvXv36thcvygi0qhRo3R3JycsWLAgZp35706dOsm/37Jz\n586YdbfccouO27Ztm/RzpxJ3pgAAAByQTAEAADgI5TSfeVtXxP7KfLo99dRTOvY/eNGcSjAfiCwS\n/ocyhl28KU7/lhHm7z7o1Ki/jUSnVM12Jk+ebNUxzRdM8+bNrfLNN9+s43jTfM2aNdOxf/rVfCCr\n/wkHJvMh2SJ/nspH5pnbV3z33XdWnbnFBoKbMGGCjv2fsS1btuj4tddes+ruu+++Wp/rww8/tMoV\nFRUxj83mB8lzZwoAAMAByRQAAIADkikAAAAHoVwz1bp1a6vcuHFjHSe6fqp79+5W2dyq/rrrrov5\nuvbt2yd0vkSZ67L8v4dcZ66d8T+2ZenSpWnrR4cOHazyHXfcEeh1vXr1SkFvcl9VVZVVHjRoUMxj\nzz33XB2bT74310j5zZo1y6F3SId169bFrDPX0PnX1yExI0eO1LF/XZS5Zuqhhx6y6sxHwcT7nH70\n0Uc6Xr9+vVVnPkLG//gm/3U/m3BnCgAAwAHJFAAAgINQTvP179/fKk+ZMkXHd955Z+B2zK89v/PO\nO1Zdq1atEuxdapnTkf369ctgT9KvRYsWOvZPzcyePVvHP/74Y+A2T5w4oePXX3890GueeeYZq2xO\nMyD5zKkDEZFPP/005rHmGJaUlDifm7ENh3hPLrj//vt1HNbrdrY5++yzdfzuu+9adTfeeKOOv/32\nW6tu06ZNNcaJuu2226xyy5YtndvMFO5MAQAAOCCZAgAAcEAyBQAA4CCUa6b8hg4dWmMsYq+tGTFi\nRNr6dCanT5/Wsf/RJWadn//YfOXfFmL8+PEJtWN+LTfomqmePXsmdC4Et337dh3H27qgc+fOVjne\nFgimefPm6fjQoUNWnbkWsU+fPoHaA3JVt27drLJ5zfSvXwy6Rc3x48d1/Oqrr8Y8bsiQIYHaywbc\nmQIAAHBAMgUAAOAgK6b54gnT1J6poKBAx/5pPbPOTymVsj7lo7Vr1+o43hRqaWmpjjt27JjSPkFk\n8uTJOt69e7dVV1hYqOPly5dbdW3btq2xva1bt1rll156Kea5hw8fruM6dfj/ZNiZO93zlIHUM7dN\nuPLKK606fzmWu+++O2ad+VSRSy65pJa9Cy+uJAAAAA5IpgAAAByQTAEAADjI+jVTuWbw4MGZ7kJO\nqaio0LG5Hs2/fiqXvqKb7erW/eOyZK6v8Dt58qSOy8vLrbrPP/88+R1DyrRr1y5mnf+RJgi/ffv2\nxawbMGCAjhs0aJCO7qQFd6YAAAAckEwBAAA4YJovScaNGxezrnfv3lZ5woQJOvbv8NymTZuk9ivf\nVVdXBzquqKgoxT1BUOaYTZo0yaozpwAXL16s4zVr1sRsb9iwYVaZKd3wGTlypI5nzpxp1a1evVrH\nlZWVVt3555+f2o4h6XL188edKQAAAAckUwAAAA5IpgAAABywZipJqqqqrPJdd92l4+nTp6e7O4g6\n66yzAh03cODAFPcEpuLi4ph1p06d0vGjjz6aUPvmOqkZM2ZYdTxCJnzMvw8lJSVWnbk27sSJE2nr\nExK3YMGCTHch7biqAAAAOCCZAgAAcMA0X5Ls2LEj011ADcyvWffp00fHl112mXVco0aN0tYniIwZ\nM0bHjRs3turKysoCtVFYWKhj/3Tg2LFjdVyvXr1EuogM8Y+/Oc0HhBV3pgAAAByQTAEAADggmQIA\nAHCgPM9L5/nSejLUSCWpHcYy85I1liKMZxjw2cwdfDZzyxnHkztTAAAADkimAAAAHJBMAQAAOCCZ\nAgAAcEAyBQAA4IBkCgAAwAHJFAAAgAOSKQAAAAckUwAAAA7SvQM6AABATuHOFAAAgAOSKQAAAAck\nUwAAAA5IpgAAAByQTAEAADggmQIAAHBAMgUAAOCAZAoAAMAByRQAAIADkikAAAAHJFMAAAAOSKYA\nAAAckEwBAAA4IJkCAABwQDIFAADggGQKAADAAckUAACAA5IpAAAAByRTAAAADkimAAAAHJBMAQAA\nOCCZAgAAcEAyBQAA4OD/AYTjpWAK2yc7AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x115937828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1028d0fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample_images = sample_images.reshape(-1, 28, 28)\n",
    "reconstructions = decoder_output_value.reshape([-1, 28, 28])\n",
    "\n",
    "plt.figure(figsize=(n_samples * 2, 3))\n",
    "for index in range(n_samples):\n",
    "    plt.subplot(1, n_samples, index + 1)\n",
    "    plt.imshow(sample_images[index], cmap=\"binary\")\n",
    "    plt.title(\"Label:\" + str(mnist.test.labels[index]))\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "plt.show()\n",
    "\n",
    "plt.figure(figsize=(n_samples * 2, 3))\n",
    "for index in range(n_samples):\n",
    "    plt.subplot(1, n_samples, index + 1)\n",
    "    plt.title(\"Predicted:\" + str(y_pred_value[index]))\n",
    "    plt.imshow(reconstructions[index], cmap=\"binary\")\n",
    "    plt.axis(\"off\")\n",
    "    \n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The predictions are all correct, and the reconstructions look great. Hurray!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Interpreting the Output Vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's tweak the output vectors to see what their pose parameters represent."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's check the shape of the `cap2_output_value` NumPy array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5, 1, 10, 16, 1)"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "caps2_output_value.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's create a function that will tweak each of the 16 pose parameters (dimensions) in all output vectors. Each tweaked output vector will be identical to the original output vector, except that one of its pose parameters will be incremented by a value varying from -0.5 to 0.5. By default there will be 11 steps (-0.5, -0.4, ..., +0.4, +0.5). This function will return an array of shape (_tweaked pose parameters_=16, _steps_=11, _batch size_=5, 1, 10, 16, 1):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tweak_pose_parameters(output_vectors, min=-0.5, max=0.5, n_steps=11):\n",
    "    steps = np.linspace(min, max, n_steps) # -0.25, -0.15, ..., +0.25\n",
    "    pose_parameters = np.arange(caps2_n_dims) # 0, 1, ..., 15\n",
    "    tweaks = np.zeros([caps2_n_dims, n_steps, 1, 1, 1, caps2_n_dims, 1])\n",
    "    tweaks[pose_parameters, :, 0, 0, 0, pose_parameters, 0] = steps\n",
    "    output_vectors_expanded = output_vectors[np.newaxis, np.newaxis]\n",
    "    return tweaks + output_vectors_expanded"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's compute all the tweaked output vectors and reshape the result to (_parameters_×_steps_×_instances_, 1, 10, 16, 1) so we can feed the array to the decoder:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_steps = 11\n",
    "\n",
    "tweaked_vectors = tweak_pose_parameters(caps2_output_value, n_steps=n_steps)\n",
    "tweaked_vectors_reshaped = tweaked_vectors.reshape(\n",
    "    [-1, 1, caps2_n_caps, caps2_n_dims, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's feed these tweaked output vectors to the decoder and get the reconstructions it produces:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./my_capsule_network\n"
     ]
    }
   ],
   "source": [
    "tweak_labels = np.tile(mnist.test.labels[:n_samples], caps2_n_dims * n_steps)\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, checkpoint_path)\n",
    "    decoder_output_value = sess.run(\n",
    "            decoder_output,\n",
    "            feed_dict={caps2_output: tweaked_vectors_reshaped,\n",
    "                       mask_with_labels: True,\n",
    "                       y: tweak_labels})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's reshape the decoder's output so we can easily iterate on the output dimension, the tweak steps, and the instances:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "tweak_reconstructions = decoder_output_value.reshape(\n",
    "        [caps2_n_dims, n_steps, n_samples, 28, 28])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lastly, let's plot all the reconstructions, for the first 3 output dimensions, for each tweaking step (column) and each digit (row):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tweaking output dimension #0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\ndXVAyKjLzc3FbrcLbV6vl9tvvx0IxeYHDRrEiSeeGDG9+6MZ2nV1dcTHxxMfHy+0t7a2MmfOHCC0\nNo0fP56BAwdGTOv+aIZqc3MzAPHx8WJja25u5u233xavPffcc8nMzAy/yMOgbXZerxePx4PD4RD6\nnU4ny5cvB0Kb38033xyVXhpZlmlqaiI2Nhaj0YgkSbhcLkpKSgBISkriwQcfbLeWRguKouB0OjGZ\nTBgMBsxmM16vVxzeevfuzf3339+phl7UGR0VFRU89dRTbN68GYCPP/6YTz75hOOOOw6DwYDf7+f+\n++/n22+/BUKTtkePHpxwwgmRlA1AfX09f//731m5ciUQulHeeustxowZg9FoxO/38+ijj4qfK4pC\n3759OfbYYyMpGwgtrq+88goLFiwAQnkpL730EpMmTcJgMCDLMs8++yyrVq0CQjfaSSedRO/evSOo\n+t/4/X4WLFjAiy++CIQ2kqeeeorTTjsNo9GILMvMmzePdevWAaHF+tJLLyUtLS2SsoWW3377jSee\neAKAffv2cd999zFr1izMZjOyLPPxxx+zadMm8fp77rknKhZgVVUpLS0VG/PatWu5+eabueyyy7BY\nLASDQb755hu2bdsmrnnyySejxlPgdDp5+eWXAVi4cCEXXngh119/PbGxsQSDQVatWiWMQbPZzNNP\nPx01J22fz8fChQsBeOGFFxg/fjx33nkniYmJKIrC1q1b2bt3LwBxcXHcd999UWGkaiiKwsaNGwG4\n//77GThwIHfddRcZGRkAVFZWCmM2LS2NK664ImJaD0ZVVRUA//M//4PVauXuu++mX79+SJJES0uL\n8NYPHDiQCRMmRFDpgWge6wcffJCKigr+53/+hyFDhmAwGITBAXDiiSd2upEdVUaHqqoUFxezatUq\nEWc3mUwUFBQwaNAgJEnitdde48UXX2yXd3D33Xd3Wrzp96KqKuXl5Xz55Zeijj85OZnt27czYsQI\nDAYDn332Gc8991y7/I3Zs2dHRXy4rq6Od999l6amJgASExMpKSnB6/ViMplYuXIlTz/9tPheJEni\n4YcfjhpXrdPp5H//93/Zt28fEAptVVRU4PV6sVgsFBYW8vjjj4sbymQyceutt0aFu7O1tZVHHnmE\ngoICAGJiYnA6nfh8PiRJoqKigscffxyv1wuAzWZj1qxZUbGB+Hw+HnroIeHdMxqNeDweAoEARqOR\npqYmnn32WbEA2+12xo4dG0nJgkAgwFNPPcU777wDtM/HUhQFj8fDSy+9hNPpBEL3c9++fSMpWRAM\nBnn11Vd59tlnAXC73UycOBFJklBVlUAgwDvvvENtbS0AWVlZUWFga6iqyhdffMFdd90FhDxk+fn5\n2Gw2JEkiGAzyxRdfUFpaCkC/fv2iwsjW2LJlC9dccw0QSrqcNWsWSUlJmEwmVFVl9erVbNiwAYAh\nQ4ZETRgUQsbStddeC4S87WeddRY9e/YUnpiSkhLh8R4xYkSnr/GRX3F1dHR0dHR0/iuIKk+HZt1q\npZgAubm59OnTB0mSaGpq4qOPPhInPoDMzExuvPHGSEkWBINBvvrqK7xer4iz9urVi5ycHCRJorm5\nmbfeeqtdR8A+ffpw+umnR0qyQJZlvvvuO5qbm4UnQNMOodjwm2++KbwgAEOHDuW4446LiN79kWWZ\nn3/+mfLycjE3hgwZIuaNy+Xi7bffFkmkAOPGjYuK5N1gMMjq1avZunUrbrcbCI1tXl4eRqMRr9fL\n4sWLRXwYQkmwqampkZIs0NzjP/74o5gb48aNY+TIkSIstGbNGjZt2iS8Mueeey52uz2SsoGQ9m3b\ntvGvf/1LeDLGjx8vknMVRaGoqIhVq1YJb9jll18eFWEhVVXZuXMn8+fPp6GhAYBJkyZx/vnnC29A\ndXU1P//8swgFXXPNNe1yyyKJFpJ74oknRIhi2rRpXHfddSQmJmIwGGhqauKnn34S+m+88caoCWvV\n1NRw3333ibLSM844g3vvvZf09HQMBgMej4f169eL8b7mmmuiwqMKoZ4hDz30kAiTX3jhhdx///1k\nZmYiSRKyLLN7927h3bjgggs63aMaHbPw/6iurubrr78WlQcA/fv3Z/jw4VgsFuLi4ti6dWu7ax57\n7LGouJkqKir4+OOPURRFuKlycnIYNmwYZrMZq9Uq3G0ac+bMiYobqaysjNdff51AINBO+5AhQ0SC\n0cqVK9tlaD/55JNRcyOVlJQwd+5cvF6vcGP26dOHQYMGYTAYUFWVJUuWoCiK0PzYY49FXL+2ecyZ\nM4fm5mYRZsvPzxdGh9/v591338Xn84nv5uGHH454aEXT/vjjj9PY2EhCQgIAo0eP5phjjhH5V2+8\n8QbNzc3ie7nzzjsjrh2gqKiIOXPmUFNTI8IOp512mtAeCAT45JNP2pXHXnPNNVGhfdeuXTzzzDPU\n1NSIcM/VV1/NMcccI/KXfv31V/bt2yfCzueff35UaAfYvXs3L774IpWVleLgctddd9G/f3+MRiOK\nolBWVkZJSYnIJ5gyZUokJQv27dvHO++8Q0lJCdOnTwdC92Pfvn0xGAwoikJrayvl5eWceuqpAIwa\nNSqSkgU1NTUsXbqUrVu3cskllwBw7733CoNDq7rx+Xzi512RNB353fr/UFWV77//nuLiYgwGg/iw\n99xzDwkJCRiNRpxOJy6Xq911s2bNEv8fDAZRVZVgMCgMkXBs6oqisGzZMnbs2IHBYCA/P19oT05O\nxmw243Q6xWlQu/mnT58uNnItnqyVSwJhMaYUReGrr75iy5YtSJIkklrvvPNO0tLSMJvNNDQ0UF9f\n307TuHHjRF5NIBAgGAy2M7jCleshyzJLlixh/fr1mM1msYj95S9/IS0tDYvFQmlpqfByaMbsiBEj\nhH6/348sy6iqKvSHI9NclmU+//xz1q1bh9VqZfz48QDccsstYt7s3btXxLU1D0FeXp7oexEIBEQJ\ntvbZDlZu29kEAgE+//xzfv75Z+Li4sR9eO211xIfH4/JZKK8vFx4ObSNvV+/fsKLKcsygUCg3biH\nQ7vf72fJkiUsX76c5ORkbr75ZgAuvvhibDYbBoOBuro6fvnlFyDk9QPo2bOn0B4MBsWc0eZ6OOa8\nz+djyZIlLFu2jOzsbGbPng2EPB3a+zudTn744QdMJhN5eXlAKBFT88Bqa6SiKGFdazT9X375JUuX\nLmXo0KEiAXnAgAHigOByuVi1ahVms5nhw4cDoRytYDAoNkdtrdf0h+MA4ff7+eGHH/jkk084+eST\nefDBB4FQWwdJkkQe0I4dOzCbzWIttdlsB9WuzflwGIN+v5+1a9fy9ttvM3XqVG699VYAcVhQFAWf\nzye6vfbo0QMIzYu22rX5/0fmetQYHX6/n9dee010uNS+sJycHDGhTCaT+NBajX9jYyM2m42Wlhb2\n7t2L1+tl4MCBYjD3r/3uCrxeL6+//jqKomCz2YT2Pn36YDQaUVVV/BdCZW0Qys7WFrht27YRDAYZ\nNWoUKSkpAO1O5l2Fy+XijTfeQJZlbDYbxxxzDBBaaLVFoO34aSen4uJisrKyKC0tFRv+lClTROZ5\nMBgMi8HX0NDAG2+8QSAQIDY2VoRMUlJSREJa2+Zfmr4tW7bQo0cPtmzZwvr167Hb7cycOVPcbLIs\nd/lCXFlZyT//+U/8fj8JCQnivS0Wi9jQ2j7gKisrC4DffvuNjIwM1q5dy+bNm0lISODiiy8WP5ck\nqUs3QFVV2bNnD2+++SaBQICEhARxv3k8HlwuF0ajkfLycmEQaeGgb775htTUVNavX09paSlJSUlc\neuml4rOHQ3tRURHz58/H4/G024wrKyuF9oKCAhoaGtp5Xd977z1SU1PZtm0bjY2NpKenc9FFF4k5\nJUlSl84ZVVUpLCxk/vz5uFwuevfuLRJFi4qKRI+UTZs2sXnzZrxerzjozJ07l5SUFMrLy5FlmbS0\nNC644ALS09PF7+/q+a6F4+bNm0ddXR0mk4ndu3cDoTVUC7Vs27aNr776ivLyclHdMnv2bJKTk3G5\nXJhMJpKTk5k1a5bQbzQau3S90bRryeqyLIu+OXv37mXNmjUoikJpaSm7d++moKBAJLVv3LhRVBTZ\n7XYcDgfnnXeemDcGg6HLtW/atInHHnuM0tJShg8fLvpweDweFi1ahNfrpba2FqvVyrZt28jOzgbg\n/fffFwegtLQ07HY7Z599tjhESJJ01HtUVBgdqqqya9cumpqakGUZg8EgTneFhYUcd9xxGI1G6urq\nhPtN4/XXX8ftdrNs2TKGDBlCeno655xzDoMGDQL+vfl0FYqisH37dtxuN8FgEJ/PJ8oDv/nmGyZP\nnozVaqW0tFR8Odom+OSTT+J0Otm4cSN5eXlkZmZitVoZOnQoEFqou9LoCAaDbNq0Ca/XK9xqWp+L\nl156iXPPPZeEhATxb/DvUqu7776b2tpa9u7dS79+/ejRoweZmZli4UpNTe1yo0OWZVavXo3f7xeb\nm1ZFUV9fz2mnnUbPnj0pLCwUP9dK8G644Qbq6upoamoiJyeHrKws+vfvL04fqampXboIBwIB1q5d\ni9/vJxAI4HQ6+fTTTwFYuXIlQ4cOpW/fvjQ1NQnvnpbXcfXVV+N0OvF6vfTs2ZOsrCyOO+44sTmm\npKR06cYdCARYt26d6HZZVVUlSpXnz59Peno62dnZ2Gw2amtrRf8agOuvv14YUtnZ2fTq1YuxY8eK\n8EtSUlKXavf7/axbt46Wlhbcbje7du3ioYceAuChhx4iJiaGpKQkkpOTKSkpwe/3i/L9e+65B4/H\ngyRJ5Obm0rt3b0466SRxAHI4HF06Z7xeL+vXr8fpdNLa2sqaNWtE0zVFUTAajdhsNhISEqivr8fj\n8YiQ7saNG/H5fJhMJvr27csxxxzDpEmTROgoNja2y40Or9dLQUEB1dXVuFwuli5dyueffw4gTtMm\nk4mYmBh8Ph9+v1/kHqxatQq/34/ZbCYvL4/8/HxmzJghcrgO1cywM7Vv2rSJPXv2iP4nr7/+OvDv\npnKSJIn1IxAICCNqxYoV+P1+rFYrgwcPZsiQIZxzzjkif66rjQ6fz8eWLVvYvn07zc3NvPzyy8yd\nOxdo/6Rqg8GAyWRClmW2b98uPlsgEMBqtTJy5EhOOOEE4f3QOFqvcFQYHVpDsOLiYoB2k23mzJnM\nmjWLn376ieLiYvFFaYvUihUrcLvdjBo1iqSkJE466STsdrs4AXR1mZjf72fLli3CSJJlWVjn119/\nPaNHj2b79u3U1NSIUlptUV2/fj0+n48TTjiBrKwsTj75ZFJSUsTG2NWNfLSGVPv27UOSJAKBgOhJ\n8Pe//108oKilpUVs2trCtGvXLgKBACeeeCL9+vVj0qRJZGdn09jYCCBOrl2tv6amRhijsiyLG/3r\nr79m7dq1uFwufD5fuxJsCJWNybLM6NGjGThwIFOnTqVv376iyZJm6XcVgUCA1tZWXC6X6IOihbDq\n6+vZt2+fWHj3d2lq5adjxoxh6NChnHbaafTt21ckovbs2bNLtWuhQI/HI3I32iZ3Nzc3s3PnTvE6\n+PfC5Pf7MZlMHH/88ZxwwgmceeaZ9OnTR9zXXd2lVAtfBgIBkbvR9hCjKAput5uysjICgQCSJImw\nlpZXM2rUKCZMmMDMmTPp1atX2LSrqioaxhmNxgO0S5IkXOR+vx9JkoQHqrW1lZiYGE466SSmT5/O\nmWeeSUZGRti0a/rsdjtGo/GgY28ymTCbzeIQYTAYhNe3ubkZi8XCxIkTOeOMM5g+fTopKSli8+tq\n/ZpBZzKZxFrZVrvZbBYGXGtrK0ajUXhhmpqaiImJYcaMGZx11llMmjSJpKQkob2ry2k17RaLRayT\nbY0Nq9Uq5kljYyNGo1HsPU1NTZhMJs4991zOOusssb9q1/8eQ1UK8/NKDvpmiqKwevVqLr30UhRF\nobGxUWzQWiyp7eIbHx/Pn/70JwDhmjUajWJzTEhIEJvGfp6CP+LyOKT2devWcc011xAIBKipqREd\nDrWQSttNLzExkeuvvx6A8847j8zMTLEIyrJMTEyMmKzh0L5p0yZuueUW3G43lZWVQnvbGKW2MKWl\npXHbbbcBcPrpp5ORkYHVahWxPrPZLCZvJ2o/rP5du3Zxzz330NzcTGlpqdiQtSRMt9st5lKPHj14\n4IEHAJgwYQIpKSkihq+FwLSFYz/vWJeM/b59+3jiiSeor6+nsLBQGGwWiwW/34/L5RKepdzcXB57\n7DEglKyZlJQkFkFAdBMMh3ZVVamqqmLevHmUl5ezdu1aUUVhMplEf466ujpUVaVfv36i8dnxxx9P\nYmJiuwW8rYs2HNrr6+tZsGABO3bs4JdffhHarVYrqampNDc3s23bNmRZ5phjjhHahw8fTnx8PDEx\nMe20H8KT2iXanU4nK1asYMuWLSxfvlwYyTabjWHDhhEMBlm6dCl1dXXk5+fzt7/9DYBhw4YRHx+P\nzWYTp+rDeIC75H5VVZWWlhYRFvzhhx/EehMbG8tZZ52F3W5n/vz5rFmzhiFDhoj7dciQIcTHx2Ox\nWDAYDEfyXnf62EPImNi0aRObNm1i9erV4t6LjY3lsssuIykpiffff5/XX3+dvLw87r77bgAGDx7c\nTvsR6BLtXq+XHTt2UFBQwK5du0S4My4ujjPOOIPY2Fh+++03HnjgAbKysrjpppuA0LzRvI8diBh0\nSHt0lB/o6Ojo6Ojo/OfT9smiYfhzSPx+v9rQ0KCWlZWpS5cuVZ977jn1ueeeU2+99VY1IyNDlSRJ\nBVRJktSJEyeqTqdTdTqd7X6Hoiiqz+dTFUU51Nt0ifZAIKA2NTWpFRUV6o8//qi+//776vvvv68+\n9dRTav/+/VWDwaACqsFgUM855xzV5XKpLpfrgN8jy3JEtLtcLrW2tlbdvHmzunLlSnXlypXqp59+\nqp500kmq1WpVAdVsNqs33HCD6na7VbfbfcDvOYzuP6r9sPplWVbdbrfa1NSklpWVqTt27FB37Nih\nrl69Wr3iiitUh8OhSpKk2mw29aGHHlJ9Pp/q8/kO9ys7W/8hCQaDqs/nU91ut9rQ0KBWVFSoFRUV\nalFRkfr444+rvXr1Ug0GgxoTE6M+++yzqt/vV/1+f1RoVxRFDQQCqt/vV1tbW8X9WF1drX7++efq\nuHHjVKvVqjocDvX5559XA4GAGggEoka7LMuqLMuq3+9XPR6P6vF4VJfLpe7YsUO944471Pj4eDU+\nPl594YUXokq7qobmjfZH0+bz+dTGxkb1s88+U3v16qUmJSVFSvsR9SuKIv5on0OWZdXn86nFxcXq\nKaecovbs2VN99dVXo27sNd0H+xzNzc3qHXfcoebn56vz58+PqvtV03so/H6/+t5776njxo1TX3rp\npS5dJ6MipwNCMbGkpCSSkpLaxaQDgQC9e/dm9uzZuFwu8ZhdrQKkLW0TecKJyWQSD4pqm8ugZYnf\nddddOJ1OLBYLF1100UiimuAAACAASURBVEGfmgvhKe/dH5PJhN1ux263t2s4JcsyRqORG2+8kZqa\nGqxWKxdeeOEh44+R6gFgNBqJiYkhJiam3ZwIBoNce+21/PTTT3g8HqxWK2effXZUPXTJYDAIPW1j\n0oqicN5557Fo0SKqqqqw2WycdtppUdNyHtpXarTVpaoqxx9/PElJSaiqis1mY/r06VHRS0dDkiRx\nrxmNRqFfVVUyMjLweDz4fD7i4+OZNm1aVGmH9qHLtv8fDAYpKSmhoaEBu93OlClTok47tF8r9n8q\nbklJCYWFhcTExDB+/Pio03847XV1dSxduhRJkhg/fnxU3a9w+DXa7XaLSrpTTz21S9fJqA+vmM1m\nbr75Zv7yl7+QmppKbGysyBuIdkwmExdeeCGXX345iYmJOBwOEhMTDxcHjhpMJhOTJ09m2rRpxMfH\nY7fbSUhI6BbaIbSZDBs2jJEjRxIbGyv0dwcMBgPZ2dlkZ2djtVqJj48nKSkp0rI6hCRJ4kmnZrMZ\nh8MhkgGjHa1cd9++fRgMBpKTk9uVlHYHfvzxRyBU2h5tT5Q9EoqisGjRImRZJisrS5SAdwdUVWXZ\nsmV4PB4GDhzY5cncnYmqqmzevBmn08nIkSO7vFNz1BsdEErwuuuuuxg0aBBpaWkH9XJEK7Gxsdxz\nzz3k5OSQnp5OTEyMcDNFO3Fxcdx+++1iAYs2y/1IxMXFcemll+JwOOjVq1dUtLDuKDabTZRj9u3b\nt1tpN5lMZGVlYbFYGDRoULfSrqoqJpMJq9XK8ccfH1UP6joSPp+P+vp6LBYLp556alQ8SPJoaGlp\noaCgAJvNxkUXXdSt9LtcLpYsWUJiYiI33XRTWKqBOouWlhbeeecdsrKyuPXWW7tce7cwOiBUA691\nU2tbVtUdyMrKYt68eZx00kmoaqjVbNuGVdGKJEkMHTqURx55hGHDhokysbalYtGMwWBgypQpXHrp\npeTl5eH3+7uNwaeVqY0ePZrevXt3i/miYTabmT59On369GnXxbM7oHUUTktLo2fPnt1irmh4vV6S\nk5OJj4+nf//+3cIj2Zby8nIg1Hk3Pz+/W+lfs2YNTU1NxMXFMWDAgEjL6TCad2nv3r3ExsaGxbvU\nbYwOCPUfOOOMM0hPTxcbd3dZFEaMGMGpp55KQkICwWBQtMKNdoxGI2eddRajR48mNjZWaO8uxMTE\ncNVVV5Gfny8eO90dxh1CxurFF1/c7tkI3UG7wWBg2LBhTJgwAbvd3q02D62B08CBA39Xt8VIYrfb\nycjIoFevXqiq2q20q2qoLbjNZhMPyewu+v1+P9XV1fh8PvHMpO4y58vLy1m+fDlVVVUMGjQoLHmF\n0ZWlcwS0k2sgEBCDEwgExEPJohmz2czZZ5+NoigiOUprcx7tEzQ+Pp7LL7+8XavhcLRo7wwkSaJ/\n//78+c9/7nYboMViYdq0aYwdO1bk03QXMjMzueSSS4iJielWIQqDwcDo0aPxer2i+2J3QWv+lZGR\nwTnnnNOt5oskSWRkZJCXl0dGRgZjxoyJtKQOYzQa6d+/P71792bGjBndIp9DO7wYjUYyMjJIT09n\n6tSphyxy6Eyif9fQ0dHR0dHR+Y8gKjqS/q5f9H+6j9Ka75Jub0f1S9qMd3fS/jvHW6NLOhwe1S+I\nnP4/rP3/s3fe4VFV6eP/TMvMpE4SQhKSkJCEEJDeqzWICpZVV7GwltVd6yq6lp+FZfGrIq7d3a+s\nBb9WBHdFWRUrEECq9BKkJZT0PsnUe+/5/THPnCUrahAyxb2f5+HZRWPyyZ1z733Pe97znhM8PC9s\n7sH6nxPIFoTFPVh3dYJnYoTFPdh6/gRP6w3L/SqEwOPxYLFYTjTDFPJrrygKPp9Pdjg+AULqLoSQ\nh+idhMLdTrlHbdDxMwl70HEC/Le6Q3T76+4/H909POj3a/j4xbvryys6Ojo6Ojo6ISHUmQ4dHR0d\nHR2d/1L0TIeOjo6Ojo5OSNCDDh0dHR0dHZ2QoAcdOjo6Ojo6OiFBDzp0dHR0dHR0QoIedOjo6Ojo\n6OiEBD3o0NHR0dHR0QkJoT5YINz7c3/xjVd+gGh2h+j2191/Prp7eNDv1/Dxi3fXMx06Ojo6Ojo6\nIUEPOnR0dHR0dHRCgh506Ojo6Ojo6ISEUNd0/Cw0TaO+vp7777+f1atXU1NTQ3x8PACjRo1izpw5\n5OXlncipil2GEIL29nbeeustPv/8c3bs2EFcXBwAJSUl3H333aSnp4fZ8tgIIfD7/Wzfvp1Vq1ax\n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\nAg6Ucqrsrl27YDKZUFJSknEn4l5JV1cXNm7cCJPJhAkTJmDs2LFaRxqw7u5urF+/HkajEdOmTUt7\n9ozYMjsQRqMRr7/+OmRZRnZ2Nj82WOtW1gNhsViwfPlySJKEoqIi3sY9E06rvJrc3Fx8+OGHePnl\nl1FSUoJoNAog5VdDmtDpdMjPz8eyZcuwfPly5Ofn81XbKb6iUJ1er8eIESMwb948bN68mW8nBJAR\nJ21eidFoRHl5OaZMmcK3nfbtiZLJlIdGaWkpJEmCxWIBY9r1AUqFwWDAqFGjkJeXh6Kiooxoe54K\nURRhs9mQk5OD8vLyjP+M9nXu3DlIkgSr1Yr77rsv1ddZmpFlGdXV1ejs7ITT6cTMmTPT3ksks0ev\nC5jNZsyZMwdNTU18EBNFUfOe/APhcDgwd+5cdHZ28veYkiRp3pN/ILxeL5544gmYTCaeXcv+IqnQ\n6XQoLy/H9OnTUVpaelETq0xmMpkwY8YMBAIBFBcX84ffYJCbm4tZs2Zhx44d8Hg8WscZML1ej8LC\nQtx7771ob2+H2+3WOtKAZWVlwefzYfz48SgqKrpkt89MZrVaMWTIENx0000YO3ZsquuuNKMUp6Io\nori4GOPHjx80RUc4HMb58+fR1NSE0aNHo7S0NO3PpIxcSHrFH8CSXfeUB57SJGmAhUfaF2NeiSRJ\n6O3t5TekTqeD0WjUbP92KgRBQG9vL19AqtfrU2mSlPaFaVcTjUYhCAKfoUmxC6lm116WZfT29kKv\n1/NBOMViSbPsfe+ZaxyENckuSRK6urrAGLuehlqaZO/t7UUoFILD4YDdbr/WwlqTzytjyb47kUgE\npaWl11N0qH7tBUHAwYMHkZ+fj6Kiout5cKuaXZIkdHZ2oq6uDrfccku/gyavAfXpIIQQQkjmGHQz\nHYq+3RsHwzfWvgZz9mt8v635TAf/Qern1/qdCGW/1h9wfa/g/qvXHbjO/Dfg1ed/9doPiuyDak1H\nX4NhPcHlDObsmb4O4moGe36iHrpXtEHX/f/b4H36EUIIIWRQUfv1CiGEEEL+o2imgxBCCCGqoKKD\nEEIIIaqgooMQQgghqqCigxBCCCGqoKKDEEIIIaqgooMQQgghqqCigxBCCCGqoKKDEEIIIaqgooMQ\nQgghqqCigxBCCCGqoKKDEEIIIaqgooMQQgghqqCigxBCCCGqoKKDEEIIIaqgooMQQgghqqCigxBC\nCCGqoKKDEEIIIaqgooMQQgghqqCigxBCCCGqoKKDEEIIIaqgooMQQgghqqCigxBCCCGqoKKDEEII\nIar4H8nxc2YM+vflAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11d6ff898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tweaking output dimension #1\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n97//DcDu3buZOHEiOTk53a7zhxBCdMjNsFgs39MfCAR47bXXAKiursblckXFXNc0Db/fL/Vardbv\n6XK73XzwwQcADB48uNs1/hiqquLz+eR5+l3t4bylTZs2AXDWWWcddQ1Ra3S0t7cDMHfuXDIyMrjo\noouIjY2Vi+yjjz4C4MsvvwQgLi6OBQsWRMWkbGtrA+CZZ56hR48enH322bLcSAjBW2+9BSA34vT0\ndG699daI31YPNSpeeukl+vfvz0knnYTT6cRkMqGqKgsWLACQyYsDBgxg2rRpkZQtUVWVhoYGAN56\n6y0GDRrEhAkTZH6Poig888wzQCifw2w2M2PGDHr27BkxzWGCwSDV1dUAfPzxxxx77LEMGzZMbg5+\nv5/HHnsMCHn37HY7t9xyy1ErYzsSPB4PZWVlAKxatYpJkyZRWFiI1WpFCIHH4+GRRx4BQnlA2dnZ\nXHzxxRFfq5qmUVNTw759+4BQCGL69On06tULi8WCpmk0Njby5JNPAtDa2so555wj492RxO/3s2fP\nHjnubrebE044gbS0NMxmM6qqUl5ezttvvy1//YILLoia0EpLSwvr16+ntrYWgKSkJI477jgSExMx\nmUwEAgH27dvHV199BYTGPho82EIIamtrWb16NU1NTQD06tWLiRMnEh8fD4QuxNu3b2fv3r0AOByO\niM91CGkvLy9n5cqVeDweAAYNGsSYMWOIiYlBCEFbWxs7duzg4MGDQMhT5nK5jqqOqDM6hBAsXbqU\n++67DwhNzsceewyn0ym/uPb2di677DIgZA1brVY++eSTiN9WVVXltddek/klXq+XBx98EJvNJg2K\ntrY2brzxRiCk3el0smrVqoi7DYPBIE8//bQ0KlRV5e6775ZjLoSgsbGRe++9Fwhtei6Xi8WLF0fF\nrc/n8/Hwww/zzjvvAKGb05///GfpsYFQXHjevHlASH9eXh6PP/54xI09t9vNXXfdxdKlS4FQ0tyf\n/vQnBg4cKA+/3bt388orrwAh7VOmTOGMM86IpGwgVP1z8803s379egBcLhcpKSn06tVLZvCvWbOG\nJUuWAKE5P2fOHHr06BFJ2QghKCoq4g9/+AMlJSUAZGdnk5GRQUpKCk6nE7/fz1tvvcW6devkn7no\noosinqSuaRpffvklt99+O62trQDk5eWRkJDA+PHjcTqdtLW18cILL7BhwwYgNKcGDRoU8bkOIeP/\n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\nQgghRFr8H85YezouTM0RAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11de36828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tweaking output dimension #2\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh0AAADYCAYAAABP2lHJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzsnXd8VFX6/9/TJ5l0UiCNTopIUbqg\nqOjPRVFxLauyurq6Kq6ua3d111W/lt11rRRhFeyoqBTLgihSRaT3kgQCSUivk+lz7/39Ma97TCCY\nBDMl7n2/XrwUcm/mM+eee85znuc5z9EpioKGhoaGhoaGRrDRh1uAhoaGhoaGxv8GmtGhoaGhoaGh\nERI0o0NDQ0NDQ0MjJGhGh4aGhoaGhkZI0IwODQ0NDQ0NjZCgGR0aGhoaGhoaIUEzOjQ0NDQ0NDRC\ngmZ0aGhoaGhoaIQEzejQ0NDQ0NDQCAma0aGhoaGhoaEREowh/rxw11zX/Yx7Ne2nzs/RDt1bv6b9\n1NG0hwftfQ0fv3jtmqdDQ0NDQ0NDIyRoRoeGhoaGhoZGSNCMDg0NDQ0NDY2Q0O2NDlmWaW5upry8\nHJ/PF245KErHw2qyLNPU1ERxcTEejyeIqtpHURRkWe7w9bIs09jYyP79+3G5XEFU1j6qdr/f3+F7\nZFmmrq6OrVu30tzc3Knn1pUoioLf78fr9Xb4HlmWqaysZPXq1TQ1NYVNuyzL+Hw+3G53p+4pLy9n\n2bJlNDQ0hLXdfT5fp/quLMtUV1ezfPlyGhsbw95nOjNmKIpCfX0933zzDXa7PWzaVWRZ7lSfB3A4\nHGzevDkixpvOzjU+n4/i4uKImKMkSerU9epY2Zn54aeIKKOjM19KkiQkSaK8vJyFCxfy7bffdmrw\n60rUwVdRFHS69nNpZFlGlmUqKir46KOPWLlyZVheJPXlcTgcyLKMXt9+d1C1V1VV8cEHH7B69Wqc\nTmcI1LatpbGxkZKSEjweD0Zj+3nRLfW///77rFu3Drfb3aHn1pX4fD6KiopYuXIlNTU1mEymdu9R\nFAVFUaiqquLdd9/lu+++w+PxhFy7y+Xi22+/5d///jc7duzAbDa3e09L7a+//jqrV68Oi3an08mH\nH37IbbfdxqJFi7BYLO3eo2qvqanh1VdfZfny5bhcrrC0+1tvvcWvf/1rXnrppQ71GZXa2lqee+45\n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\n8ePHc8kll2C321m/fj233norffv2Dbp2q9XKpEmT+OKLL2hqasJqtZKQkCBWnbfddpuYyNxuN7W1\ntdx3331s2LABCPSzm2++mSuvvBKv18t3333HpZdeGpQw6PHodDp++9vfcuTIEVFWOzk5Waz6rrnm\nGvLy8tDr9bjdbux2O3/6059ELDwuLo5//etfTJw4EUVROHr0KIMGDQpZ8vSZZ57JZZddRmNjI3q9\nnpSUFFHl8sILLxQ7EzweD263mzvuuEPkFfTs2ZN33nmHgQMHimuioqJCmkhqs9k477zz2LhxI3V1\nda3afujQofTv3194HH0+H3fddRdfffUVAHl5ebz99tskJSUJz2UoJ22dTkdqaip/+MMf2LhxIxaL\nRdSm6dOnD9nZ2cLTrealLFq0CICJEycya9assBdmmzJliphv1UrMasG4rKwsevbsSVRUFJWVlbz3\n3nsAXHHFFbzwwgtdOp9qdTo0NDQ0NDQ0QkLYwytffPEFU6dOpba2lv79+/PXv/6Vc845p9XWRTX8\nIMsyF1xwAZ988okoZ92vXz8yMjKIiopi+/bt7N+/n6qqqpCsPj7++GOuu+46iouL6devH/feey/n\nnHOO+Gw1UU71hIwdO5aMjAyxbbN3797k5+fTp08fCgsL+fbbb3E6nSGxiF955RX0ej07d+4kOzub\nm2++mQkTJogYa8uYtl6vZ8iQIcTHx4vvkpaWxvjx4xkxYgR2u52PPvoIi8USsjojN910E263m3Xr\n1pGWlsall17KyJEjRXKX6gJU66cMGjQIvV4vPDupqamMHTuW//f//h8mk4nFixfTq1evkOgfOnQo\nM2bMYP369VgsFkaOHMnpp58utlqrqwq1fooao1e1JycnM27cOM4++2xsNhvZ2dn079+/VWJbsOjR\nowePPfYYkydPxu12k5WVRW5urjh1VdWuep+MRmOr3ILk5GTGjh3LwIEDsVgsZGRkkJSUFBLvnslk\n4qyzzmLWrFnU1tYSHR1N3759RVJcS7exxWLBYDBgt9tFu6elpTFs2DCxXTkhIQGDwRCSFbdOpyM+\nPp7bb7+dK664AlmWSUtLE57FlivRqKgoHA4HTU1Nwk2em5tLnz59xLgajmMXDAYDubm5vPLKKzid\nTmJiYkSfNxgMrbwubrcbh8Mh8oEmTJgg2h1CEw46nujoaKZOncoFF1wgttxDoO1b9gGfz4fT6RSh\n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\n334bk8kkmg2uW7eOqqoqkXvQ1NSUMBsEDS2Jd/ny5RgMBoYPH04kEmHjxo14PB4+/vhjILpWJULX\n4xPRjjbffvtt0Z8mJSWF4uJiwuGwsPORSOS09xFJjC2qjo6Ojo6Ozn88CRfpkGWZtWvXCk+sa9eu\nrFu3rt1tspIkiSOM5uZmWltb6d+/f8w6An4TqqqybNky4QGnp6fzf//3f4wfP14kzmlXrkM0xK91\nI413lENVVe655x4RYbLb7fzpT39izpw5ooOedlU5RCuIfD5f3HWfyM033yyiTGazmVtuuYU777wT\nh8MhupJqJXha8mii6H/kkUdEhZPBYGDOnDk8+eSTuFwu2traKCkpEfNK6wyYKKxZs4YtW7aIry+8\n8EJefPFFMjIyqK2t5ZNPPhGXIGr3aiQKR44cYcmSJUB0TkycOJEXX3yRrKws9u/fz/r160X076v9\ngeKN3+8XEa9wOMyUKVN45plnyMrKYsWKFezZs0eUPmrH1YmELMvMnj0biOZFXHrppTz88MNkZmZy\n99138/TTTwv9Pp8v4SIdf/jDH4DolQrz58/n1ltvxe12M3fuXN577z3xvGoJvonEJ598AkRvQr/8\n8su54oorcLlcTJo0iR07doi5HgwGT3ukI+GcjubmZgKBgDhGeemll752IZosy6LM7fDhwxiNRoYN\nGxb3MLnX66WlpUUkL95zzz2cc8457RpmhcNhkVdgMplIS0uLeb35yQiFQtTU1Iizvp/85CdcccUV\n7ZL+QqGQKAUbPHjwN142Fg8kSWpXPnjOOedw7733inNXu92OLMvC6cjOzk6Y83lVVfnnP/8pvh40\naFC7M3i32y16uADtGoElAk8++aRwJAoKCvjrX/8q+ld06dKFnj17smfPHgAGDBiQUNeRP/XUU8LA\n9ujRg1deeUUkS/ft25eBAweKxaNfv34JMV80VqxYIZr5de3alRdeeEEszOeddx79+vUTTdu0BoqJ\nxP79+4UtzMrK4uGHHxY9Z6688kpx3AiIzyRRqKurE0n3brebm2++WdxBdccdd7Bp0yaRc5VoDoff\n7xdViACXX365GPf77ruPuXPnCvvSGS3aE+fp//988cUXGAwGhg0bBkQfnhOJRCKsW7dOVIi4XC7u\nvPNOMjMzY671qxQXF6MoCt27dweiGeUnGimfz8dLL73EG2+8AcDIkSO55JJLEiIhUOsHoRmtBx54\n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\njo6Ojs5/BAl/RqEoCnv37m3Xyz4WtcSnA+0eBK1yRWvfnizaKyoqxI7JZDKJ8s1koaqqitbWViA6\nZ5KlIyZES0417ZmZmUml3ev1Cu1dunSJs5qOEQwGRUfSZLtNWas0M5vNSZHw/VU7qJWIp6SkJHwU\n+6vatXb/brc74e37V/VpPYxiVamV2J8sUSOwaNEi0STJbDYzZ86cpFi8I5EIixcvFqFCq9Uakzro\n04Esyzz77LOix0WyJTMqisLrr78u9Ofl5SVNQqOqqmzevFloLywsTHgjfCKlpaVIkoTJZGLgwIEJ\n/5yeSGNjIxDdICRTuSxEj7VcLhcmkympjuM0ZFkmLy8Pq9WaVDl7EH1mBw0aRGpqalI9qxoTJ04k\nKysrJq+V8J9sWVkZVVVV4uuUlJSkMQZtbW2ioRlEm1MlSwleJBLh0KFDohNp9+7dk+psXlVVampq\nUBRFlIIlU7QAoo6T3W6nd+/eSaVdW/CcTicZGRlJcTmghtvtxmQyxeSK79ONy+XC6XSiKIqIriYT\nNpuNrl27oqoqfr8/aWwl0K7cNBQKJZXTZDQaGTlyJBC9cK+zo2QJ65Jp7biXLl0qbjY1GAwMGDCA\noqKiOKs7NXbs2NFu5zR8+PCkqaBobW0VDpPJZGLEiBFJ04IborumTZs2YTAYMJvN9O/fP6kMwbp1\n6zAajZjN5qQ5TtTYv3+/uDAt2S4da2pqEs51eXl5Ujl72hG0JEns3bs3qbRD9Jk1GAx4vV527doV\nbzkdQnOsGxoa2LdvX7zldBir1UpNTU27KtHOImGdDlmWkWVZVB9AdGB+9rOfJU3osLa2FkmSMBgM\nWK1WFixYkBRnrRB9iCKRCEajEYvFwrRp05Iq0mEwGAiHw1gsFiwWCyNHjkyahVtzlBwOB0ajka5d\nu8ZbUofIzMwUodpku9o+PT1dRMWqq6uT6rZQh8PBhAkTkGWZffv2JZV2iEYLfvjDHxIOh/n000+T\nKofMaDRy6aWX4vF4ePfdd5NKO8CYMWNoa2tjxYoVnV45lLBOh4bJZBLlsYWFhUycODFpdqwul4uU\nlBRMJhP9+vVj5MiRSbNwOxwO8vLyMJvN9OrVi169eiXVWaXJZGLSpElYrVby8vJIT09PGqcD4PLL\nL8fhcJCTk5N0kY4xY8bQtWvXdhfWJQtdunShf//+pKam0tzcnFQOk9VqZfDgwdhsNnF/TDJhNBop\n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\nwb333ouGhoZFtVaZQKvVorm5GXV1dSgsLEzL7/VSBEHA9u3bEQqFMu6iDcQvfjabDWfPnk2rVesb\nEQgE4PP5MDc3h1AolFFJ3+TkJPr7++FyueD3+1O6DZ05ZwJCCCGEZDTFW2ZlJks7Uor8V2MHMjt+\nin35FIs9FoshEonwCcnLoFjs4XCYj8pf5gqTor9Xt9uN0dFR1NTULLd+SZFjL0kS/vzzTzidTjQ1\nNS13m0KR2Ofn59HR0YGBgQG0tbUt9wnnmTGnQ2Z0AlYGJR3KodiV8V+NHViB+G9yu1bRZBW4qS1y\nxWJnDQ2pjj3jajoIIYT8f8ukOpqFMjVuQL7OMrlXOgghhBDyH0WFpIQQQgiRBSUdhBBCCJEFJR2E\nEEIIkQUlHYQQQgiRBSUdhBBCCJEFJR2EEEIIkQUlHYQQQgiRBSUdhBBCCJEFJR2EEEIIkQUlHYQQ\nQgiRBSUdhBBCCJEFJR2EEEIIkQUlHYQQQgiRBSUdhBBCCJEFJR2EEEIIkQUlHYQQQgiRBSUdhBBC\nCJEFJR2EEEIIkQUlHYQQQgiRBSUdhBBCCJEFJR2EEEIIkQUlHYQQQgiRBSUdhBBCCJHF/wCiwym+\nYLm7/AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x115f4bf60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for dim in range(3):\n",
    "    print(\"Tweaking output dimension #{}\".format(dim))\n",
    "    plt.figure(figsize=(n_steps / 1.2, n_samples / 1.5))\n",
    "    for row in range(n_samples):\n",
    "        for col in range(n_steps):\n",
    "            plt.subplot(n_samples, n_steps, row * n_steps + col + 1)\n",
    "            plt.imshow(tweak_reconstructions[dim, col, row], cmap=\"binary\")\n",
    "            plt.axis(\"off\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Conclusion"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "I tried to make the code in this notebook as flat and linear as possible, to make it easier to follow, but of course in practice you would want to wrap the code in nice reusable functions and classes. For example, you could try implementing your own `PrimaryCapsuleLayer`, and `DenseRoutingCapsuleLayer` classes, with parameters for the number of capsules, the number of routing iterations, whether to use a dynamic loop or a static loop, and so on. For an example a modular implementation of Capsule Networks based on TensorFlow, take a look at the [CapsNet-TensorFlow](https://github.com/naturomics/CapsNet-Tensorflow) project.\n",
    "\n",
    "That's all for today, I hope you enjoyed this notebook!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
