{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 12: Training Artificial Neural Networks for Image Recognition\n", "\n", "In this notebook I work through chapter 12 of Python Machine Learning—see [the author's definitive notes](http://nbviewer.jupyter.org/github/rasbt/python-machine-learning-book/blob/master/code/ch12/ch12.ipynb).\n", "\n", "## Loading in the MNIST hand written image data set" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import os\n", "import struct\n", "import numpy as np\n", "\n", "def load_mnist(path, kind='train'):\n", " \"\"\"Load MNIST data from `path`\"\"\"\n", " labels_path = os.path.join(path, \n", " '%s-labels-idx1-ubyte' % kind)\n", " images_path = os.path.join(path, \n", " '%s-images-idx3-ubyte' % kind)\n", " \n", " with open(labels_path, 'rb') as lbpath:\n", " magic, n = struct.unpack('>II', \n", " lbpath.read(8))\n", " labels = np.fromfile(lbpath, \n", " dtype=np.uint8)\n", "\n", " with open(images_path, 'rb') as imgpath:\n", " magic, num, rows, cols = struct.unpack(\">IIII\", \n", " imgpath.read(16))\n", " images = np.fromfile(imgpath, \n", " dtype=np.uint8).reshape(len(labels), 784)\n", " \n", " return images, labels" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 60000, columns: 784\n" ] } ], "source": [ "X_train, y_train = load_mnist('mnist', kind='train')\n", "print('Rows: %d, columns: %d' % (X_train.shape[0], X_train.shape[1]))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 10000, columns: 784\n" ] } ], "source": [ "X_test, y_test = load_mnist('mnist', kind='t10k')\n", "print('Rows: %d, columns: %d' % (X_test.shape[0], X_test.shape[1]))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nVV988UXIhg0bljx21qxZIXvhhRdCtuKKK1a/MeigvIkCAADIoEQBAABkUKIAAAAyKFEAAAAZOsRg\niQULFoRs2bJlIUt9dNnQR/cff/xxyK666qpG7C7fgAEDQjZq1KiQXXPNNcnz+/TpE7JtttkmZNtt\nt13+5qgZn3zySchuuOGGRq+Xuu+KoigGDx7c6DUB2qNPP/20VNaQHj16hOyZZ54J2YMPPpg8f8MN\nNwyZgT/QtLyJAgAAyKBEAQAAZFCiAAAAMihRAAAAGdrVYIl33nknmQ8ZMiRkH330UXNvp0kst1zs\nuamBEakPRg899NDkmqusskrIevbsGbK+ffuW2SKtbP78+cl85513DlmlUim15hNPPBGyTTfdNG9j\n0ExuvPHGkC1evDh57IsvvhiyiRMnlrrORhttlMyffvrpUufTNvztb39L5qn75M033yy1ZmoIxKxZ\ns0rv6eKLLw5Z6l5u6Jk+cODAkNXX15e+PrUvdS9OnTo1ZHfeeWfInnrqqdLX+c1vfhOy/v37h+ye\ne+4J2UEHHZRcs6FBVW2NN1EAAAAZlCgAAIAMShQAAEAGJQoAACBDuxossdJKKyXzfv36haylBksM\nHTo0ZKl93nbbbcnzu3btGrJtt9226n3Rftx0003JPPUR88iRI0N22WWXhaxXr17Vbwz+iddeey1k\nM2fODNldd90VsquvvjpkZYemFEVR1NXVlTruz3/+czLfeOONQ/bss8+Wvj615dFHH03mP//5zxu9\nZrdu3UJ2wgknJI9N/fk/atSoUtdp6F4+9thjQ5YaQEXta+j+3HvvvUP23nvvhSz1bNxrr71CNnv2\n7OR1Uj83pKSuM2/evOSxv/rVr0qtWeu8iQIAAMigRAEAAGRQogAAADIoUQAAABna1WCJhj6aTP0G\n52nTpoXsu9/9bsiGDx9e+vpbb711yP7whz+ErEuXLiGbO3ducs0JEyaUvj7t38477xyy6dOnJ48d\nNGhQyC655JKQGSLBV1m4cGHI9t9//5C98MILpddMDff59NNPQ5b6WDk1XOehhx4qfe2y6uvrk/mC\nBQua/Fq0jEmTJoXs1FNPLX3+ySefHLLU8KpjjjkmZN27d0+umRoisdlmm4UsNTTgG9/4RnLNrbba\nKplTO1LPlzfffDNku+66a/L81HN5jz32CNn5558fsoEDB4Zs2bJlyesccsghIfvtb3+bPPYffe97\n3yt1XFvlTRQAAEAGJQoAACCDEgUAAJBBiQIAAMigRAEAAGRoV9P5GpKacrPBBhuELDU1r6GpPT//\n+c9DNnbs2FJrpjQ0YednP/tZqfNpf55++umQ3X333SGrq6tLnn/YYYeFrHPnztVvjHZr5syZyTw1\n8emNN95o7u0URZGeXNqzZ8+QpSZVFUVRfPDBByH7wQ9+ELLUVKyGbLnllqWPpbak7pPPPvsseexa\na60VsrPPPjtkqfsx5cMPP0zmqelpqfu+R48eIbv88suTa3bq1CF+vGvTHnjggZDttNNOpc/fZ599\nQnbttdeGrGvXrqXWe+SRR5J52Ul8AwYMCNmee+5Z6ty2ypsoAACADEoUAABABiUKAAAggxIFAACQ\nocN+eVj2Q7uvfe1rpdecOHFiyLbZZpuQNTQIgI5r8eLFIbvvvvuqWnPllVcOWe/evataM+XWW28N\nWdmhA2PGjGnq7VCF8847L5lXM0SiW7duyfz6668P2SabbBKyvn37lrrOCiuskMx/+ctfhqzsEIlB\ngwYl88mTJ5c6n9qz9957hyz1DCuKonj22WdDdtZZZ4XsggsuCNmSJUtCdvLJJyev8+tf/zpkqft+\nwoQJIdt9992Ta1JbUj8fnnTSSSFL/XyYuueKIv3nZ9mfbVNOPPHERp9bFEVx8803h6x79+5VrVnr\nvIkCAADIoEQBAABkUKIAAAAyKFEAAAAZOuxgibIa+tDuySefDNnvf//7kM2YMSNk6623XvUbo11J\nfUyausfq6+tDttxy6b8LSQ01Keumm24KWUMDUc4+++yQ/eUvfyl1ndNOOy2Zf/LJJyHr1atXqTUp\n56WXXgrZnXfeWdWaa665ZsjuuOOO0sc2h7fffrvR5x5wwAHJvL1/LN2effOb3wzZ9ttvnzw2NVji\ntttuC9mPf/zjkO23334hmzVrVpktFkVRFJMmTQrZ8OHDS59P67jiiiuSeWqIRGoIxL777huy008/\nPblm586dS+1p6dKlIXvhhRdC9vrrryfPr1QqIUsNyth0001L7ac98SYKAAAggxIFAACQQYkCAADI\noEQBAABkMFjiK3Tp0iWZX3XVVSG77777Qpb6beJ77LFHyLbaaqvkdfbcc8+QNfSBP23XzJkzQ/aH\nP/whZKkhEg19oN+7d+9S154zZ07IUvfy1KlTS61XFOkhEGussUbIUh+3FkVRjBgxImSp34bep0+f\n0nvifxs3blzIFi5cWPr8XXfdNWQXXHBByJpjgMTixYtDlhrEUhRF8cc//rHUmql/ntTzm7atU6f4\nY8+KK653xavbAAALpUlEQVRY+vzZs2eHbMsttwxZ6mP8hv7sPvXUU0O24447lt4TrSP1HBo7dmzy\n2NR/+9QQiWuvvbaqPX344Ych22effUL2wAMPlF7zyCOPDNnhhx+et7F2ypsoAACADEoUAABABiUK\nAAAggxIFAACQQYkCAADIYDpfI339618P2V133RWyYcOGhezSSy8tlRVFelLL8OHDQ9azZ8/k+dSW\nJUuWJPM33nij1Pn9+/cP2fHHH588dqWVVgrZ/PnzQ3bhhReGbMqUKSHr169f8jqpSXqnnHJKyD77\n7LOQrbPOOsk133///WRO0znxxBND9u677yaP7du3b8hS0xpb6jl04403huyII44off5mm20Wst/8\n5jch81ztGNZaa60Wuc7IkSOT+ahRo0JWdroqrWfZsmUhe++990qfP378+JAtWrQoZNOmTUuen5pY\n+9hjj4Xsk08+CVlqWmBD0yMPO+ywkDU0ubqj8SYKAAAggxIFAACQQYkCAADIoEQBAABkMFiiCW2+\n+eYhmzFjRshOOumkkN16663JNQ855JCQzZo1K2SpD/l79eqVXJPW88orryTzffbZp9T5p512WsiO\nOuqo5LGpD1RHjx4dshtuuCFkffr0CVlDH+7/27/9W8hSAyxS/4yp6xRFUey2226lj6Vxtthii5A9\n9NBDrbCTf+7ZZ58N2XHHHVf6/M6dO4cs9f+RIRIdQ319fcjuueee5LGVSqXR19l///1Ddt111zV6\nPWrP8ssvH7JvfOMbyWPnzp0bstSAsoaGO5T1rW99K2QrrrhiyGbPnh2yhoZHbbzxxlXtqT3zJgoA\nACCDEgUAAJBBiQIAAMigRAEAAGQwWKKZrbrqqiGbOnVqyBoaDrDDDjuEbNy4cSF79dVXQ5b6bda0\nrueff76q8xu6T1JGjBgRsrvvvrvUuY8//njIBg0alDz2jTfeKH3sP0rdy0VRFGPGjCl1Pu3fZptt\nFrKcj69/97vfhWyXXXapak+0XUcffXTIrr766uSx1XzkX+2AAGpft27dQvbII48kj91yyy1DNm/e\nvJCtu+66IUsNKSmKojjggANC1qNHj1LnpwZLpP7f4J/zJgoAACCDEgUAAJBBiQIAAMigRAEAAGQw\n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\n", "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 280, "width": 424 } }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline\n", "%config InlineBackend.figure_format = 'retina'\n", "\n", "\n", "fig, ax = plt.subplots(nrows=2, ncols=5, sharex=True, sharey=True,)\n", "ax = ax.flatten()\n", "for i in range(10):\n", " img = X_train[y_train == i][0].reshape(28, 28)\n", " ax[i].imshow(img, cmap='Greys', interpolation='nearest')\n", "\n", "ax[0].set_xticks([])\n", "ax[0].set_yticks([])\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Show a bunch of 4s" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nQAGbJhpjnKtE6pJqTb941xhjfv31V8nXXnut9TWzImaiAAAAAMACgygAAAAAsEA5n4X169dLvvnm\nm6PYEsQTXcJ3ww03SD569GjAY2bPni25VKlS4WlYkOrXry9Zr9zj68knn5T8xx9/hLVNiE16lShd\nGmWMMSdPnpT86KOPSk5JSZF86NAhyXr1KWOcK0VRwoeM6HKlrl27StZlpgULFnQcU6dOnbC0ZcOG\nDZK//fbbgPuxqmnWF2wJn16FT5fwTZo0SbLv6n56Rd9Q+6r+jqFXjHzkkUckz5s3z3FMuFasjGXM\nRAEAAACABQZRAAAAAGCBQRQAAAAAWEjYZ6KWL19ufUz//v0l+74pWi/Jq5ew3LFjR8BjAGOMWbRo\nkeT0noO68847Jd96661hbZON1157TfLq1aslL1261LGfrvFGYhoyZIjk4cOHOz676qqrJA8aNMjv\n8brfHz582PHZO++8I5nnoJCRVatWSR47dqxkj8cj2fd7QokSJVy7vr4f9unTx+8+vkua582b17Xr\nI/bo5/QqVaok+ffff5esn4PyvU927tw5pOvr76vt2rXzu88nn3wiuWPHjo7PEmVZc42ZKAAAAACw\nwCAKAAAAACwkbDnfzJkzrY/R05jlypVzfJaU9N//lPv375esl/TNjIEDB4Z0PGJfz549/f68aNGi\nju3Ro0dL9l3aNJp0W9Iro9JvXddli77LCCO+fPbZZ5JfeeUVybp8zxhnWWhqaqrkNWvWSNblJnrJ\nfGOMadmyZchtRXy7dOmSZL1UtKZLksqUKRO2tkyZMkXy119/LTl37tySX3/9dccxycnJYWsPIu/c\nuXOO7Q4dOkjWJXz6+6butzVr1nS1Pbp8NNCjBU2aNJFcrVo1V6+fFTETBQAAAAAWGEQBAAAAgIWE\nKufbunWr5IULF4Z0rt27d4fanKCwGk/8+/PPPyXrlaHq1q3r2O+6666LWJv8OXnypORAU/3Hjh0L\nePyRI0ck33XXXZI3bNjgQusQS77//nvJbdu2lazLqerVq+c4xuv1Sn7jjTck9+rVy+81+vbt69jW\n/3Z27dol+ddff5Ws+x0Sz4svvih5woQJkgsXLix5xYoVknVpnds2btzo9+dVqlSRXLJkybBdH9Gh\nS/iee+45x2fvvvuuZF26OW/ePMkVKlRwrS36Pm2MMZs3b/a73y233CL57bfflhxLjxVECzNRAAAA\n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\nRAEAAGT4BRe+N3I2gqK7AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "image/png": { "height": 280, "width": 424 } }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(nrows=5, ncols=5, sharex=True, sharey=True,)\n", "ax = ax.flatten()\n", "for i in range(25):\n", " img = X_train[y_train == 4][i].reshape(28, 28)\n", " ax[i].imshow(img, cmap='Greys', interpolation='nearest')\n", "\n", "ax[0].set_xticks([])\n", "ax[0].set_yticks([])\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classifying with tree based models\n", "\n", "Let's see how well some other models do before we get to the neural net." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier\n", "\n", "tree10 = DecisionTreeClassifier(criterion='entropy', max_depth=10, random_state=0)\n", "tree100 = DecisionTreeClassifier(criterion='entropy', max_depth=100, random_state=0)\n", "\n", "rf10 = RandomForestClassifier(criterion='entropy', n_estimators=10, random_state=1)\n", "rf100 = RandomForestClassifier(criterion='entropy', n_estimators=100, random_state=1)\n", "\n", "labeled_models = [\n", " ('decision tree depth 10', tree10),\n", " ('decision tree depth 100', tree100),\n", " ('random forest 10 estimators', rf10),\n", " ('random forest 100 estimators', rf100),\n", "]\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "decision tree depth 10 fit the dataset in 15.2 seconds\n", "decision tree depth 100 fit the dataset in 19.1 seconds\n", "random forest 10 estimators fit the dataset in 5.3 seconds\n", "random forest 100 estimators fit the dataset in 52.6 seconds\n" ] } ], "source": [ "import time\n", "import subprocess\n", "\n", "def say_done(label):\n", " subprocess.call(\"say 'done with {}'\".format(label), shell=True)\n", "\n", "for label, model in labeled_models:\n", " before = time.time()\n", " model.fit(X_train, y_train)\n", " after = time.time()\n", "\n", " print(\"{} fit the dataset in {:.1f} seconds\".format(label, after - before))\n", " say_done(label)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "decision tree depth 10 training fit: 0.912\n", "decision tree depth 10 test accuracy: 0.872\n", "decision tree depth 100 training fit: 1.000\n", "decision tree depth 100 test accuracy: 0.886\n", "random forest 10 estimators training fit: 0.999\n", "random forest 10 estimators test accuracy: 0.946\n", "random forest 100 estimators training fit: 1.000\n", "random forest 100 estimators test accuracy: 0.969\n" ] } ], "source": [ "from sklearn.metrics import accuracy_score\n", "\n", "for label, model in labeled_models:\n", " print(\"{} training fit: {:.3f}\".format(label, accuracy_score(y_train, model.predict(X_train)))) \n", " print(\"{} test accuracy: {:.3f}\".format(label, accuracy_score(y_test, model.predict(X_test)))) " ] } ], "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.4.4" } }, "nbformat": 4, "nbformat_minor": 0 }