{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Deep Learning Models -- A collection of various deep learning architectures, models, and tips for TensorFlow and PyTorch in Jupyter Notebooks.\n", "- Author: Sebastian Raschka\n", "- GitHub Repository: https://github.com/rasbt/deeplearning-models" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sebastian Raschka \n", "\n", "CPython 3.6.1\n", "IPython 6.0.0\n", "\n", "tensorflow 1.2.0\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -a 'Sebastian Raschka' -v -p tensorflow" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Model Zoo -- Autoencoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A simple, single-layer autoencoder that compresses 768-pixel MNIST images into 32-pixel vectors (32-times smaller representations)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting ./train-images-idx3-ubyte.gz\n", "Extracting ./train-labels-idx1-ubyte.gz\n", "Extracting ./t10k-images-idx3-ubyte.gz\n", "Extracting ./t10k-labels-idx1-ubyte.gz\n" ] } ], "source": [ "import tensorflow as tf\n", "from tensorflow.examples.tutorials.mnist import input_data\n", "\n", "##########################\n", "### WRAPPER FUNCTIONS\n", "##########################\n", "\n", "def fully_connected(input_tensor, output_nodes,\n", " activation=None, seed=None,\n", " name='fully_connected'):\n", "\n", " with tf.name_scope(name):\n", " input_nodes = input_tensor.get_shape().as_list()[1]\n", " weights = tf.Variable(tf.truncated_normal(shape=(input_nodes,\n", " output_nodes),\n", " mean=0.0,\n", " stddev=0.1,\n", " dtype=tf.float32,\n", " seed=seed),\n", " name='weights')\n", " biases = tf.Variable(tf.zeros(shape=[output_nodes]), name='biases')\n", "\n", " act = tf.matmul(input_tensor, weights) + biases\n", " if activation is not None:\n", " act = activation(act)\n", " return act\n", "\n", "\n", "##########################\n", "### DATASET\n", "##########################\n", "\n", "mnist = input_data.read_data_sets(\"./\", validation_size=0)\n", "\n", "\n", "##########################\n", "### SETTINGS\n", "##########################\n", "\n", "\n", "# Hyperparameters\n", "learning_rate = 0.01\n", "training_epochs = 5\n", "batch_size = 128\n", "\n", "# Architecture\n", "hidden_size = 32\n", "input_size = 784\n", "image_width = 28\n", "\n", "# Other\n", "print_interval = 200\n", "random_seed = 123\n", "\n", "\n", "##########################\n", "### GRAPH DEFINITION\n", "##########################\n", "\n", "g = tf.Graph()\n", "with g.as_default():\n", " \n", " tf.set_random_seed(random_seed)\n", "\n", " # Input data\n", " input_layer = tf.placeholder(tf.float32, [None, input_size],\n", " name='input')\n", "\n", " ###########\n", " # Encoder\n", " ###########\n", " \n", " hidden_layer = fully_connected(input_layer, hidden_size, \n", " activation=tf.nn.relu, \n", " name='encoding')\n", " \n", " ###########\n", " # Decoder\n", " ###########\n", " \n", " logits = fully_connected(hidden_layer, input_size, \n", " activation=None, name='logits')\n", " # note MNIST pixels are normalized to 0-1 range\n", " out_layer = tf.nn.sigmoid(logits, name='decoding') \n", " \n", " ##################\n", " # Loss & Optimizer\n", " ##################\n", " \n", " cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(\n", " labels=input_layer, logits=logits), name='cost')\n", " \n", " optimizer = tf.train.AdamOptimizer(learning_rate)\n", " train = optimizer.minimize(cost, name='train')\n", "\n", " # Saver to save session for reuse\n", " saver = tf.train.Saver()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Minibatch: 001 | Cost: 0.702\n", "Minibatch: 201 | Cost: 0.124\n", "Minibatch: 401 | Cost: 0.111\n", "Epoch: 001 | AvgCost: 0.144\n", "Minibatch: 001 | Cost: 0.110\n", "Minibatch: 201 | Cost: 0.107\n", "Minibatch: 401 | Cost: 0.113\n", "Epoch: 002 | AvgCost: 0.108\n", "Minibatch: 001 | Cost: 0.108\n", "Minibatch: 201 | Cost: 0.108\n", "Minibatch: 401 | Cost: 0.112\n", "Epoch: 003 | AvgCost: 0.107\n", "Minibatch: 001 | Cost: 0.105\n", "Minibatch: 201 | Cost: 0.102\n", "Minibatch: 401 | Cost: 0.110\n", "Epoch: 004 | AvgCost: 0.107\n", "Minibatch: 001 | Cost: 0.101\n", "Minibatch: 201 | Cost: 0.106\n", "Minibatch: 401 | Cost: 0.106\n", "Epoch: 005 | AvgCost: 0.107\n" ] } ], "source": [ "import numpy as np\n", "\n", "##########################\n", "### TRAINING & EVALUATION\n", "##########################\n", " \n", "with tf.Session(graph=g) as sess:\n", " sess.run(tf.global_variables_initializer())\n", "\n", " np.random.seed(random_seed) # random seed for mnist iterator\n", " for epoch in range(training_epochs):\n", " avg_cost = 0.\n", " total_batch = mnist.train.num_examples // batch_size\n", "\n", "\n", " for i in range(total_batch):\n", " batch_x, batch_y = mnist.train.next_batch(batch_size)\n", " _, c = sess.run(['train', 'cost:0'], \n", " feed_dict={'input:0': batch_x})\n", " avg_cost += c\n", " \n", " if not i % print_interval:\n", " print(\"Minibatch: %03d | Cost: %.3f\" % (i + 1, c))\n", " \n", " print(\"Epoch: %03d | AvgCost: %.3f\" % (epoch + 1, avg_cost / (i + 1)))\n", " \n", " saver.save(sess, save_path='./autoencoder.ckpt')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from ./autoencoder.ckpt\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABIEAAACqCAYAAAA6El8nAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXWgHNXZxn9T2lKhFCtBA6VokCLBrbgUCA4BghO0xYpL\n0QIFalAkuBW34JTgToJr0CBFSrFS6Edp9/sjeeacnbt37+y9K7O7z++fu3d2dnfm3XPOnJ33Oc+b\nlEoljDHGGGOMMcYYY0xn841WH4AxxhhjjDHGGGOMaTy+CWSMMcYYY4wxxhjTBfgmkDHGGGOMMcYY\nY0wX4JtAxhhjjDHGGGOMMV2AbwIZY4wxxhhjjDHGdAG+CWSMMcYYY4wxxhjTBfgmkDHGGGOMMcYY\nY0wXMKCbQEmSrJkkyUtJkrySJMmB9TooY4wxxhhjjDHGGFNfklKp1L8XJslkwHhgNeBt4DFgeKlU\ner5+h2eMMcYYY4wxxhhj6sE3B/DaJYBXSqXSawBJklwGDAN6vQk03XTTlWafffYBfGT7Mm7cuA9L\npdKP8u7vWDlWeag1VtC98XKsasP9MD+OVX7cD/PjWNWG+2F+HKv8uB/mx7HKj2NVGx6z8pM3VgO5\nCTQz8Fb0/9vAktmdkiQZCYwEGDx4MGPHjh3AR7YvSZJMyLGPY4VjVQt5YjVpv66Pl2NVG+6H+XGs\n8uN+mB/HqjbcD/PjWOXH/TA/jlV+HKva8JiVn7xtq+HG0KVSaVSpVBpaKpWG/uhHNd3w7Docq/w4\nVrXheOXHscqPY5Ufx6o2HK/8OFb5cazy41jVhuOVH8cqP45Vfhyr2hjITaB3gFmj/2eZtM0YY4wx\nxhhjjDHGFIyB3AR6DJgrSZIfJ0nybWBzYHR9DssYY4wxxhhjjDHG1JN+ewKVSqWvkyTZA7gNmAw4\nt1QqPVe3IzPGGGOMMcYYY4wxdWMgxtCUSqWbgZvrdCzGGGOMMcYYY4wxpkEM6CaQaU9OOukkAL78\n8st029NPPw3AVVddVbbvrrvuCsDSSy+dbhsxYkSjD9EYY4wxxhgzif/7v/8DYJlllkm3PfHEEwCs\nt956AFx33XXNPzBjTNvR8OpgxhhjjDHGGGOMMab1WAnURWy22WYAXHnllb3ukyRJ2f9nnHEGAHfc\ncUe6bcUVVwRg8ODB9T7EjmD8+PHp43nmmQeAP/3pTwD84he/aMkxtYp//etfAOy3335AaE9Dhw4F\nytvibLPN1uSjM8YY0ww+/vhjAN58882Kz8fj/+9//3sAFlhgAQDmnntuAH7605828hBNi7nvvvvS\nx1K6vPTSSwDceOONANx0000A/PznP+/xeinWl19++YYeZyuQAmjvvfcG4Mknn0yf07x9scUWa/6B\nGWPKOOKIIwA48sgjAfjZz34GwF133dWiI+odK4GMMcYYY4wxxhhjugArgbqAPAqgeeedF4A111wT\ngNdeew2A0aNHA/DKK6+k+1588cUAHHzwwfU/2A5A67MBvvGNifdZZ5555lYdTkv529/+BsBZZ50F\nwGSTTQbA2LFjAbjhhhvSfffYY48mH13rePzxxwHYcMMN021vvPFGv9/v9ttvB2C++eYDYNZZZ+3/\nwXUIcduSV8Ipp5wCBK8ztcdO4IMPPgBg0003Bco9I0aOHAnA7LPPPuDP+fTTT9PH9957LxCuG9/6\n1rcG/P6m/ZFqI+6Dd999NwAvv/xyxddINQthLJT6Qfzvf/+r41GaVvPZZ58BsOWWWwIwZsyY9Lnv\nfve7APznP/8B4J///GfZazX2xOg13//+9wE4/fTTAdh4443redgtQWryM888E4BVVlklfe6oo44C\nYKmllmr+gZmORepN/aa59dZbATjxxBOB8pUjm2yyCRAUnfvuuy8AgwYNas7BFoh77rmn7H9d+/QX\ngjqo1VgJZIwxxhhjjDHGGNMFWAnUoUhpAXDttdeWPad19lL5AEw33XQATDHFFAB89dVXACy55JIA\nPPXUU+m+//jHPxpwxJ1DvFZb8YwVH53O3//+9/TxNtts08IjKS633XYb0DPT3V/Ul88991wALrvs\nsrq8bzui8Ulqnxh5cu2www5AyBy3M8rWzT///EBQ6sQZuHoqgBZddNF024cffgiE681cc8014M9p\nBVIkABx44IEAPPfcc0Dww7PKqSevvvoqAH/+858BGDVqFBAqj5ZKpdzvJe8X0z0ccMABQFCOxagN\nSd06/fTTAzDllFP22FcKMfkF6bUa5+UpBbDQQgvV5dibzbvvvlv2/6qrrpo+tgLIDBQp7k4++eR0\n26mnngr0bHtSAMVKoGxlac0NNCftJmLFT2/brQQyxhhjjDHGGGOMMU2j8Eog3V2UpwjATDPNBMB3\nvvMdIKwnnmGGGdJ95pxzzmYdYiGJ79wqGycFkFQIM844Y6+vP+mkkwB44YUXejy3zjrr1O04O4ln\n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\nyRtJniS5lORskgdJDtbavznjfpIPluu3kvye5CDJjSSHy/phkutaabVtrfTSSiuttqmVXlpppdU2\ntdJLK6202pZWaz4J9GGSx2OMP8YY/yb5KsknK+5/rDHG0zHGT8v1yyQPk5zPZs7by89uJ/n0hEfR\nqk+rOXr1adWnVZ9Wc/Tq06pPqz6t5ujVp1WfVn1aNax5CHQ+yZ9Hvv+1rJ1KVfVukveT3E1ybozx\ndLn1LMm5E95eqz6t5ujVp1WfVn1azdGrT6s+rfq0mqNXn1Z9WvVp1eDF0P+jqt5M8nWSL8YYL47e\nG5vns8YrGewU0qpPqzl69WnVp1WfVnP06tOqT6s+rebo1adVn1Z9r7LVmodAfye5eOT7hWXtVKmq\nM9n8M74cY3yzLP9TVfvL/f0kz094DK36tJqjV59WfVr1aTVHrz6t+rTq02qOXn1a9WnVp1XDmodA\n95Jcrqr3qupsks+S3Flx/2NVVSW5leThGOPmkVt3klxdrq8m+faER9GqT6s5evVp1adVn1Zz9OrT\nqk+rPq3m6NWnVZ9WfVp1jHXfhH0lm7dfP0lybc29m/N9lM1jVz8nub98riR5J8kPSR4l+T7JnlZa\nbWMrvbTSSqttaqWXVlpptU2t9NJKK622oVUtgwAAAADwGvNiaAAAAIAd4BAIAAAAYAc4BAIAAADY\nAQ6BAAAAAHaAQyAAAACAHeAQCAAAAGAHOAQCAAAA2AH/ATg0HKNqIGffAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "##########################\n", "### VISUALIZATION\n", "##########################\n", "\n", "n_images = 15\n", "\n", "fig, axes = plt.subplots(nrows=2, ncols=n_images, \n", " sharex=True, sharey=True, figsize=(20, 2.5))\n", "test_images = mnist.test.images[:n_images]\n", "\n", "with tf.Session(graph=g) as sess:\n", " saver.restore(sess, save_path='./autoencoder.ckpt')\n", " decoded = sess.run('decoding:0', feed_dict={'input:0': test_images})\n", "\n", "for i in range(n_images):\n", " for ax, img in zip(axes, [test_images, decoded]):\n", " ax[i].imshow(img[i].reshape((image_width, image_width)), cmap='binary')\n" ] } ], "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.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }