From b1870ca45f17bede7dc288a8b4d3f26a9028900a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mat=C3=ADas=20Duhalde?= <matias.duhalde@uc.cl>
Date: Fri, 10 Nov 2023 18:58:38 +0100
Subject: [PATCH] fix: softmax

---
 main.ipynb      | 192 ++++++++++++++++++++++++++++++++++++++++++------
 mlp.py          |  34 ++++++---
 results/mlp.png | Bin 0 -> 16878 bytes
 3 files changed, 193 insertions(+), 33 deletions(-)
 create mode 100644 results/mlp.png

diff --git a/main.ipynb b/main.ipynb
index e1dc11e..72d5d96 100644
--- a/main.ipynb
+++ b/main.ipynb
@@ -23,7 +23,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 33,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -41,7 +41,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 34,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -52,7 +52,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 35,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -61,7 +61,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 36,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -70,7 +70,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 37,
    "metadata": {},
    "outputs": [
     {
@@ -100,7 +100,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 38,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -410,7 +410,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 39,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -420,7 +420,11 @@
     "    learn_once_mse,\n",
     "    one_hot,\n",
     "    learn_once_cross_entropy,\n",
-    "    run_mlp_training\n",
+    "    run_mlp_training,\n",
+    "    learn_once_mse,\n",
+    "    softmax,\n",
+    "    test_mlp,\n",
+    "    train_mlp,\n",
     ")"
    ]
   },
@@ -433,7 +437,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 50,
+   "execution_count": 40,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -454,14 +458,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 51,
+   "execution_count": 41,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Loss: 0.10367831888711801\n"
+      "Loss: 0.07218991126027921\n"
      ]
     }
    ],
@@ -488,7 +492,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 52,
+   "execution_count": 42,
    "metadata": {},
    "outputs": [
     {
@@ -499,7 +503,7 @@
        "       [1., 0., 0.]])"
       ]
      },
-     "execution_count": 52,
+     "execution_count": 42,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -517,9 +521,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 53,
+   "execution_count": 43,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "(30,)\n"
+     ]
+    }
+   ],
    "source": [
     "N = 30  # number of input data\n",
     "d_in = 3  # input dimension\n",
@@ -533,19 +545,21 @@
     "b2 = np.zeros((1, d_out))  # second layer biaises\n",
     "\n",
     "random_data = np.random.rand(N, d_in)  # create a random data\n",
-    "random_targets = np.random.randint(1, d_out, N)  # create a random targets"
+    "random_targets = np.random.randint(1, d_out, (N))  # create a random targets\n",
+    "\n",
+    "print(random_targets.shape)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 54,
+   "execution_count": 44,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Loss: 0.6940785845571713\n"
+      "Loss: 0.7075029802848043\n"
      ]
     }
    ],
@@ -572,7 +586,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 55,
+   "execution_count": 45,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -583,15 +597,127 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 56,
+   "execution_count": 46,
    "metadata": {},
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/home/tracert6/Documents/ECL-S9-DeepLearning/TP/TP1/mlp.py:210: RuntimeWarning: overflow encountered in exp\n",
-      "  z1 = np.matmul(a0, w1) + b1  # input of the hidden layer\n"
+      "/home/tracert6/Documents/ECL-S9-DeepLearning/TP/TP1/mlp.py:221: RuntimeWarning: overflow encountered in exp\n",
+      "  z2 = np.matmul(a1, w2) + b2\n",
+      "/home/tracert6/Documents/ECL-S9-DeepLearning/TP/TP1/mlp.py:118: RuntimeWarning: overflow encountered in exp\n",
+      "  z2 = np.matmul(a1, w2) + b2\n",
+      "/home/tracert6/Documents/ECL-S9-DeepLearning/TP/TP1/mlp.py:16: RuntimeWarning: invalid value encountered in divide\n",
+      "  \n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Epoch 0: 0.10592592592592592\n",
+      "Epoch 1: 0.09855555555555555\n",
+      "Epoch 2: 0.10437037037037038\n",
+      "Epoch 3: 0.109\n",
+      "Epoch 4: 0.10901851851851851\n",
+      "Epoch 5: 0.10907407407407407\n",
+      "Epoch 6: 0.10044444444444445\n",
+      "Epoch 7: 0.0995925925925926\n",
+      "Epoch 8: 0.09985185185185186\n",
+      "Epoch 9: 0.09985185185185186\n",
+      "Epoch 10: 0.09985185185185186\n",
+      "Epoch 11: 0.09985185185185186\n",
+      "Epoch 12: 0.09985185185185186\n",
+      "Epoch 13: 0.09985185185185186\n",
+      "Epoch 14: 0.09985185185185186\n",
+      "Epoch 15: 0.09985185185185186\n",
+      "Epoch 16: 0.09985185185185186\n",
+      "Epoch 17: 0.09985185185185186\n",
+      "Epoch 18: 0.09985185185185186\n",
+      "Epoch 19: 0.09985185185185186\n",
+      "Epoch 20: 0.09985185185185186\n",
+      "Epoch 21: 0.09985185185185186\n",
+      "Epoch 22: 0.09985185185185186\n",
+      "Epoch 23: 0.09985185185185186\n",
+      "Epoch 24: 0.09985185185185186\n",
+      "Epoch 25: 0.09985185185185186\n",
+      "Epoch 26: 0.09985185185185186\n",
+      "Epoch 27: 0.09985185185185186\n",
+      "Epoch 28: 0.09985185185185186\n",
+      "Epoch 29: 0.09985185185185186\n",
+      "Epoch 30: 0.09985185185185186\n",
+      "Epoch 31: 0.09985185185185186\n",
+      "Epoch 32: 0.09985185185185186\n",
+      "Epoch 33: 0.09985185185185186\n",
+      "Epoch 34: 0.09985185185185186\n",
+      "Epoch 35: 0.09985185185185186\n",
+      "Epoch 36: 0.09985185185185186\n",
+      "Epoch 37: 0.09985185185185186\n",
+      "Epoch 38: 0.09985185185185186\n",
+      "Epoch 39: 0.09985185185185186\n",
+      "Epoch 40: 0.09985185185185186\n",
+      "Epoch 41: 0.09985185185185186\n",
+      "Epoch 42: 0.09985185185185186\n",
+      "Epoch 43: 0.09985185185185186\n",
+      "Epoch 44: 0.09985185185185186\n",
+      "Epoch 45: 0.09985185185185186\n",
+      "Epoch 46: 0.09985185185185186\n",
+      "Epoch 47: 0.09985185185185186\n",
+      "Epoch 48: 0.09985185185185186\n",
+      "Epoch 49: 0.09985185185185186\n",
+      "Epoch 50: 0.09985185185185186\n",
+      "Epoch 51: 0.09985185185185186\n",
+      "Epoch 52: 0.09985185185185186\n",
+      "Epoch 53: 0.09985185185185186\n",
+      "Epoch 54: 0.09985185185185186\n",
+      "Epoch 55: 0.09985185185185186\n",
+      "Epoch 56: 0.09985185185185186\n",
+      "Epoch 57: 0.09985185185185186\n",
+      "Epoch 58: 0.09985185185185186\n",
+      "Epoch 59: 0.09985185185185186\n",
+      "Epoch 60: 0.09985185185185186\n",
+      "Epoch 61: 0.09985185185185186\n",
+      "Epoch 62: 0.09985185185185186\n",
+      "Epoch 63: 0.09985185185185186\n",
+      "Epoch 64: 0.09985185185185186\n",
+      "Epoch 65: 0.09985185185185186\n",
+      "Epoch 66: 0.09985185185185186\n",
+      "Epoch 67: 0.09985185185185186\n",
+      "Epoch 68: 0.09985185185185186\n",
+      "Epoch 69: 0.09985185185185186\n",
+      "Epoch 70: 0.09985185185185186\n",
+      "Epoch 71: 0.09985185185185186\n",
+      "Epoch 72: 0.09985185185185186\n",
+      "Epoch 73: 0.09985185185185186\n",
+      "Epoch 74: 0.09985185185185186\n",
+      "Epoch 75: 0.09985185185185186\n",
+      "Epoch 76: 0.09985185185185186\n",
+      "Epoch 77: 0.09985185185185186\n",
+      "Epoch 78: 0.09985185185185186\n",
+      "Epoch 79: 0.09985185185185186\n",
+      "Epoch 80: 0.09985185185185186\n",
+      "Epoch 81: 0.09985185185185186\n",
+      "Epoch 82: 0.09985185185185186\n",
+      "Epoch 83: 0.09985185185185186\n",
+      "Epoch 84: 0.09985185185185186\n",
+      "Epoch 85: 0.09985185185185186\n",
+      "Epoch 86: 0.09985185185185186\n",
+      "Epoch 87: 0.09985185185185186\n",
+      "Epoch 88: 0.09985185185185186\n",
+      "Epoch 89: 0.09985185185185186\n",
+      "Epoch 90: 0.09985185185185186\n",
+      "Epoch 91: 0.09985185185185186\n",
+      "Epoch 92: 0.09985185185185186\n",
+      "Epoch 93: 0.09985185185185186\n",
+      "Epoch 94: 0.09985185185185186\n",
+      "Epoch 95: 0.09985185185185186\n",
+      "Epoch 96: 0.09985185185185186\n",
+      "Epoch 97: 0.09985185185185186\n",
+      "Epoch 98: 0.09985185185185186\n",
+      "Epoch 99: 0.09985185185185186\n",
+      "Epoch 100: 0.09985185185185186\n",
+      "Test accuracy: 0.10133333333333333\n"
      ]
     }
    ],
@@ -614,9 +740,20 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 47,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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ZrH4RoWiYfcWaTOCBABAOEkbQZKkwsJCTZ06VcOGDdOIESNUUlKis2fPatq0aZKkKVOmqEePHioqKpJUV4S9d+9e758PHz6sXbt2qUOHDurbt29UbVosFt1///1atGiRBg0apMGDB+v3v/+99u/fr1deeSUJdyGQ56y02kYCjP85bBZLDAHJVtc+RdoAAISX1IB0xx136NixY3r44YdVXl6uwYMHa926dd4i64MHDwbsTVRWVqYhQ4Z4fy4uLlZxcbHGjBmjjRs3RtWmJN177706d+6c5s2bpxMnTmjQoEFav369Lr300ub5xSOIfgQp9mNGJEaQAACIRlIDkiQVFBSooKAg5Gee0OORm5srw2j8wR6pTY/58+dr/vz5Ufezudht0R0FEs8u2pKvBqm2kQAGAEBb1uZWsaU6zxRbY0XU3l20YziHra59RpAAAGgMASnF+KbYGqlBqh9BSrPFN4JEDRIAAOERkFKMZyPHxqbY4q1BctjYKBIAgMbEHJDefvvtRPQD9TwjSI2dlVZdG98Um42NIgEAaFTMAWn8+PG69NJL9atf/Sphu0m3ZZ4aocaW+cdzzIh/+2wUCQBAeDEHpMOHD6ugoECvvPKK+vTpo3Hjxunll19WTU1NIvrX5nj3KWpsmX9tfFNs1CABANC4mANSVlaW5s2bp127dmnr1q267LLLdM8996h79+6aM2eOPvroo0T0s82IuUg71hEkG6vYAABoTJOKtK+55hotWLBABQUFOnPmjFauXKmhQ4fqP/7jP7Rnzx6z+timRL2TtmeZf8z7IHlGqAhIAACEE1dAqq2t1SuvvKKbb75ZvXv31l//+lc9++yzqqio0N///nf17t1bt912m9l9bRPs7KQNAEDSxbyT9uzZs/XSSy/JMAzdddddWrJkia688krv5+3bt1dxcbG6d+9uakfbCoctuhEe707asW4UaaMGCQCAxsQckPbu3avf/OY3mjhxopxOZ8hrsrKy2A4gTr5VbFHupM0qNgAATBdzQCotLW28UbtdY8aMiatDbV20I0ieVWyxFml7apBc1CABABBWzDVIRUVFWrlyZYP3V65cqSeffNKUTrVl0R4m29QaJKbYAAAIL+aA9Nvf/lb9+/dv8P7AgQO1YsUKUzrVlkVbIxT3FBvL/AEAaFTMAam8vFzdunVr8P5FF12kI0eOmNKptiza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mwf3uXlwn5tHou5zpJEjD4q0AQAAghCQAAAAghCQUozT6dSiRYvkdDqT3ZVWj3vdPLjPzYP73Dy4z80jFe4zRdoAAABBGEECAAAIQkACAAAIQkACAAAIQkACAAAIQkBKMcuXL1dubq7S09M1cuRIbdu2LdldatGKioo0fPhwdezYUV27dtWtt96qAwcOBFxz7tw5zZo1SxdeeKE6dOig/Px8VVRUJKnHrcPixYtlsVh07733et/jPpvj8OHDuvPOO3XhhReqXbt2uuqqq/TBBx94PzcMQw8//LC6deumdu3aKS8vT5999lkSe9zyuFwuLVy4UJdcconatWunSy+9VL/85S8Dzu7iPsfn3Xff1Xe+8x11795dFotFr732WsDn0dzXEydOaPLkycrMzFTnzp314x//WGfOnDG9rwSkFLJ69WoVFhZq0aJF2rlzpwYNGqRx48bp6NGjye5ai/XOO+9o1qxZev/997V+/XrV1tbqxhtv1NmzZ73XzJs3T6+//rrWrFmjd955R2VlZZo4cWISe92ybd++Xb/97W919dVXB7zPfW66r776Stddd50cDofefPNN7d27V08//bS6dOnivWbJkiV65plntGLFCm3dulXt27fXuHHjdO7cuST2vGV58skn9dxzz+nZZ5/Vvn379OSTT2rJkiX6zW9+472G+xyfs2fPatCgQVq+fHnIz6O5r5MnT9aePXu0fv16vfHGG3r33Xc1Y8YM8ztrIGWMGDHCmDVrlvdnl8tldO/e3SgqKkpir1qXo0ePGpKMd955xzAMwzh58qThcDiMNWvWeK/Zt2+fIcnYsmVLsrrZYp0+fdro16+fsX79emPMmDHG3LlzDcPgPpvlgQceMK6//vqwn7vdbiMnJ8d46qmnvO+dPHnScDqdxksvvdQcXWwVJkyYYNx9990B702cONGYPHmyYRjcZ7NIMl599VXvz9Hc17179xqSjO3bt3uvefPNNw2LxWIcPnzY1P4xgpQiampqtGPHDuXl5Xnfs1qtysvL05YtW5LYs9bl1KlTkqQLLrhAkrRjxw7V1tYG3Pf+/furV69e3Pc4zJo1SxMmTAi4nxL32Sxr167VsGHDdNttt6lr164aMmSIfve733k///LLL1VeXh5wnzt16qSRI0dyn2MwevRolZaW6tNPP5UkffTRR9q0aZNuuukmSdznRInm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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
    "source": [
     "# Plot the training accuracy values\n",
     "plt.plot(range(num_epoch + 1), training_accuracy_values)\n",
@@ -625,6 +762,13 @@
     "plt.savefig('./results/mlp.png')\n",
     "plt.show()\n"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
diff --git a/mlp.py b/mlp.py
index 38188f1..944df7f 100644
--- a/mlp.py
+++ b/mlp.py
@@ -1,5 +1,20 @@
 import numpy as np
 
+EPSILON = 1e-8
+
+
+def softmax(x: np.ndarray) -> np.ndarray:
+    """Compute the softmax of the given vector.
+
+    Args:
+        z (np.ndarray): The vector to compute the softmax of.
+
+    Returns:
+        np.ndarray: The softmax of the given vector.
+    """
+    e_x = np.exp(x - np.max(x))
+    return e_x / e_x.sum(axis=0)
+
 
 def learn_once_mse(
     w1: np.ndarray,
@@ -46,11 +61,11 @@ def learn_once_mse(
     dC_da2 = 2 * (predictions - targets) / predictions.shape[0]
     dC_dz2 = dC_da2 * a2 * (1 - a2)
     dC_dw2 = np.matmul(a1.T, dC_dz2)
-    dC_db2 = np.sum(dC_dz2, axis=0, keepdims=True)
+    dC_db2 = np.sum(dC_dz2, axis=0)
     dC_da1 = np.matmul(dC_dz2, w2.T)
     dC_dz1 = dC_da1 * a1 * (1 - a1)
     dC_dw1 = np.matmul(a0.T, dC_dz1)
-    dC_db1 = np.sum(dC_dz1, axis=0, keepdims=True)
+    dC_db1 = np.sum(dC_dz1, axis=0)
 
     # Update weights and biases
     w1 -= learning_rate * dC_dw1
@@ -102,7 +117,8 @@ def learn_once_cross_entropy(
     z1 = np.matmul(a0, w1) + b1
     a1 = 1 / (1 + np.exp(-z1))
     z2 = np.matmul(a1, w2) + b2
-    a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True)
+    a2 = softmax(z2)
+
     predictions = a2
 
     one_hot_targets = one_hot(labels_train)
@@ -110,8 +126,8 @@ def learn_once_cross_entropy(
     # Compute loss (Cross Entropy)
     # https://arize.com/blog-course/binary-cross-entropy-log-loss/
     loss = -np.mean(
-        one_hot_targets * np.log(predictions)
-        + (1 - one_hot_targets) * np.log(1 - predictions)
+        one_hot_targets * np.log(predictions + EPSILON)
+        + (1 - one_hot_targets) * np.log(1 - predictions + EPSILON)
     )
 
     # Backward pass
@@ -120,11 +136,11 @@ def learn_once_cross_entropy(
 
     dC_dz2 = a2 - one_hot_targets
     dC_dw2 = np.matmul(a1.T, dC_dz2)
-    dC_db2 = np.sum(dC_dz2, axis=0, keepdims=True)
+    dC_db2 = np.sum(dC_dz2, axis=0)
     dC_da1 = np.matmul(dC_dz2, w2.T)
     dC_dz1 = dC_da1 * a1 * (1 - a1)
     dC_dw1 = np.matmul(a0.T, dC_dz1)
-    dC_db1 = np.sum(dC_dz1, axis=0, keepdims=True)
+    dC_db1 = np.sum(dC_dz1, axis=0)
 
     # Update weights and biases
     w1 -= learning_rate * dC_dw1
@@ -204,7 +220,7 @@ def test_mlp(
     z1 = np.matmul(a0, w1) + b1
     a1 = 1 / (1 + np.exp(-z1))
     z2 = np.matmul(a1, w2) + b2
-    a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True)
+    a2 = softmax(z2)
     predictions = a2
 
     # Compute accuracy
@@ -237,7 +253,7 @@ def run_mlp_training(
     """
 
     d_in = data_train.shape[1]
-    d_out = labels_train.shape[0]
+    d_out = max(labels_train) + 1
 
     # Random initialization of the network weights and biaises
     w1 = 2 * np.random.rand(d_in, d_h) - 1  # first layer weights
diff --git a/results/mlp.png b/results/mlp.png
new file mode 100644
index 0000000000000000000000000000000000000000..7adf3430932d16a46e17db300e3a1335a7211aac
GIT binary patch
literal 16878
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
Y?+lAiFiJV|9(1ySr>mdKI;Vst07j07bpQYW

literal 0
HcmV?d00001

-- 
GitLab