machinelearning

Machine learning code
git clone git://git.laack.co/machinelearning.git
Log | Files | Refs

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 }