diff --git a/tensorflow_examples/models/Complete MNIST classification comparison.ipynb b/tensorflow_examples/models/Complete MNIST classification comparison.ipynb new file mode 100644 index 00000000000..f35d1804fec --- /dev/null +++ b/tensorflow_examples/models/Complete MNIST classification comparison.ipynb @@ -0,0 +1,1091 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 34, + "id": "ec79adc4", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import confusion_matrix\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "54ec7992", + "metadata": {}, + "outputs": [], + "source": [ + "mnist = tf.keras.datasets.mnist" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b0114801", + "metadata": {}, + "outputs": [], + "source": [ + "(x_train,y_train),(x_test,y_test) = mnist.load_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "bf790e12", + "metadata": {}, + "outputs": [], + "source": [ + "x_train = x_train/255" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "71675baa", + "metadata": {}, + "outputs": [], + "source": [ + "x_test = x_test/255" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "d1643f50", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(60000, 28, 28)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We have rescaled the data for easier computations\n", + "x_train.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "dc39a1a3", + "metadata": {}, + "outputs": [], + "source": [ + "# As we can see that input shape is 28,28 for a specific mnist data image and there are 60000 training examples" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "2fcb1c34", + "metadata": {}, + "outputs": [], + "source": [ + "# Lets build a ANN model to tryout the classification model\n", + "model_1 = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape =(28,28)),\n", + " tf.keras.layers.Dense(units = 128, activation = 'relu'),\n", + " tf.keras.layers.Dropout(0.2),\n", + " tf.keras.layers.Dense(units = 10, activation = 'sigmoid')])" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "0c8d38bc", + "metadata": {}, + "outputs": [], + "source": [ + "model_1.compile(optimizer = 'Adam',loss = 'sparse_categorical_crossentropy',metrics = 'accuracy')" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "ddb864bb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/15\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.3004 - accuracy: 0.9127 - val_loss: 0.1324 - val_accuracy: 0.9595\n", + "Epoch 2/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.1456 - accuracy: 0.9565 - val_loss: 0.1020 - val_accuracy: 0.9689\n", + "Epoch 3/15\n", + "1875/1875 [==============================] - 2s 1ms/step - loss: 0.1076 - accuracy: 0.9672 - val_loss: 0.0877 - val_accuracy: 0.9731\n", + "Epoch 4/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0890 - accuracy: 0.9726 - val_loss: 0.0824 - val_accuracy: 0.9734\n", + "Epoch 5/15\n", + "1875/1875 [==============================] - 3s 2ms/step - loss: 0.0757 - accuracy: 0.9761 - val_loss: 0.0731 - val_accuracy: 0.9772\n", + "Epoch 6/15\n", + "1875/1875 [==============================] - 3s 2ms/step - loss: 0.0650 - accuracy: 0.9790 - val_loss: 0.0741 - val_accuracy: 0.9778\n", + "Epoch 7/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0589 - accuracy: 0.9809 - val_loss: 0.0724 - val_accuracy: 0.9774\n", + "Epoch 8/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0517 - accuracy: 0.9827 - val_loss: 0.0710 - val_accuracy: 0.9787\n", + "Epoch 9/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0473 - accuracy: 0.9849 - val_loss: 0.0707 - val_accuracy: 0.9779\n", + "Epoch 10/15\n", + "1875/1875 [==============================] - 3s 2ms/step - loss: 0.0438 - accuracy: 0.9858 - val_loss: 0.0732 - val_accuracy: 0.9799\n", + "Epoch 11/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0401 - accuracy: 0.9865 - val_loss: 0.0684 - val_accuracy: 0.9812\n", + "Epoch 12/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0390 - accuracy: 0.9871 - val_loss: 0.0775 - val_accuracy: 0.9788\n", + "Epoch 13/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0366 - accuracy: 0.9873 - val_loss: 0.0792 - val_accuracy: 0.9808\n", + "Epoch 14/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0350 - accuracy: 0.9877 - val_loss: 0.0717 - val_accuracy: 0.9794\n", + "Epoch 15/15\n", + "1875/1875 [==============================] - 3s 1ms/step - loss: 0.0330 - accuracy: 0.9890 - val_loss: 0.0715 - val_accuracy: 0.9809\n" + ] + } + ], + "source": [ + "r = model_1.fit(x_train,y_train,validation_data = (x_test,y_test),epochs = 15)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "f5efce43", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 0s 629us/step\n" + ] + } + ], + "source": [ + "# We have fit our model and tested the validation accuracy as well\n", + "# Let us plot the confusion matrix for this model\n", + "y_pred = model_1.predict(x_test).argmax(axis = 1)\n", + "cm = confusion_matrix(y_pred,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "4d3dd20e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import itertools\n", + "labels = [0,1,2,3,4,5,6,7,8,9]\n", + "plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)\n", + "plt.title(\"Confusion Matrix\")\n", + "plt.colorbar()\n", + "tick_marks = np.arange(len(labels))\n", + "plt.xticks(tick_marks, labels, rotation=45)\n", + "plt.yticks(tick_marks, labels)\n", + "\n", + "# Normalize the confusion matrix\n", + "\n", + "\n", + "# Use white text if squares are dark; otherwise black\n", + "thresh = cm.max() / 2.\n", + "for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", + " color = \"white\" if cm[i, j] > thresh else \"black\"\n", + " plt.text(j, i, format(cm[i, j], '.2f'), horizontalalignment=\"center\", color=color)\n", + "\n", + "plt.tight_layout()\n", + "plt.ylabel('True label')\n", + "plt.xlabel('Predicted label')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "7a1b2d7e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The predicted label was 5 where as the real was 8\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# As with this confusion matrix we can see that classification for similar looking classes like 2,7 the misclassification number is high\n", + "# Let us look this in-depth\n", + "misclass = np.where(y_test != y_pred)[0]\n", + "i = np.random.choice(misclass)\n", + "plt.imshow(x_test[i],cmap = 'gray')\n", + "print(\"The predicted label was \"+str(y_pred[i])+' where as the real was '+str(y_test[i])) " + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "e8ba12cf", + "metadata": {}, + "outputs": [], + "source": [ + "# By re-running you can for yourself what is the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "293b1b97", + "metadata": {}, + "outputs": [], + "source": [ + "# Let us now try using a model with some more layers\n", + "model_2 = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape =(28,28)),\n", + " tf.keras.layers.Dense(units = 16, activation = 'relu'),\n", + " tf.keras.layers.Dense(units = 32, activation = 'relu'),\n", + " tf.keras.layers.Dense(units = 64, activation = 'relu'),\n", + " tf.keras.layers.Dense(units = 128, activation = 'relu'),\n", + " tf.keras.layers.Dense(units = 256, activation = 'relu'),\n", + " tf.keras.layers.Dense(units = 512, activation = 'relu'),\n", + " tf.keras.layers.Dropout(0.2),\n", + " tf.keras.layers.Dense(units = 10, activation = 'sigmoid')])" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "79583980", + "metadata": {}, + "outputs": [], + "source": [ + "model_2.compile(optimizer = 'Adam',loss = 'sparse_categorical_crossentropy',metrics = 'accuracy')" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "163fe0aa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/30\n", + "1875/1875 [==============================] - 5s 2ms/step - loss: 0.3866 - accuracy: 0.8780 - val_loss: 0.2297 - val_accuracy: 0.9298\n", + "Epoch 2/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.2071 - accuracy: 0.9381 - val_loss: 0.2173 - val_accuracy: 0.9373\n", + "Epoch 3/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.1709 - accuracy: 0.9493 - val_loss: 0.1787 - val_accuracy: 0.9517\n", + "Epoch 4/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.1486 - accuracy: 0.9552 - val_loss: 0.1719 - val_accuracy: 0.9531\n", + "Epoch 5/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.1343 - accuracy: 0.9603 - val_loss: 0.2102 - val_accuracy: 0.9456\n", + "Epoch 6/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.1235 - accuracy: 0.9622 - val_loss: 0.1347 - val_accuracy: 0.9616\n", + "Epoch 7/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.1137 - accuracy: 0.9657 - val_loss: 0.1747 - val_accuracy: 0.9551\n", + "Epoch 8/30\n", + "1875/1875 [==============================] - 5s 3ms/step - loss: 0.1070 - accuracy: 0.9673 - val_loss: 0.1449 - val_accuracy: 0.9590\n", + "Epoch 9/30\n", + "1875/1875 [==============================] - 5s 2ms/step - loss: 0.1016 - accuracy: 0.9694 - val_loss: 0.1432 - val_accuracy: 0.9625\n", + "Epoch 10/30\n", + "1875/1875 [==============================] - 4s 2ms/step - loss: 0.0932 - accuracy: 0.9714 - val_loss: 0.1716 - val_accuracy: 0.9538\n", + "Epoch 11/30\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0951 - accuracy: 0.9713 - val_loss: 0.1465 - val_accuracy: 0.9650\n", + "Epoch 12/30\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0876 - accuracy: 0.9724 - val_loss: 0.1511 - val_accuracy: 0.9633\n", + "Epoch 13/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0858 - accuracy: 0.9742 - val_loss: 0.1697 - val_accuracy: 0.9556\n", + "Epoch 14/30\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0835 - accuracy: 0.9750 - val_loss: 0.1378 - val_accuracy: 0.9641\n", + "Epoch 15/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0771 - accuracy: 0.9764 - val_loss: 0.1490 - val_accuracy: 0.9613\n", + "Epoch 16/30\n", + "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0772 - accuracy: 0.9766 - val_loss: 0.1362 - val_accuracy: 0.9659\n", + "Epoch 17/30\n", + "1875/1875 [==============================] - 11s 6ms/step - loss: 0.0717 - accuracy: 0.9778 - val_loss: 0.1569 - val_accuracy: 0.9657\n", + "Epoch 18/30\n", + "1875/1875 [==============================] - 9s 5ms/step - loss: 0.0716 - accuracy: 0.9776 - val_loss: 0.1596 - val_accuracy: 0.9631\n", + "Epoch 19/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0706 - accuracy: 0.9784 - val_loss: 0.1566 - val_accuracy: 0.9627\n", + "Epoch 20/30\n", + "1875/1875 [==============================] - 9s 5ms/step - loss: 0.0684 - accuracy: 0.9792 - val_loss: 0.1611 - val_accuracy: 0.9631\n", + "Epoch 21/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0645 - accuracy: 0.9796 - val_loss: 0.1774 - val_accuracy: 0.9612\n", + "Epoch 22/30\n", + "1875/1875 [==============================] - 9s 5ms/step - loss: 0.0668 - accuracy: 0.9794 - val_loss: 0.1660 - val_accuracy: 0.9618\n", + "Epoch 23/30\n", + "1875/1875 [==============================] - 9s 5ms/step - loss: 0.0667 - accuracy: 0.9798 - val_loss: 0.2110 - val_accuracy: 0.9532\n", + "Epoch 24/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0635 - accuracy: 0.9805 - val_loss: 0.1722 - val_accuracy: 0.9633\n", + "Epoch 25/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0628 - accuracy: 0.9805 - val_loss: 0.1729 - val_accuracy: 0.9645\n", + "Epoch 26/30\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0610 - accuracy: 0.9812 - val_loss: 0.1834 - val_accuracy: 0.9618\n", + "Epoch 27/30\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0601 - accuracy: 0.9813 - val_loss: 0.2225 - val_accuracy: 0.9618\n", + "Epoch 28/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0578 - accuracy: 0.9813 - val_loss: 0.1821 - val_accuracy: 0.9628\n", + "Epoch 29/30\n", + "1875/1875 [==============================] - 8s 5ms/step - loss: 0.0574 - accuracy: 0.9822 - val_loss: 0.1959 - val_accuracy: 0.9650\n", + "Epoch 30/30\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0622 - accuracy: 0.9810 - val_loss: 0.1872 - val_accuracy: 0.9630\n" + ] + } + ], + "source": [ + "r_2 = model_2.fit(x_train,y_train,validation_data = (x_test,y_test),epochs = 30)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "b3cde8b7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 0s 1ms/step - loss: 0.0933 - accuracy: 0.9808\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.09328067302703857, 0.9807999730110168]" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_1.evaluate(x_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "2abd2bbc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 1s 2ms/step - loss: 0.1872 - accuracy: 0.9630\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.18715877830982208, 0.9629999995231628]" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_2.evaluate(x_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "62656a7a", + "metadata": {}, + "outputs": [], + "source": [ + "# So even after increasing the number of epochs and trying more layers our accuracy for validation set is worse and hence using this was not a great idea\n", + "# Lets go for a CNN method \n", + "model_3 = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32,(3,3),input_shape = (28,28,1),activation ='relu'),\n", + " tf.keras.layers.AveragePooling2D((2,2)),\n", + " tf.keras.layers.Conv2D(64,(3,3),activation = 'relu'),\n", + " tf.keras.layers.AveragePooling2D((2,2)),\n", + "# tf.keras.layers.Conv2D(64,(3,3),padding = 'valid',activation = 'relu'),\n", + "# tf.keras.layers.AveragePooling2D((2,2)),\n", + "# tf.keras.layers.Conv2D(128,(3,3),padding = 'valid',activation = 'relu'),\n", + "# tf.keras.layers.AveragePooling2D((2,2)),\n", + " tf.keras.layers.Flatten(),\n", + " tf.keras.layers.Dense(256,activation = 'relu'),\n", + " tf.keras.layers.Dense(10,activation = 'softmax')])" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "96459b42", + "metadata": {}, + "outputs": [], + "source": [ + "model_3.compile(optimizer = 'Adam',loss = 'sparse_categorical_crossentropy',metrics = 'accuracy')" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "id": "acff80a8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "1875/1875 [==============================] - 30s 16ms/step - loss: 0.1458 - accuracy: 0.9567 - val_loss: 0.0497 - val_accuracy: 0.9837\n", + "Epoch 2/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0471 - accuracy: 0.9857 - val_loss: 0.0355 - val_accuracy: 0.9883\n", + "Epoch 3/10\n", + "1875/1875 [==============================] - 25s 13ms/step - loss: 0.0331 - accuracy: 0.9895 - val_loss: 0.0508 - val_accuracy: 0.9841\n", + "Epoch 4/10\n", + "1875/1875 [==============================] - 28s 15ms/step - loss: 0.0258 - accuracy: 0.9916 - val_loss: 0.0310 - val_accuracy: 0.9894\n", + "Epoch 5/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0191 - accuracy: 0.9938 - val_loss: 0.0261 - val_accuracy: 0.9912\n", + "Epoch 6/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0150 - accuracy: 0.9952 - val_loss: 0.0310 - val_accuracy: 0.9911\n", + "Epoch 7/10\n", + "1875/1875 [==============================] - 25s 13ms/step - loss: 0.0117 - accuracy: 0.9960 - val_loss: 0.0228 - val_accuracy: 0.9936\n", + "Epoch 8/10\n", + "1875/1875 [==============================] - 25s 13ms/step - loss: 0.0097 - accuracy: 0.9970 - val_loss: 0.0307 - val_accuracy: 0.9901\n", + "Epoch 9/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0079 - accuracy: 0.9974 - val_loss: 0.0341 - val_accuracy: 0.9904\n", + "Epoch 10/10\n", + "1875/1875 [==============================] - 28s 15ms/step - loss: 0.0068 - accuracy: 0.9979 - val_loss: 0.0404 - val_accuracy: 0.9891\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_3.fit(x_train,y_train,validation_data = (x_test,y_test),epochs = 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "19037950", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 1s 3ms/step\n" + ] + } + ], + "source": [ + "y_pred_3 = model_3.predict(x_test).argmax(axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "id": "ad1b853e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 1s 3ms/step - loss: 0.0404 - accuracy: 0.9891\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.04035135358572006, 0.9890999794006348]" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_3.evaluate(x_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "id": "edfc4220", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# The validation accuracy for model_3 or CNN is better than the previous best model by some good margin so let us plot its confusion matrix \n", + "cm = confusion_matrix(y_pred_3,y_test)\n", + "labels = [0,1,2,3,4,5,6,7,8,9]\n", + "plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)\n", + "plt.title(\"Confusion Matrix\")\n", + "plt.colorbar()\n", + "tick_marks = np.arange(len(labels))\n", + "plt.xticks(tick_marks, labels, rotation=45)\n", + "plt.yticks(tick_marks, labels)\n", + "\n", + "# Use white text if squares are dark; otherwise black\n", + "thresh = cm.max() / 2.\n", + "for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", + " color = \"white\" if cm[i, j] > thresh else \"black\"\n", + " plt.text(j, i, format(cm[i, j], '.2f'), horizontalalignment=\"center\", color=color)\n", + "\n", + "plt.tight_layout()\n", + "plt.ylabel('True label')\n", + "plt.xlabel('Predicted label')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "id": "d29adf66", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The predicted label was 3 where as the real was 8\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# There is still some confusion between some numbers but let us see what was the test input \n", + "misclass = np.where(y_test != y_pred_3)[0]\n", + "i = np.random.choice(misclass)\n", + "plt.imshow(x_test[i],cmap = 'gray')\n", + "print(\"The predicted label was \"+str(y_pred[i])+' where as the real was '+str(y_test[i])) " + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "id": "11107664", + "metadata": {}, + "outputs": [], + "source": [ + "# You can see the problem of misclassification with the ANN has persisted but has reduced by some margin with this model.\n", + "# Also you can see that misclassified data is more blurrier and confusing even to us humans.\n", + "# You can see that our CNN has overfitted so let us try regularizing by a dropout layer.\n", + "# We do not need to do batch normalization as our data is not that huge where it would help significantly hence we skip it here\n", + "model_4 = tf.keras.models.Sequential([tf.keras.layers.Conv2D(32,(3,3),input_shape = (28,28,1),activation ='relu'),\n", + " tf.keras.layers.AveragePooling2D((2,2)),\n", + " tf.keras.layers.Conv2D(64,(3,3),activation = 'relu'),\n", + " tf.keras.layers.AveragePooling2D((2,2)),\n", + " tf.keras.layers.Flatten(),\n", + " tf.keras.layers.Dense(256,activation = 'relu'),\n", + " tf.keras.layers.Dropout(0.2),\n", + " tf.keras.layers.Dense(10,activation = 'softmax')])" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "id": "7c01536e", + "metadata": {}, + "outputs": [], + "source": [ + "model_4.compile(optimizer = 'Adam',loss = 'sparse_categorical_crossentropy',metrics = ['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "id": "1b9bf5be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "1875/1875 [==============================] - 27s 14ms/step - loss: 0.1550 - accuracy: 0.9533 - val_loss: 0.0480 - val_accuracy: 0.9854\n", + "Epoch 2/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0538 - accuracy: 0.9834 - val_loss: 0.0437 - val_accuracy: 0.9854\n", + "Epoch 3/10\n", + "1875/1875 [==============================] - 27s 14ms/step - loss: 0.0394 - accuracy: 0.9876 - val_loss: 0.0306 - val_accuracy: 0.9899\n", + "Epoch 4/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0304 - accuracy: 0.9907 - val_loss: 0.0273 - val_accuracy: 0.9910\n", + "Epoch 5/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0243 - accuracy: 0.9926 - val_loss: 0.0360 - val_accuracy: 0.9887\n", + "Epoch 6/10\n", + "1875/1875 [==============================] - 27s 14ms/step - loss: 0.0206 - accuracy: 0.9936 - val_loss: 0.0259 - val_accuracy: 0.9919\n", + "Epoch 7/10\n", + "1875/1875 [==============================] - 28s 15ms/step - loss: 0.0167 - accuracy: 0.9950 - val_loss: 0.0226 - val_accuracy: 0.9927\n", + "Epoch 8/10\n", + "1875/1875 [==============================] - 30s 16ms/step - loss: 0.0138 - accuracy: 0.9954 - val_loss: 0.0238 - val_accuracy: 0.9932\n", + "Epoch 9/10\n", + "1875/1875 [==============================] - 26s 14ms/step - loss: 0.0128 - accuracy: 0.9959 - val_loss: 0.0274 - val_accuracy: 0.9925\n", + "Epoch 10/10\n", + "1875/1875 [==============================] - 25s 13ms/step - loss: 0.0103 - accuracy: 0.9966 - val_loss: 0.0280 - val_accuracy: 0.9915\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_4.fit(x_train,y_train,validation_data = (x_test,y_test),epochs = 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "f0fd9e60", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 1s 3ms/step - loss: 0.0280 - accuracy: 0.9915\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.027956563979387283, 0.9915000200271606]" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_4.evaluate(x_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "bf160d17", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 1s 3ms/step\n" + ] + } + ], + "source": [ + "# As you can see this has performed even better than the previous best CNN by a significant margin \n", + "y_pred_4 = model_4.predict(x_test).argmax(axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "cddd0a9b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "cm = confusion_matrix(y_pred_4,y_test)\n", + "labels = [0,1,2,3,4,5,6,7,8,9]\n", + "plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)\n", + "plt.title(\"Confusion Matrix\")\n", + "plt.colorbar()\n", + "tick_marks = np.arange(len(labels))\n", + "plt.xticks(tick_marks, labels, rotation=45)\n", + "plt.yticks(tick_marks, labels)\n", + "\n", + "# Use white text if squares are dark; otherwise black\n", + "thresh = cm.max() / 2.\n", + "for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n", + " color = \"white\" if cm[i, j] > thresh else \"black\"\n", + " plt.text(j, i, format(cm[i, j], '.2f'), horizontalalignment=\"center\", color=color)\n", + "\n", + "plt.tight_layout()\n", + "plt.ylabel('True label')\n", + "plt.xlabel('Predicted label')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "id": "865323ed", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The predicted label was 6 where as the real was 4\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "misclass = np.where(y_test != y_pred_4)[0]\n", + "i = np.random.choice(misclass)\n", + "plt.imshow(x_test[i],cmap = 'gray')\n", + "print(\"The predicted label was \"+str(y_pred[i])+' where as the real was '+str(y_test[i])) " + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "id": "055ec6bc", + "metadata": {}, + "outputs": [], + "source": [ + "# As you can see the images gets blurry that is when the output is getting fuzzier for the CNN network\n", + "# Also we can see that the humans also can mistake in classifying such images " + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "id": "01ca5d75", + "metadata": {}, + "outputs": [], + "source": [ + "# Let us try using RNN for the same image classification problem\n", + "model_5 = tf.keras.models.Sequential([\n", + " tf.keras.layers.InputLayer(input_shape = (28,28)),\n", + " tf.keras.layers.SimpleRNN(units = 128,activation= 'relu'),\n", + " tf.keras.layers.Dense(units = 10,activation = 'softmax')\n", + "])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "id": "905106f3", + "metadata": {}, + "outputs": [], + "source": [ + "model_5.compile(optimizer = 'Adam',loss = 'sparse_categorical_crossentropy',metrics = 'accuracy')" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "id": "677562c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.4194 - accuracy: 0.8659 - val_loss: 0.2063 - val_accuracy: 0.9363\n", + "Epoch 2/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1903 - accuracy: 0.9460 - val_loss: 0.1897 - val_accuracy: 0.9453\n", + "Epoch 3/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1615 - accuracy: 0.9550 - val_loss: 0.1423 - val_accuracy: 0.9629\n", + "Epoch 4/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1434 - accuracy: 0.9591 - val_loss: 0.1482 - val_accuracy: 0.9567\n", + "Epoch 5/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1263 - accuracy: 0.9643 - val_loss: 0.1109 - val_accuracy: 0.9718\n", + "Epoch 6/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1197 - accuracy: 0.9664 - val_loss: 0.1064 - val_accuracy: 0.9678\n", + "Epoch 7/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1135 - accuracy: 0.9689 - val_loss: 0.1323 - val_accuracy: 0.9603\n", + "Epoch 8/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1062 - accuracy: 0.9708 - val_loss: 0.0900 - val_accuracy: 0.9748\n", + "Epoch 9/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.1028 - accuracy: 0.9715 - val_loss: 0.1519 - val_accuracy: 0.9564\n", + "Epoch 10/10\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0983 - accuracy: 0.9728 - val_loss: 0.0938 - val_accuracy: 0.9748\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 175, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_5.fit(x_train,y_train,validation_data = (x_test,y_test),epochs = 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "id": "dddf981b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 0s 2ms/step - loss: 0.0938 - accuracy: 0.9748\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.09380391240119934, 0.9747999906539917]" + ] + }, + "execution_count": 176, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_5.evaluate(x_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "id": "3ea521e0", + "metadata": {}, + "outputs": [], + "source": [ + "# So this RNN has worked worse than our originial ANN which means we need to look at some more powerful RNN technique\n", + "# Let us try using LSTMS" + ] + }, + { + "cell_type": "code", + "execution_count": 179, + "id": "52a2d2d5", + "metadata": {}, + "outputs": [], + "source": [ + "model_7 = tf.keras.models.Sequential([tf.keras.layers.LSTM(128,input_shape = (28,28),activation = 'relu'),\n", + " tf.keras.layers.Dense(10,activation = 'softmax')])" + ] + }, + { + "cell_type": "code", + "execution_count": 180, + "id": "416437db", + "metadata": {}, + "outputs": [], + "source": [ + "model_7.compile(optimizer = 'Adam',loss = 'sparse_categorical_crossentropy',metrics = ['accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "id": "74fd24dc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "1875/1875 [==============================] - 22s 11ms/step - loss: 0.5576 - accuracy: 0.8191 - val_loss: 0.1467 - val_accuracy: 0.9561\n", + "Epoch 2/10\n", + "1875/1875 [==============================] - 20s 11ms/step - loss: 0.1228 - accuracy: 0.9630 - val_loss: 0.0785 - val_accuracy: 0.9748\n", + "Epoch 3/10\n", + "1875/1875 [==============================] - 21s 11ms/step - loss: 0.0866 - accuracy: 0.9736 - val_loss: 0.0690 - val_accuracy: 0.9782\n", + "Epoch 4/10\n", + "1875/1875 [==============================] - 22s 12ms/step - loss: 0.0681 - accuracy: 0.9799 - val_loss: 0.0620 - val_accuracy: 0.9827\n", + "Epoch 5/10\n", + "1875/1875 [==============================] - 23s 12ms/step - loss: 0.0571 - accuracy: 0.9824 - val_loss: 0.0510 - val_accuracy: 0.9823\n", + "Epoch 6/10\n", + "1875/1875 [==============================] - 21s 11ms/step - loss: 0.0483 - accuracy: 0.9858 - val_loss: 0.0414 - val_accuracy: 0.9867\n", + "Epoch 7/10\n", + "1875/1875 [==============================] - 21s 11ms/step - loss: 0.0403 - accuracy: 0.9875 - val_loss: 0.0455 - val_accuracy: 0.9859\n", + "Epoch 8/10\n", + "1875/1875 [==============================] - 21s 11ms/step - loss: 0.0360 - accuracy: 0.9894 - val_loss: 0.0443 - val_accuracy: 0.9869\n", + "Epoch 9/10\n", + "1875/1875 [==============================] - 21s 11ms/step - loss: 0.0317 - accuracy: 0.9899 - val_loss: 0.0446 - val_accuracy: 0.9872\n", + "Epoch 10/10\n", + "1875/1875 [==============================] - 20s 11ms/step - loss: 0.0297 - accuracy: 0.9912 - val_loss: 0.0405 - val_accuracy: 0.9889\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 181, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_7.fit(x_train,y_train,validation_data = (x_test,y_test),epochs = 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "id": "05dcdcb2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "313/313 [==============================] - 1s 4ms/step - loss: 0.0405 - accuracy: 0.9889\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.040485356003046036, 0.9889000058174133]" + ] + }, + "execution_count": 182, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_7.evaluate(x_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "id": "e89e137b", + "metadata": {}, + "outputs": [], + "source": [ + "# As you can see LSTMS have worked well in comparison with RNN and other ANN \n", + "# So finally we might conclude that the regularized CNN is the most helpful when we are classifying an mnist dataset.\n", + "# Also we can use the same analysis or code to build a fashion dataset model as well." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e1fecf9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}