CNNFashionMNIST.ipynb (10351B)
1 { 2 "cells": [ 3 { 4 "cell_type": "markdown", 5 "metadata": {}, 6 "source": [ 7 "91.52% Accuracy" 8 ] 9 }, 10 { 11 "cell_type": "code", 12 "execution_count": 120, 13 "metadata": {}, 14 "outputs": [], 15 "source": [ 16 "import tensorflow as tf\n", 17 "\n", 18 "fashion_mnist = tf.keras.datasets.fashion_mnist.load_data()\n", 19 "\n", 20 "# Split train, validation, test\n", 21 "(X_train_full, y_train_full) , (X_test, y_test) = fashion_mnist\n", 22 "X_train, y_train = X_train_full[:-5000], y_train_full[:-5000]\n", 23 "X_valid, y_valid = X_train_full[-5000:], y_train_full[-5000:]\n", 24 "\n", 25 "y_train = tf.one_hot(y_train, depth=10)\n", 26 "y_valid = tf.one_hot(y_valid, depth=10)\n", 27 "y_test = tf.one_hot(y_test, depth=10)\n", 28 "X_train, X_valid, X_test = X_train / 255., X_valid / 255., X_test / 255." 29 ] 30 }, 31 { 32 "cell_type": "code", 33 "execution_count": 101, 34 "metadata": {}, 35 "outputs": [ 36 { 37 "data": { 38 "text/plain": [ 39 "(55000, 28, 28)" 40 ] 41 }, 42 "execution_count": 101, 43 "metadata": {}, 44 "output_type": "execute_result" 45 } 46 ], 47 "source": [ 48 "X_train.shape" 49 ] 50 }, 51 { 52 "cell_type": "code", 53 "execution_count": 102, 54 "metadata": {}, 55 "outputs": [], 56 "source": [ 57 "import keras \n", 58 "\n", 59 "model = keras.Sequential(layers=[\n", 60 " keras.layers.Input(shape=[28,28,1]),\n", 61 " keras.layers.Conv2D(activation='relu', kernel_size=7, filters=32, padding='same'),\n", 62 " keras.layers.MaxPool2D(),\n", 63 " keras.layers.BatchNormalization(),\n", 64 " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=64, padding='same'),\n", 65 " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=64, padding='same'),\n", 66 " keras.layers.MaxPool2D(),\n", 67 " keras.layers.BatchNormalization(),\n", 68 " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=128, padding='same'),\n", 69 " keras.layers.Conv2D(activation='relu', kernel_size=3, filters=128, padding='same'),\n", 70 " keras.layers.BatchNormalization(),\n", 71 " keras.layers.Flatten(),\n", 72 " keras.layers.Dense(256, activation='relu'),\n", 73 " keras.layers.Dropout(.2),\n", 74 " keras.layers.Dense(128, activation='relu'),\n", 75 " keras.layers.Dropout(.2),\n", 76 " keras.layers.Dense(10 , activation='softmax')\n", 77 "])" 78 ] 79 }, 80 { 81 "cell_type": "markdown", 82 "metadata": {}, 83 "source": [ 84 "I should have use SPARSE categorical cross entropy. This stops the need to encode the expected outputs as [0,0,1] to represent 3. " 85 ] 86 }, 87 { 88 "cell_type": "code", 89 "execution_count": 103, 90 "metadata": {}, 91 "outputs": [], 92 "source": [ 93 "model.compile(loss=keras.losses.categorical_crossentropy, optimizer='adam', metrics=['accuracy'])" 94 ] 95 }, 96 { 97 "cell_type": "code", 98 "execution_count": 104, 99 "metadata": {}, 100 "outputs": [ 101 { 102 "name": "stdout", 103 "output_type": "stream", 104 "text": [ 105 "Epoch 1/20\n", 106 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m64s\u001b[0m 36ms/step - accuracy: 0.7764 - loss: 0.6517 - val_accuracy: 0.8630 - val_loss: 0.3664\n", 107 "Epoch 2/20\n", 108 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.8840 - loss: 0.3228 - val_accuracy: 0.8920 - val_loss: 0.2956\n", 109 "Epoch 3/20\n", 110 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.8992 - loss: 0.2802 - val_accuracy: 0.9050 - val_loss: 0.2503\n", 111 "Epoch 4/20\n", 112 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9110 - loss: 0.2451 - val_accuracy: 0.9032 - val_loss: 0.2733\n", 113 "Epoch 5/20\n", 114 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 36ms/step - accuracy: 0.9147 - loss: 0.2305 - val_accuracy: 0.8996 - val_loss: 0.2790\n", 115 "Epoch 6/20\n", 116 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9254 - loss: 0.2052 - val_accuracy: 0.9090 - val_loss: 0.2362\n", 117 "Epoch 7/20\n", 118 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 35ms/step - accuracy: 0.9308 - loss: 0.1841 - val_accuracy: 0.9138 - val_loss: 0.2550\n", 119 "Epoch 8/20\n", 120 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9382 - loss: 0.1669 - val_accuracy: 0.9144 - val_loss: 0.2555\n", 121 "Epoch 9/20\n", 122 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9438 - loss: 0.1507 - val_accuracy: 0.9154 - val_loss: 0.2593\n", 123 "Epoch 10/20\n", 124 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9520 - loss: 0.1354 - val_accuracy: 0.9178 - val_loss: 0.2691\n", 125 "Epoch 11/20\n", 126 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 36ms/step - accuracy: 0.9519 - loss: 0.1275 - val_accuracy: 0.9186 - val_loss: 0.2308\n", 127 "Epoch 12/20\n", 128 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9592 - loss: 0.1089 - val_accuracy: 0.9130 - val_loss: 0.2994\n", 129 "Epoch 13/20\n", 130 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9592 - loss: 0.1121 - val_accuracy: 0.9234 - val_loss: 0.2817\n", 131 "Epoch 14/20\n", 132 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 36ms/step - accuracy: 0.9650 - loss: 0.0970 - val_accuracy: 0.9172 - val_loss: 0.2725\n", 133 "Epoch 15/20\n", 134 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9694 - loss: 0.0843 - val_accuracy: 0.9184 - val_loss: 0.2797\n", 135 "Epoch 16/20\n", 136 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9696 - loss: 0.0867 - val_accuracy: 0.9208 - val_loss: 0.2503\n", 137 "Epoch 17/20\n", 138 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9728 - loss: 0.0778 - val_accuracy: 0.9230 - val_loss: 0.3293\n", 139 "Epoch 18/20\n", 140 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9738 - loss: 0.0708 - val_accuracy: 0.9176 - val_loss: 0.3096\n", 141 "Epoch 19/20\n", 142 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9741 - loss: 0.0707 - val_accuracy: 0.9156 - val_loss: 0.3369\n", 143 "Epoch 20/20\n", 144 "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 36ms/step - accuracy: 0.9796 - loss: 0.0589 - val_accuracy: 0.9224 - val_loss: 0.3426\n" 145 ] 146 }, 147 { 148 "data": { 149 "text/plain": [ 150 "<keras.src.callbacks.history.History at 0x7f0d4c974dd0>" 151 ] 152 }, 153 "execution_count": 104, 154 "metadata": {}, 155 "output_type": "execute_result" 156 } 157 ], 158 "source": [ 159 "model.fit(X_train,y_train, validation_data=[X_valid, y_valid], epochs=20)" 160 ] 161 }, 162 { 163 "cell_type": "code", 164 "execution_count": 117, 165 "metadata": {}, 166 "outputs": [ 167 { 168 "name": "stdout", 169 "output_type": "stream", 170 "text": [ 171 "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 8ms/step\n" 172 ] 173 } 174 ], 175 "source": [ 176 "from sklearn.metrics import accuracy_score\n", 177 "import numpy as np \n", 178 "\n", 179 "preds = model.predict(X_test)\n", 180 "preds = np.argmax(preds, axis=1)" 181 ] 182 }, 183 { 184 "cell_type": "code", 185 "execution_count": 121, 186 "metadata": {}, 187 "outputs": [], 188 "source": [ 189 "y_test = np.array(y_test).argmax(axis=1)" 190 ] 191 }, 192 { 193 "cell_type": "code", 194 "execution_count": 123, 195 "metadata": {}, 196 "outputs": [ 197 { 198 "data": { 199 "text/plain": [ 200 "0.9152" 201 ] 202 }, 203 "execution_count": 123, 204 "metadata": {}, 205 "output_type": "execute_result" 206 } 207 ], 208 "source": [ 209 "accuracy_score(y_pred=preds,y_true=y_test)" 210 ] 211 }, 212 { 213 "cell_type": "code", 214 "execution_count": 124, 215 "metadata": {}, 216 "outputs": [], 217 "source": [ 218 "model.save('../models/CNNMnistFashion.keras')" 219 ] 220 } 221 ], 222 "metadata": { 223 "kernelspec": { 224 "display_name": ".venv", 225 "language": "python", 226 "name": "python3" 227 }, 228 "language_info": { 229 "codemirror_mode": { 230 "name": "ipython", 231 "version": 3 232 }, 233 "file_extension": ".py", 234 "mimetype": "text/x-python", 235 "name": "python", 236 "nbconvert_exporter": "python", 237 "pygments_lexer": "ipython3", 238 "version": "3.11.2" 239 } 240 }, 241 "nbformat": 4, 242 "nbformat_minor": 2 243 }