Created
November 14, 2020 02:37
-
-
Save iamaziz/78529877fb79780f99049017c623d1f9 to your computer and use it in GitHub Desktop.
tf_practice_MNIST_nn_normalized_vs._non-normalized-data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "name": "tf_practice_MNIST_nn_normalized_vs._non-normalized-data", | |
| "provenance": [], | |
| "collapsed_sections": [], | |
| "authorship_tag": "ABX9TyM212CV8k2RhpEpPrsfStLj", | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/iamaziz/78529877fb79780f99049017c623d1f9/tf_practice_mnist_nn_normalized_vs-_non-normalized-data.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "hvraLv15RwLM" | |
| }, | |
| "source": [ | |
| "# Training Neural Network with: Normalized vs. Non-normalized data\n", | |
| "\n", | |
| "## An example network with MNIST dataset.\n", | |
| "\n", | |
| "In this example, the same model is trained twice on the same dataset. \n", | |
| "In the first training, the dataset is normalized; while in the second training it is not." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "H02dBghtIjzd" | |
| }, | |
| "source": [ | |
| "%%capture\n", | |
| "import tensorflow as tf\n", | |
| "from tensorflow import keras\n", | |
| "\n", | |
| "mnist = keras.datasets.mnist\n", | |
| "(x_train, y_train), (x_test, y_test) = mnist.load_data()" | |
| ], | |
| "execution_count": 1, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "mH9KaGK3I8d7" | |
| }, | |
| "source": [ | |
| "class EarlyStopping(keras.callbacks.Callback):\n", | |
| " def on_epoch_end(self, epoch, logs={}):\n", | |
| " if logs.get('accuracy') >= 0.99:\n", | |
| " print('\\nReached enough accuracy %99 🥳 .. Stopping the training')\n", | |
| " self.model.stop_training = True\n", | |
| "\n", | |
| "callback = EarlyStopping()" | |
| ], | |
| "execution_count": 2, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "Eath2-1_JRfh" | |
| }, | |
| "source": [ | |
| "def train_fashion_mnist_model(x_train, y_train):\n", | |
| " model = keras.models.Sequential(\n", | |
| " [keras.layers.Flatten(),\n", | |
| " keras.layers.Dense(units=500, activation=keras.activations.relu), # == tf.nn.relu\n", | |
| " keras.layers.Dense(units=10, activation=keras.activations.softmax) # == tf.nn.softmax\n", | |
| " ])\n", | |
| " model.compile(optimizer=keras.optimizers.Adam(),\n", | |
| " loss=keras.losses.sparse_categorical_crossentropy, \n", | |
| " metrics=['accuracy']\n", | |
| " )\n", | |
| " history = model.fit(x_train, y_train, epochs=7, callbacks=[callback])\n", | |
| " return model, history" | |
| ], | |
| "execution_count": 3, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "Nsll1gwSPmdJ" | |
| }, | |
| "source": [ | |
| "# 1) Training with **normalized data** images\n", | |
| "\n", | |
| "Notice how normaizling the data enabled the network to reach %99 accuracy (pretty enough!) in just 5 epochs and took ~27seconds. And starting from %94 in the first epoch!!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "Err6hqmgMWwp", | |
| "outputId": "14388cb6-c783-4985-ce16-f9474bdaaf3d", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "%%time\n", | |
| "x_train_normalized = x_train / x_train.max()\n", | |
| "x_test_normalized = x_test / x_test.max()\n", | |
| "model, history = train_fashion_mnist_model(x_train_normalized, y_train)\n", | |
| "print(model.evaluate(x_test_normalized, y_test))" | |
| ], | |
| "execution_count": 4, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 1/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.2001 - accuracy: 0.9406\n", | |
| "Epoch 2/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.0812 - accuracy: 0.9753\n", | |
| "Epoch 3/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.0514 - accuracy: 0.9839\n", | |
| "Epoch 4/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.0362 - accuracy: 0.9891\n", | |
| "Epoch 5/7\n", | |
| "1874/1875 [============================>.] - ETA: 0s - loss: 0.0269 - accuracy: 0.9914\n", | |
| "Reached enough accuracy %99 🥳 .. Stopping the training\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.0269 - accuracy: 0.9914\n", | |
| "313/313 [==============================] - 0s 2ms/step - loss: 0.0768 - accuracy: 0.9780\n", | |
| "[0.07679472118616104, 0.9779999852180481]\n", | |
| "CPU times: user 39.3 s, sys: 3.36 s, total: 42.6 s\n", | |
| "Wall time: 27.7 s\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "nKduCMAAQCIW" | |
| }, | |
| "source": [ | |
| "# 2) Training **without** normalizing the images data\n", | |
| "Notice the network completed all the (7) epochs while it is still at %95 accuracy." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "zHPeio0eLoJy", | |
| "outputId": "d62aadb7-06bc-4d45-95ed-5bd9ab3eeef9", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "%%time\n", | |
| "model, history = train_fashion_mnist_model(x_train, y_train)\n", | |
| "print(model.evaluate(x_test, y_test))" | |
| ], | |
| "execution_count": 5, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 1/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 2.7264 - accuracy: 0.9076\n", | |
| "Epoch 2/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.3410 - accuracy: 0.9372\n", | |
| "Epoch 3/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.2963 - accuracy: 0.9412\n", | |
| "Epoch 4/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.2804 - accuracy: 0.9457\n", | |
| "Epoch 5/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.2461 - accuracy: 0.9493\n", | |
| "Epoch 6/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.2355 - accuracy: 0.9546\n", | |
| "Epoch 7/7\n", | |
| "1875/1875 [==============================] - 5s 3ms/step - loss: 0.2077 - accuracy: 0.9585\n", | |
| "313/313 [==============================] - 0s 1ms/step - loss: 0.2709 - accuracy: 0.9540\n", | |
| "[0.2708840072154999, 0.9539999961853027]\n", | |
| "CPU times: user 53.2 s, sys: 4.61 s, total: 57.8 s\n", | |
| "Wall time: 37.5 s\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "4y94jrB6Q2QA" | |
| }, | |
| "source": [ | |
| "# Takeaway\n", | |
| "\n", | |
| "Normalizing the dataset makes the training converges faster 🚀. \n", | |
| "**Always normalize the data!!**" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "xruwzwX6a7k3", | |
| "outputId": "37dc6c43-5bed-4e82-ed27-9de744a251a5", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "!date" | |
| ], | |
| "execution_count": 6, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Sat Nov 14 02:36:57 UTC 2020\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "Ipl6ljj7kNYO", | |
| "outputId": "3b8fa88a-745e-4bb5-a4c8-809f8830fabf", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| } | |
| }, | |
| "source": [ | |
| "model.summary()" | |
| ], | |
| "execution_count": 7, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Model: \"sequential_1\"\n", | |
| "_________________________________________________________________\n", | |
| "Layer (type) Output Shape Param # \n", | |
| "=================================================================\n", | |
| "flatten_1 (Flatten) (None, 784) 0 \n", | |
| "_________________________________________________________________\n", | |
| "dense_2 (Dense) (None, 500) 392500 \n", | |
| "_________________________________________________________________\n", | |
| "dense_3 (Dense) (None, 10) 5010 \n", | |
| "=================================================================\n", | |
| "Total params: 397,510\n", | |
| "Trainable params: 397,510\n", | |
| "Non-trainable params: 0\n", | |
| "_________________________________________________________________\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "HfONPELYkV_I", | |
| "outputId": "0d67f024-4a25-4095-8a2e-3cf717348572", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 77 | |
| } | |
| }, | |
| "source": [ | |
| "keras.utils.plot_model(model, rankdir='LR')" | |
| ], | |
| "execution_count": 8, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<IPython.core.display.Image object>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 8 | |
| } | |
| ] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment