From 157f71184e410e9770cb7060a93931c4aca07c26 Mon Sep 17 00:00:00 2001 From: selalimi <saraelalami2001@gmail.com> Date: Fri, 10 Nov 2023 22:38:23 -0500 Subject: [PATCH] Final Update --- README.md | 2 +- Results/mlp.png | Bin 36849 -> 30518 bytes knn.py | 14 +- main.ipynb | 623 ----------------------------------------------- mlp.py | 354 ++++++++++++--------------- requirements.txt | Bin 4086 -> 142 bytes test/test_mlp.py | 12 +- 7 files changed, 175 insertions(+), 830 deletions(-) delete mode 100644 main.ipynb diff --git a/README.md b/README.md index cc072b6..c10f173 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Unfortunately, the performance of the KNN algorithm was disappointing, with accu 4. *Lack of Feature Abstraction*: KNN directly uses pixels as features. More advanced feature extraction techniques could improve performance ## Analysis of ANN Results -The deep learning algorithm (ANN) used for our dataset has relatively low performance, with test set accuracy plateauing around 15% over 100 epochs. +The deep learning algorithm (ANN) used for our dataset has relatively low performance, with test set accuracy plateauing around 14% over 100 epochs. These results suggest that adjustments to certain aspects of the model, such as complexity, hyperparameters, or weight initialization, may be necessary to improve its ability to generalize to new data. Further exploration of these aspects could be beneficial in optimizing model performance. diff --git a/Results/mlp.png b/Results/mlp.png index 508165161125d93c3053d5a2c0fece13c34cbf9b..ae0874322238e9f205dbdcf5c262f719cc6cfedd 100644 GIT binary patch literal 30518 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 E0FuV(UH||9 literal 36849 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 z%0A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 diff --git a/knn.py b/knn.py index f0efd4c..1998519 100644 --- a/knn.py +++ b/knn.py @@ -2,7 +2,7 @@ import numpy as np import os import pickle import matplotlib.pyplot as plt -import plotly.graph_objects as go +import read_cifar as rc @@ -77,3 +77,15 @@ def plot_KNN(X_train, y_train, X_test, y_test, max_k=20): plt.ylabel('Accuracy') plt.title('Variation of Accuracy with K') plt.savefig("Results/knn.png") + +# The following code block is executed only if the script is run as the main program +if _name_ == "_main_": + # Read the CIFAR-10 dataset from the specified path + X, y = rc.read_cifar('data\cifar-10-batches-py') + + # Split the dataset into training and testing sets + X_train, y_train, X_test, y_test = rc.split_dataset(X, y, split=0.9) + + # Plot the evolution of learning accuracy across the number of neighbors (K) using the 'plot_KNN' function + plot_KNN(X_train, y_train, X_test, y_test, max_k=20) + diff --git a/main.ipynb b/main.ipynb deleted file mode 100644 index 04aa675..0000000 --- a/main.ipynb +++ /dev/null @@ -1,623 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prepare the Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import read_cifar as rc\n", - "X,y=rc.read_cifar('data') \n", - "# Split the Dataset\n", - "X_train,y_train,X_test,y_test=rc.split_dataset(X,y,split=0.9) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## k-nearest neighbors" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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QLcivFYLXL2qbF2IiIhcEQOQAnx85A1gNxgREZESGIAUwnFAREREymEAUggDEBERkXIYgBTCAERERKQcBiCFcD0wIiIi5TAAKYQtQERERMphAFII1wMjIiJSDgOQQtgCREREpBwGIIUwABERESmHAUghDEBERETKYQBSCAMQERGRchiAFMIAREREpBwGIIWUDUBCKFsXIiIiV8MApBBdACopAQoLla0LERGRq2EAUkitWoCnp3zMbjAiIiL7YgBSiErFcUBERERKYQBSEAMQERGRMhiAFMQFUYmIiJTBAKQgtgAREREpgwFIQVwQlYiISBkMQApiCxAREZEyGIAUxABERESkDAYgBTEAERERKYMBSEEMQERERMpgAFIQAxAREZEyGIAUxABERESkDAYgBTEAERERKYMBSEG6AHTzJnDjhrJ1ISIiciUMQAry8wPc3eVjtgIRERHZDwOQgrgiPBERkTIYgBTGAERERGR/DEAK43pgRERE9scApDC2ABEREdkfA5DCGICIiIjsjwFIYQxARERE9scApDAGICIiIvtjAFIYAxAREZH9MQApjAGIiIjI/hiAFMYAREREZH8MQApjACIiIrI/BiCFMQARERHZHwOQwurWlfeFhUBRkbJ1ISIichUMQArz9wfc/ncWrlxRti5ERESuggFIYW5uQJ068jHXAyMiIrIPBiAHwHFARERE9sUA5AAYgIiIiOyLAcgBMAARERHZFwOQA2AAIiIisi8GIAfAAERERGRfDEAOgAGIiIjIvhiAHAADEBERkX0xADkABiAiIiL7YgByAAxARERE9sUA5AAYgIiIiOyLAcgB6BZEZQAiIiKyDwYgB6BrASooAEpKlK0LERGRK2AAcgCBgaWPuSI8ERGR7TlEAJo/fz4iIyPh7e2NuLg47N6922TZlJQUxMbGIjAwEL6+voiJicGyZcsMyowZMwYqlcrg1rt3b1sfRpWp1aUhiN1gREREtueudAXWrFmDpKQkLFy4EHFxcZgzZw569eqFzMxM1K9fv1z5oKAgTJs2DdHR0fD09MSPP/6IxMRE1K9fH7169dKX6927N7766iv9z15eXnY5nqoKCgLy8hiAiIiI7EHxFqCPPvoITz/9NBITE3HnnXdi4cKFqFWrFhYvXmy0fLdu3TBw4EC0bNkSTZs2xcSJE9GmTRts27bNoJyXlxca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/9mcz3p1MQDVUACM3r766it9mfvuu0+MHj1a//OkSZNEo0aNhKenpwgJCREPPfSQyMjIsH/lq2DYsGEiNDRUeHp6ivDwcDFs2DBx/Phx/fO3H6sQQnz99dfijjvuEJ6enqJVq1biv//9r51rXXUbNmwQAERmZma555z5vG7evNnov1vd8Wi1WjF9+nQREhIivLy8xAMPPFDud9C4cWMxc+ZMg23z5s3T/w46deokdu7caacjqlhFx3vy5EmTn+PNmzfr93H78Vb2WVBKRcd6/fp18eCDD4p69eoJDw8P0bhxY/H000+XCzLOcm4r+3cshBCLFi0SPj4+Ii8vz+g+nOW8mvNdc+PGDTF27FhRp04dUatWLTFw4EBx7ty5cvsp+xpzPuvVpfrfGxMRERG5DI4BIiIiIpfDAEREREQuhwGIiIiIXA4DEBEREbkcBiAiIiJyOQxARERE5HIYgIiIiMjlMAARERGRy2EAIiKXMGbMGAwYMMBg2zfffANvb298+OGHylSKiBTjrnQFiIiU8MUXX2DcuHFYuHAhEhMTla4OEdkZW4CIyOXMnj0b48ePx+rVqxl+iFwUW4CIyKVMnToVn332GX788Uc88MADSleHiBTCAERELuOnn37CunXrkJqaivvvv1/p6hCRgtgFRkQuo02bNoiMjMTMmTNx7do1patDRApiACIilxEeHo60tDRkZ2ejd+/euHr1qtJVIiKFMAARkUtp3LgxtmzZgvPnzzMEEbkwBiAicjkRERFIS0vDhQsX0KtXLxQUFChdJSKyMwYgInJJDRs2RFpaGnJzcxmCiFyQSgghlK4EERERkT2xBYiIiIhcDgMQERERuRwGICIiInI5DEBERETkchiAiIiIyOUwABEREZHLYQAiIiIil8MARERERC6HAYiIiIhcDgMQERERuRwGICIiInI5DEBERETkcv4fnWkth3i6zJEAAAAASUVORK5CYII=", - "text/plain": [ - "<Figure size 640x480 with 1 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "import read_cifar as rc\n", - "import knn\n", - "X,y=rc.read_cifar('data') \n", - "# Split the Dataset\n", - "X_train,y_train,X_test,y_test=rc.split_dataset(X,y,split=0.9) \n", - "# Plot the accuracy of the model KNN\n", - "knn.plot_KNN(X_train,y_train,X_test,y_test) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Artificial Neural Network" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\Users\\HP\\Desktop\\Deep_learning_BE\\image-classification\\mlp.py:29: RuntimeWarning: overflow encountered in exp\n", - " return 1 / (1 + np.exp(-x))\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/100\n", - "Train Accuracy: 0.093370 Test Accuracy: 0.069000\n", - "Epoch 2/100\n", - "Train Accuracy: 0.073167 Test Accuracy: 0.073833\n", - "Epoch 3/100\n", - "Train Accuracy: 0.074981 Test Accuracy: 0.078000\n", - "Epoch 4/100\n", - "Train Accuracy: 0.076926 Test Accuracy: 0.076667\n", - "Epoch 5/100\n", - "Train Accuracy: 0.078741 Test Accuracy: 0.076000\n", - "Epoch 6/100\n", - "Train Accuracy: 0.079537 Test Accuracy: 0.076000\n", - "Epoch 7/100\n", - "Train Accuracy: 0.078704 Test Accuracy: 0.076500\n", - "Epoch 8/100\n", - "Train Accuracy: 0.079852 Test Accuracy: 0.077000\n", - "Epoch 9/100\n", - "Train Accuracy: 0.079944 Test Accuracy: 0.078000\n", - "Epoch 10/100\n", - "Train Accuracy: 0.079722 Test Accuracy: 0.078667\n", - "Epoch 11/100\n", - "Train Accuracy: 0.080241 Test Accuracy: 0.077667\n", - "Epoch 12/100\n", - "Train Accuracy: 0.080463 Test Accuracy: 0.077500\n", - "Epoch 13/100\n", - "Train Accuracy: 0.080500 Test Accuracy: 0.076167\n", - "Epoch 14/100\n", - "Train Accuracy: 0.080870 Test Accuracy: 0.076333\n", - "Epoch 15/100\n", - "Train Accuracy: 0.081204 Test Accuracy: 0.075333\n", - "Epoch 16/100\n", - "Train Accuracy: 0.081352 Test Accuracy: 0.076167\n", - "Epoch 17/100\n", - "Train Accuracy: 0.081389 Test Accuracy: 0.075667\n", - "Epoch 18/100\n", - "Train Accuracy: 0.082185 Test Accuracy: 0.075333\n", - "Epoch 19/100\n", - "Train Accuracy: 0.081981 Test Accuracy: 0.076167\n", - "Epoch 20/100\n", - "Train Accuracy: 0.081741 Test Accuracy: 0.075667\n", - "Epoch 21/100\n", - "Train Accuracy: 0.081741 Test Accuracy: 0.076833\n", - "Epoch 22/100\n", - "Train Accuracy: 0.082111 Test Accuracy: 0.075667\n", - "Epoch 23/100\n", - "Train Accuracy: 0.082259 Test Accuracy: 0.075333\n", - "Epoch 24/100\n", - "Train Accuracy: 0.082315 Test Accuracy: 0.074667\n", - "Epoch 25/100\n", - "Train Accuracy: 0.082370 Test Accuracy: 0.076833\n", - "Epoch 26/100\n", - "Train Accuracy: 0.082852 Test Accuracy: 0.074833\n", - "Epoch 27/100\n", - "Train Accuracy: 0.082926 Test Accuracy: 0.075833\n", - "Epoch 28/100\n", - "Train Accuracy: 0.083185 Test Accuracy: 0.075833\n", - "Epoch 29/100\n", - "Train Accuracy: 0.083370 Test Accuracy: 0.075833\n", - "Epoch 30/100\n", - "Train Accuracy: 0.083667 Test Accuracy: 0.076500\n", - "Epoch 31/100\n", - "Train Accuracy: 0.083741 Test Accuracy: 0.076833\n", - "Epoch 32/100\n", - "Train Accuracy: 0.083778 Test Accuracy: 0.078500\n", - "Epoch 33/100\n", - "Train Accuracy: 0.084185 Test Accuracy: 0.079167\n", - "Epoch 34/100\n", - "Train Accuracy: 0.084148 Test Accuracy: 0.079000\n", - "Epoch 35/100\n", - "Train Accuracy: 0.084407 Test Accuracy: 0.079500\n", - "Epoch 36/100\n", - "Train Accuracy: 0.085037 Test Accuracy: 0.079500\n", - "Epoch 37/100\n", - "Train Accuracy: 0.085037 Test Accuracy: 0.080000\n", - "Epoch 38/100\n", - "Train Accuracy: 0.084778 Test Accuracy: 0.079667\n", - "Epoch 39/100\n", - "Train Accuracy: 0.084593 Test Accuracy: 0.079833\n", - "Epoch 40/100\n", - "Train Accuracy: 0.084519 Test Accuracy: 0.080167\n", - "Epoch 41/100\n", - "Train Accuracy: 0.084852 Test Accuracy: 0.079500\n", - "Epoch 42/100\n", - "Train Accuracy: 0.084815 Test Accuracy: 0.079167\n", - "Epoch 43/100\n", - "Train Accuracy: 0.084574 Test Accuracy: 0.079000\n", - "Epoch 44/100\n", - "Train Accuracy: 0.084685 Test Accuracy: 0.078500\n", - "Epoch 45/100\n", - "Train Accuracy: 0.084481 Test Accuracy: 0.079000\n", - "Epoch 46/100\n", - "Train Accuracy: 0.084833 Test Accuracy: 0.079333\n", - "Epoch 47/100\n", - "Train Accuracy: 0.085130 Test Accuracy: 0.079500\n", - "Epoch 48/100\n", - "Train Accuracy: 0.085185 Test Accuracy: 0.080667\n", - "Epoch 49/100\n", - "Train Accuracy: 0.085389 Test Accuracy: 0.080833\n", - "Epoch 50/100\n", - "Train Accuracy: 0.085944 Test Accuracy: 0.081667\n", - "Epoch 51/100\n", - "Train Accuracy: 0.086111 Test Accuracy: 0.079000\n", - "Epoch 52/100\n", - "Train Accuracy: 0.086648 Test Accuracy: 0.079667\n", - "Epoch 53/100\n", - "Train Accuracy: 0.086963 Test Accuracy: 0.080833\n", - "Epoch 54/100\n", - "Train Accuracy: 0.087278 Test Accuracy: 0.081833\n", - "Epoch 55/100\n", - "Train Accuracy: 0.087648 Test Accuracy: 0.082500\n", - "Epoch 56/100\n", - "Train Accuracy: 0.088352 Test Accuracy: 0.084167\n", - "Epoch 57/100\n", - "Train Accuracy: 0.088519 Test Accuracy: 0.083500\n", - "Epoch 58/100\n", - "Train Accuracy: 0.089019 Test Accuracy: 0.085167\n", - "Epoch 59/100\n", - "Train Accuracy: 0.089000 Test Accuracy: 0.086333\n", - "Epoch 60/100\n", - "Train Accuracy: 0.089500 Test Accuracy: 0.086000\n", - "Epoch 61/100\n", - "Train Accuracy: 0.089833 Test Accuracy: 0.086333\n", - "Epoch 62/100\n", - "Train Accuracy: 0.090056 Test Accuracy: 0.088000\n", - "Epoch 63/100\n", - "Train Accuracy: 0.090370 Test Accuracy: 0.087833\n", - "Epoch 64/100\n", - "Train Accuracy: 0.090185 Test Accuracy: 0.087667\n", - "Epoch 65/100\n", - "Train Accuracy: 0.090741 Test Accuracy: 0.087167\n", - "Epoch 66/100\n", - "Train Accuracy: 0.091444 Test Accuracy: 0.087833\n", - "Epoch 67/100\n", - "Train Accuracy: 0.091667 Test Accuracy: 0.088500\n", - "Epoch 68/100\n", - "Train Accuracy: 0.092315 Test Accuracy: 0.090167\n", - "Epoch 69/100\n", - "Train Accuracy: 0.091963 Test Accuracy: 0.090667\n", - "Epoch 70/100\n", - "Train Accuracy: 0.092093 Test Accuracy: 0.091167\n", - "Epoch 71/100\n", - "Train Accuracy: 0.091833 Test Accuracy: 0.091833\n", - "Epoch 72/100\n", - "Train Accuracy: 0.091870 Test Accuracy: 0.090333\n", - "Epoch 73/100\n", - "Train Accuracy: 0.092148 Test Accuracy: 0.091833\n", - "Epoch 74/100\n", - "Train Accuracy: 0.092481 Test Accuracy: 0.091667\n", - "Epoch 75/100\n", - "Train Accuracy: 0.092315 Test Accuracy: 0.093000\n", - "Epoch 76/100\n", - "Train Accuracy: 0.092852 Test Accuracy: 0.093333\n", - "Epoch 77/100\n", - "Train Accuracy: 0.093389 Test Accuracy: 0.093500\n", - "Epoch 78/100\n", - "Train Accuracy: 0.093852 Test Accuracy: 0.095500\n", - "Epoch 79/100\n", - "Train Accuracy: 0.094167 Test Accuracy: 0.095500\n", - "Epoch 80/100\n", - "Train Accuracy: 0.094685 Test Accuracy: 0.096333\n", - "Epoch 81/100\n", - "Train Accuracy: 0.095111 Test Accuracy: 0.097000\n", - "Epoch 82/100\n", - "Train Accuracy: 0.095537 Test Accuracy: 0.097667\n", - "Epoch 83/100\n", - "Train Accuracy: 0.095685 Test Accuracy: 0.096833\n", - "Epoch 84/100\n", - "Train Accuracy: 0.096167 Test Accuracy: 0.098000\n", - "Epoch 85/100\n", - "Train Accuracy: 0.095685 Test Accuracy: 0.097833\n", - "Epoch 86/100\n", - "Train Accuracy: 0.096000 Test Accuracy: 0.097333\n", - "Epoch 87/100\n", - "Train Accuracy: 0.096481 Test Accuracy: 0.097667\n", - "Epoch 88/100\n", - "Train Accuracy: 0.096611 Test Accuracy: 0.098167\n", - "Epoch 89/100\n", - "Train Accuracy: 0.096519 Test Accuracy: 0.098667\n", - "Epoch 90/100\n", - "Train Accuracy: 0.096519 Test Accuracy: 0.098500\n", - "Epoch 91/100\n", - "Train Accuracy: 0.096519 Test Accuracy: 0.096500\n", - "Epoch 92/100\n", - "Train Accuracy: 0.096704 Test Accuracy: 0.097667\n", - "Epoch 93/100\n", - "Train Accuracy: 0.096815 Test Accuracy: 0.098167\n", - "Epoch 94/100\n", - "Train Accuracy: 0.096685 Test Accuracy: 0.099000\n", - "Epoch 95/100\n", - "Train Accuracy: 0.096796 Test Accuracy: 0.098833\n", - "Epoch 96/100\n", - "Train Accuracy: 0.096815 Test Accuracy: 0.099167\n", - "Epoch 97/100\n", - "Train Accuracy: 0.097241 Test Accuracy: 0.098833\n", - "Epoch 98/100\n", - "Train Accuracy: 0.097333 Test Accuracy: 0.099500\n", - "Epoch 99/100\n", - "Train Accuracy: 0.097389 Test Accuracy: 0.098833\n", - "Epoch 100/100\n", - "Train Accuracy: 0.097556 Test Accuracy: 0.098167\n", - "Test Set Accuracy: 0.09816666666666667\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "<Figure size 640x480 with 1 Axes>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import mlp\n", - "mlp.plot_ANN(X_train,y_train,X_test,y_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Test " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test de la fonction read_cifar " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import read_cifar as rc\n", - "from read_cifar import read_cifar_batch\n", - "from read_cifar import read_cifar\n", - "\n", - "def test_read_cifar_batch():\n", - " # Test read_cifar_batch function\n", - " batch_path = \"data\\data_batch_1\"\n", - " data, labels = read_cifar_batch(batch_path)\n", - "\n", - " # Check that data has the right shape and type\n", - " assert data.shape == (10000, 3072)\n", - " assert data.dtype == np.float32\n", - "\n", - " # Check that labels has the right shape and type\n", - " assert labels.shape == (10000,)\n", - " assert labels.dtype == np.int64\n", - " print(\"All tests passed successfully.\")\n", - " \n", - "def test_read_cifar():\n", - " # Test read_cifar function\n", - " data, labels = read_cifar('data')\n", - "\n", - " # Check that data has the right shape and type\n", - " assert data.shape == (60000, 3072)\n", - " assert data.dtype == np.float32\n", - "\n", - " # Check that labels has the right shape and type\n", - " assert labels.shape == (60000,)\n", - " assert labels.dtype == np.int64\n", - " print(\"All tests passed successfully.\")\n", - "\n", - "def test_split_dataset():\n", - " data = np.random.randn(150, 4)\n", - " labels = np.random.randn(150)\n", - " split = 0.8\n", - " data_train, labels_train, data_test, labels_test = rc.split_dataset(data, labels, split)\n", - "\n", - " total_size = data_train.shape[0] + data_test.shape[0]\n", - "\n", - " assert total_size == len(data)\n", - " assert len(labels_train) == len(data_train)\n", - " assert len(labels_test) == len(data_test)\n", - " \n", - " print(\"All tests passed successfully.\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All tests passed successfully.\n" - ] - } - ], - "source": [ - "test_read_cifar_batch()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All tests passed successfully.\n" - ] - } - ], - "source": [ - "test_read_cifar()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All tests passed successfully.\n" - ] - } - ], - "source": [ - "test_split_dataset()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test de la fonction knn" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import knn \n", - "\n", - "# Test de la fonction distance_matrix :\n", - "def test_distance_matrix():\n", - " X = np.array([[1, 2], [3, 4]])\n", - " Y = np.array([[2, 2], [1, 1]])\n", - " dists = knn.distance_matrix(X, Y)\n", - " assert dists.shape == (2, 2)\n", - " print(\"Test for distance_matrix passed.\")\n", - " \n", - "\n", - "# Test de la fonction knn_predict :\n", - "def test_knn_predict():\n", - " dists = np.array([[2, 5], [10, 1]])\n", - " labels_train = np.array([0, 1])\n", - " k = 1\n", - " y_pred = knn.knn_predict(dists, labels_train, k)\n", - " assert y_pred.shape == (2,)\n", - " assert np.array_equal(y_pred, np.array([0, 1]))\n", - " print(\"Test for knn_predict passed.\")\n", - "\n", - "# Test de la fonction evaluate_knn :\n", - "def test_evaluate_knn_accuracy():\n", - " data_train = np.array([[1, 2], [3, 4], [5, 6], [1, 1], [2, 2]])\n", - " labels_train = np.array([0, 1, 2, 0, 1])\n", - " data_test = np.array([[2, 2], [1, 1], [3, 3]])\n", - " labels_test = np.array([1, 0, 1])\n", - " k = 2\n", - " accuracy = knn.evaluate_knn(data_train, labels_train, data_test, labels_test, k)\n", - " assert 0 <= accuracy <= 1\n", - " print(\"Test for evaluate_knn accuracy passed.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test for distance_matrix passed.\n" - ] - } - ], - "source": [ - "test_distance_matrix()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test for knn_predict passed.\n" - ] - } - ], - "source": [ - "test_knn_predict()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test for evaluate_knn accuracy passed.\n" - ] - } - ], - "source": [ - "test_evaluate_knn_accuracy()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Test de la fonction mlp" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "from mlp import initialization, train_mlp, calculate_accuracy, run_mlp_training\n", - "\n", - "def test_mlp_training():\n", - " #Paramètres du test\n", - " num_samples = 200\n", - " num_features = 3\n", - " num_classes = 2\n", - " num_hidden_units = 3\n", - " learning_rate = 0.1\n", - " num_epochs = 10\n", - "\n", - " # Générez des données factices pour le test\n", - " X_train = np.random.randn(num_samples, num_features)\n", - " y_train = np.random.randint(0, num_classes, num_samples)\n", - " X_test = np.random.randn(num_samples, num_features)\n", - " y_test = np.random.randint(0, num_classes, num_samples)\n", - "\n", - " # Initialisez les poids et les biais\n", - " W1, b1, W2, b2 = initialization(num_features, num_hidden_units, num_classes)\n", - "\n", - " # Entraînez le modèle\n", - " train_accuracies, test_accuracy = run_mlp_training(X_train, y_train, X_test, y_test, num_hidden_units, learning_rate, num_epochs)\n", - "\n", - " # Vérifiez si l'accuracy sur l'ensemble de test est un nombre entre 0 et 1\n", - " assert 0 <= test_accuracy <= 1\n", - "\n", - " # Vérifiez si la longueur de la liste des accuracies d'entraînement correspond au nombre d'époques\n", - " assert len(train_accuracies) == num_epochs\n", - "\n", - " # Vérifiez si les accuracies d'entraînement sont des nombres entre 0 et 1\n", - " for accuracy in train_accuracies:\n", - " assert 0 <= accuracy <= 1\n", - "\n", - " print(\"Tous les tests ont réussi avec succès.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 1/10\n", - "Train Accuracy: 0.490000 Test Accuracy: 0.555000\n", - "Epoch 2/10\n", - "Train Accuracy: 0.490000 Test Accuracy: 0.535000\n", - "Epoch 3/10\n", - "Train Accuracy: 0.505000 Test Accuracy: 0.540000\n", - "Epoch 4/10\n", - "Train Accuracy: 0.505000 Test Accuracy: 0.540000\n", - "Epoch 5/10\n", - "Train Accuracy: 0.500000 Test Accuracy: 0.545000\n", - "Epoch 6/10\n", - "Train Accuracy: 0.500000 Test Accuracy: 0.545000\n", - "Epoch 7/10\n", - "Train Accuracy: 0.500000 Test Accuracy: 0.545000\n", - "Epoch 8/10\n", - "Train Accuracy: 0.500000 Test Accuracy: 0.545000\n", - "Epoch 9/10\n", - "Train Accuracy: 0.500000 Test Accuracy: 0.545000\n", - "Epoch 10/10\n", - "Train Accuracy: 0.500000 Test Accuracy: 0.545000\n", - "Tous les tests ont réussi avec succès.\n" - ] - } - ], - "source": [ - "test_mlp_training()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.12.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/mlp.py b/mlp.py index 5839834..2a03b6b 100644 --- a/mlp.py +++ b/mlp.py @@ -1,61 +1,11 @@ import numpy as np +import pandas as pd import matplotlib.pyplot as plt - - -N = 30 # number of input data -d_in = 3 # input dimension -d_h = 3 # number of neurons in the hidden layer -d_out = 2 # output dimension (number of neurons of the output layer) -learning_rate = 0.1 -num_epochs=100 - -# Random initialization of the network weights and biaises -def initialization(d_in,d_h,d_out): - np.random.seed(10) # To get the same random values - W1 = 2 * np.random.rand(d_in, d_h) - 1 # first layer weights - b1 = np.zeros((1, d_h)) # first layer biaises - W2 = 2 * np.random.rand(d_h, d_out) - 1 # second layer weights - b2 = np.zeros((1, d_out)) # second layer biaises - return W1,b1,W2,b2 - -data = np.random.rand(N, d_in) # create a random data -targets = np.random.rand(N, d_out) # create a random targets - -# Define the sigmoid activation function -def sigmoid(x,derivate): - if derivate==False: - return 1 / (1 + np.exp(-x)) - else: - return x*(1-x) - - -# Define the softmax activation function -def softmax(x,derivate): - if derivate == False : - return np.exp(x) / np.exp(np.array(x)).sum(axis=1, keepdims=True) - else : - return x*(1-x) - -#Definir les métriques : -def loss_metrics(predictions, targets, metric, status): - if metric == "MSE": - if status == "forward": - return np.mean((predictions - targets) ** 2) - elif status == "backward": - return 2 * (predictions - targets) / len(predictions) # Gradient of MSE loss - elif metric == "BCE": - # Binary Cross-Entropy Loss - epsilon = 1e-15 # Small constant to prevent log(0) - predictions = np.clip(predictions, epsilon, 1 - epsilon) - if status == "forward": - return - (targets * np.log(predictions) + (1 - targets) * np.log(1 - predictions)).mean() - elif status == "backward": - return (predictions - targets) / ((1 - predictions) * predictions) # Gradient of BCE loss - else: - raise ValueError("Metric not supported: " + metric) +import read_cifar as rc # learn_once_mse -""" +def learn_once_mse(w1, b1, w2, b2, data, targets, learning_rate): + """ Update the weights and biases of the network for one gradient descent step using Mean Squared Error (MSE) loss. Parameters: @@ -74,42 +24,38 @@ def loss_metrics(predictions, targets, metric, status): - b2: Updated bias vector of the second layer. - loss: Mean Squared Error (MSE) loss for monitoring. """ - -def learn_once_mse(W1, b1, W2, b2, data, targets, learning_rate): + a0 = data # Forward pass - # Calculate the input and output of the hidden layer - hidden_layer_input = np.matmul(data, W1) + b1 - hidden_layer_output = sigmoid(hidden_layer_input, derivate=False) # Apply the sigmoid activation - - # Calculate the input and output of the output layer - output_layer_input = np.matmul(hidden_layer_output, W2) + b2 - output_layer_output = softmax(output_layer_input, derivate=False) # Apply the softmax activation - - # Backpropagation phase - # Calculate the error at the output layer - output_error = output_layer_output - targets - - # Calculate gradients for the output layer - output_layer_gradients = output_error * softmax(output_layer_output, derivate=True) + z1 = np.matmul(a0, w1) + b1 # Calculate the weighted sum for the hidden layer + a1 = 1 / (1 + np.exp(-z1)) # Apply the sigmoid activation function to hidden layer + z2 = np.matmul(a1, w2) + b2 # Calculate the weighted sum for the output layer + a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True) # Apply the softmax activation to the output layer + predictions = a2 # The network's predictions - # Update weights and biases of the output layer - W2 = W2 - learning_rate * np.dot(hidden_layer_output.T, output_layer_gradients) / data.shape[0] - b2 = b2 - learning_rate * (1 / hidden_layer_output.shape[1]) * output_layer_gradients.sum(axis=0, keepdims=True) + n = data.shape[0] # Number of samples (batch size) - # Calculate the error at the hidden layer - hidden_layer_error = np.dot(output_layer_gradients, W2.T) + # Backpropagation + e2 = predictions - targets # Compute the error in the output layer - # Calculate gradients for the hidden layer - hidden_layer_gradients = hidden_layer_error * sigmoid(hidden_layer_output, derivate=True) + dw2 = e2 * a2 * (1 - a2) / n # Gradient for w2 + update_w2 = np.dot(a1.T, dw2) / n # Update for w2 + update_b2 = (1/a1.shape[1])*dw2.sum(axis=0, keepdims=True) # Update for b2 - # Update weights and biases of the hidden layer - W1 = W1 - learning_rate * np.dot(data.T, hidden_layer_gradients) / data.shape[0] - b1 = b1 - learning_rate * (1 / data.shape[1]) * hidden_layer_gradients.sum(axis=0) + e1 = np.dot(e2, w2.T) # Compute the error in the hidden layer + dw1 = e1 * a1 * (1 - a1) # Gradient for w1 + update_b1 = (1/data.shape[1])*dw1.sum(axis=0, keepdims=True) # Update for b1 + update_w1 = np.dot(data.T, dw1) / n # Update for w2 - # Calculate the loss using the specified metric - loss = loss_metrics(output_layer_output, targets,metric="MSE",status="forward") + # Gradient descent + w2 = w2 - learning_rate * update_w2 + b2 = b2 - learning_rate * update_b2 + w1 = w1 - learning_rate * update_w1 + b1 = b1 - learning_rate * update_b1 - return W1, b1, W2, b2, loss + # Calculate the Mean Squared Error (MSE) loss + loss = compute_error(predictions, targets, loss_type = 'MSE') + + return w1, b1, w2, b2, loss #One Hot Function : def one_hot(targets): @@ -133,9 +79,9 @@ def one_hot(targets): return one_hot_matrix -#learn_once_cross_entropy -def learn_once_cross_entropy(W1, b1, W2, b2, data, targets, learning_rate): +# The function learn_once_mse: +def learn_once_cross_entropy(w1, b1, w2, b2, data, targets, learning_rate): """ Perform one gradient descent step using binary cross-entropy loss. @@ -149,59 +95,47 @@ def learn_once_cross_entropy(W1, b1, W2, b2, data, targets, learning_rate): - Updated weights and biases (W1, b1, W2, b2) of the network. - Loss value for monitoring. """ - # Forward pass - # Implement feedforward propagation on the hidden layer - hidden_layer_input = np.matmul(data, W1) + b1 - hidden_layer_output = sigmoid(hidden_layer_input, derivate=False) # Apply the Sigmoid activation function - - # Implement feedforward propagation on the output layer - output_layer_input = np.matmul(hidden_layer_output, W2) + b2 - output_layer_output = softmax(output_layer_input, derivate=False) # Apply the Softmax activation function - - # Backpropagation phase - # Updating W2 and b2 - output_error = output_layer_output - targets - dW2 = output_error * softmax(output_layer_output, derivate=True) - W2_update = np.dot(hidden_layer_output.T, dW2) / data.shape[0] - update_b2 = (1 / hidden_layer_output.shape[1]) * dW2.sum(axis=0, keepdims=True) - - # Updating W1 and b1 - hidden_layer_error = np.dot(dW2, W2.T) - dW1 = hidden_layer_error * sigmoid(hidden_layer_output, derivate=True) - W1_update = np.dot(data.T, dW1) / data.shape[0] - update_b1 = (1 / data.shape[1]) * dW1.sum(axis=0, keepdims=True) + z1 = np.matmul(data, 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) - # Gradient descent - W2 = W2 - learning_rate * W2_update - W1 = W1 - learning_rate * W1_update - b2 = b2 - learning_rate * update_b2 - b1 = b1 - learning_rate * update_b1 + predictions = a2 - # Compute loss (Binary Cross Entropy) - loss = loss_metrics(output_layer_output, targets, metric="BCE", status="forward") + one_hot_matrix = one_hot(targets) - return W1, b1, W2, b2, loss + n = data.shape[0] + # Backpropagation + e2 = predictions - one_hot_matrix + dw2 = e2 * a2 * (1 - a2) / n + update_w2 = np.dot(a1.T, dw2) / n + update_b2 = (1/a1.shape[1])*dw2.sum(axis=0, keepdims=True) -def calculate_accuracy(predictions, actual_values): - """ - calculate_accuracy: Compute the accuracy of the model. + e1 = np.dot(e2, w2.T) + dw1 = e1 * a1 * (1 - a1) + update_b1 = (1/data.shape[1])*dw1.sum(axis=0, keepdims=True) + update_w1 = np.dot(data.T, dw1) / n - Parameters: - - predictions: Predicted values. - - actual_values: Ground truth observations. + # Gradient descent + w2 = w2 - learning_rate * update_w2 + b2 = b2 - learning_rate * update_b2 + w1 = w1 - learning_rate * update_w1 + b1 = b1 - learning_rate * update_b1 + + # Calculate binary cross-entropy loss + loss = compute_error(predictions, one_hot_matrix, loss_type = 'binary cross-entropy') + + # Calculate the accuray for a single batch + batch_accuracy = accuracy(predictions, one_hot_matrix) - Returns: - - Accuracy as a float. - """ - correct_predictions = predictions.argmax(axis=1) == actual_values.argmax(axis=1) - accuracy = correct_predictions.mean() - return accuracy + return w1, b1, w2, b2, loss, batch_accuracy -def train_mlp(W1, b1, W2, b2, data, targets, learning_rate): - """ - Perform training steps for a specified number of epochs. +# The function train_mlp: +def train_mlp(w1, b1, w2, b2, data_train, labels_train, learning_rate, num_epoch): + """ + Perform training steps for a specified number of epochs. Parameters: - W1, b1, W2, b2: Weights and biases of the network. @@ -215,43 +149,25 @@ def train_mlp(W1, b1, W2, b2, data, targets, learning_rate): - Updated weights and biases (W1, b1, W2, b2) of the network. - List of training accuracies across epochs as a list of floats. """ - - # Forward pass - hidden_layer_input = np.matmul(data, W1) + b1 - hidden_layer_output = sigmoid(hidden_layer_input, derivate=False) + train_accuracies = [] # To store training accuracies across epochs - output_layer_input = np.matmul(hidden_layer_output, W2) + b2 - output_layer_output = softmax(output_layer_input, derivate=False) + # Iterate through the specified number of epochs + for epoch in range(num_epoch): - N = data.shape[0] + # Call the 'learn_once_cross_entropy' function to update weights, calculate loss, and obtain batch accuracy + w1, b1, w2, b2, loss, batch_accuracy = learn_once_cross_entropy(w1, b1, w2, b2, data_train, labels_train, learning_rate) - # Backpropagation phase - output_error = output_layer_output - targets - output_layer_gradients = output_error * softmax(output_layer_output, derivate=True) + # Append the batch accuracy to the 'train_accuracies' list for tracking progress + train_accuracies.append(batch_accuracy) - W2_update = np.dot(hidden_layer_output.T, output_layer_gradients) / N - update_b2 = (1 / hidden_layer_output.shape[1]) * output_layer_gradients.sum(axis=0, keepdims=True) + # Print the current epoch's progress + print("Epoch {}/{}".format(epoch+1, num_epoch)) + print("[=======] Train_Accuracies : {}".format(round(batch_accuracy, 5))) - hidden_layer_error = np.dot(output_layer_gradients, W2.T) - hidden_layer_gradients = hidden_layer_error * sigmoid(hidden_layer_output, derivate=True) + return w1, b1, w2, b2, train_accuracies - W1_update = np.dot(data.T, hidden_layer_gradients) / N - update_b1 = (1 / data.shape[1]) * hidden_layer_gradients.sum(axis=0, keepdims=True) - - # Gradient descent - W2 = W2 - learning_rate * W2_update - W1 = W1 - learning_rate * W1_update - b2 = b2 - learning_rate * update_b2 - b1 = b1 - learning_rate * update_b1 - - # Calculate loss and accuracy - loss = loss_metrics(output_layer_output, targets,metric="BCE",status="forward") - - train_accuracies=calculate_accuracy(output_layer_output, targets) - - return W1, b1, W2, b2, loss, train_accuracies - -def test_mlp(W1, b1, W2, b2, data_test, labels_test): +# The function test_mlp: +def test_mlp(w1,b1,w2,b2,data_test,labels_test): """ Evaluate the network's performance on the test set. @@ -263,18 +179,19 @@ def test_mlp(W1, b1, W2, b2, data_test, labels_test): Returns: - test_accuracy: The testing accuracy as a float. """ - # Forward pass - hidden_layer_input = np.matmul(data_test, W1) + b1 - hidden_layer_output = sigmoid(hidden_layer_input, derivate=False) + z1 = np.matmul(data_test, 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) + + # Compute the testing accuracy using the 'accuracy' function + test_accuracy = accuracy(a2, labels_test) - output_layer_input = np.matmul(hidden_layer_output, W2) + b2 - output_layer_output = softmax(output_layer_input, derivate=False) + return test_accuracy - # Compute testing accuracy - test_accuracy = calculate_accuracy(output_layer_output, labels_test) - return test_accuracy -def run_mlp_training(X_train, labels_train, data_test, labels_test, num_hidden_units, learning_rate, num_epochs): +# The function run_mlp_training: +def run_mlp_training(X_train, labels_train, data_test, labels_test, d_h, learning_rate, num_epoch): """ Train an MLP classifier and evaluate its performance. @@ -291,30 +208,31 @@ def run_mlp_training(X_train, labels_train, data_test, labels_test, num_hidden_u - train_accuracies: List of training accuracies across epochs. - test_accuracy: The final testing accuracy. """ - #input_dimension = X_train.shape[1] - #output_dimension = np.unique(labels_train).shape[0] # Number of classes - - # Initialize weights and biases - W1, b1, W2, b2 = initialization(d_in, d_h, d_out) - - train_accuracies = [] # List to store training accuracies - - # Training loop - for epoch in range(num_epochs): - W1, b1, W2, b2, loss, train_accuracy = train_mlp(W1, b1, W2, b2, X_train, one_hot(labels_train), learning_rate) - test_accuracy = test_mlp(W1, b1, W2, b2, data_test, one_hot(labels_test)) - train_accuracies.append(train_accuracy) - - print("Epoch {}/{}".format(epoch + 1, num_epochs)) - print("Train Accuracy: {:.6f} Test Accuracy: {:.6f}".format(round(train_accuracy, 6), round(test_accuracy, 6))) - return train_accuracies, test_accuracy + d_in = X_train.shape[1] # Input dimension + d_out = 10 # Output dimension: 10 classes -# plot_ANN + np.random.seed(10) # Set a random seed for reproducibility -import matplotlib.pyplot as plt + # Initialize weights and biases for the neural network + w1 = 2 * np.random.rand(d_in, d_h) - 1 # First layer weights + b1 = np.zeros((1, d_h)) # First layer biases + w2 = 2 * np.random.rand(d_h, d_out) - 1 # Second layer weights + b2 = np.zeros((1, d_out)) # Second layer biases + + # Train the MLP using the provided training data and parameters + w1, b1, w2, b2, train_accuracies = train_mlp(w1, b1, w2, b2, X_train, labels_train, learning_rate, num_epoch) + + # Test the trained MLP on the testing data and compute the test accuracy + test_accuracy = test_mlp(w1, b1, w2, b2, data_test, one_hot(labels_test)) -def plot_ANN(X_train, y_train, X_test, y_test): + # Print the test set accuracy + print("test accuracy:", test_accuracy) + + return train_accuracies, test_accuracy + +# Plot of the evolution of learning accuracy across learning epochs: +def plot_ANN(data_train, labels_train, data_test, labels_test): """ Plot the variation of accuracy in terms of the number of epochs. @@ -324,29 +242,61 @@ def plot_ANN(X_train, y_train, X_test, y_test): - X_test: Test data matrix. - y_test: True labels for the test data. """ - # Train an MLP and obtain training accuracies and final test accuracy - train_accuracies, test_accuracy = run_mlp_training(X_train, y_train, X_test, y_test, num_hidden_units=64, learning_rate=0.1, num_epochs=100) + # Train the MLP and obtain training accuracies and test accuracy + train_accuracies, test_accuracy = run_mlp_training(data_train, labels_train, data_test, labels_test, 64, 0.1, 100) + + # Create a DataFrame from the accuracy values + df = pd.DataFrame({'Epoch': range(1, len(train_accuracies) + 1), 'Accuracy': train_accuracies}) - # Display the test accuracy - print("Test Set Accuracy: {}".format(test_accuracy)) + # Create a line plot using Matplotlib + plt.figure(figsize=(10, 6)) + plt.plot(df['Epoch'], df['Accuracy'], 'b') - # Create a Matplotlib plot - plt.plot(list(range(1, len(train_accuracies) + 1)), train_accuracies) - plt.title('Accuracy Variation Over Epochs') + # Add labels and title to the plot plt.xlabel('Epoch') plt.ylabel('Accuracy') + plt.title('The Variation of Accuracy') - # Save the figure (optional) + # Save the plot as an image file plt.savefig("Results/mlp.png") - # Show the plot (optional) - plt.show() - - - +# Define accuracy function +def accuracy(y_pred, y_true): + """ + calculate_accuracy: Compute the accuracy of the model. + Parameters: + - predictions: Predicted values. + - actual_values: Ground truth observations. + Returns: + - Accuracy as a float. + """ + accuracy = (y_pred.argmax(axis=1) == y_true.argmax(axis=1)).mean() + return accuracy +def compute_error(predictions, targets, loss_type): + # Calculate the loss based on the specified loss type + + if loss_type == 'MSE': # Mean Squared Error loss + loss = np.mean(np.square(predictions - targets)) + elif loss_type == 'binary cross-entropy': # Binary Cross-Entropy loss + n = targets.shape[0] + loss = -(1/n)*np.mean((np.dot(targets.T,np.log(predictions+ 1e-7)) + np.dot((1 - targets).T,np.log((1 - predictions+ 1e-7))))) + else: + raise ValueError("Unsupported loss type. Use 'MSE' or 'binary cross-entropy'.") + + return loss +# The following code block is executed only if the script is run as the main program +if _name_ == "_main_": + # Read the CIFAR-10 dataset from the specified path + X, y = rc.read_cifar('data\cifar-10-batches-py') + + # Split the dataset into training and testing sets + X_train, y_train, X_test, y_test = rc.split_dataset(X, y, split=0.9) + + # Plot the evolution of learning accuracy across learning epochs using the 'plot_ANN' function + plot_ANN(X_train, y_train, X_test, y_test) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 30289c4d43b2e8fbc58f0a987c9dbb13d8079c71..f79e2ac214f7f35432bcb057b6ac1eb849b2db46 100644 GIT binary patch delta 107 zcmew+-^XbB|6d+MDMKzp0YfE&ErTtCA%h-+5tuY!;AP-qC}2or$YV%hNMtC6%NtMT mWtZgysWxWNV=$R)&mk(O%aF^E$xy+N$&d$EX8<+}WC{R>=n?+_ literal 4086 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 RDh5y+xB%>Wkg3S^9smm+OA-J8 diff --git a/test/test_mlp.py b/test/test_mlp.py index 546d9f3..027576c 100644 --- a/test/test_mlp.py +++ b/test/test_mlp.py @@ -1,7 +1,7 @@ import numpy as np # Importez les fonctions -from mlp import initialization, train_mlp, calculate_accuracy +from mlp import train_mlp, accuracy def test_mlp_training(): # Paramètres du test @@ -11,6 +11,9 @@ def test_mlp_training(): num_hidden_units = 5 learning_rate = 0.1 num_epochs = 10 + d_in= 3 + d_out=2 + d_h=3 # Générez des données factices pour le test X_train = np.random.randn(num_samples, num_features) @@ -19,10 +22,13 @@ def test_mlp_training(): y_test = np.random.randint(0, num_classes, num_samples) # Initialisez les poids et les biais - W1, b1, W2, b2 = initialization(num_features, num_hidden_units, num_classes) + w1 = 2 * np.random.rand(d_in, d_h) - 1 # First layer weights + b1 = np.zeros((1, d_h)) # First layer biases + w2 = 2 * np.random.rand(d_h, d_out) - 1 # Second layer weights + b2 = np.zeros((1, d_out)) # Second layer biases # Entraînez le modèle - train_accuracies, test_accuracy = train_mlp(W1, b1, W2, b2, X_train, y_train, learning_rate, num_epochs) + train_accuracies, test_accuracy = train_mlp(w1, b1, w2, b2, X_train, y_train, learning_rate, num_epochs) # Vérifiez si l'accuracy est un nombre entre 0 et 1 assert 0 <= test_accuracy <= 1 -- GitLab