{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Lab 1 DNN Training.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Lab 1: Handwritten Digits Recognition" ], "metadata": { "id": "imUw_pCIDLCx" } }, { "cell_type": "markdown", "source": [ "## Problem definition\n" ], "metadata": { "id": "MdYJ2MVoDqFf" } }, { "cell_type": "markdown", "source": [ "We will provide a model to recognize handwritten digits." ], "metadata": { "id": "6jGEVgFNDwHp" } }, { "cell_type": "markdown", "source": [ "## Data Preparation\n" ], "metadata": { "id": "-zFOQzC6EBJ5" } }, { "cell_type": "code", "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras import layers, optimizers, datasets, Sequential\n", "from tensorflow.keras.layers import Activation, Dropout, Dense" ], "metadata": { "id": "EE5socElDTOz" }, "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "source": [ "Loading the dataset" ], "metadata": { "id": "X5bp9QWqFg9N" } }, { "cell_type": "code", "source": [ "# downloading MNIST dataset\n", "(x_train, y_train) , (x_test, y_test)= datasets.mnist.load_data() " ], "metadata": { "id": "bzq3X3adFjIp" }, "execution_count": 13, "outputs": [] }, { "cell_type": "code", "source": [ "# print the size of the dataset\n", "print(x_train.shape, y_train.shape,x_test.shape, y_test.shape )" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "l0fNOEx9FzrJ", "outputId": "d0c9d94b-1d5a-443c-d9b9-c17d142a1637" }, "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(60000, 28, 28) (60000,) (10000, 28, 28) (10000,)\n" ] } ] }, { "cell_type": "markdown", "source": [ "Snapshot of the dataset\n" ], "metadata": { "id": "TqmwgFtRGxsG" } }, { "cell_type": "code", "source": [ "import matplotlib.pyplot as plt" ], "metadata": { "id": "PI0iqDwIG8cT" }, "execution_count": 7, "outputs": [] }, { "cell_type": "code", "source": [ "# show the first 9 images \n", "plt.figure()\n", "for i in range(9):\n", " # creation of a figure containing 9 subplots\n", " plt.subplot(3,3,i+1)\n", " # show an image\n", " plt.imshow(x_train[i])\n", " # show the label\n", " plt.ylabel(y_train[i])\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 268 }, "id": "TfHBjcw7HpZd", "outputId": "b9ae7a66-0275-475e-fd79-e4f338bbc014" }, "execution_count": 8, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "# print the first image\n", "print(x_train[0])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "X2BHfhECIxW_", "outputId": "a476bf6d-4a63-41c4-bcc0-6d66123646a0" }, "execution_count": 9, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136\n", " 175 26 166 255 247 127 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253\n", " 225 172 253 242 195 64 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251\n", " 93 82 82 56 39 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119\n", " 25 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253\n", " 150 27 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252\n", " 253 187 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249\n", " 253 249 64 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253\n", " 253 207 2 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253\n", " 250 182 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201\n", " 78 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0]]\n" ] } ] }, { "cell_type": "markdown", "source": [ "Data Normalization" ], "metadata": { "id": "6_3Qa7TGJ4dd" } }, { "cell_type": "code", "source": [ "# reshaping the dataset\n", "x_train_1 = x_train.reshape(60000,784)\n", "x_test_1 = x_test.reshape(10000,784)" ], "metadata": { "id": "g21g4n3UJ6TU" }, "execution_count": 16, "outputs": [] }, { "cell_type": "code", "source": [ "# pixel normalization\n", "x_train_1 = x_train_1.astype('float32')/255\n", "x_test_1 = x_test_1.astype('float32')/255" ], "metadata": { "id": "u5iQirdzKvBJ" }, "execution_count": 17, "outputs": [] }, { "cell_type": "code", "source": [ "# showing the first normqlized picture\n", "print(x_train_1[0])" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dkPw4GfMLOq-", "outputId": "eb882dc3-9234-4873-c196-f21bd0e1364e" }, "execution_count": 18, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.01176471 0.07058824 0.07058824 0.07058824\n", " 0.49411765 0.53333336 0.6862745 0.10196079 0.6509804 1.\n", " 0.96862745 0.49803922 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.11764706 0.14117648 0.36862746 0.6039216\n", " 0.6666667 0.99215686 0.99215686 0.99215686 0.99215686 0.99215686\n", " 0.88235295 0.6745098 0.99215686 0.9490196 0.7647059 0.2509804\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.19215687\n", " 0.93333334 0.99215686 0.99215686 0.99215686 0.99215686 0.99215686\n", " 0.99215686 0.99215686 0.99215686 0.9843137 0.3647059 0.32156864\n", " 0.32156864 0.21960784 0.15294118 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.07058824 0.85882354 0.99215686\n", " 0.99215686 0.99215686 0.99215686 0.99215686 0.7764706 0.7137255\n", " 0.96862745 0.94509804 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.3137255 0.6117647 0.41960785 0.99215686\n", " 0.99215686 0.8039216 0.04313726 0. 0.16862746 0.6039216\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.05490196 0.00392157 0.6039216 0.99215686 0.3529412\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.54509807 0.99215686 0.74509805 0.00784314 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.04313726\n", " 0.74509805 0.99215686 0.27450982 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0.13725491 0.94509804\n", " 0.88235295 0.627451 0.42352942 0.00392157 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.31764707 0.9411765 0.99215686\n", " 0.99215686 0.46666667 0.09803922 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.1764706 0.7294118 0.99215686 0.99215686\n", " 0.5882353 0.10588235 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.0627451 0.3647059 0.9882353 0.99215686 0.73333335\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0.9764706 0.99215686 0.9764706 0.2509804 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.18039216 0.50980395 0.7176471 0.99215686\n", " 0.99215686 0.8117647 0.00784314 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0.15294118 0.5803922\n", " 0.8980392 0.99215686 0.99215686 0.99215686 0.98039216 0.7137255\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.09411765 0.44705883 0.8666667 0.99215686 0.99215686 0.99215686\n", " 0.99215686 0.7882353 0.30588236 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0.09019608 0.25882354 0.8352941 0.99215686\n", " 0.99215686 0.99215686 0.99215686 0.7764706 0.31764707 0.00784314\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0.07058824 0.67058825\n", " 0.85882354 0.99215686 0.99215686 0.99215686 0.99215686 0.7647059\n", " 0.3137255 0.03529412 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.21568628 0.6745098 0.8862745 0.99215686 0.99215686 0.99215686\n", " 0.99215686 0.95686275 0.52156866 0.04313726 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0.53333336 0.99215686\n", " 0.99215686 0.99215686 0.83137256 0.5294118 0.5176471 0.0627451\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. ]\n" ] } ] }, { "cell_type": "code", "source": [ "# shape of the x_train_1 and x_test_1\n", "print(x_train_1.shape)\n", "print(x_test_1.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iLomk3kMLhT5", "outputId": "6b9dbf8c-3e6a-41fe-85ce-945b78e0fac8" }, "execution_count": 19, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(60000, 784)\n", "(10000, 784)\n" ] } ] }, { "cell_type": "markdown", "source": [ "## DNN Construction" ], "metadata": { "id": "GPtqqM9vLzkd" } }, { "cell_type": "code", "source": [ "model = Sequential()\n", "# input layer\n", "model.add(Dense(512,input_dim=784))\n", "model.add(Activation('relu'))\n", "# first hidden layer\n", "model.add(Dense(256))\n", "model.add(Activation('relu'))\n", "# 2nd hidden layer\n", "model.add(Dense(128))\n", "model.add(Activation('relu'))\n", "# 3rd hidden layer\n", "model.add(Dense(64))\n", "model.add(Activation('relu'))\n", "# 4th hidden layer\n", "model.add(Dense(64))\n", "model.add(Activation('relu'))\n", "# Output layer\n", "model.add(Dense(10))\n", "# map the score of each class into probability\n", "model.add(Activation('softmax'))\n", "\n", "model.compile(loss='sparse_categorical_crossentropy', optimizer= keras.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])\n", "\n" ], "metadata": { "id": "ueYDUk-dOPAE" }, "execution_count": 21, "outputs": [] }, { "cell_type": "code", "source": [ "# summary of my model\n", "model.summary()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1I0iwl5YRXfQ", "outputId": "d0392f6f-394d-421c-951b-22af07fe4bce" }, "execution_count": 22, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Model: \"sequential_1\"\n", "_________________________________________________________________\n", " Layer (type) Output Shape Param # \n", "=================================================================\n", " dense_1 (Dense) (None, 512) 401920 \n", " \n", " activation (Activation) (None, 512) 0 \n", " \n", " dense_2 (Dense) (None, 256) 131328 \n", " \n", " activation_1 (Activation) (None, 256) 0 \n", " \n", " dense_3 (Dense) (None, 128) 32896 \n", " \n", " activation_2 (Activation) (None, 128) 0 \n", " \n", " dense_4 (Dense) (None, 64) 8256 \n", " \n", " activation_3 (Activation) (None, 64) 0 \n", " \n", " dense_5 (Dense) (None, 64) 4160 \n", " \n", " activation_4 (Activation) (None, 64) 0 \n", " \n", " dense_6 (Dense) (None, 10) 650 \n", " \n", " activation_5 (Activation) (None, 10) 0 \n", " \n", "=================================================================\n", "Total params: 579,210\n", "Trainable params: 579,210\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ] }, { "cell_type": "markdown", "source": [ "## Training the model" ], "metadata": { "id": "wODnX-fpR060" } }, { "cell_type": "code", "source": [ "# choose the best model to save\n", "from tensorflow.keras.callbacks import ModelCheckpoint\n", "model_name='DNN_model.h5'\n", "model_checkpoint = ModelCheckpoint(model_name, monitor='loss', verbose=1, save_best_only=True)\n" ], "metadata": { "id": "OFo8josvR2d8" }, "execution_count": 24, "outputs": [] }, { "cell_type": "code", "source": [ "# train\n", "model.fit(x_train_1, y_train, batch_size=128,epochs=3, callbacks=[model_checkpoint], verbose=1)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nd_lQ2QdTwa5", "outputId": "ec11b247-f452-4d20-86fd-cbc4b516e4af" }, "execution_count": 26, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/3\n", "468/469 [============================>.] - ETA: 0s - loss: 0.2588 - accuracy: 0.9224\n", "Epoch 1: loss improved from inf to 0.25850, saving model to DNN_model.h5\n", "469/469 [==============================] - 8s 14ms/step - loss: 0.2585 - accuracy: 0.9225\n", "Epoch 2/3\n", "468/469 [============================>.] - ETA: 0s - loss: 0.0953 - accuracy: 0.9712\n", "Epoch 2: loss improved from 0.25850 to 0.09514, saving model to DNN_model.h5\n", "469/469 [==============================] - 6s 13ms/step - loss: 0.0951 - accuracy: 0.9712\n", "Epoch 3/3\n", "466/469 [============================>.] - ETA: 0s - loss: 0.0640 - accuracy: 0.9797\n", "Epoch 3: loss improved from 0.09514 to 0.06397, saving model to DNN_model.h5\n", "469/469 [==============================] - 6s 13ms/step - loss: 0.0640 - accuracy: 0.9797\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 26 } ] }, { "cell_type": "markdown", "source": [ "## Testing the model" ], "metadata": { "id": "OuWJytD6VsE6" } }, { "cell_type": "code", "source": [ "new_model = Sequential()\n", "# input layer\n", "new_model.add(Dense(512,input_dim=784))\n", "new_model.add(Activation('relu'))\n", "# first hidden layer\n", "new_model.add(Dense(256))\n", "new_model.add(Activation('relu'))\n", "# 2nd hidden layer\n", "new_model.add(Dense(128))\n", "new_model.add(Activation('relu'))\n", "# 3rd hidden layer\n", "new_model.add(Dense(64))\n", "new_model.add(Activation('relu'))\n", "# 4th hidden layer\n", "new_model.add(Dense(64))\n", "new_model.add(Activation('relu'))\n", "# Output layer\n", "new_model.add(Dense(10))\n", "# map the score of each class into probability\n", "new_model.add(Activation('softmax'))\n", "\n", "new_model.compile(loss='sparse_categorical_crossentropy', optimizer= keras.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])\n", "\n", "new_model.load_weights('DNN_model.h5')\n", "model.evaluate(x_test_1, y_test, verbose=1)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "eMgdmLckVvKP", "outputId": "ae3dff3b-6b13-4848-fdc7-e8eb717e8879" }, "execution_count": 28, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "313/313 [==============================] - 2s 5ms/step - loss: 0.0826 - accuracy: 0.9752\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "[0.08256571739912033, 0.9751999974250793]" ] }, "metadata": {}, "execution_count": 28 } ] } ] }