Skip to content

Instantly share code, notes, and snippets.

@akiross
Created March 22, 2017 12:04
Show Gist options
  • Save akiross/4996667616d04cc37be34754a395f6b1 to your computer and use it in GitHub Desktop.
Save akiross/4996667616d04cc37be34754a395f6b1 to your computer and use it in GitHub Desktop.
Super-simple autoencoder with tensorflow and MNIST data
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Super simple autoencoder\n",
"\n",
"In this notebook I build a simple autoencoder to reconstruct MNIST digits.\n",
"\n",
"I say it's simple because there is only one layer in encoding, one layer in decoding, no convolutions, no denoising, no data augmentation, etc.\n",
"\n",
"Let's start by importing matplotlib (for displaying images), tensorflow (for the model) and a couple of functions for picking random image. After that, we will use tensorflow utility functions to automatically retrieve the MNIST dataset of handwritten Hindu-Arabic numerals."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import tensorflow as tf\n",
"from random import randrange, choice\n",
"from matplotlib import pyplot as plt\n",
"plt.rcParams['figure.figsize'] = (15, 7)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Extracting MNIST_data/train-images-idx3-ubyte.gz\n",
"Extracting MNIST_data/train-labels-idx1-ubyte.gz\n",
"Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n",
"Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n"
]
}
],
"source": [
"# Download mnist data as sample\n",
"from tensorflow.examples.tutorials.mnist import input_data\n",
"mnist = input_data.read_data_sets(\"MNIST_data/\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"28 * 28 = 784 (784,)\n"
]
},
{
"data": {
"text/plain": [
"(-0.5, 27.5, 27.5, -0.5)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAaIAAAGfCAYAAAAd79YcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACilJREFUeJzt3F+o33Udx/Hv+ZND8shO0GEN19qala3szP6xMcGg3QSr\nZR0Ir6SsILPyL0WEoy6U6sK5WRn0RxQRFrtSiWZKUWezZkQt2uRszj+dCU5Hm0Nb55xft3YRnM+7\n43mds/N4XJ8X79/d83xvPn29Xq8DgJT+9A8AYGkTIgCihAiAKCECIEqIAIgSIgCihAiAKCECIEqI\nAIganM9jW/rHPOMAsETsndndN5u/80UEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQ\nARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIE\nQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREA\nUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABE\nCREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABEDaZ/ACQMDA+XdmdH\n1zRvjl3TK92q+si6J5s3j028o3RraN/5pd3IrvHSjnOTLyIAooQIgCghAiBKiACIEiIAooQIgCgh\nAiBKiACIEiIAooQIgCghAiBKiACIEiIAory+zYJx5lMfLu1WfO1I82bzmyZKt65b/uvmzVcnN5Zu\n/WHXZaXdXx9+b/Nm2ZWnS7f23LyztNs2eEvzZsUdXuw+V/kiAiBKiACIEiIAooQIgCghAiBKiACI\nEiIAooQIgCghAiBKiACIEiIAooQIgKi+Xq83b8e29I/N3zFijt+4qbT74w07Srt7Tq1u3vxw57bS\nrbfcd7B5M/PKq6VbvX+fLe3m04ufqz3o+vtv39m8ufLysdKtqaPHSjv+f3tndvfN5u98EQEQJUQA\nRAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQNZj+AZx7tly1v7Rbf/9X\nSruLt/+leTNyZrx0a7q0OneN7H+ptBvsBpo3vf5ZPeTMIuSLCIAoIQIgSogAiBIiAKKECIAoIQIg\nSogAiBIiAKKECIAoIQIgSogAiBIiAKI8esqcO7RtZWnX/6XavYlbL23erL1lX+0Y/+3EydLs3tMr\n2k9tbt90XdcNTzxV2jF/fBEBECVEAEQJEQBRQgRAlBABECVEAEQJEQBRQgRAlBABECVEAEQJEQBR\nQgRAlBABEOX1bebc1LPPlXYX3137v+iFu5Y1b6YeeWvp1rJrz2veTB+eKN2aTwPr1pR2z3+09iL2\nA5NvaN5c+PS/SrdY+HwRARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABECREAUUIE\nQJQQARDl9W0WjKljz5R2w1sHmjdHvvvB0q3pG6abN+vu21C6NfjE4dLu+DWjzZufXH9H6dZ3ntla\n2r1645ubNwMH/lS6xcLniwiAKCECIEqIAIgSIgCihAiAKCECIEqIAIgSIgCihAiAKCECIEqIAIgS\nIgCiPHrK4jfT/hDp22/aXzp19PaNzZvRHQdKtx488p7S7uCmXc2b2168tHTr7LazpV3v5MHSjnOT\nLyIAooQIgCghAiBKiACIEiIAooQIgCghAiBKiACIEiIAooQIgCghAiBKiACIEiIAory+DQ3WfqP9\n1e7x0TWlWwc33VPa/fzUyubN+OaR0q3pUydLO3gtX0QARAkRAFFCBECUEAEQJUQARAkRAFFCBECU\nEAEQJUQARAkRAFFCBECUEAEQ5dFTaDC4ZnXz5rOrx1+HX/K//fTpTc2bC04dfR1+CcyOLyIAooQI\ngCghAiBKiACIEiIAooQIgCghAiBKiACIEiIAooQIgCghAiBKiACIEiIAory+DQ1W3H+ieXP1hZOl\nWz/6Z/tL313XdZ9Z9UTz5sFuuHQL5oIvIgCihAiAKCECIEqIAIgSIgCihAiAKCECIEqIAIgSIgCi\nhAiAKCECIEqIAIgSIgCivL7NknTy6o2l3cOr7mrerPvlF0q33vnFP5d22598vHlz5+1fLt1a+/V9\npR28li8iAKKECIAoIQIgSogAiBIiAKKECIAoIQIgSogAiBIiAKKECIAoIQIgSogAiPLoKYte34b1\nzZup82u3Zrpe8+aihwZKt3pTU6XdVb9tf2R1+btfKt2CueCLCIAoIQIgSogAiBIiAKKECIAoIQIg\nSogAiBIiAKKECIAoIQIgSogAiBIiAKKECIAor2+zYPQPDZV2z2+fbt68fKh0qvvQbdc1b0b2jNeO\nwRLhiwiAKCECIEqIAIgSIgCihAiAKCECIEqIAIgSIgCihAiAKCECIEqIAIgSIgCihAiAKK9vs2Cc\n/Pj60u7AB37QvLnkb9eWbo3s8pI2zDVfRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAlRABE\nCREAUUIEQJQQARDl0VMWjBMbaruBvvb/py54tnZrPk1fcVlp99AVO5s3n7/p+tItmAu+iACIEiIA\nooQIgCghAiBKiACIEiIAooQIgCghAiBKiACIEiIAooQIgCghAiBKiACI8vo2C8bq0cnS7rmpl5s3\nKx59oXRrurSqeeoT55V2j5y5pHnzxl88XroFc8EXEQBRQgRAlBABECVEAEQJEQBRQgRAlBABECVE\nAEQJEQBRQgRAlBABECVEAER59JRF7/RM+/9T04cnSrf6h4aaN4e+1/4Iadd13W8+9v3SbuybNzdv\nlnf7SrdgLvgiAiBKiACIEiIAooQIgCghAiBKiACIEiIAooQIgCghAiBKiACIEiIAooQIgCghAiDK\n69ssGJO/u6i0W/muvubNP/asL93a8/4fN2/2v/L30q1Pf6v9Fe2u67rhe72kzeLiiwiAKCECIEqI\nAIgSIgCihAiAKCECIEqIAIgSIgCihAiAKCECIEqIAIgSIgCihAiAKK9vs2Cs+tWZ0u7WrZc3b3a8\n74HSrU/e3f4i9tt+drR0a/i4V7RZGnwRARAlRABECREAUUIEQJQQARAlRABECREAUUIEQJQQARAl\nRABECREAUUIEQFRfr9ebt2Nb+sfm7xgAUXtndvfN5u98EQEQJUQARAkRAFFCBECUEAEQJUQARAkR\nAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQA\nRAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQ\nJUQARAkRAFFCBEBUX6/XS/8GAJYwX0QARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkR\nAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBECUEAEQJUQARAkRAFFCBEDUfwCWm/T/\nit2x5wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f5c50aca4e0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Size of a mnist image is 28x28\n",
"print('28 * 28 =', 28*28, mnist.train.images[0].shape)\n",
"# Display a sample image\n",
"plt.imshow(choice(mnist.train.images).reshape((28, 28)))\n",
"plt.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# How large is the encoding? Try changing this!\n",
"encoding_size = 100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now prepare the computation graph and train the model. I reset the graph and create a new session so that re-running subsequent parts of this notebook shall be easy, without re-defining variables or clashing scopes.\n",
"\n",
"Try changinging some parameters like the activation function (relu, sigmoid, tanh, ...) and optimizer parameters."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Create a new graph and set it as default\n",
"tf.reset_default_graph()\n",
"# Create placeholder for input data\n",
"x = tf.placeholder(tf.float32, shape=[None, 784], name='x')\n",
"# Create session\n",
"sess = tf.Session()\n",
"# Define weight and bias for encoding phase\n",
"with tf.variable_scope('encoding'):\n",
" w_e = tf.get_variable(name='W', shape=[784, encoding_size], initializer=tf.contrib.layers.xavier_initializer())\n",
" b_e = tf.get_variable(name='b', shape=[encoding_size], initializer=tf.constant_initializer(0.01))\n",
"# Define weight and bias for decoding phase\n",
"with tf.variable_scope('decoding'):\n",
" w_d = tf.get_variable(name='W', shape=[encoding_size, 784], initializer=tf.contrib.layers.xavier_initializer())\n",
" b_d = tf.get_variable(name='b', shape=[784], initializer=tf.constant_initializer(0.01))\n",
"# Sigmoid for the encoding\n",
"z = tf.nn.sigmoid(tf.matmul(x, w_e) + b_e)\n",
"# Output uses just linear unit (try rectifying it) \n",
"y = tf.matmul(z, w_d) + b_d\n",
"# Loss is difference between in and out\n",
"loss = tf.reduce_mean(tf.squared_difference(y, x))\n",
"# Optimization using adaptive moment estimation\n",
"opt = tf.train.AdamOptimizer(0.001).minimize(loss)\n",
"\n",
"# Train the network\n",
"with sess.as_default():\n",
" tf.global_variables_initializer().run()\n",
"\n",
" for _ in range(5000):\n",
" btx, _ = mnist.train.next_batch(100)\n",
" sess.run(opt, feed_dict={x: btx})"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nDZkY7zHXwXPH7XGq5r7RWOWvox+XT2s4SlZzc0xB+IJ7dnOhTydB2bm28Bor+YwztUTH8tC5ei3/\n4fO+KrXzTf/VAAAgAElEQVTz2818ExF35BomUjmkYydMQJR7P5XhCallZ2qwV0TEyNalUtv9at3u\nfefdKbVmrse+9d5z7HHOvEPHfRzR95iv0GvOPa+4cDgbFhgFc625jspIYIYGAAAAAPxTLNQAAAAA\nIDEs1AAAAAAgMSzUAAAAACAxLNQAAAAAIDELKvWx9LYmbcUmjzU1OaytIPWo+ZwmxVRWrbDbyrHN\nOU6fu1Fq9YtNQk1E/IuB+6T2tyPbpLbn7nVSO+OB5/R8itKVzHlm4ya9r0eT+uzLmWS24o1Nglzl\n5Cfo+bFYLqHsR5u6BCjzXqt6KTZ6NW0pq+vr1UYKkjTNsUfP1jHb9RJNTvy5vmek9tv7Xiq1wbv8\nFNK+V5NOp1f1S+3oNt1/xQs1he3NfQ/a41x//DSp3XT7hVJb/wNNbmw7pilV9vsqmo/cf3MVbTuP\n3HWTNcz7Krq+3HswSZDh9jepfDO4WiJqJnW37Pm4ed+kbE1s1ISviIj9L9Yz/eDGb0vtkakxqd11\n71apnf3dQ/Y4Ma7jrrlSU9Bcsl02qQljtTHzCbs05JS579jd7wtSVZsd5nteqhfoxBr9XF67VlOV\nz+54VmqfOfhSe+zb7zxXasse0vPs36n30qklOo739es18PTIoD12f82MpVyPPTatr9k2rvfnxiE/\nZquTeu61nk12W5GZidI8exUmICYwpxYpO9cWPguZuktUzE1YYDag9/2z2w9I7fZxTUGOiOjdZZ5D\nRkfNgUyq7K6Duq+5Xpvr/TPyyBp9Q32r9Rn7tb0/kNpXjuv9vf+xgjTFe3+o52TuHZXQe0LlmPks\nDLu2mGP8ogYAAAAAiWGhBgAAAACJYaEGAAAAAIlhoQYAAAAAiTn5YSIzCZFwzcVlt5vSJuyY1GbM\nekEzbVS0WbGxZonUakMmoKB7jZSevVwDOd57zjfsocea2gj8J49eKbW1t+l7zPZqc2msKQhBcU2R\nddOUbhqBXQOsDScp6HG3TbnNGcUQzJ8Z/PdGVi8ZqJLpdjUTdlE5PKT7usbsiJg+Y7XUdr1BP9OP\nb9Vx91fHtQH5m19/odRO++5Re+xmv47v/Zd2S23Zy/ZJ7b+d9QWpTeX+Q//Ifa+X2oabdRx3P6nh\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f5c4ea7af60>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Pick random position\n",
"n = 5\n",
"p = randrange(len(mnist.train.images) - n)\n",
"# Apply autoencoder on sample images\n",
"with sess.as_default():\n",
" xdata = mnist.train.images[p:p+n]\n",
" t1 = y.eval(feed_dict={x: xdata})\n",
" \n",
" for i in range(n):\n",
" plt.subplot(2, n, i+1)\n",
" plt.imshow(xdata[i].reshape((28, 28)))\n",
" plt.axis('off')\n",
" plt.subplot(2, n, i+1+n)\n",
" plt.imshow(t1[i].reshape((28, 28)))\n",
" plt.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "TensorFlow",
"language": "python",
"name": "tensorflow"
},
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment