{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Dropout\n", "Dropout [1] is a technique for regularizing neural networks by randomly setting some features to zero during the forward pass. In this exercise you will implement a dropout layer and modify your fully-connected network to optionally use dropout.\n", "\n", "[1] Geoffrey E. Hinton et al, \"Improving neural networks by preventing co-adaptation of feature detectors\", arXiv 2012" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "# As usual, a bit of setup\n", "from __future__ import print_function\n", "import time\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from cs231n.classifiers.fc_net import *\n", "from cs231n.data_utils import get_CIFAR10_data\n", "from cs231n.gradient_check import eval_numerical_gradient, eval_numerical_gradient_array\n", "from cs231n.solver import Solver\n", "\n", "%matplotlib inline\n", "plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n", "plt.rcParams['image.interpolation'] = 'nearest'\n", "plt.rcParams['image.cmap'] = 'gray'\n", "\n", "# for auto-reloading external modules\n", "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "def rel_error(x, y):\n", " \"\"\" returns relative error \"\"\"\n", " return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X_val: (1000, 3, 32, 32)\n", "X_train: (49000, 3, 32, 32)\n", "X_test: (1000, 3, 32, 32)\n", "y_val: (1000,)\n", "y_train: (49000,)\n", "y_test: (1000,)\n" ] } ], "source": [ "# Load the (preprocessed) CIFAR10 data.\n", "\n", "data = get_CIFAR10_data()\n", "for k, v in data.items():\n", " print('%s: ' % k, v.shape)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Dropout forward pass\n", "In the file `cs231n/layers.py`, implement the forward pass for dropout. Since dropout behaves differently during training and testing, make sure to implement the operation for both modes.\n", "\n", "Once you have done so, run the cell below to test your implementation." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running tests with p = 0.3\n", "Mean of input: 10.0002078785\n", "Mean of train-time output: 10.0350727971\n", "Mean of test-time output: 10.0002078785\n", "Fraction of train-time output set to zero: 0.699124\n", "Fraction of test-time output set to zero: 0.0\n", "\n", "Running tests with p = 0.6\n", "Mean of input: 10.0002078785\n", "Mean of train-time output: 9.97691075877\n", "Mean of test-time output: 10.0002078785\n", "Fraction of train-time output set to zero: 0.401368\n", "Fraction of test-time output set to zero: 0.0\n", "\n", "Running tests with p = 0.75\n", "Mean of input: 10.0002078785\n", "Mean of train-time output: 9.99306858826\n", "Mean of test-time output: 10.0002078785\n", "Fraction of train-time output set to zero: 0.250496\n", "Fraction of test-time output set to zero: 0.0\n", "\n" ] } ], "source": [ "np.random.seed(231)\n", "x = np.random.randn(500, 500) + 10\n", "\n", "for p in [0.3, 0.6, 0.75]:\n", " out, _ = dropout_forward(x, {'mode': 'train', 'p': p})\n", " out_test, _ = dropout_forward(x, {'mode': 'test', 'p': p})\n", "\n", " print('Running tests with p = ', p)\n", " print('Mean of input: ', x.mean())\n", " print('Mean of train-time output: ', out.mean())\n", " print('Mean of test-time output: ', out_test.mean())\n", " print('Fraction of train-time output set to zero: ', (out == 0).mean())\n", " print('Fraction of test-time output set to zero: ', (out_test == 0).mean())\n", " print()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Dropout backward pass\n", "In the file `cs231n/layers.py`, implement the backward pass for dropout. After doing so, run the following cell to numerically gradient-check your implementation." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dx relative error: 5.44561271827e-11\n" ] } ], "source": [ "np.random.seed(231)\n", "x = np.random.randn(10, 10) + 10\n", "dout = np.random.randn(*x.shape)\n", "\n", "dropout_param = {'mode': 'train', 'p': 0.8, 'seed': 123}\n", "out, cache = dropout_forward(x, dropout_param)\n", "dx = dropout_backward(dout, cache)\n", "dx_num = eval_numerical_gradient_array(lambda xx: dropout_forward(xx, dropout_param)[0], x, dout)\n", "\n", "print('dx relative error: ', rel_error(dx, dx_num))" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Fully-connected nets with Dropout\n", "In the file `cs231n/classifiers/fc_net.py`, modify your implementation to use dropout. Specificially, if the constructor the the net receives a nonzero value for the `dropout` parameter, then the net should add dropout immediately after every ReLU nonlinearity. After doing so, run the following to numerically gradient-check your implementation." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running check with dropout = 0\n", "Initial loss: 2.30047908977\n", "b3 relative error: 5.80e-11\n", "\n", "Running check with dropout = 0.25\n", "Initial loss: 2.29243250883\n", "b3 relative error: 1.65e-10\n", "\n", "Running check with dropout = 0.5\n", "Initial loss: 2.30427592208\n", "b3 relative error: 1.13e-10\n", "\n" ] } ], "source": [ "np.random.seed(231)\n", "N, D, H1, H2, C = 2, 15, 20, 30, 10\n", "X = np.random.randn(N, D)\n", "y = np.random.randint(C, size=(N,))\n", "\n", "for dropout in [0, 0.25, 0.5]:\n", " print('Running check with dropout = ', dropout)\n", " model = FullyConnectedNet([H1, H2], input_dim=D, num_classes=C,\n", " weight_scale=5e-2, dtype=np.float64,\n", " dropout=dropout, seed=123)\n", "\n", " loss, grads = model.loss(X, y)\n", " print('Initial loss: ', loss)\n", "\n", " for name in sorted(grads):\n", " f = lambda _: model.loss(X, y)[0]\n", " grad_num = eval_numerical_gradient(f, model.params[name], verbose=False, h=1e-5)\n", " print('%s relative error: %.2e' % (name, rel_error(grad_num, grads[name])))\n", " print()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Regularization experiment\n", "As an experiment, we will train a pair of two-layer networks on 500 training examples: one will use no dropout, and one will use a dropout probability of 0.75. We will then visualize the training and validation accuracies of the two networks over time." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "(Iteration 1 / 125) loss: 7.856643\n", "(Epoch 0 / 25) train acc: 0.274000; val_acc: 0.192000\n", "(Epoch 1 / 25) train acc: 0.410000; val_acc: 0.263000\n", "(Epoch 2 / 25) train acc: 0.518000; val_acc: 0.269000\n", "(Epoch 3 / 25) train acc: 0.550000; val_acc: 0.248000\n", "(Epoch 4 / 25) train acc: 0.684000; val_acc: 0.297000\n", "(Epoch 5 / 25) train acc: 0.758000; val_acc: 0.292000\n", "(Epoch 6 / 25) train acc: 0.782000; val_acc: 0.266000\n", "(Epoch 7 / 25) train acc: 0.862000; val_acc: 0.240000\n", "(Epoch 8 / 25) train acc: 0.866000; val_acc: 0.283000\n", "(Epoch 9 / 25) train acc: 0.904000; val_acc: 0.281000\n", "(Epoch 10 / 25) train acc: 0.912000; val_acc: 0.268000\n", "(Epoch 11 / 25) train acc: 0.950000; val_acc: 0.288000\n", "(Epoch 12 / 25) train acc: 0.960000; val_acc: 0.303000\n", "(Epoch 13 / 25) train acc: 0.974000; val_acc: 0.288000\n", "(Epoch 14 / 25) train acc: 0.970000; val_acc: 0.275000\n", "(Epoch 15 / 25) train acc: 0.986000; val_acc: 0.283000\n", "(Epoch 16 / 25) train acc: 0.976000; val_acc: 0.296000\n", "(Epoch 17 / 25) train acc: 0.960000; val_acc: 0.301000\n", "(Epoch 18 / 25) train acc: 0.972000; val_acc: 0.300000\n", "(Epoch 19 / 25) train acc: 0.980000; val_acc: 0.291000\n", "(Epoch 20 / 25) train acc: 0.980000; val_acc: 0.302000\n", "(Iteration 101 / 125) loss: 0.026443\n", "(Epoch 21 / 25) train acc: 0.958000; val_acc: 0.300000\n", "(Epoch 22 / 25) train acc: 0.954000; val_acc: 0.289000\n", "(Epoch 23 / 25) train acc: 0.958000; val_acc: 0.308000\n", "(Epoch 24 / 25) train acc: 0.964000; val_acc: 0.277000\n", "(Epoch 25 / 25) train acc: 0.970000; val_acc: 0.296000\n", "0.75\n", "(Iteration 1 / 125) loss: 11.299055\n", "(Epoch 0 / 25) train acc: 0.246000; val_acc: 0.181000\n", "(Epoch 1 / 25) train acc: 0.400000; val_acc: 0.231000\n", "(Epoch 2 / 25) train acc: 0.544000; val_acc: 0.270000\n", "(Epoch 3 / 25) train acc: 0.622000; val_acc: 0.263000\n", "(Epoch 4 / 25) train acc: 0.688000; val_acc: 0.300000\n", "(Epoch 5 / 25) train acc: 0.774000; val_acc: 0.289000\n", "(Epoch 6 / 25) train acc: 0.778000; val_acc: 0.284000\n", "(Epoch 7 / 25) train acc: 0.836000; val_acc: 0.281000\n", "(Epoch 8 / 25) train acc: 0.842000; val_acc: 0.284000\n", "(Epoch 9 / 25) train acc: 0.886000; val_acc: 0.280000\n", "(Epoch 10 / 25) train acc: 0.854000; val_acc: 0.308000\n", "(Epoch 11 / 25) train acc: 0.910000; val_acc: 0.287000\n", "(Epoch 12 / 25) train acc: 0.910000; val_acc: 0.272000\n", "(Epoch 13 / 25) train acc: 0.932000; val_acc: 0.292000\n", "(Epoch 14 / 25) train acc: 0.938000; val_acc: 0.313000\n", "(Epoch 15 / 25) train acc: 0.928000; val_acc: 0.305000\n", "(Epoch 16 / 25) train acc: 0.948000; val_acc: 0.280000\n", "(Epoch 17 / 25) train acc: 0.958000; val_acc: 0.325000\n", "(Epoch 18 / 25) train acc: 0.952000; val_acc: 0.335000\n", "(Epoch 19 / 25) train acc: 0.956000; val_acc: 0.301000\n", "(Epoch 20 / 25) train acc: 0.962000; val_acc: 0.293000\n", "(Iteration 101 / 125) loss: 0.584279\n", "(Epoch 21 / 25) train acc: 0.970000; val_acc: 0.300000\n", "(Epoch 22 / 25) train acc: 0.946000; val_acc: 0.305000\n", "(Epoch 23 / 25) train acc: 0.982000; val_acc: 0.304000\n", "(Epoch 24 / 25) train acc: 0.990000; val_acc: 0.298000\n", "(Epoch 25 / 25) train acc: 0.974000; val_acc: 0.281000\n" ] } ], "source": [ "# Train two identical nets, one with dropout and one without\n", "np.random.seed(231)\n", "num_train = 500\n", "small_data = {\n", " 'X_train': data['X_train'][:num_train],\n", " 'y_train': data['y_train'][:num_train],\n", " 'X_val': data['X_val'],\n", " 'y_val': data['y_val'],\n", "}\n", "\n", "solvers = {}\n", "dropout_choices = [0, 0.75]\n", "for dropout in dropout_choices:\n", " model = FullyConnectedNet([500], dropout=dropout)\n", " print(dropout)\n", "\n", " solver = Solver(model, small_data,\n", " num_epochs=25, batch_size=100,\n", " update_rule='adam',\n", " optim_config={\n", " 'learning_rate': 5e-4,\n", " },\n", " verbose=True, print_every=100)\n", " solver.train()\n", " solvers[dropout] = solver" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "image/png": "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\nzGszszEzG0eMGFHBkqvIsNHda5ckSZJUc4oIgsuAYyJibEQMAaYDS9p2ZuaWzByemUdm5pHAz4Ep\nmdlUQK2hZI8BAAAgAElEQVTV5/TZMLh+97bB9aV2SZIkSaKAIJiZ24GLgKXAI8CizHw4IuZGxJS+\nrmfAmTANzl4Aw8YAUbo9e0GpXZIkSZKAyMyia+gVjY2N2dRkp6EkSZKk2hQRyzOzS2uw97vJYiRJ\nkiRJlWUQlCRJkqQaYxCUJEmSpBpjEJQkSZKkGmMQlCRJkqQaYxCUJEmSpBpjEJQkSZKkGmMQlCRJ\nkqQaYxCUJEmSpBpjEJQkSZKkGmMQlCRJkqQaYxCUJEmSpBpjEJQkSZKkGmMQlCRJkqQaYxCUJEmS\npBpjEJQkSZKkGmMQlCRJkqQaYxCUJEmSpBpjEJQkSZKkGmMQlCRJkqQaU0gQjIgzImJNRKyNiMs6\n2f+piHgoIlZGxL0RcWwRdUqSJEnSQNTnQTAi6oBrgPcAxwLndxL0vpOZx2Xm8cCVwJf7uExJkiRJ\nGrCK6BGcBKzNzMcycyuwEDin/QGZ+Wy7zQOB7MP6JEmSJGlAG1TAOUcB69ptNwMndjwoIj4D/C0w\nBDitb0qTJEmSpIGv304Wk5nXZObrgEuBz3d2TETMiIimiGjasGFD3xYoSZIkSVWqiCDYAoxptz26\n3LYnC4Gpne3IzGszszEzG0eMGNGLJUqSJEnSwFVEEFwGHBMRYyNiCDAdWNL+gIg4pt3mmcCjfVif\nJEmSJA1ofX6NYGZuj4iLgKVAHfD1zHw4IuYCTZm5BLgoIv4c2AY8A3ykr+uUJEmSpIGqiMliyMzb\ngds7tM1ud/+zfV6UJEmSKmrbtm00Nzfz4osvFl2KVNWGDh3K6NGjGTx48D4/RyFBsBYsXtHC/KVr\nWL+5lZEN9cyaPI6pE0cVXZYkSVJhmpubOfjggznyyCOJiKLLkapSZrJp0yaam5sZO3bsPj9Pv501\ntJotXtHC5bc8RMvmVhJo2dzK5bc8xOIVe5sTR5IkaWB78cUXOeywwwyBUg9EBIcddliPe9YNghUw\nf+kaWrft2K2tddsO5i9dU1BFkiRJ/YMhUOq53vjvyCBYAes3t3arXZIkSX3jhz/8IePGjePoo49m\n3rx5nR7z0ksvcd5553H00Udz4okn8sQTT+zad8UVV3D00Uczbtw4li5d+ornu/7667nooot6q/xu\n+8pXvsILL7xQ2Pl7W1fev0suuYTjjz+e448/nte//vU0NDTs2ldXV7dr35QpU17xfE888QTjx4/v\ntfq7a/Hixaxevboiz20QrICRDfXdapckSVLl7dixg8985jPccccdrF69mhtvvLHTP7K/9rWvccgh\nh7B27VouueQSLr30UgBWr17NwoULefjhh/nhD3/Ipz/9aXbs2PGyx3fF9u3be/RaumogBcGuvn9X\nXXUVK1euZOXKlVx88cWce+65u/bV19fv2rdkyZKXPbar+ur9MwhWmVmTx1E/uG63tvrBdcyaPK6g\niiRJkqrP4hUtnDTvLsZe9gNOmndXj+dbeOCBBzj66KM56qijGDJkCNOnT+fWW2992XG33norH/lI\nafWyD3zgA9x5551kJrfeeivTp09n//33Z+zYsRx99NE88MADL3v8v/3bv/H617+eSZMmcd999+1q\nv/DCC/nUpz7FiSeeyOc+9zmefvpppk6dyoQJE3jLW97CqlWrAJgzZw4XXHABb33rWznmmGP46le/\nCpQmCZk1axbjx4/nuOOO46abbgLgnnvu4ayzztp1nosuuojrr7+eBQsWsH79ek499VROPfXUHv3u\n9smqRXDVeJjTULpdtahHT9fV96+9G2+8kfPPP79b51m+fDlvetObeNOb3sQ111yzq/36669nypQp\nnHbaaZx++ul7fT9OPvlkzjzzTMaNG8enPvUpdu7cuaue4447jvHjx+/6BwaAgw46aNf9m2++mQsv\nvJCf/vSnLFmyhFmzZnH88cfzm9/8pluv45U4a2gFtM0O6qyhkiRJ+6Zt8r22eRfaJt8D9vlvqpaW\nFsaMGbNre/To0dx///17PW7QoEEMGzaMTZs20dLSwlve8pbdHt/Ssns4feqpp/jiF7/I8uXLGTZs\nGKeeeioTJ07ctb+5uZmf/vSn1NXVcfHFFzNx4kQWL17MXXfdxYc//GFWrlwJwKpVq/j5z3/OH/7w\nByZOnMiZZ57Jz372M1auXMkvfvELNm7cyAknnMDJJ5+8x9c7c+ZMvvzlL3P33XczfPjwffqd7bNV\ni+C2mbCtfGnUlnWlbYAJ0/bpKbv6/rV58sknefzxxznttNN2tb344os0NjYyaNAgLrvsMqZOnfqy\nx330ox/l6quv5uSTT2bWrFm77XvwwQdZtWoVhx56KN/73vf2+H488MADrF69mte+9rWcccYZ3HLL\n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\nRAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot train and validation accuracies of the two models\n", "\n", "train_accs = []\n", "val_accs = []\n", "for dropout in dropout_choices:\n", " solver = solvers[dropout]\n", " train_accs.append(solver.train_acc_history[-1])\n", " val_accs.append(solver.val_acc_history[-1])\n", "\n", "plt.subplot(3, 1, 1)\n", "for dropout in dropout_choices:\n", " plt.plot(solvers[dropout].train_acc_history, 'o', label='%.2f dropout' % dropout)\n", "plt.title('Train accuracy')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Accuracy')\n", "plt.legend(ncol=2, loc='lower right')\n", " \n", "plt.subplot(3, 1, 2)\n", "for dropout in dropout_choices:\n", " plt.plot(solvers[dropout].val_acc_history, 'o', label='%.2f dropout' % dropout)\n", "plt.title('Val accuracy')\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Accuracy')\n", "plt.legend(ncol=2, loc='lower right')\n", "\n", "plt.gcf().set_size_inches(15, 15)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Question\n", "Explain what you see in this experiment. What does it suggest about dropout?" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Answer\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }