{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "jupytext": { "cell_metadata_filter": "-all", "formats": "ipynb" }, "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.8.3" }, "colab": { "name": "dropout-and-batch-normalization.ipynb", "provenance": [], "collapsed_sections": [] } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "rbbaAwB1XtJP" }, "source": [ "Modified from: https://www.kaggle.com/ryanholbrook/overfitting-and-underfitting" ] }, { "cell_type": "markdown", "metadata": { "id": "DKwljf9XZFYX" }, "source": [ "# Introduction #\n", "\n", "There's more to the world of deep learning than just dense layers. There are dozens of kinds of layers you might add to a model. (Try browsing through the [Keras docs](https://www.tensorflow.org/api_docs/python/tf/keras/layers/) for a sample!) Some are like dense layers and define connections between neurons, and others can do preprocessing or transformations of other sorts.\n", "\n", "In this lesson, we'll learn about a two kinds of special layers, not containing any neurons themselves, but that add some functionality that can sometimes benefit a model in various ways. Both are commonly used in modern architectures.\n", "\n", "# Dropout #\n", "\n", "The first of these is the \"dropout layer\", which can help correct overfitting.\n", "\n", "In the last lesson we talked about how overfitting is caused by the network learning spurious patterns in the training data. To recognize these spurious patterns a network will often rely on very a specific combinations of weight, a kind of \"conspiracy\" of weights. Being so specific, they tend to be fragile: remove one and the conspiracy falls apart.\n", "\n", "This is the idea behind **dropout**. To break up these conspiracies, we randomly *drop out* some fraction of a layer's input units every step of training, making it much harder for the network to learn those spurious patterns in the training data. Instead, it has to search for broad, general patterns, whose weight patterns tend to be more robust.\n", "\n", "
\n", "\"An\n", "
Here, 50% dropout has been added between the two hidden layers.
\n", "
\n", "\n", "You could also think about dropout as creating a kind of *ensemble* of networks. The predictions will no longer be made by one big network, but instead by a committee of smaller networks. Individuals in the committee tend to make different kinds of mistakes, but be right at the same time, making the committee as a whole better than any individual. (If you're familiar with random forests as an ensemble of decision trees, it's the same idea.)\n", "\n", "## Adding Dropout ##\n", "\n", "In Keras, the dropout rate argument `rate` defines what percentage of the input units to shut off. Put the `Dropout` layer just before the layer you want the dropout applied to:\n", "\n", "```\n", "keras.Sequential([\n", " # ...\n", " layers.Dropout(rate=0.3), # apply 30% dropout to the next layer\n", " layers.Dense(16),\n", " # ...\n", "])\n", "```\n", "\n", "# Batch Normalization #\n", "\n", "The next special layer we'll look at performs \"batch normalization\" (or \"batchnorm\"), which can help correct training that is slow or unstable.\n", "\n", "With neural networks, it's generally a good idea to put all of your data on a common scale, perhaps with something like scikit-learn's [StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) or [MinMaxScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html). The reason is that SGD will shift the network weights in proportion to how large an activation the data produces. Features that tend to produce activations of very different sizes can make for unstable training behavior.\n", "\n", "Now, if it's good to normalize the data before it goes into the network, maybe also normalizing inside the network would be better! In fact, we have a special kind of layer that can do this, the **batch normalization layer**. A batch normalization layer looks at each batch as it comes in, first normalizing the batch with its own mean and standard deviation, and then also putting the data on a new scale with two trainable rescaling parameters. Batchnorm, in effect, performs a kind of coordinated rescaling of its inputs.\n", "\n", "Most often, batchnorm is added as an aid to the optimization process (though it can sometimes also help prediction performance). Models with batchnorm tend to need fewer epochs to complete training. Moreover, batchnorm can also fix various problems that can cause the training to get \"stuck\". Consider adding batch normalization to your models, especially if you're having trouble during training.\n", "\n", "## Adding Batch Normalization ##\n", "\n", "It seems that batch normalization can be used at almost any point in a network. You can put it after a layer...\n", "\n", "```\n", "layers.Dense(16, activation='relu'),\n", "layers.BatchNormalization(),\n", "```\n", "\n", "... or between a layer and its activation function:\n", "\n", "```\n", "layers.Dense(16),\n", "layers.BatchNormalization(),\n", "layers.Activation('relu'),\n", "```\n", "\n", "And if you add it as the first layer of your network it can act as a kind of adaptive preprocessor, standing in for something like Sci-Kit Learn's `StandardScaler`.\n", "\n", "# Example - Using Dropout and Batch Normalization #\n", "\n", "Let's continue developing the *Red Wine* model. Now we'll increase the capacity even more, but add dropout to control overfitting and batch normalization to speed up optimization. This time, we'll also leave off standardizing the data, to demonstrate how batch normalization can stabalize the training." ] }, { "cell_type": "markdown", "metadata": { "id": "PP2KojJnY-S-" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "id": "cbXj1tgXY9B3" }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "id": "3IZftzPwY9M1" }, "source": [ "" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "XcBINM75X1tn", "outputId": "5217fa57-3880-41b4-ac95-b94a9d0f61a9" }, "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ] }, { "cell_type": "code", "metadata": { "_kg_hide-input": true, "id": "meZZ7M-FXtJZ" }, "source": [ "\n", "# Setup plotting\n", "import matplotlib.pyplot as plt\n", "\n", "plt.style.use('seaborn-whitegrid')\n", "# Set Matplotlib defaults\n", "plt.rc('figure', autolayout=True)\n", "plt.rc('axes', labelweight='bold', labelsize='large',\n", " titleweight='bold', titlesize=18, titlepad=10)\n", "\n", "\n", "import pandas as pd\n", "red_wine = pd.read_csv('/content/drive/MyDrive/CommonFiles/MUSA650-Data/red-wine.csv')\n", "\n", "# Create training and validation splits\n", "df_train = red_wine.sample(frac=0.7, random_state=0)\n", "df_valid = red_wine.drop(df_train.index)\n", "\n", "# Split features and target\n", "X_train = df_train.drop('quality', axis=1)\n", "X_valid = df_valid.drop('quality', axis=1)\n", "y_train = df_train['quality']\n", "y_valid = df_valid['quality']" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "D-k94iG7XtJa" }, "source": [ "When adding dropout, you may need to increase the number of units in your `Dense` layers." ] }, { "cell_type": "code", "metadata": { "id": "qnHxSX4rXtJb" }, "source": [ "from tensorflow import keras\n", "from tensorflow.keras import layers\n", "\n", "model = keras.Sequential([\n", " layers.Dense(1024, activation='relu', input_shape=[11]),\n", " layers.Dropout(0.3),\n", " layers.BatchNormalization(),\n", " layers.Dense(1024, activation='relu'),\n", " layers.Dropout(0.3),\n", " layers.BatchNormalization(),\n", " layers.Dense(1024, activation='relu'),\n", " layers.Dropout(0.3),\n", " layers.BatchNormalization(),\n", " layers.Dense(1),\n", "])" ], "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KDkVo9slXtJb" }, "source": [ "There's nothing to change this time in how we set up the training." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "mcVqYYvmXtJb", "outputId": "e7284c27-a835-450e-97b0-c869e98ff6af" }, "source": [ "model.compile(\n", " optimizer='adam',\n", " loss='mae',\n", ")\n", "\n", "history = model.fit(\n", " X_train, y_train,\n", " validation_data=(X_valid, y_valid),\n", " batch_size=256,\n", " epochs=100,\n", " verbose=0,\n", ")\n", "\n", "\n", "# Show the learning curves\n", "history_df = pd.DataFrame(history.history)\n", "history_df.loc[:, ['loss', 'val_loss']].plot();" ], "execution_count": 4, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ] }, { "cell_type": "code", "metadata": { "id": "u7CofNpqYo5S" }, "source": [ "" ], "execution_count": 4, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "MHw4gQJSXtJc" }, "source": [ "You'll typically get better performance if you standardize your data before using it for training. That we were able to use the raw data at all, however, shows how effective batch normalization can be on more difficult datasets.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "X1wFAwl-XtJc" }, "source": [ "---" ] } ] }