Skip to content

Instantly share code, notes, and snippets.

@peterroelants
Created December 20, 2014 13:55
Show Gist options
  • Save peterroelants/2f59ee7f90244bedcae5 to your computer and use it in GitHub Desktop.
Save peterroelants/2f59ee7f90244bedcae5 to your computer and use it in GitHub Desktop.
{
"metadata": {
"name": "",
"signature": "sha256:32eee8b1ca84be1664af41531e486282214748e0d105940b99c250a717c02333"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import os\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import scipy.signal\n",
"from PIL import Image\n",
"import requests\n",
"from StringIO import StringIO\n",
"\n",
"%matplotlib inline"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Compare 2 translated filters\n",
"\n",
"Create 2 filters `filter_left` and `filter_right` that are a translation of each other. `filter_right` will be a translation of `filter_left` 2 pixels to the right.\n",
"\n",
"These 2 filters will detect a vertical gradient. The gradient is a change in greyness from left to right.\n",
"\n",
"These filters will be created by the following code, and will be plotted for illustration."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Define the left vertical vector (positive multiplication)\n",
"vec_pos = np.matrix([1,2,3,2,1])\n",
"# Define the right vertical vector (negative multiplication)\n",
"vec_neg = vec_pos * -1\n",
"\n",
"# Create the first filter \n",
"filter_left = np.zeros((5,5))\n",
"filter_left[:,0] = vec_pos\n",
"filter_left[:,2] = vec_neg\n",
"\n",
"# Create the second filter (This is a translation of the first filter with 2 pixels to the right)\n",
"# filter_right = np.zeros((5,5))\n",
"# filter_right[:,2] = vec_pos\n",
"# filter_right[:,4] = vec_neg\n",
"filter_right = np.roll(filter_left, 2, axis=1)\n",
"\n",
"# Plot the filters\n",
"ax1 = plt.subplot(1, 2, 1)\n",
"ax1.matshow(filter_left, cmap=plt.cm.gray)\n",
"ax1.set_title(\"filter1\")\n",
"ax1.get_xaxis().set_visible(False)\n",
"ax1.get_yaxis().set_visible(False)\n",
"\n",
"ax2 = plt.subplot(1, 2, 2)\n",
"ax2.matshow(filter_right, cmap=plt.cm.gray)\n",
"ax2.set_title(\"filter2\")\n",
"ax2.get_xaxis().set_visible(False)\n",
"ax2.get_yaxis().set_visible(False)\n",
"\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nrkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x107ed8b50>"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These two filters (`filter_left` and `filter_right`) are quite far in Euclidian space. Especially when we compare their distance with the distance of the `filter_left`, that detects vertical gradients, and its transpose `filter_left.T`, that detects horizontal gradients.\n",
"\n",
"So 2 filters that detect totally different gradients (vertical and horizontal) are closer together than 2 filters that detect the same gradient, but are a small translation of each other."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Print distance between the left and right filter\n",
"dist = np.linalg.norm(filter_left - filter_right)\n",
"print 'distance between filter_left and filter_right: ', dist\n",
"\n",
"# Print the distance between the left filter, and the transpose of the left filter\n",
"dist2 = np.linalg.norm(filter_left - filter_left.T)\n",
"print 'distance between transpose: ', dist2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"distance between filter_left and filter_right: 10.677078252\n",
"distance between transpose: 8.24621125124\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Compare the activations of the 2 translated filters\n",
"\n",
"To illustrate their effect on an image, and to illustrate that also the activations of these filters can be quite diffent, we test them out on an example 9-image from the MNIST dataset."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Load and show an example image from MNIST\n",
"mnist_url = \"http://deeplearning.net/tutorial/_images/mnist_4.png\"\n",
"response = requests.get(mnist_url)\n",
"mnist9 = Image.open(StringIO(response.content))\n",
"plt.matshow(mnist9, cmap=plt.cm.gray)\n",
"plt.axis('off')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAPwAAAD7CAYAAABOrvnfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABn1JREFUeJzt3c+Ljvsfx/Hr5pSaSGmm2CgmG2YnVjQbzdaPBRaEpSyV\nBdkgf4CFlVFSookiFrLxazW2ykh2GgtKUpMU93f13fieeX++3GeM4/V4LL245uo4z67Fx3XfvX6/\n3wEZliz2DQC/juAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAhiOAh\niOAhiOAhiOAhyF8LdeFer+fTMWER9fv93ve/5gkPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQP\nQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQP\nQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQPQQQP\nQQQPQQQPQQQPQQQPQQQPQQQPQf5a7BtgYWzdurXcDx48WO7j4+PNn7Fp06YfuqfvHT9+vNxnZ2fL\nffv27eV+9erVcp+eni73P5EnPAQRPAQRPAQRPAQRPAQRPAQRPATp9fv9hblwr7cwF6bruq7bu3dv\nuV+4cKHch4eHy73X6zXv4eHDh+U+MjJS7hs3bmz+jErrHqempsp9//79A/38312/3/+f/0Ce8BBE\n8BBE8BBE8BBE8BBE8BBE8BDE+/CLZOnSpeW+ZcuWcr906VK5Dw0Nlfvjx4/L/cyZM+XedV339OnT\ncl+2bFm5t87JJyYmmvdQefbs2UB//k/kCQ9BBA9BBA9BBA9BBA9BBA9BBA9BnMMvkgMHDpT75OTk\nQNd/8OBBubfep//06dNAP7/rum7fvn3lPug5+5s3b8r9ypUrA13/T+QJD0EED0EED0EED0EED0EE\nD0EED0F8Lv0COXv2bLmfPHmy3Ft/LxcvXiz3U6dOlfs/cc7e8uLFi3LfsGHDQNffs2dPud+5c2eg\n6//b+Vx6CCd4CCJ4CCJ4CCJ4CCJ4CCJ4COJ9+J90+vTpcm+ds3/58qXc79+/X+4nTpwo98+fP5d7\nS+sz5buu/T772rVry731/e7nzp0r9/Rz9p/hCQ9BBA9BBA9BBA9BBA9BBA9BBA9BvA8/j5UrV5b7\ny5cvy314eLjc7969W+67du0q90GNjo6W+7Vr15rX2Lx580D3cPPmzXI/cuRIuc/NzQ308/903oeH\ncIKHIIKHIIKHIIKHIIKHIIKHIM7h5zEyMlLub9++Hej669atK/fW++ytM+qdO3eW+9jYWLkvX768\n3Luu/dn5rX337t3l3vq3CtScw0M4wUMQwUMQwUMQwUMQwUMQwUMQ5/DzaL0PPzMzU+6tc/zWZ7Iv\n1N/Lf83OzpZ76/66ruvWrFlT7u/evRvozzMY5/AQTvAQRPAQRPAQRPAQRPAQRPAQxPfDz+Pjx4/l\n3nrf/N69e+W+atWqcn/9+nW53759u9wvX75c7h8+fCj3GzdulHvXtc/Rr1+/3rwGv5YnPAQRPAQR\nPAQRPAQRPAQRPAQRPARxDv+Tpqeny731Pvxi27ZtW7mPj483r/Ht27dyb/1bAn49T3gIIngIIngI\nIngIIngIIngIIngI4hw+1NDQULm3zti7rv3Z+d6H//14wkMQwUMQwUMQwUMQwUMQwUMQwUMQ3w/P\n3/r69Wvz97T+31m9enW5v3///ofuiR/j++EhnOAhiOAhiOAhiOAhiOAhiOAhiPfhQ01MTCz2LbAI\nPOEhiOAhiOAhiOAhiOAhiOAhiOAhiHP4UKOjo4t9CywCT3gIIngIIngIIngIIngIIngIIngI4hw+\n1JMnT8p9yZL2s+D/+Q55fi+e8BBE8BBE8BBE8BBE8BBE8BBE8BDEOXyo58+fl/urV6+a11i/fn25\nt9659/3wv54nPAQRPAQRPAQRPAQRPAQRPAQRPATp9fv9hblwr7cwF+aXOHToUPP3TE5OlvujR4/K\n/dixY+U+MzPTvAfm1+/3e9//mic8BBE8BBE8BBE8BBE8BBE8BBE8BHEOz99asWJF8/dMTU2V+44d\nO8r91q1b5X748OFyn5ubK/d0zuEhnOAhiOAhiOAhiOAhiOAhiOAhiHN4flrrrP78+fPlfvTo0XIf\nGxsrd+/L15zDQzjBQxDBQxDBQxDBQxDBQxDBQxDn8PCHcg4P4QQPQQQPQQQPQQQPQQQPQQQPQRbs\nHB74/XjCQxDBQxDBQxDBQxDBQxDBQ5D/ANnDKegI8yFtAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x1082b2c10>"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets convolve both `filter_left` and `filter_right` over the MNIST image to get their activations.\n",
"\n",
"If we plot out these activations we notice that they are a small translation of each other, this effect is because the filters are translations of each other.\n",
"\n",
"We notice that the distance between the activation is quite large. Especially compared to the distance between the activations of `filter_left` and the translated activations of `filter_right`, which are 0. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Convolve both filters over the mnist image\n",
"mnist9_filter_left = scipy.signal.convolve2d(mnist9, filter_left)\n",
"mnist9_filter_right = scipy.signal.convolve2d(mnist9, filter_right)\n",
"\n",
"# Plot the resulting convolutions\n",
"ax1 = plt.subplot(1, 2, 1)\n",
"ax1.matshow(mnist9_filter_left, cmap=plt.cm.gray)\n",
"ax1.set_title(\"mnist9 filter1\")\n",
"ax1.get_xaxis().set_visible(False)\n",
"ax1.get_yaxis().set_visible(False)\n",
"\n",
"ax2 = plt.subplot(1, 2, 2)\n",
"ax2.matshow(mnist9_filter_right, cmap=plt.cm.gray)\n",
"ax2.set_title(\"mnist9 filter2\")\n",
"ax2.get_xaxis().set_visible(False)\n",
"ax2.get_yaxis().set_visible(False)\n",
"\n",
"plt.show()\n",
"\n",
"# compute the difference matrix and distance\n",
"diff = mnist9_filter_left - mnist9_filter_right\n",
"dist = np.linalg.norm(diff)\n",
"print 'distance between convolutions: ', dist\n",
"# compute the distance, but with the filter_right convolved image shifted 2 pixels to the left.\n",
"diff2 = mnist9_filter_left - np.roll(mnist9_filter_right, -2, axis=1)\n",
"dist2 = np.linalg.norm(diff2)\n",
"print 'distance between shifted convolutions: ', dist2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10487c2d0>"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"distance between convolutions: 25317.8653524\n",
"distance between shifted convolutions: 0.0\n"
]
}
],
"prompt_number": 5
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment