machinelearning

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

MLPFasionMNIST.ipynb (59847B)


      1 {
      2  "cells": [
      3   {
      4    "cell_type": "code",
      5    "execution_count": 9,
      6    "metadata": {},
      7    "outputs": [],
      8    "source": [
      9     "import tensorflow as tf\n",
     10     "\n",
     11     "fashion_mnist = tf.keras.datasets.fashion_mnist.load_data()\n",
     12     "\n",
     13     "# Split train, validation, test\n",
     14     "(X_train_full, y_train_full) , (X_test, y_test) = fashion_mnist\n",
     15     "X_train, y_train = X_train_full[:-5000], y_train_full[:-5000]\n",
     16     "X_valid, y_valid = X_train_full[-5000:], y_train_full[-5000:]"
     17    ]
     18   },
     19   {
     20    "cell_type": "code",
     21    "execution_count": 10,
     22    "metadata": {},
     23    "outputs": [
     24     {
     25      "data": {
     26       "text/plain": [
     27        "(55000, 28, 28)"
     28       ]
     29      },
     30      "execution_count": 10,
     31      "metadata": {},
     32      "output_type": "execute_result"
     33     }
     34    ],
     35    "source": [
     36     "X_train.shape"
     37    ]
     38   },
     39   {
     40    "cell_type": "code",
     41    "execution_count": 11,
     42    "metadata": {},
     43    "outputs": [
     44     {
     45      "data": {
     46       "text/plain": [
     47        "dtype('uint8')"
     48       ]
     49      },
     50      "execution_count": 11,
     51      "metadata": {},
     52      "output_type": "execute_result"
     53     }
     54    ],
     55    "source": [
     56     "X_train.dtype"
     57    ]
     58   },
     59   {
     60    "cell_type": "code",
     61    "execution_count": 12,
     62    "metadata": {},
     63    "outputs": [],
     64    "source": [
     65     "X_train, X_valid, X_test = X_train / 255., X_valid / 255., X_test / 255."
     66    ]
     67   },
     68   {
     69    "cell_type": "code",
     70    "execution_count": 13,
     71    "metadata": {},
     72    "outputs": [],
     73    "source": [
     74     "class_names =  [\"T-shirt/top\", \"Trouser\", \"Pullover\", \"Dress\", \"Coat\",\n",
     75     "\"Sandal\", \"Shirt\", \"Sneaker\", \"Bag\", \"Ankle boot\"]"
     76    ]
     77   },
     78   {
     79    "cell_type": "code",
     80    "execution_count": 14,
     81    "metadata": {},
     82    "outputs": [],
     83    "source": [
     84     "tf.random.set_seed(10)\n",
     85     "\n",
     86     "# simple model where layers are sequential\n",
     87     "model = tf.keras.Sequential()\n",
     88     "\n",
     89     "# input\n",
     90     "model.add(tf.keras.layers.Input(shape=[28,28]))\n",
     91     "\n",
     92     "# convert inputs into 1d array (preprocessing)\n",
     93     "model.add(tf.keras.layers.Flatten())\n",
     94     "\n",
     95     "# first hidden\n",
     96     "model.add(tf.keras.layers.Dense(300, activation='relu'))\n",
     97     "\n",
     98     "# second hidden\n",
     99     "model.add(tf.keras.layers.Dense(100,activation='relu'))\n",
    100     "\n",
    101     "# output using softmax to get sum of 1 output with logs\n",
    102     "model.add(tf.keras.layers.Dense(10,activation='softmax'))"
    103    ]
    104   },
    105   {
    106    "cell_type": "markdown",
    107    "metadata": {},
    108    "source": [
    109     "### Note\n",
    110     "\n",
    111     "Instead of doing what was done above, we can call tf.keras.Sequential and then pass in a python list of the layers without having to do the .add bit each time."
    112    ]
    113   },
    114   {
    115    "cell_type": "code",
    116    "execution_count": 15,
    117    "metadata": {},
    118    "outputs": [
    119     {
    120      "data": {
    121       "text/html": [
    122        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_1\"</span>\n",
    123        "</pre>\n"
    124       ],
    125       "text/plain": [
    126        "\u001b[1mModel: \"sequential_1\"\u001b[0m\n"
    127       ]
    128      },
    129      "metadata": {},
    130      "output_type": "display_data"
    131     },
    132     {
    133      "data": {
    134       "text/html": [
    135        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
    136        "┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n",
    137        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
    138        "│ flatten_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>)             │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">784</span>)            │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
    139        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
    140        "│ dense_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">300</span>)            │       <span style=\"color: #00af00; text-decoration-color: #00af00\">235,500</span> │\n",
    141        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
    142        "│ dense_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">100</span>)            │        <span style=\"color: #00af00; text-decoration-color: #00af00\">30,100</span> │\n",
    143        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
    144        "│ dense_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>)             │         <span style=\"color: #00af00; text-decoration-color: #00af00\">1,010</span> │\n",
    145        "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
    146        "</pre>\n"
    147       ],
    148       "text/plain": [
    149        "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
    150        "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
    151        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
    152        "│ flatten_1 (\u001b[38;5;33mFlatten\u001b[0m)             │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m784\u001b[0m)            │             \u001b[38;5;34m0\u001b[0m │\n",
    153        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
    154        "│ dense_3 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m300\u001b[0m)            │       \u001b[38;5;34m235,500\u001b[0m │\n",
    155        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
    156        "│ dense_4 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m)            │        \u001b[38;5;34m30,100\u001b[0m │\n",
    157        "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
    158        "│ dense_5 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m)             │         \u001b[38;5;34m1,010\u001b[0m │\n",
    159        "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
    160       ]
    161      },
    162      "metadata": {},
    163      "output_type": "display_data"
    164     },
    165     {
    166      "data": {
    167       "text/html": [
    168        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">266,610</span> (1.02 MB)\n",
    169        "</pre>\n"
    170       ],
    171       "text/plain": [
    172        "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m266,610\u001b[0m (1.02 MB)\n"
    173       ]
    174      },
    175      "metadata": {},
    176      "output_type": "display_data"
    177     },
    178     {
    179      "data": {
    180       "text/html": [
    181        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">266,610</span> (1.02 MB)\n",
    182        "</pre>\n"
    183       ],
    184       "text/plain": [
    185        "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m266,610\u001b[0m (1.02 MB)\n"
    186       ]
    187      },
    188      "metadata": {},
    189      "output_type": "display_data"
    190     },
    191     {
    192      "data": {
    193       "text/html": [
    194        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
    195        "</pre>\n"
    196       ],
    197       "text/plain": [
    198        "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
    199       ]
    200      },
    201      "metadata": {},
    202      "output_type": "display_data"
    203     }
    204    ],
    205    "source": [
    206     "model.summary()"
    207    ]
    208   },
    209   {
    210    "cell_type": "code",
    211    "execution_count": 17,
    212    "metadata": {},
    213    "outputs": [
    214     {
    215      "data": {
    216       "text/plain": [
    217        "array([[ 0.01645865,  0.03546067, -0.05682132, ...,  0.00900105,\n",
    218        "        -0.07353848, -0.01912361],\n",
    219        "       [ 0.06523621,  0.0171279 , -0.04132329, ..., -0.01150481,\n",
    220        "        -0.04539145, -0.00335996],\n",
    221        "       [-0.00808337,  0.02399082, -0.05179171, ...,  0.02264993,\n",
    222        "        -0.06493723,  0.00833919],\n",
    223        "       ...,\n",
    224        "       [ 0.03792074, -0.01328152, -0.01112796, ...,  0.0608198 ,\n",
    225        "         0.03235608,  0.0042805 ],\n",
    226        "       [-0.0601988 ,  0.07004283,  0.00318228, ..., -0.02014124,\n",
    227        "         0.03856488, -0.07357981],\n",
    228        "       [ 0.03060566,  0.01161554, -0.07438355, ..., -0.01837594,\n",
    229        "        -0.03390887, -0.03670444]], dtype=float32)"
    230       ]
    231      },
    232      "execution_count": 17,
    233      "metadata": {},
    234      "output_type": "execute_result"
    235     }
    236    ],
    237    "source": [
    238     "weights, biases = model.layers[1].get_weights()\n",
    239     "weights"
    240    ]
    241   },
    242   {
    243    "cell_type": "code",
    244    "execution_count": 21,
    245    "metadata": {},
    246    "outputs": [
    247     {
    248      "data": {
    249       "text/plain": [
    250        "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)"
    251       ]
    252      },
    253      "execution_count": 21,
    254      "metadata": {},
    255      "output_type": "execute_result"
    256     }
    257    ],
    258    "source": [
    259     "biases[0 : 10] # all 0"
    260    ]
    261   },
    262   {
    263    "cell_type": "code",
    264    "execution_count": 22,
    265    "metadata": {},
    266    "outputs": [],
    267    "source": [
    268     "model.compile(loss='sparse_categorical_crossentropy',\n",
    269     "              optimizer='sgd',\n",
    270     "              metrics = ['accuracy']              \n",
    271     ")"
    272    ]
    273   },
    274   {
    275    "cell_type": "code",
    276    "execution_count": 23,
    277    "metadata": {},
    278    "outputs": [
    279     {
    280      "name": "stdout",
    281      "output_type": "stream",
    282      "text": [
    283       "Epoch 1/30\n"
    284      ]
    285     },
    286     {
    287      "name": "stderr",
    288      "output_type": "stream",
    289      "text": [
    290       "2024-06-11 06:04:50.806133: W external/local_tsl/tsl/framework/cpu_allocator_impl.cc:83] Allocation of 172480000 exceeds 10% of free system memory.\n"
    291      ]
    292     },
    293     {
    294      "name": "stdout",
    295      "output_type": "stream",
    296      "text": [
    297       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.6828 - loss: 1.0010 - val_accuracy: 0.8232 - val_loss: 0.5078\n",
    298       "Epoch 2/30\n",
    299       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8273 - loss: 0.4971 - val_accuracy: 0.8402 - val_loss: 0.4490\n",
    300       "Epoch 3/30\n",
    301       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8420 - loss: 0.4438 - val_accuracy: 0.8494 - val_loss: 0.4202\n",
    302       "Epoch 4/30\n",
    303       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8540 - loss: 0.4137 - val_accuracy: 0.8562 - val_loss: 0.4017\n",
    304       "Epoch 5/30\n",
    305       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8619 - loss: 0.3923 - val_accuracy: 0.8602 - val_loss: 0.3891\n",
    306       "Epoch 6/30\n",
    307       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8681 - loss: 0.3749 - val_accuracy: 0.8624 - val_loss: 0.3780\n",
    308       "Epoch 7/30\n",
    309       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8730 - loss: 0.3608 - val_accuracy: 0.8646 - val_loss: 0.3702\n",
    310       "Epoch 8/30\n",
    311       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8768 - loss: 0.3487 - val_accuracy: 0.8682 - val_loss: 0.3628\n",
    312       "Epoch 9/30\n",
    313       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8798 - loss: 0.3379 - val_accuracy: 0.8716 - val_loss: 0.3563\n",
    314       "Epoch 10/30\n",
    315       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8833 - loss: 0.3281 - val_accuracy: 0.8726 - val_loss: 0.3517\n",
    316       "Epoch 11/30\n",
    317       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8856 - loss: 0.3192 - val_accuracy: 0.8756 - val_loss: 0.3481\n",
    318       "Epoch 12/30\n",
    319       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8883 - loss: 0.3110 - val_accuracy: 0.8776 - val_loss: 0.3443\n",
    320       "Epoch 13/30\n",
    321       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.8914 - loss: 0.3034 - val_accuracy: 0.8774 - val_loss: 0.3412\n",
    322       "Epoch 14/30\n",
    323       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 1ms/step - accuracy: 0.8930 - loss: 0.2963 - val_accuracy: 0.8784 - val_loss: 0.3386\n",
    324       "Epoch 15/30\n",
    325       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8960 - loss: 0.2896 - val_accuracy: 0.8772 - val_loss: 0.3354\n",
    326       "Epoch 16/30\n",
    327       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.8986 - loss: 0.2834 - val_accuracy: 0.8786 - val_loss: 0.3341\n",
    328       "Epoch 17/30\n",
    329       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.9010 - loss: 0.2775 - val_accuracy: 0.8780 - val_loss: 0.3324\n",
    330       "Epoch 18/30\n",
    331       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.9029 - loss: 0.2718 - val_accuracy: 0.8794 - val_loss: 0.3306\n",
    332       "Epoch 19/30\n",
    333       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.9050 - loss: 0.2665 - val_accuracy: 0.8796 - val_loss: 0.3295\n",
    334       "Epoch 20/30\n",
    335       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9063 - loss: 0.2614 - val_accuracy: 0.8790 - val_loss: 0.3295\n",
    336       "Epoch 21/30\n",
    337       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - accuracy: 0.9080 - loss: 0.2564 - val_accuracy: 0.8810 - val_loss: 0.3281\n",
    338       "Epoch 22/30\n",
    339       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9101 - loss: 0.2514 - val_accuracy: 0.8810 - val_loss: 0.3272\n",
    340       "Epoch 23/30\n",
    341       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9118 - loss: 0.2468 - val_accuracy: 0.8820 - val_loss: 0.3260\n",
    342       "Epoch 24/30\n",
    343       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9133 - loss: 0.2425 - val_accuracy: 0.8814 - val_loss: 0.3263\n",
    344       "Epoch 25/30\n",
    345       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9145 - loss: 0.2381 - val_accuracy: 0.8826 - val_loss: 0.3251\n",
    346       "Epoch 26/30\n",
    347       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 2ms/step - accuracy: 0.9167 - loss: 0.2338 - val_accuracy: 0.8836 - val_loss: 0.3243\n",
    348       "Epoch 27/30\n",
    349       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 2ms/step - accuracy: 0.9177 - loss: 0.2298 - val_accuracy: 0.8836 - val_loss: 0.3261\n",
    350       "Epoch 28/30\n",
    351       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - accuracy: 0.9192 - loss: 0.2259 - val_accuracy: 0.8836 - val_loss: 0.3267\n",
    352       "Epoch 29/30\n",
    353       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9210 - loss: 0.2219 - val_accuracy: 0.8846 - val_loss: 0.3254\n",
    354       "Epoch 30/30\n",
    355       "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9226 - loss: 0.2181 - val_accuracy: 0.8840 - val_loss: 0.3252\n"
    356      ]
    357     }
    358    ],
    359    "source": [
    360     "history = model.fit(X_train, y_train, epochs=30,\n",
    361     "                    validation_data=(X_valid,y_valid))"
    362    ]
    363   },
    364   {
    365    "cell_type": "code",
    366    "execution_count": 29,
    367    "metadata": {},
    368    "outputs": [
    369     {
    370      "data": {
    371       "text/plain": [
    372        "<Axes: >"
    373       ]
    374      },
    375      "execution_count": 29,
    376      "metadata": {},
    377      "output_type": "execute_result"
    378     },
    379     {
    380      "data": {
    381       "image/png": "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Ia1cuZLTTjuNpKQkunTpwvnnn8+2bdtC+/fs2cOll15KSkoKsbGxjBkzhk8//TS0/9///jdjx47F5XKRmprKBRdcENpnsVh47bXXGlwvKSmJp556CoCdO3disVhYvnw5Z555Ji6Xi2effZaioiIuvfRSMjMziYmJYdiwYTz//PMNXicYDHLvvffSv39/nE4nPXv25Pe//z0AEydOZN68eQ2O379/Pw6Hg+zs7Jb42NoVzVNysJQ+sG+d+pWIiNQwDINqX6DNrxttt4U1sqOyspL58+czfPhwKioqWLRoERdccAHr16+nqqqKM888k8zMTN544w0yMjJYt24dwWAQgBUrVnDBBRfw61//mn/84x94vV7efPPNsMu8YMEC7r//fk466SRcLhdut5vRo0dz2223kZCQwIoVK7jiiivo168f48aNA2DhwoU89thj/OlPf+K0004jNzeXTZs2AXD11Vczb9487r//fpxOJwDPPPMMmZmZTJw4MezytXcKJQfTjflERBqo9gUYuujtNr/ud7+ZQoyj+T9TF110UYPnTzzxBF27duW7777j448/Zv/+/Xz++eekpKQA0L9//9Cxv//977nkkku46667QttGjBgRdplvuukmLrzwwgbbbrnlltD6jTfeyNtvv82//vUvxo0bR3l5OQ8++CAPP/wws2fPBqBfv36cdtppAFx44YXMmzeP119/nZ/85CcAPPXUU1x55ZXH5bBtNd8cTMOCRUQ6pC1btnDppZfSt29fEhIS6N27NwA5OTmsX7+ek046KRRIDrZ+/XomTZp0zGUYM2ZMg+eBQIDf/va3DBs2jJSUFOLi4nj77bfJyckBYOPGjXg8niav7XK5uOKKK3jiiScAWLduHRs2bODKK6885rK2R6opOZiGBYuINBBtt/Hdb6ZE5LrhmDp1Kr169eKxxx6je/fuBINBTjzxRLxeb2g69CavdYT9FosFwzAabGusI2tsbGyD5/fddx8PPvggS5cuZdiwYcTGxnLTTTfh9XqbdV0wm3BGjhzJnj17ePLJJ5k4cSK9evU64nkdkWpKDlZbU1K6B/zeyJZFRKQdsFgsxDii2nwJp3miqKiIzZs3c/vttzNp0iSGDBlCcXFxaP/w4cNZv349Bw4caPT84cOHH7bjaNeuXcnNzQ0937JlC1VVVUcs1+rVq5k2bRqXX345I0aMoG/fvnz//feh/QMGDCA6Ovqw1x42bBhjxozhscce47nnnuOqq6464nU7KoWSg8WlgT0WjCCU5ES6NCIi0gzJycl06dKFRx99lK1bt/L+++8zf/780P5LL72UjIwMpk+fzurVq9m+fTsvv/wya9asAWDx4sU8//zzLF68mI0bN/LNN99wzz33hM6fOHEiDz/8MF9++SVffPEF1113HXa7/YjlGjBgAO+++y4ff/wxGzdu5Gc/+xn5+fmh/S6Xi9tuu41bb72Vf/zjH2zbto1PPvmExx9/vMHrXH311dx9990YhtFgVNDxRqHkYBaLbswnItLBWK1WXnjhBdauXcuJJ57IzTffzH333Rfa73A4eOedd0hLS+O8885j2LBh3H333aG72p511lm8+OKLvPHGG4wcOZKJEyfy2Wefhc6///77ycrK4vTTT+eyyy7jlltuadZNC2+//XZGjRrFlClTOOuss0LBqL477riDX/7ylyxatIghQ4YwY8YMCgoKGhxz6aWXEhUVxaWXXorL5TqGT6p9sxgHN5K1Q2VlZSQmJlJaWkpCQkLrX3D55bDx33DOPXDyda1/PRGRdsLtdrNjxw769OlzXP/4dTQ7d+6kX79+fP7554waNSrSxWngcN+ZcH+/1dG1MRoWLCIi7YDP56OoqIjbb7+dk08+ud0Fkpam5pvGaFiwiIi0A6tXr6Zbt258/vnnPPLII5EuTqtTTUljNCxYRETagbPOOuuQocjHM9WUNCZUU7ILgm0/tbKIiEhnpFDSmIRMsDkh6DPnKxEREZFWp1DSGKsVkmtmy1MTjoiISJtQKGmKRuCIiIi0KYWSpmgEjoiISJtSKGlKaASOQomIiEhbOKpQsmzZMnr37o3L5WL8+PENpuJtTElJCXPnzqVbt244nU4GDhzIm2++eVQFbjNqvhER6VDOOussbrrppkgXQ45B2POULF++nPnz5/PII48wfvx4li5dypQpU9i8eTNpaWmHHO/1evnhD39IWloaL730EpmZmezatYukpKSWKH/rSalXU2IY5j1xREREpNWEHUoeeOABrrnmGubMmQPAI488wooVK3jiiSdYsGDBIcc/8cQTHDhwgI8//jh0R8XevXsfW6nbQlJPsNjAXw3leZDQLdIlEhEROa6F1Xzj9XpZu3YtkydPrnsBq5XJkyeHbv98sDfeeIMJEyYwd+5c0tPTOfHEE/nDH/5AIND0pGQej4eysrIGS5uz2SEpy1xXE46ISIdSXFzMrFmzSE5OJiYmhnPPPZctW7aE9u/atYupU6eSnJxMbGwsJ5xwQqhbQXFxMTNnzqRr165ER0czYMAAnnzyyUi9lU4lrJqSwsJCAoEA6enpDbanp6ezadOmRs/Zvn0777//PjNnzuTNN99k69at3HDDDfh8PhYvXtzoOUuWLOGuu+4Kp2itI6UvFO80Q0nvUyNdGhGRyDAM8FW1/XXtMUfddH7llVeyZcsW3njjDRISErjttts477zz+O6777Db7cydOxev18t///tfYmNj+e6774iLiwPgjjvu4LvvvuOtt94iNTWVrVu3Ul1d3ZLvTJrQ6ve+CQaDpKWl8eijj2Kz2Rg9ejR79+7lvvvuazKULFy4kPnz54eel5WVkZWV1dpFPVRKX9j2voYFi0jn5quCP3Rv++v+v33giA37tNowsnr1ak455RQAnn32WbKysnjttdf48Y9/TE5ODhdddBHDhg0DoG/fvqHzc3JyOOmkkxgzZgzQQbocHCfCCiWpqanYbDby8/MbbM/PzycjI6PRc7p164bdbsdms4W2DRkyhLy8PLxeLw6H45BznE4nTqcznKK1Dt2YT0Skw9m4cSNRUVGMHz8+tK1Lly4MGjSIjRs3AvDzn/+c66+/nnfeeYfJkydz0UUXMXz4cACuv/56LrroItatW8fZZ5/N9OnTQ+FGWldYocThcDB69Giys7OZPn06YNaEZGdnM2/evEbPOfXUU3nuuecIBoNYrWYXlu+//55u3bo1GkjaFQ0LFhExm1H+377IXLeVXH311UyZMoUVK1bwzjvvsGTJEu6//35uvPFGzj33XHbt2sWbb77Ju+++y6RJk5g7dy5//OMfW608Ygp7npL58+fz2GOP8fTTT7Nx40auv/56KisrQ6NxZs2axcKFC0PHX3/99Rw4cIBf/OIXfP/996xYsYI//OEPzJ07t+XeRWsJhZKdZpuqiEhnZLGYzShtvRxlf5IhQ4bg9/v59NNPQ9uKiorYvHkzQ4cODW3Lysriuuuu45VXXuGXv/wljz32WGhf165dmT17Ns888wxLly7l0UcfPfrPT5ot7D4lM2bMYP/+/SxatIi8vDxGjhzJypUrQ51fc3JyQjUiYP5Hf/vtt7n55psZPnw4mZmZ/OIXv+C2225ruXfRWmpvyucphaoDENslsuUREZEjGjBgANOmTeOaa67hb3/7G/Hx8SxYsIDMzEymTZsGwE033cS5557LwIEDKS4u5oMPPmDIkCEALFq0iNGjR3PCCSfg8Xj4z3/+E9onreuoOrrOmzevyeaaVatWHbJtwoQJfPLJJ0dzqciyR0NCJpTtNZtwFEpERDqEJ598kl/84hecf/75eL1ezjjjDN58883QfFmBQIC5c+eyZ88eEhISOOecc/jTn/4EmF0VFi5cyM6dO4mOjub000/nhRdeiOTb6TQshtH+2yXKyspITEyktLSUhISEtr34U+fDzv/BBY/CiBlte20RkTbmdrvZsWMHffr0weVyRbo40gEc7jsT7u+3bsh3JLXTzWtYsIiISKtSKDkSDQsWERFpEwolR6JhwSIiIm1CoeRIQqFEzTciIiKtSaHkSGr7lFQVgrs0smURERE5jimUHIkzHmK7muuqLREREWk1CiXNUduEoxE4IiIirUahpDk0AkdERKTVKZQ0h0bgiIiItDqFkubQCBwRkeNe7969Wbp0aaSL0akplDRH7QgchRIREZFWo1DSHLU1JeX7wFsV2bKIiIgcJBAIEAwGI12MY6ZQ0hzRyeBKNNeLd0a0KCIicqhHH32U7t27H/LDPG3aNK666iq2bdvGtGnTSE9PJy4ujrFjx/Lee+8d9fUeeOABhg0bRmxsLFlZWdxwww1UVFQ0OGb16tWcddZZxMTEkJyczJQpUyguLgYgGAxy77330r9/f5xOJz179uT3v/89AKtWrcJisVBSUhJ6rfXr12OxWNi5cycATz31FElJSbzxxhsMHToUp9NJTk4On3/+OT/84Q9JTU0lMTGRM888k3Xr1jUoV0lJCT/72c9IT0/H5XJx4okn8p///IfKykoSEhJ46aWXGhz/2muvERsbS3l5+VF/Xs2lUNIcFouGBYtIp2UYBlW+qjZfwrmJ/Y9//GOKior44IMPQtsOHDjAypUrmTlzJhUVFZx33nlkZ2fz5Zdfcs455zB16lRycnKO6jOxWq38+c9/5ttvv+Xpp5/m/fff59Zbbw3tX79+PZMmTWLo0KGsWbOGjz76iKlTpxIIBABYuHAhd999N3fccQffffcdzz33HOnp6WGVoaqqinvuuYe///3vfPvtt6SlpVFeXs7s2bP56KOP+OSTTxgwYADnnXdeKFAEg0HOPfdcVq9ezTPPPMN3333H3Xffjc1mIzY2lksuuYQnn3yywXWefPJJLr74YuLj44/qswpHVKtf4XiR3Af2fakROCLS6VT7qxn/3Pg2v+6nl31KjD2mWccmJydz7rnn8txzzzFp0iQAXnrpJVJTU/nBD36A1WplxIgRoeN/+9vf8uqrr/LGG28wb968sMt20003hdZ79+7N7373O6677jr+8pe/AHDvvfcyZsyY0HOAE044AYDy8nIefPBBHn74YWbPng1Av379OO2008Iqg8/n4y9/+UuD9zVx4sQGxzz66KMkJSXx4Ycfcv755/Pee+/x2WefsXHjRgYOHAhA3759Q8dfffXVnHLKKeTm5tKtWzcKCgp48803j6lWKRyqKWkuDQsWEWnXZs6cycsvv4zH4wHg2Wef5ZJLLsFqtVJRUcEtt9zCkCFDSEpKIi4ujo0bNx51Tcl7773HpEmTyMzMJD4+niuuuIKioiKqqsx+h7U1JY3ZuHEjHo+nyf3N5XA4GD58eINt+fn5XHPNNQwYMIDExEQSEhKoqKgIvc/169fTo0ePUCA52Lhx4zjhhBN4+umnAXjmmWfo1asXZ5xxxjGVtblUU9JcGhYsIp1UdFQ0n172aUSuG46pU6diGAYrVqxg7Nix/O9//+NPf/oTALfccgvvvvsuf/zjH+nfvz/R0dFcfPHFeL3esMu1c+dOzj//fK6//np+//vfk5KSwkcffcRPf/pTvF4vMTExREc3XfbD7QOzaQho0Hzl8/kafR2LxdJg2+zZsykqKuLBBx+kV69eOJ1OJkyYEHqfR7o2mLUly5YtY8GCBTz55JPMmTPnkOu0FoWS5krRrK4i0jlZLJZmN6NEksvl4sILL+TZZ59l69atDBo0iFGjRgFmp9Mrr7ySCy64AICKiopQp9FwrV27lmAwyP333x8KEP/6178aHDN8+HCys7O56667Djl/wIABREdHk52dzdVXX33I/q5dzfut5ebmkpycDJg1HM2xevVq/vKXv3DeeecBsHv3bgoLCxuUa8+ePXz//fdN1pZcfvnl3Hrrrfz5z3/mu+++CzUxtQU13zRXbU1J6W7wh5+sRUSk9c2cOZMVK1bwxBNPMHPmzND2AQMG8Morr7B+/Xq++uorLrvssqMeQtu/f398Ph8PPfQQ27dv55///CePPPJIg2MWLlzI559/zg033MDXX3/Npk2b+Otf/0phYSEul4vbbruNW2+9lX/84x9s27aNTz75hMcffzz0+llZWdx5551s2bKFFStWcP/99zerbAMGDOCf//wnGzdu5NNPP2XmzJkNakfOPPNMzjjjDC666CLeffddduzYwVtvvcXKlStDxyQnJ3PhhRfyq1/9irPPPpsePXoc1ed0NBRKmisuHewxYASh5OjaIEVEpHVNnDiRlJQUNm/ezGWXXRba/sADD5CcnMwpp5zC1KlTmTJlSqgWJVwjRozggQce4J577uHEE0/k2WefZcmSJQ2OGThwIO+88w5fffUV48aNY8KECbz++utERZkNFHfccQe//OUvWbRoEUOGDGHGjBkUFBQAYLfbef7559m0aRPDhw/nnnvu4Xe/+12zyvb4449TXFzMqFGjuOKKK/j5z39OWlpag2Nefvllxo4dy6WXXsrQoUO59dZbQ6OCatU2RV111VVH9RkdLYsRzpirCCkrKyMxMZHS0lISEhIiV5C/nAIF38LMl2DADyNXDhGRVuJ2u9mxYwd9+vTB5XJFujgSIf/85z+5+eab2bdvHw6H47DHHu47E+7vt2pKwqF+JSIichyrqqpi27Zt3H333fzsZz87YiBpaQol4dCwYBGR496zzz5LXFxco0vtXCPHq3vvvZfBgweTkZHBwoUL2/z6Gn0TDg0LFhE57v3f//0f48c3Plmc3W5v49K0rTvvvJM777wzYtdXKAmHmm9ERI578fHxbTKluhxKzTfhCN3/ZicEA4c9VERERMKjUBKOhEywOSDog7K9kS6NiIjIcUWhJBxWGyT1MtfVhCMiItKiFErCpRE4IiIirUKhJFwKJSIiIq1CoSRcoRE4GhYsInI86d27N0uXLm3WsRaLhddee61Vy9MZKZSES3OViIiItAqFknCFhgXvgPZ/2yAREZEOQ6EkXIlZYLGBrwoq8iNdGhERAR599FG6d+9OMBhssH3atGlcddVVbNu2jWnTppGenk5cXBxjx47lvffea7Hrf/PNN0ycOJHo6Gi6dOnCtddeS0VFRWj/qlWrGDduHLGxsSQlJXHqqaeya9cuAL766it+8IMfEB8fT0JCAqNHj+aLL75osbJ1JJ06lBheL+XvfxDeSVEOSOxhrquzq4h0AoZhEKyqavMlnJvY//jHP6aoqIgP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DObNm8err77K+++/T58+fRrsHz16NHa7vcF3bfPmzeTk5HTq79qRPrfGrF+/HqBTf98aEwwG8Xg8Lftda9m+uB3HCy+8YDidTuOpp54yvvvuO+Paa681kpKSjLy8vEgXrd365S9/aaxatcrYsWOHsXr1amPy5MlGamqqUVBQEOmitSvl5eXGl19+aXz55ZcGYDzwwAPGl19+aezatcswDMO4++67jaSkJOP11183vv76a2PatGlGnz59jOrq6giXPHIO95mVl5cbt9xyi7FmzRpjx44dxnvvvWeMGjXKGDBggOF2uyNd9Ii5/vrrjcTERGPVqlVGbm5uaKmqqgodc9111xk9e/Y03n//feOLL74wJkyYYEyYMCGCpY68I31uW7duNX7zm98YX3zxhbFjxw7j9ddfN/r27WucccYZES55ZC1YsMD48MMPjR07dhhff/21sWDBAsNisRjvvPOOYRgt913rtKHEMAzjoYceMnr27Gk4HA5j3LhxxieffBLpIrVrM2bMMLp162Y4HA4jMzPTmDFjhrF169ZIF6vd+eCDDwzgkGX27NmGYZjDgu+44w4jPT3dcDqdxqRJk4zNmzdHttARdrjPrKqqyjj77LONrl27Gna73ejVq5dxzTXXdPo/IBr7vADjySefDB1TXV1t3HDDDUZycrIRExNjXHDBBUZubm7kCt0OHOlzy8nJMc444wwjJSXFcDqdRv/+/Y1f/epXRmlpaWQLHmFXXXWV0atXL8PhcBhdu3Y1Jk2aFAokhtFy3zWLYRjGUdbciIiIiLSYTtmnRERERNofhRIRERFpFxRKREREpF1QKBEREZF2QaFERERE2gWFEhEREWkXFEpERESkXVAoERERkXZBoURERETaBYUSERERaRcUSkRERKRdUCgRERGRduH/A/hvBD+UpORaAAAAAElFTkSuQmCC",
    382       "text/plain": [
    383        "<Figure size 640x480 with 1 Axes>"
    384       ]
    385      },
    386      "metadata": {},
    387      "output_type": "display_data"
    388     }
    389    ],
    390    "source": [
    391     "import pandas as pd\n",
    392     "import matplotlib.pyplot as plt\n",
    393     "\n",
    394     "pd.DataFrame(history.history).plot()"
    395    ]
    396   },
    397   {
    398    "cell_type": "code",
    399    "execution_count": 31,
    400    "metadata": {},
    401    "outputs": [
    402     {
    403      "name": "stdout",
    404      "output_type": "stream",
    405      "text": [
    406       "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 858us/step - accuracy: 0.8790 - loss: 0.3375\n"
    407      ]
    408     },
    409     {
    410      "data": {
    411       "text/plain": [
    412        "[0.33449822664260864, 0.8787999749183655]"
    413       ]
    414      },
    415      "execution_count": 31,
    416      "metadata": {},
    417      "output_type": "execute_result"
    418     }
    419    ],
    420    "source": [
    421     "model.evaluate(X_test, y_test)"
    422    ]
    423   },
    424   {
    425    "cell_type": "code",
    426    "execution_count": 39,
    427    "metadata": {},
    428    "outputs": [
    429     {
    430      "name": "stdout",
    431      "output_type": "stream",
    432      "text": [
    433       "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 40ms/step\n"
    434      ]
    435     },
    436     {
    437      "data": {
    438       "text/plain": [
    439        "array([[0.  , 0.  , 0.  , 0.  , 0.  , 0.01, 0.  , 0.05, 0.  , 0.94]],\n",
    440        "      dtype=float32)"
    441       ]
    442      },
    443      "execution_count": 39,
    444      "metadata": {},
    445      "output_type": "execute_result"
    446     }
    447    ],
    448    "source": [
    449     "X_new = X_test[:1]\n",
    450     "y_proba = model.predict(X_new)\n",
    451     "y_proba.round(2)"
    452    ]
    453   },
    454   {
    455    "cell_type": "code",
    456    "execution_count": 43,
    457    "metadata": {},
    458    "outputs": [
    459     {
    460      "data": {
    461       "text/plain": [
    462        "array([9])"
    463       ]
    464      },
    465      "execution_count": 43,
    466      "metadata": {},
    467      "output_type": "execute_result"
    468     }
    469    ],
    470    "source": [
    471     "import numpy as np\n",
    472     "y_pred = y_proba.argmax(axis=-1) # Find the highest value and get the index\n",
    473     "y_pred"
    474    ]
    475   }
    476  ],
    477  "metadata": {
    478   "kernelspec": {
    479    "display_name": "notebook",
    480    "language": "python",
    481    "name": "notebook"
    482   },
    483   "language_info": {
    484    "codemirror_mode": {
    485     "name": "ipython",
    486     "version": 3
    487    },
    488    "file_extension": ".py",
    489    "mimetype": "text/x-python",
    490    "name": "python",
    491    "nbconvert_exporter": "python",
    492    "pygments_lexer": "ipython3",
    493    "version": "3.11.2"
    494   }
    495  },
    496  "nbformat": 4,
    497  "nbformat_minor": 2
    498 }