{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Simple Neural Network\n", "A simple 3 layer classifier in python - with no bias or regularization.\n", "Created on a [vnode](https://github.com/thomaswilley/vnode) :)\n", "\n", "@thomaswilley" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from sklearn.datasets import load_digits\n", "%matplotlib inline\n", "\n", "src_X, src_y = load_digits(return_X_y=True)\n", "m, dim_input = src_X.shape\n", "dim_hidden = 100\n", "dim_output = 10\n", "m_train = 1000\n", "\n", "X_train = src_X[0:m_train, :] / 255\n", "X_test = src_X[m_train+1::, :]/ 255\n", "\n", "y = np.zeros((m, 10))\n", "y[np.arange(m), src_y]=1\n", "y_train = y[0:m_train, :]\n", "y_test = y[m_train+1::, :]\n", "\n", "img_dim = int(np.sqrt(src_X.shape[1]))\n", "images_and_labels = list(zip(src_X.reshape(m, img_dim, img_dim), src_y))\n", "for index, (image, label) in enumerate(images_and_labels[:10]):\n", " plt.subplot(1, 10, index + 1)\n", " plt.axis('off')\n", " plt.imshow(image, cmap=plt.cm.gray_r)\n", " plt.title('{}'.format(label))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "def nonlin_sigmoid(x, deriv=False):\n", " if deriv:\n", " return x * (1. - x)\n", " return 1. / (1 + np.exp(-x))\n", "\n", "def nonlin_relu(x, deriv=False):\n", " if deriv:\n", " return 1. * (x > 0)\n", " return np.maximum(x, 0)\n", "\n", "def forward(model, x):\n", " z1 = np.dot(model['w1'].T, x)\n", " a1 = model['nonlin'](z1)\n", " z2 = np.dot(model['w2'].T, a1)\n", " a2 = model['nonlin'](z2)\n", " return (z1, a1, z2, a2)\n", "\n", "def backward(model, x, z1, a1, z2, a2, y):\n", " loss = a2 - y\n", " grad_w2 = np.dot(a1, loss.T)\n", " grad_a1 = np.dot(model['w2'], loss) * model['nonlin'](a1, deriv=True)\n", " grad_w1 = np.dot(x, grad_a1.T)\n", " return (loss, grad_w1, grad_w2)\n", "\n", "def predict(model, x):\n", " return np.argmax(forward(model, x)[3])\n", "\n", "def accuracy(model, X, y):\n", " correct = []\n", " m = X.shape[0]\n", " for i in range(m):\n", " y_hat = predict(model, X[i,:].reshape(-1, 1))\n", " _y = np.argmax(y[i,:].reshape(-1, 1))\n", " correct.append(y_hat == _y)\n", " return np.sum(1.*np.array(correct)) / m\n", "\n", "def create_model(dim_input, dim_hidden, dim_output, nonlin=nonlin_sigmoid, epochs=30, learning_rate=0.9): \n", " model = {}\n", " model['dims'] = (dim_input, dim_hidden, dim_output)\n", " model['nonlin'] = nonlin # which non linearity fn we use for the activations of hidden & output\n", " model['w1'] = np.random.random((dim_input, dim_hidden))\n", " model['w2'] = np.random.random((dim_hidden, dim_output))\n", " model['epochs'] = epochs\n", " model['learning_rate'] = learning_rate\n", " return model\n", "\n", "def train_model(model):\n", " all_examples_err = []\n", " for e in range(model['epochs']):\n", " single_example_err = []\n", " for i in range(m_train):\n", " _x = X_train[i,:].reshape(-1, 1)\n", " _y = y_train[i,:].reshape(-1, 1)\n", "\n", " z1, a1, z2, a2 = forward(model, _x)\n", " loss, grad_w1, grad_w2 = backward(model, _x, z1, a1, z2, a2, _y)\n", "\n", " model['w2'] -= model['learning_rate'] * grad_w2\n", " model['w1'] -= model['learning_rate'] * grad_w1\n", "\n", " single_example_err.append(np.square(loss).sum())\n", "\n", " all_examples_err.append(np.sum(single_example_err) / m_train)\n", " model['error'] = all_examples_err\n", " return model\n", "\n", "def plot_model_error(model, label=\"Model\"):\n", " f, ax = plt.subplots()\n", " ax.plot(model['error'])\n", " ax.set_title(\"Model-{} Train accuracy: {:.02f}%\\nTest accuracy: {:.02f}%\".format(\n", " label,\n", " accuracy(model, X_train, y_train),\n", " accuracy(model, X_test, y_test)))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nm38vAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAEXCAYAAACNj66GAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcXGWd7/HPt7rTWTtASEgjIEGRBMQFjfei+MIRkcu4\n4DjqHfCCgnKRcUGUuW5XBleujivquCC4AQMqMjPK4DqKy70jGhavQAIiSwIE6EAgIYEk3f2bP56n\n0qcr3ekKdKXq1Pm+X69+peps9VR1+ntOPeec56eIwMzMyqPW7gaYmdmOcXCbmZWMg9vMrGQc3GZm\nJePgNjMrGQe3mVnJOLhLQNIiSSGpt4llT5T0m53Rrk4iqUfSw5Ke2O62mLWag3uKSbpd0mZJ8xum\nX5vDd1F7Wra1Hd/I7XtY0gOSfippyQ6sH5L2H2f6ByRduAPLP1z4GZH0SOH5/9jR9xURwxExJyJW\n7ui6VSZpP0m/lLRR0nJJL9zOsrtJukDSoKT7JJ05zjLvzH8DD0u6UdKT8/RD8vYHJZ1WWL5P0u8k\n7dWad9idHNytcRtwXP2JpKcBs9rXnG38Q0TMAfYC7gLO39kNyCE7J7djJfDywrSLGpdv5ttGWbX5\nvX0HuAqYB5wFXCZp9wmW/RwwDXgicCjwBkkn1GdKOhU4AfhLoB84Bnggz/44cBrwLOADkhbk6f8L\nuCQi7prKN9XtHNytcQHwusLz1wPfKi4gaRdJ38pHIHdIer+kWp7XI+mTktZIuhV46Tjrni9ptaS7\nJH1EUs+ONjIiHiH94T6zYftvyEdHayX9WNK+O7rtxyu/p29LuljSeuB4Sc+V9FtJD+b3/jlJ0/Ly\nvcVvNJIuzPN/KGm9pP+QtN8Er1WTdKmke/K2r5R0YGH+LEmfkbRS0kOSfiVpep53eG7TQ5JW1YNM\n0m8knVjYxsmSrmxo65sl3QKsyNO/IOlOSesk/V7S8wrr90o6U9Kf8/xlkp4g6SuSPt7wfq6Q9LYm\nPuODgIOBD0bEoxHxHWA58MoJVnkZaaf/SETcCnwdeEPeVg/w98DpEbE8klsiYm1edxHw84hYBdwK\n7JN/H8eQdgi2AxzcrfFbYK6kA/N/6GOBxm6EzwO7AE8CXkAK+pPyvP9J+iM5BFgKvLph3W8AQ8D+\neZmjgJN3tJGSZpO+GdxSmPYK4H3AXwMLgF8DF+/otqfIK4F/In1O3ya957cD84HDgKOBN21n/dcC\nZ5KOJlcCH97OspcDTwEGgOtJO9+6zwBPB/5r3tb7gJEcPFcAnwZ2J/0u/rgD7+8Y4DnA0/Lzq/Lr\nzAMuBb5b30GQjkxfTXrPu5J+348C3wSOkyQASQuBvyD/znKwTxSMTwVuiYgNhWl/yNPHo3GeH5wf\n7wvsCTwj73xulXRWvV3ADcBRSucg9iGF9+eBMyJiaILXs4lEhH+m8Ae4HTgSeD/wf0h/aD8FeoEg\nHXn0AJuBgwrrvQm4Mj/+OXBqYd5Red1eYCGwCZhZmH8c8Iv8+ETgN9tp3zdIf/APAiOkbp2nF+b/\nEHhj4XkN2Ajsm58HsP842/0AcOE408ddfrzPrGHaR0hHaNtb7++A7+bHWz/f/PxC4MuFZY8Brm/y\ndzg/b2t2/l1tAp46znJn1l9/nHm/AU4sPD+58Putt/Xw7bRBwPr66wJ/Bl46wbI3Ay/Mj08Hvt/k\n+zyp8f8KqUvjvAmWv4T0DW0OaSd3G7Ahzzs8v6cfkHa0+5EOCE7K8/cDfgRcDfx30oHB10l/Dz8A\nfgn89c74G+2GHx9xt84FpCO+E2noJiEFwzTgjsK0O0h9zgBPAFY1zKvbN6+7On+tfxD4CrBHYwMk\nvU+jJ/y+XJj1yYjYlfRH8wiwuGH75xS2/QApRCY7eTSU21V8/frzLZOsO5HiZ4CkJZL+LXdprAM+\nRPosJ3JP4fFGUuBsI3dN/UM+SlzH6DeQ+aQdZR8pOBvtM8H0ZjW+v3dJWiHpIWAtacdRf3/be61v\nAcfnx8cz9tvC9jwMzG2YtgtphzGetwLDpM/nn0lH9XfmeY/kfz8WEQ9FxG3AV4GXAETEbRFxdEQ8\nm/Qt5SzgXaRvKxcAfwV8TtIuTba90hzcLRIRd5COSF4CXNYwew0pzIp9x08knSgEWE36Qy3Oq1tF\nOgKcHxG75p+5EbHN19uIODtGT/idOs78laSuh3MkzSxs/02Fbe8aETMj4v9N8pZXknYERfuRAv2x\nnnhqHLryK6RujP0jYi6pT7Xx6/tj8TrS7+kIUnDVr4IRcC/p29GTx1lv1QTTATYw9oT0wDjLbH1/\nSldzvBN4FakrZDdSsNbf3/Ze6wLglZIOycv8YILlGt0A7C+p2M5n5OnbNjZiTUQcFxEDEXEw6ZvD\n7/LsFaT/08Xf2URDj34A+FJEDJK6iZZF6gtfzcTv0Qoc3K31RuCIGNuHSEQMk75yflRSfz75905G\n+8G/A5wmaW9JuwHvKay7GvgJ8ClJc/OJtSdLesFjaWBE/BS4GzglT/oy8F5JT4WtJ0Jf07Ban6QZ\nhZ8e0tfgJZJOkDRN0jzgbOB7MXV9mP3AQ8CGfPJwe/3bO7rdTcD9pLD9aH1G/l19A/ispIF8dH5Y\n/jZxIXC0pFflk4fzJT0jr3od8CpJMyUdQD6JN0kbhkg79WmkcJtdmH8e8JH8u5akZ+bPuH6Q8AdS\nf/d3I+LRZt50RNxICum/z7/H1wBLSEfT25C0v6R5+b2+NL+nj+ZtrSf1y79b0hxJ+5C6hy5v2MbT\ngOcB5+ZJtwFHSNqTdL5nzLcQG5+Du4Ui4s8RsWyC2W8jHZXdSuoP/Sfga3neV4Efk/4Yr2HbI/bX\nkb6+30j6Sn0p6cTQY/UJ4F2SpkfEP5P6OS/J3QbXky7vKrqB9NW4/nNSRNyXl3sTcF9e70Hgbx9H\nuxqdQbpCZz3p6PvbU7Tdr5N2XneT3lvjt4t3kK62uJrUdXQ2oNwd8HLg3Xn6NYyeaPwk6YjzPtLv\ndZtr3BtcAfwM+BOpz38d6Qi07hPAvwD/nuedC8wozP9mfu0x3SSSzpP0he287t8AzyX9P/oQ8KqI\nuD+v+xe5u6zuOaTPZx3pRO+xEbGiMP/NpB3gatJn+C0K3YT5ROUXgNMiYiRPfjfpXMUfgQ/lo3Cb\nhPKJAzMrMUlHkK7Hf1L4j7rr+YjbrOQk9ZHOVXzVoV0NDm6zEst9xmtJ1377RpaKcFeJmVnJ+Ijb\nzKxkHNxmZiXj4K4QTfFQqoXt/lbS8ZMvWT35uutfKw2beoOkw7ez7DxJFykNPHavpPc1zP+4pOsl\nDUt6T8O8Z+e7LgclvaUwfbrSgFXj3QBkJdW1Q2XatiINoQqkccOBkyPiZ+1r0c4hqXcKbwLaUZeS\nxn95MWnQrH+R9KSIeHCcZf+RdEv5E0lDDPy7pNsioj7I102kcWzeMc66nyBdM38rcJ2kiyPiAdLN\nWxdExD3jrGMl5SNu2yrfFXhmHrNjTT762zXPmy3pEqXiCw9KukppYP1PkW7MOC8fuX9qnO32Svpe\nPop8UNIvJC0uzJ+tNATrKqXhUX+pPEZ1vgmkPmzqSkmvzdPHHOVLOlXSz/LjGUrDpv6tpD+TbgZC\n0pc0Omzq7yQd2tDGs/J7rw+rOqA0fO7WOynzsj+RNOmNRZKeDhwAfDjSsKkXk8b5+KsJVikOm3oL\n6aaarXdcRsTXIuLHpFvhG+1LGsTqDtLYNnsrFbA4mrRDsC7i4LaivyONRPh8YG/S2BOfyfNOJn1D\n24s08NFbgc0RcQbwe9LR+5z8fDz/ShqHYoA0rsU3C/M+R7rV+jmky9reD9Qr51xOOprcHXg2E4yj\nMYGX5XUOyc//g3R34e65Pd/V6EBY7yUF6lGksUJOYXTY1Nfmu/6Q9IT8+Xw7Pz9f0qcneP2nAjdH\nGve8bnvDpjYqDps6mRuBI5XGI9+TdPfl54F35Nv2rYu4q8SKTgWOj4i7ASR9ELhB0htIIb4AeHJE\nXE8K66bkborirc8fBO6WNIPUNfA64ODC1/lf5+VOAH4QEd/L0wfzT7M+WuySiIhiG84G/jdpfIyb\nSDumU/KRLsC1eblfk25df35u12uBH+VuCCLijdt5/TmksVWK1pHGJRnPj0njxJxM2nG+nuYrJ50O\nfJG0U30z6Uj7TuBeSZfntnwmIv61ye1ZB3NwG7B1HIl9gCskFS/ur5GOUM8nHS1fKmkOKYjPbOZo\nLnd7fJzUxzufNA648nZ7SP8Pd8awqe8lDbM7QArjGcB8STeTvkls81oREZLqw6b+Ov/7wSZff6Jh\nU9eOsyykPuovkPqp7wUuIo0jPqmI+DPw3wAk9QP/F3ghaRyWr5HGu/6DpJ/nAaGsxNxVYkAKKNLw\nq0c0DOk6Iw/nuSki/j4ilpAGzX8NqbIPTDx8Z91JpJNzLyQFV704sUgDEg3R+mFTX0wa2OuVpK6Q\neaQBslR47xO91reAV0t6Nmln8m8TLNfoBuCA/M2ibnvDpg5GxN9ExMKIeDowndFhU3fEh4HP5cGi\n6sOm3k/6tjJu+TYrFwe3FX0Z+JjSkJxI2kPSy/PjIyUdpFQXcx0pbOsjvN1L6nKYSD+pv/h+0lCl\nH6nPiIgtpGA8R9LCfIL0+UpDxV4AvEzSK/PJwwX5hB+kYVNfnU9ELiEdSW9PP6m7Z5A0suKHGDu6\n3nnA2ZKepOSQ+onZSPUVbyQdvX47IjZP8lr19/b/SaP9nZkvyzuOtHMYt7tCadjU3fJ7PYbUVXJ2\nYf60vBOoAb35vdcatvFMUr9+vQB0fdjUvUgnMO/Eyu/xltDxTzl/GL9cWA9pmM0/kYZOvQU4K897\nfZ6+gVRZ5lNALc97QV52LemqiMbX2oV0lPowKUhOJB0N753nzyZd+XA3aSjYXwC9ed4RpP70daSr\nJY7L0xeSLo1bD/yKtDP4WZ43o7j9PG0aaUewjnR0fXp+H88vzP9Q/lzWk+o/Liysf3Le5nMb3ts3\ngM9u53Pen9TF8ggp/F9QmHcksKbw/ITcpo2kIWSPaNjWJbkNxZ9jC/NFGiL4kMK0paQ+/EHgLe3+\nf+efqfnxWCVmTZB0FPDFiNh/0oXNWsxdJWaTUBo29TRGq7aYtZWD22w7cp/xWlIfuW9ksY7grhIz\ns5LxEbeZWcm05Aac+fPnx6JFi1qxaTOzrnT11VeviYgFzSzbkuBetGgRy5ZNVNzczMwaSbqj2WXd\nVWJmVjIObjOzknFwm5mVjIPbzKxkHNxmZiXj4DYzKxkHt5lZyXRMcG8ZHuGLV97Cr27ekcpUZmbV\n0zHB3VsT5/7qVn54/ep2N8XMrKN1THBLYvHCflbc43J4Zmbb0zHBDbBkoJ+b71nPyIhHLDQzm0hn\nBfeec9mweZi7Hnyk3U0xM+tYHRXciwf6AdxdYma2HR0V3AcszMG9el2bW2Jm1rk6KrjnTO9ln3kz\nWXGvj7jNzCbSUcENsHjhXG5yV4mZ2YQ6LrgP3LOf29ZsYNPQcLubYmbWkTouuBcP9DM8Etxy38Pt\nboqZWUfquOBeUr+yZLW7S8zMxtNxwb1o99n09da4yScozczG1XHB3dtTY/8Fc3wtt5nZBDouuAGW\n7NnPTff4Wm4zs/F0ZnAP9HPvuk2s3bC53U0xM+s4HRnciwfmAr713cxsPB0Z3PUrS9xdYma2rY4M\n7j36p7PrrGm+ssTMbBwdGdwuqmBmNrGODG6AA/ec66IKZmbj6NjgXjzQz4bNw9y51kUVzMyKOjq4\nAVb4BKWZ2RgdG9z1ogoe4tXMbKyODW4XVTAzG19TwS3pHZJukHS9pIslzWh1wwCWDLiogplZo0mD\nW9JewGnA0og4GOgBjm11wyDdiHPbmg08usVFFczM6prtKukFZkrqBWYBd7euSaNcVMHMbFuTBndE\n3AV8ElgJrAYeioifNC4n6RRJyyQtGxwcnJLGjd767u4SM7O6ZrpKdgNeAewHPAGYLen4xuUi4tyI\nWBoRSxcsWDAljXNRBTOzbTXTVXIkcFtEDEbEFuAy4HmtbVbiogpmZttqJrhXAodKmiVJwIuA5a1t\n1igXVTAzG6uZPu6rgEuBa4A/5nXObXG7tnJRBTOzsZq6qiQizoqIJRFxcEScEBGbWt2wOhdVMDMb\nq2PvnKxzUQUzs7E6PrhdVMHMbKyOD25JLBlwUQUzs7qOD24YHbPERRXMzEoS3IsH+tnoogpmZkCJ\nghtcVMHMDEoS3C6qYGY2qhTBPWd6L0+cN8tFFczMKElwQ+ou8RG3mVmJgttFFczMktIEt4sqmJkl\npQluF1UwM0tKE9wuqmBmlpQmuHt7ajxlDxdVMDMrTXBD6udesdo34ZhZtZUquJcM9HPfehdVMLNq\nK1Vwu6iCmVnJgttFFczMShbce/RPZzcXVTCziitVcEti8UA/y1c7uM2sukoV3JCKKtx8r4sqmFl1\nlS64XVTBzKqulMENLqpgZtVVuuB2UQUzq7rSBbeLKphZ1ZUuuMG3vptZtZUyuJcM9HP7/RtdVMHM\nKqmUwe2iCmZWZaUMbhdVMLMqK2Vwu6iCmVVZKYO7XlRhuU9QmlkFlTK4IfVzu6vEzKqotMHtogpm\nVlWlDW4XVTCzqmoquCXtKulSSSskLZf03FY3bDIuqmBmVdXb5HLnAD+KiFdL6gNmtbBNTakXVfAR\nt5lVzaTBLWkX4HDgRICI2Ay0vWO5XlTBwW1mVdNMV8l+wCDwdUnXSjpP0uwWt6spLqpgZlXUTHD3\nAs8CvhQRhwAbgPc0LiTpFEnLJC0bHByc4maOz0UVzKyKmgnuO4E7I+Kq/PxSUpCPERHnRsTSiFi6\nYMGCqWzjhFxUwcyqaNLgjoh7gFWSFudJLwJubGmrmrTYRRXMrIKavarkbcBF+YqSW4GTWtek5s2u\nF1VwcJtZhTQV3BFxHbC0xW15TNKVJe4qMbPqKO2dk3UuqmBmVVP64HZRBTOrmtIH95I8ZolPUJpZ\nVZQ+uBftPou+3pr7uc2sMkof3PWiCr6yxMyqovTBDS6qYGbV0hXB7aIKZlYlXRHcLqpgZlXSFcF9\noMcsMbMK6YrgXpCLKrif28yqoCuC20UVzKxKuiK4wUUVzKw6uia4XVTBzKqia4J7iU9QmllFdE1w\nH7CwHtzu5zaz7tY1wV0vquArS8ys23VNcIOLKphZNXRVcLuogplVQVcFt4sqmFkVdFVwL/GYJWZW\nAV0V3PWiCje5n9vMulhXBbeLKphZFXRVcIOLKphZ9+u64K4XVXjARRXMrEt1YXDXT1C6n9vMulMX\nBne69d3dJWbWrbouuF1Uwcy6XdcFt4sqmFm367rgBhdVMLPu1qXB7aIKZta9ujK4F+cTlMt9ZYmZ\ndaGuDO56UQWfoDSzbtSVwe2iCmbWzboyuMFFFcyse3VtcC8Z6Oe2NRtcVMHMuk7TwS2pR9K1ki5v\nZYOmypKBuYwELqpgZl1nR4643w4sb1VDplr9yhLfiGNm3aap4Ja0N/BS4LzWNmfquKiCmXWrZo+4\nPwu8CxiZaAFJp0haJmnZ4ODglDTu8XBRBTPrVpMGt6SXAfdFxNXbWy4izo2IpRGxdMGCBVPWwMfD\nRRXMrBs1c8R9GHCMpNuBS4AjJF3Y0lZNkQMH5rqogpl1nUmDOyLeGxF7R8Qi4Fjg5xFxfMtbNgVG\nT1C6n9vMukfXXscNLqpgZt2pd0cWjogrgStb0pIWcFEFM+tGXX3E7aIKZtaNujq4wUUVzKz7VCC4\nU1GFVWs3trspZmZTouuD27e+m1m36frgdlEFM+s2XR/cLqpgZt2m64MbXFTBzLpLJYL7QBdVMLMu\nUongXuyiCmbWRSoS3L6yxMy6RyWC20UVzKybVCK4XVTBzLpJJYIb0q3vDm4z6wYVCu5+Bl1Uwcy6\nQGWC20UVzKxbVCa4XVTBzLpFZYLbRRXMrFtUJrjrRRWWO7jNrOQqE9yQriz5k4sqmFnJVSy4XVTB\nzMqvUsHtW9/NrBtUKrhdVMHMukGlgttFFcysG1QquCH1cy/3TThmVmKVDO7bXVTBzEqscsHtogpm\nVnYVDG5fWWJm5Va54HZRBTMru8oFt4sqmFnZVS64wUUVzKzcKhrcLqpgZuVVyeB2UQUzK7NKBreL\nKphZmVUyuOtFFVasdnCbWflMGtyS9pH0C0k3SrpB0tt3RsNaSVI6QXmvg9vMyqeZI+4h4IyIOAg4\nFHiLpINa26zWWzzQ76IKZlZKkwZ3RKyOiGvy4/XAcmCvVjes1VxUwczKaof6uCUtAg4Brhpn3imS\nlklaNjg4ODWtayHf+m5mZdV0cEuaA3wPOD0itrmOLiLOjYilEbF0wYIFU9nGlnBRBTMrq6aCW9I0\nUmhfFBGXtbZJO8fs6b3su/ssX8ttZqXTzFUlAs4HlkfEp1vfpJ1n8cJ+d5WYWek0c8R9GHACcISk\n6/LPS1rcrp3CRRXMrIx6J1sgIn4DaCe0ZacrFlU4eK9d2t0cM7OmVPLOyTpfWWJmZVTp4K4XVVix\n2icozaw8Kh3cvT01Dlg4h5t867uZlUilgxtg8UIXVTCzcql8cLuogpmVTeWD20UVzKxsKh/c9aIK\nHpvbzMqi8sG9oH8682b3ecwSMyuNyge3pHTru68sMbOSqHxwg4sqmFm5OLhxUQUzKxcHN7713czK\nxcHNaFEFX1liZmXg4Ga0qMJN9/pabjPrfA7uzEUVzKwsHNyZiyqYWVk4uLNiUQUzs07m4M7qV5Ys\n99jcZtbhHNzZot1nMb235lvfzazjObiz3p4aT3FRBTMrAQd3gYsqmFkZOLgL6kUV7n94U7ubYmY2\nIQd3Qf0Epfu5zayTObgLluzpMUvMrPM5uAsWzHFRBTPrfA7uAhdVMLMycHA3cFEFM+t0Du4GLqpg\nZp2ut90N6DRL9pwLwGu/ehUDu8xg3uw+5s/pY97sPubNnl543Mf8OdPZbVYffb3e/5nZzuPgbvC0\nvXbhbUfsz+33b+SBDZtY9cBGrlv1IA9s2MzwBN0n/TN6mZ9PbDrozazVHNwNemrijKMWbzN9ZCRY\n9+gW7t+wmfsf3swDGzYVHm9mzcObeGDDZlY9sJFrVz7I2o2PP+jnze5j1rReZvTV6OupIanVb9/M\nSsDB3aRaTew6q49dZ/Xx5AWTL18P+jU52O9/OAV94+OV908e9AA1wYxpPcyc1sOMaT3MmFZjZl/x\nef1xLf3b18OM3p7CMrUx6483fWZep1bzDsKskzm4W6QY9M0YGQkeeqR+RJ+O3tdu3MIjW4Z5dMsw\nj2zO/+afTVtG0uPNwzy8aYjB9Zt4dMswj9anbxlm89DIY2p7X29tzE5gem8P03pFby0d+ff2iGk9\nNab1pGnTemtMq6VpY+b11NLjWv1xfV5arr6t3lqNvrz9sesWls/br9WgR2nZWo2t//ZI9NTkbyVW\nCQ7uDlGrid1m97Hb7D7232POlGxzeCTYNJRDf2hka/hv3QHk6Y9uHh7dQRR3DIXpQyPBluERtgyP\nsHlohA2bh9kyNMLQyAhbhtO8oeHRZbYMx9Z5O1NN24Z5+qnRU5/WozHzahK9E0yrSfSOMy39pN9b\n/XF9x1FTeh3l5XpqUMvPxzweZxs1KT8f+7gnb0v5deqPVVhPjD4vTqe+LYFI/45OS9upryPGTld9\n24VtQOE18zbryxa3kV86TSs8rreD4vYZfUx+XG+rCvO9Y04c3F2spyZm9fUyq699v+aIYGgkGBoO\nNg+PMDQ8wtBIsHloZMzOYMtwMDRc2AmMjLB5KIX/6LrBcAQjI2mbIyPp+fBI+hlv2tafCIaHG+aN\nM20kYuvrPLplZMy0kfxeRiKIYOu84uORIP+b2jL2eXo8nNexx6a+EyjuONi6YyjsSBgNfSbYidTX\nYcw6225j6+tOsv3dZ0/nO6c+t+WfQVN/0ZKOBs4BeoDzIuJjLW2VdQ1JucsDZtLT7uZ0jKgHfkwQ\n/uPtCArTh0eCKGynvlwU/g1izPTI29j6L2OXH7Ne3snUXyOtN9oWYOvOqNiO+jaD4vaAwmun5cdf\nr9guSO93dPm0DQrbGImx89lmu4zZ/tbPvmF6/Tn15+PMK25/ZMz2I79HmDtz5xwkTfoqknqAfwRe\nDNwJ/F7S9yPixlY3zqxb1Y/8avirv+24Zi4o/i/ALRFxa0RsBi4BXtHaZpmZ2USaCe69gFWF53fm\naWNIOkXSMknLBgcHp6p9ZmbWYMpu4YuIcyNiaUQsXbCgiQudzczsMWkmuO8C9ik83ztPMzOzNmgm\nuH8PPEXSfpL6gGOB77e2WWZmNpFJryqJiCFJbwV+TLoc8GsRcUPLW2ZmZuNq6qLDiLgCuKLFbTEz\nsyZ4fFEzs5JRtODeW0mDwB2PcfX5wJopbE6Z+bMYy5/HWP48RnXDZ7FvRDR1SV5LgvvxkLQsIpa2\nux2dwJ/FWP48xvLnMapqn4W7SszMSsbBbWZWMp0Y3Oe2uwEdxJ/FWP48xvLnMapSn0XH9XGbmdn2\ndeIRt5mZbYeD28ysZDomuCUdLekmSbdIek+729NOkvaR9AtJN0q6QdLb292mdpPUI+laSZe3uy3t\nJmlXSZdKWiFpuaTW18rqYJLekf9Orpd0saQZ7W5Tq3VEcBeq7PwlcBBwnKSD2tuqthoCzoiIg4BD\ngbdU/PMAeDuwvN2N6BDnAD+KiCXAM6jw5yJpL+A0YGlEHEwaT+nY9raq9ToiuHGVnTEiYnVEXJMf\nryf9YW5TvKIqJO0NvBQ4r91taTdJuwCHA+cDRMTmiHiwva1qu15gpqReYBZwd5vb03KdEtxNVdmp\nIkmLgEOAq9rbkrb6LPAuYKTdDekA+wGDwNdz19F5kma3u1HtEhF3AZ8EVgKrgYci4iftbVXrdUpw\n2zgkzQG+B5weEeva3Z52kPQy4L6IuLrdbekQvcCzgC9FxCHABqCy54Qk7Ub6dr4f8ARgtqTj29uq\n1uuU4HaVnQaSppFC+6KIuKzd7Wmjw4BjJN1O6kI7QtKF7W1SW90J3BkR9W9gl5KCvKqOBG6LiMGI\n2AJcBjyvzW1quU4JblfZKZAkUh/m8oj4dLvb004R8d6I2DsiFpH+X/w8Irr+iGoiEXEPsErS4jzp\nRcCNbWyy4H/cAAAAd0lEQVRSu60EDpU0K//dvIgKnKxtqpBCq7nKzjYOA04A/ijpujztfbmghdnb\ngIvyQc6twEltbk/bRMRVki4FriFdjXUtFbj93be8m5mVTKd0lZiZWZMc3GZmJePgNjMrGQe3mVnJ\nOLjNzErGwW1mVjIObjOzkvlPvgiP/qsSSggAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model1 = create_model(dim_input, dim_hidden, dim_output, nonlin=nonlin_sigmoid, epochs=10, learning_rate=0.9)\n", "model1 = train_model(model1)\n", "plot_model_error(model1, \"Sigmoid\")\n", "\n", "model2 = create_model(dim_input, dim_hidden, dim_output, nonlin=nonlin_relu, epochs=10, learning_rate=0.05)\n", "model2 = train_model(model2)\n", "plot_model_error(model2, \"ReLU\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "model 1 predicts 7\n", "model 2 predicts 7\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPgAAAD8CAYAAABaQGkdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACkdJREFUeJzt3d+LXPUZx/HPx1VpN1qFJimSxG4uJLAUamQJSIrQiCVG\n0V70IgGFSiFXitKCaO/6D4i9KIJErWCqtFFBxCoWFSu0xk1MW7OblDSkZIN2NxTxFzSsPr3YE4iS\nMmcz3++cs0/fL1jcmR32PBN57zkze/Z8HRECkNNFXQ8AoB4CBxIjcCAxAgcSI3AgMQIHEiNwIDEC\nBxIjcCCxi2t809WrV8fExESNb92pxcXFkW7voov4+TusrP+GJ06c0OnTpz3ocVUCn5iY0PT0dI1v\n3amFhYWRbm/VqlUj3V5G4+PjXY9QxdTUVKvH5fzxBkASgQOpETiQGIEDiRE4kBiBA4kROJAYgQOJ\ntQrc9nbbR20fs/1A7aEAlDEwcNtjkn4l6WZJk5J22Z6sPRiA4bXZg2+RdCwijkfEGUnPSLq97lgA\nSmgT+DpJJ8+5PdfcB6Dnir3JZnu37Wnb06P+owwA59cm8FOSNpxze31z35dExKMRMRURU2vWrCk1\nH4AhtAn8HUnX2N5o+1JJOyW9UHcsACUM/HvwiFi0fbekVySNSXo8Ig5XnwzA0Fpd8CEiXpL0UuVZ\nABTGmWxAYgQOJEbgQGIEDiRG4EBiBA4kRuBAYgQOJFZlZZNRsgeu3lIM59iXsWPHjpFta//+/SPb\nliTNzMyMdHuDsAcHEiNwIDECBxIjcCAxAgcSI3AgMQIHEiNwIDECBxJrs7LJ47bnbb83ioEAlNNm\nD/5rSdsrzwGggoGBR8Sbkv49glkAFMZrcCAxli4CEisWOEsXAf3DITqQWJtfkz0t6U+SNtmes/2T\n+mMBKKHN2mS7RjEIgPI4RAcSI3AgMQIHEiNwIDECBxIjcCAxAgcSI3AgsRW/dFFEdD0Cemzt2rVd\nj9Ap9uBAYgQOJEbgQGIEDiRG4EBiBA4kRuBAYgQOJEbgQGIEDiTW5qKLG2y/bnvG9mHb945iMADD\na3Mu+qKkn0XEQduXSzpg+9WImKk8G4AhtVmb7P2IONh8/rGkWUnrag8GYHjLeg1ue0LSZklvn+dr\nLF0E9EzrwG1fJulZSfdFxEdf/TpLFwH90ypw25doKe69EfFc3ZEAlNLmXXRLekzSbEQ8VH8kAKW0\n2YNvlXSnpG22DzUfOyrPBaCANmuTvSXJI5gFQGGcyQYkRuBAYgQOJEbgQGIEDiRG4EBiBA4kRuBA\nYit+bTKsPKNcL2x+fn5k2+oj9uBAYgQOJEbgQGIEDiRG4EBiBA4kRuBAYgQOJEbgQGJtLrr4Ndv7\nbf+lWbroF6MYDMDw2pyq+h9J2yLik+byyW/Z/n1E/LnybACG1OaiiyHpk+bmJc1H1BwKQBltFz4Y\ns31I0rykVyOCpYuAFaBV4BHxeURcK2m9pC22v3Oex7B0EdAzy3oXPSI+lPS6pO11xgFQUpt30dfY\nvrL5/OuSbpJ0pPZgAIbX5l30qyQ9aXtMSz8QfhsRL9YdC0AJbd5F/6uW1gQHsMJwJhuQGIEDiRE4\nkBiBA4kROJAYgQOJETiQGIEDibF0ESSxnFBW7MGBxAgcSIzAgcQIHEiMwIHECBxIjMCBxAgcSIzA\ngcRaB95cG/1d21yPDVghlrMHv1fSbK1BAJTXdmWT9ZJukbSn7jgASmq7B39Y0v2Svqg4C4DC2ix8\ncKuk+Yg4MOBxrE0G9EybPfhWSbfZPiHpGUnbbD/11QexNhnQPwMDj4gHI2J9RExI2inptYi4o/pk\nAIbG78GBxJZ1RZeIeEPSG1UmAVAce3AgMQIHEiNwIDECBxIjcCAxAgcSI3AgMQIHEmPpoh6bnJwc\n2bZYTign9uBAYgQOJEbgQGIEDiRG4EBiBA4kRuBAYgQOJEbgQGKtzmRrrqj6saTPJS1GxFTNoQCU\nsZxTVb8fEaerTQKgOA7RgcTaBh6S/mD7gO3dNQcCUE7bQ/TvRcQp22slvWr7SES8ee4DmvB3S9LV\nV19deEwAF6LVHjwiTjX/nZf0vKQt53kMSxcBPdNm8cFVti8/+7mkH0h6r/ZgAIbX5hD9W5Ket332\n8b+JiJerTgWgiIGBR8RxSd8dwSwACuPXZEBiBA4kRuBAYgQOJEbgQGIEDiRG4EBiBA4kxtJFkCR9\n9tlnI9vW+Pj4yLb1/449OJAYgQOJETiQGIEDiRE4kBiBA4kROJAYgQOJETiQWKvAbV9pe5/tI7Zn\nbV9fezAAw2t7quovJb0cET+yfakkzjUEVoCBgdu+QtINkn4sSRFxRtKZumMBKKHNIfpGSQuSnrD9\nru09zfXRAfRcm8AvlnSdpEciYrOkTyU98NUH2d5te9r29MLCQuExAVyINoHPSZqLiLeb2/u0FPyX\nsHQR0D8DA4+IDySdtL2puetGSTNVpwJQRNt30e+RtLd5B/24pLvqjQSglFaBR8QhSVOVZwFQGGey\nAYkROJAYgQOJETiQGIEDiRE4kBiBA4kROJAYgQOJsTbZMkxOTo50ezMznPKP4bAHBxIjcCAxAgcS\nI3AgMQIHEiNwIDECBxIjcCAxAgcSGxi47U22D53z8ZHt+0YxHIDhDDxVNSKOSrpWkmyPSTol6fnK\ncwEoYLmH6DdK+kdE/LPGMADKWm7gOyU9fb4vsHQR0D+tA28WPbhN0u/O93WWLgL6Zzl78JslHYyI\nf9UaBkBZywl8l/7H4TmAfmoVeLMe+E2Snqs7DoCS2q5N9qmkb1aeBUBhnMkGJEbgQGIEDiRG4EBi\nBA4kRuBAYgQOJEbgQGKOiPLf1F6QtNw/KV0t6XTxYfoh63PjeXXn2xEx8K+6qgR+IWxPR8RU13PU\nkPW58bz6j0N0IDECBxLrU+CPdj1ARVmfG8+r53rzGhxAeX3agwMorBeB295u+6jtY7Yf6HqeEmxv\nsP267Rnbh23f2/VMJdkes/2u7Re7nqUk21fa3mf7iO1Z29d3PdMwOj9Eb661/nctXTFmTtI7knZF\nxEyngw3J9lWSroqIg7Yvl3RA0g9X+vM6y/ZPJU1J+kZE3Nr1PKXYflLSHyNiT3Oh0fGI+LDruS5U\nH/bgWyQdi4jjEXFG0jOSbu94pqFFxPsRcbD5/GNJs5LWdTtVGbbXS7pF0p6uZynJ9hWSbpD0mCRF\nxJmVHLfUj8DXSTp5zu05JQnhLNsTkjZLervbSYp5WNL9kr7oepDCNkpakPRE8/JjT3M9whWrD4Gn\nZvsySc9Kui8iPup6nmHZvlXSfEQc6HqWCi6WdJ2kRyJis6RPJa3o94T6EPgpSRvOub2+uW/Fs32J\nluLeGxFZrki7VdJttk9o6eXUNttPdTtSMXOS5iLi7JHWPi0Fv2L1IfB3JF1je2PzpsZOSS90PNPQ\nbFtLr+VmI+KhrucpJSIejIj1ETGhpf9Xr0XEHR2PVUREfCDppO1NzV03SlrRb4q2umxyTRGxaPtu\nSa9IGpP0eEQc7nisErZKulPS32wfau77eUS81OFMGOweSXubnc1xSXd1PM9QOv81GYB6+nCIDqAS\nAgcSI3AgMQIHEiNwIDECBxIjcCAxAgcS+y932YtMdG+7fwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# \"create\" an arbitrary digit and predict its label\n", "example = np.array([[ 0., 0., 2., 1., 1., 1., 0., 0.],\n", " [ 0., 24., 22., 22., 22., 15., 20., 0.],\n", " [ 0., 0., 0., 0., 0., 0., 22., 0.],\n", " [ 0., 0., 0., 0., 0., 22., 0., 0.],\n", " [ 0., 0., 0., 0., 22., 0., 0., 0.],\n", " [ 0., 0., 0., 20., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 20., 1., 0., 0., 0.],\n", " [ 0., 0., 20., 0., 0., 0., 0., 0.]])\n", "f, ax = plt.subplots(figsize=(4,4))\n", "ax.imshow(example, cmap=plt.cm.gray_r)\n", "print(\"model 1 predicts {}\\nmodel 2 predicts {}\".format(\n", " predict(model1, example.reshape(-1, 1)),\n", " predict(model2, example.reshape(-1, 1))))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": 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 }