2531 lines
242 KiB
Plaintext
2531 lines
242 KiB
Plaintext
{
|
||
"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://www.youtube.com/embed/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\"\n",
|
||
" src=\"https://www.youtube.com/embed/pPN8d0E3900\"\n",
|
||
" frameborder=\"0\"\n",
|
||
" allowfullscreen></iframe>"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from IPython.display import HTML\n",
|
||
"\n",
|
||
"# Display the video in an iframe:\n",
|
||
"HTML(\"\"\"<iframe width=\"560\" height=\"315\"\n",
|
||
" src=\"https://www.youtube.com/embed/pPN8d0E3900\"\n",
|
||
" frameborder=\"0\"\n",
|
||
" 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": 2,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from __future__ import division, print_function, unicode_literals"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"To plot pretty figures:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 4,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"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": 5,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 6,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 7,
|
||
"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": 8,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x7f6231f8aa58>"
|
||
]
|
||
},
|
||
"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": 9,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([7, 3, 4, 6, 1], dtype=uint8)"
|
||
]
|
||
},
|
||
"execution_count": 9,
|
||
"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": 10,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 11,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 12,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 13,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 14,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 15,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 16,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 17,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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",
|
||
"\\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.01."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"init_sigma = 0.01\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": 19,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 20,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 21,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'W_tiled:0' shape=(?, 1152, 10, 16, 8) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"W_tiled"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Good, and now the second:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps1_output_tiled:0' shape=(?, 1152, 10, 8, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 22,
|
||
"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": 23,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 24,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_predicted:0' shape=(?, 1152, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 24,
|
||
"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": 25,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 26,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 27,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 28,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"caps2_output_round_1 = squash(weighted_sum, axis=-2,\n",
|
||
" name=\"caps2_output_round_1\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_output_round_1/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 29,
|
||
"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": 30,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_predicted:0' shape=(?, 1152, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"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": 31,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_output_round_1/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 31,
|
||
"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": 32,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 33,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 34,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 35,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 36,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 37,
|
||
"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": 38,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"338350"
|
||
]
|
||
},
|
||
"execution_count": 38,
|
||
"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": 39,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 40,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 41,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 42,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'y_proba_1:0' shape=(?, 1, 1) dtype=int64>"
|
||
]
|
||
},
|
||
"execution_count": 42,
|
||
"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": 43,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"y_pred = tf.squeeze(y_proba_argmax, axis=[1,2], name=\"y_pred\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'y_pred:0' shape=(?,) dtype=int64>"
|
||
]
|
||
},
|
||
"execution_count": 44,
|
||
"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": 45,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 46,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 47,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 48,
|
||
"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": 49,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_output_round_2/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 49,
|
||
"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": 50,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 51,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 52,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 53,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 54,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 55,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 56,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 57,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 58,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'reconstruction_mask:0' shape=(?, 10) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 58,
|
||
"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": 59,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_output_round_2/mul:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 59,
|
||
"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": 60,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 61,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"caps2_output_masked = tf.multiply(\n",
|
||
" caps2_output, reconstruction_mask_reshaped,\n",
|
||
" name=\"caps2_output_masked\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'caps2_output_masked:0' shape=(?, 1, 10, 16, 1) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 62,
|
||
"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": 63,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 64,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<tf.Tensor 'decoder_input:0' shape=(?, 160) dtype=float32>"
|
||
]
|
||
},
|
||
"execution_count": 64,
|
||
"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": 65,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"n_hidden1 = 512\n",
|
||
"n_hidden2 = 1024\n",
|
||
"n_output = 28 * 28"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 67,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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_sum(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": 68,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 69,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 70,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 71,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 72,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch: 1 Val accuracy: 98.7000% Loss: 0.416563 (improved)\n",
|
||
"Epoch: 2 Val accuracy: 99.0400% Loss: 0.291740 (improved)\n",
|
||
"Epoch: 3 Val accuracy: 99.1200% Loss: 0.241666 (improved)\n",
|
||
"Epoch: 4 Val accuracy: 99.2800% Loss: 0.211442 (improved)\n",
|
||
"Epoch: 5 Val accuracy: 99.3200% Loss: 0.196026 (improved)\n",
|
||
"Epoch: 6 Val accuracy: 99.3600% Loss: 0.186166 (improved)\n",
|
||
"Epoch: 7 Val accuracy: 99.3400% Loss: 0.179290 (improved)\n",
|
||
"Epoch: 8 Val accuracy: 99.3800% Loss: 0.173593 (improved)\n",
|
||
"Epoch: 9 Val accuracy: 99.3600% Loss: 0.169071 (improved)\n",
|
||
"Epoch: 10 Val accuracy: 99.3400% Loss: 0.165477 (improved)\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.3% 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": 73,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"INFO:tensorflow:Restoring parameters from ./my_capsule_network\n",
|
||
"Final test accuracy: 99.4300% Loss: 0.165047 \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.43% 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": 74,
|
||
"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": 75,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\nKR7uTAEAADggmQIAAHBAMgUAAOAg69ZMLVy40Co/+OCDOja/QitiP6Lg5MmTqe2Yj/8rvEge/5om\ns+x/eni8bShimTRpklU+ceJEzGMvv/xyHd9www21Phfi+/77763yrFmzdOx/TFMifv31V6s8depU\nHY8fP965fQSzc+dOHX/yySeZ6wgyyrzWxlsr16VLl3R0p1a4MwUAAOCAZAoAAMBB1k3zbdiwwSof\nPnw45rHm1ghmnA7xzm1OPwZtA3/o3r27VTZ3tL744outOvMr10GtX78+8LGDBg3ScatWrWp9LvzZ\n8ePHdVxSUmLV7d27N1Ab99xzj443btxo1fl3VkbmHTt2TMdVVVUxjzO3whFJzlQvwmPy5Mk63rVr\nl1VXXFysY/9yjjDgzhQAAIADkikAAAAHJFMAAAAOsm7NlLk+RiT+V9/NtUn+16Waeb7a9DlWG/ku\n3iNdzLVlb731llX35JNPBmp/9erVOvavyzHbb9OmjVXHY4Pc+R/D89hjj+k46Bopv2+++UbHX3zx\nReDXmdti7Nixw6p7+umndVxUVJRQv+DG//mDu99++80qv/322zo+cuSIVTdkyBAdt2zZMul9Wbdu\nXcy6bt266TiMj3rizhQAAIADkikAAAAHWTfNh/ywbds2q/zEE0/EPNacDk10F/KKigod+3fFNtv3\nP9Ee7latWmWVzbGIp2fPnjq+9957rTpz9+R4O9j7mVutzJw506obNWqUjpnmy4y+fftmugs5p6ys\nzCpPmzZNx3Xq2PdbSktLdZyMab5FixZZ5ffffz/mseYUYxhxZwoAAMAByRQAAIADkikAAAAHOb1m\nqnXr1jpu0qRJQm2Y6zn8jzkYN25czNcdOHAgofMhYvPmzVa5uro65rFXXHGFjjt16hSo/aNHj1rl\nhQsXxjy2bt0/Pib+x9UgMYcOHdLx1KlTA7+uc+fOOl62bJmO586dax23cuXKhPrVoEEDHfvXYV1w\nwQUJtQk39evX17H5WUTivv76ax2Xl5fHPO7xxx+3yhdddFFS+7F8+XKrbK5vbNq0qVUX9vVy3JkC\nAABwQDIFAADgICvumZrTa/6vUsbTv39/HV944YUxj/PvYr1//34dm08pD7pzOdzNmDEj8LGzZs3S\ncb169QK9ZsWKFVZ5z549MY81p4gfeOCBwP1CbD/88IOOt27dGvh15rHmlO7BgwcT6sett95qladM\n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\n4OD/AYTjpWAK2yc7AAAAAElFTkSuQmCC\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x7f6231bd8358>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\nuXhpqQAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x7f6231cdab00>"
|
||
]
|
||
},
|
||
"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": 76,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(5, 1, 10, 16, 1)"
|
||
]
|
||
},
|
||
"execution_count": 76,
|
||
"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": 77,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 78,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 79,
|
||
"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": 80,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"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": 81,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Tweaking output dimension #0\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAh0AAADYCAYAAABP2lHJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8VNXd/z9z586WWTLZQzYSSEggQABRQQyKCgYXRIr6\nUrGVumFbrT6PPm1/1ta9tfWxLnXDoriggAIqLuyIkVWWQAgQEgJkIfsySWa7c+d+f3/kuYeZBEiU\nzJ2kve/XKy9IMjf5zM2553zPdzsaIoKKioqKioqKSqjhwi1ARUVFRUVF5T8D1ehQUVFRUVFRUQTV\n6FBRUVFRUVFRBNXoUFFRUVFRUVEE1ehQUVFRUVFRUQTV6FBRUVFRUVFRBNXoUFFRUVFRUVEE1ehQ\nUVFRUVFRUQTV6FBRUVFRUVFRBNXoUFFRUVFRUVEEXuHfF+6e65rzuFbV/tM5H+3A4Navav/pqNrD\ng/q8ho9/e+2qp0NFRUVFRUVFEVSjQ0VFRUVFRUURVKNDRUVFRUVFRREGlNHh8/nQ2dmJ5uZmEBGI\n+haiEgQBBw4cQGtra4gVnh2/3w+v1wun09ln7USE9vZ2rFixAsePH+/z++1vJEmCz+eDIAg/6prq\n6mo888wz+OGHHyBJUggVnhsigt/vh9/v7/M1fr8fRUVFuOeee/D1119DFMUQKjw3P2asA4Aoili7\ndi1mz56NDz/8EF6vN4TqeufHaPf5fFi6dCkKCgqwaNEiuN3uECrrXwRBwKJFi1BQUID3339/0Gl/\n6623cMMNN2DVqlXweDzhlvSj8Pl8ePvtt3Hbbbdh48aNYR/zPwafz4d33nkHCxYswM6dO+Hz+cIt\nqc+IooilS5fi8ccfR2lp6Y+aY8+KPOEp9HFGfD4f1dXV0aJFi2jr1q3kdrvP9tIeuFwueu+99+jO\nO++kxYsXk9PpPNfLQ6K9oaGBVq9eTUePHiVBEPqsvbGxkR566CGaOnUqPfnkk+RwOBTVLooitbS0\n0Pbt26muro5EUexVsyRJJEkSHT58mGbMmEHZ2dl0zz33UFNTU6i0n1W/3+8nh8NBpaWl1N7eTn6/\nv1f9fr+f/H4/rV+/nnJycigxMZGuu+46qqmpCZX+s+ro7Oyk2tpa8ng8JElSr9p9Ph/5fD5atGgR\nDRkyhKKiomjSpElUVlamqHZJksjlcpHD4SCfz9erbiIiQRBIEAR68sknKSoqimw2G+Xl5VFxcbGi\n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\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x7f622afd4320>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Tweaking output dimension #1\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\nHeja+lXtF4+qPTKo4zVy/MdrVz0dKioqKioqKoqgGh0qKiqKEnqJWlejK2unN0J3Vbpqu6uEoxod\nKioqKioqKorwH2F0SJKEmpoaSJIUaSkXjMfjQUlJCURRjLSUC4IQgpqaGhw6dKhLtrskSTh48CAO\nHTrU5XaAfr8fP/30E06cONFldn+yLEOWZdTX12PFihWora2NtKR2EwgEEAgEUFxcjE8++QQejyfS\nktqNw+GAw+HA9u3bsXbt2i41VgkhqKysRGVlJbZu3YrDhw9HWlK7kWUZJSUlKCkpwb59++BwOCIt\nqd1IkoTCwkIUFhaitLT0sveZLm90LF68GDExMRg8eDByc3MjLadd0Al40aJFSEhIwNVXX42TJ09G\nWla7EEURoihi6tSpyMjIwPTp02G32yMtq914PB54PB6MHDkSV155Jf7nf/4HgUAg0rLaRVVVFaqq\nqtC3b19MmzYNr7/+epcxmPbu3Yu9e/eiX79+uO+++7B169YuYTARQrBq1SqsWrUK48aNw4svvojG\nxsZIy2oXkiRhyZIlWLJkCWbPno1vvvmmS7Q5JRAIYPHixVi8eDEefvjhLmWoNjY24v3338f777+P\nd955p62bWTsdFRUVWLFiBVasWIH8/Py2biO+KJTOXrlsuFwuAMDjjz+OQCAAr9cLQRAirKp91NTU\nAADee+89iKIIu90Oo9EYYVXto6CgAACwfv16EELgdru7jHYA+OabbwCcex8cx0Gn00VSUruQZRnP\nPvssAOD06dPQaDTo27dvl5jMRFHEfffdBwCoq6uDwWDAsGHDLvtk1hF4vV48/vjjAID6+nrEx8cj\nPj4+wqraR11dHf70pz8BAOx2OwYNGgSe7zpT/pEjR/CPf/wDQNAAGThwYIQVtQ9CCNavX49//vOf\nAICUlBRERUVFWFX7kCQJn376KT744AMAwP3334/Zs2df1r/RKXugLMvMhcnzPAwGQ9gERQjBiy++\nCABsl6rVanHVVVcpL7YJkiQx7Xq9Hnq9Pky7JEl44IEHAIAdqRiNRqSmpiovtgmCIMDn8wEIamq6\nGAcCAdxzzz0AzgV19enTp9MMqEAgAL/fDwAwmUzNJtjGxka2gFDmzJkDrVarmMaWIITA5/Mxo9ls\nNjfTfubMGXz22Wfse61WizvuuCPiC7csy/B6vczjYjabm7Xnjh07UFhYyL43mUzIyspSVGdL0LFK\n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\nAACAiT+REwpltjb67AAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x7f622a2ca860>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Tweaking output dimension #2\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n/VthGCpJEiVJojy334SqjJWVFXU6HaVpqjyfas1JrQRBoG63q4eHB+V5bra1/P+wtLSkVqulfr8v\n6c/fUH367uzs7Ojx8VHj8VidTser7Jubm7q9vdVgMNDZ2ZlX2Z1zyrJMW1tburq6qjrOzIIg0P7+\nvk5OTnR+fl51nJmtra0pTVOdnp5WHWVmk8lEzWbze93YPNViIamhuS/SmaNFzS75nX8hsxfjSsmb\ndiXZiyMUlpeXy+SvJHtxqJdzrswMU2W/1/F4rM/PT62vr5d52Kzk2n98fGg4HKrRaJQ5kLGS7KPR\nSC8vL9re3v7nkQxTmCq7X4+vAADAW8x0TI/sv8dMR3XIXo1FzS75nb9U9mJHbN9myCR9HzNS4lX6\nVNlru6YDAACf+Lb27SerBd/+XiEAAOAV69crAABgQTHTAQAATFA6AACACUoHAAAwQekAAAAmKB0A\nAMAEpQMAAJigdAAAABOUDgAAYILSAQAATFA6AACACUoHAAAwQekAAAAmKB0AAMAEpQMAAJigdAAA\nABOUDgAAYILSAQAATFA6AACACUoHAAAwQekAAAAmKB0AAMAEpQMAAJigdAAAABNfAHFr6+oB734A\nAAAASUVORK5CYII=\n",
|
||
"text/plain": [
|
||
"<matplotlib.figure.Figure at 0x7f6229e93e10>"
|
||
]
|
||
},
|
||
"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": {
|
||
"collapsed": true
|
||
},
|
||
"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.5.2"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|