From 65b9a00d02dbfcb567ead4d48fbd9d3b33e9ff76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pelletier?= Date: Thu, 2 May 2019 22:25:24 -0400 Subject: [PATCH] =?UTF-8?q?ajout=20rapport=20final=20et=20am=C3=A9lioratio?= =?UTF-8?q?ns/corrections=20au=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/NeuralNet.py | 19 +- Code/Rapport-Final.ipynb | 407 +++++++++++++++++++++++++++++++++++++ Code/Rapport-Partiel.ipynb | 2 +- Code/main.py | 2 +- 4 files changed, 421 insertions(+), 9 deletions(-) create mode 100644 Code/Rapport-Final.ipynb diff --git a/Code/NeuralNet.py b/Code/NeuralNet.py index 8441c15..77a90d4 100644 --- a/Code/NeuralNet.py +++ b/Code/NeuralNet.py @@ -71,7 +71,7 @@ class NeuralNet: #nom de la class à changer all_input_values.append(current_input_values) return all_input_values - def train(self, train, train_labels, alpha, nb_epoch): #vous pouvez rajouter d'autres attribus au besoin + def train(self, train, train_labels, alpha, nb_epoch, verbose=True): #vous pouvez rajouter d'autres attribus au besoin """ c'est la méthode qui va entrainer votre modèle, train est une matrice de taille nxm, avec @@ -90,12 +90,14 @@ class NeuralNet: #nom de la class à changer """ train_labels_enc = self.one_hot_encoder(train_labels) + learning_curve = [] + for epoch in range(nb_epoch): - print("epoch"+str(epoch)) + # print("epoch"+str(epoch)) for i in range(len(train)): deltas = [] output = self.feed_forward(train[i]) - print("Les valeurs des sorties sont: "+str(output)+"\nLabel:"+str(train_labels_enc[i])) + # print("Les valeurs des sorties sont: "+str(output)+"\nLabel:"+str(train_labels_enc[i])) deltas.append(train_labels_enc[i]-output[-1]) # On recule dans les couches cachées j for j in reversed(range(self.n_hidden_layers)): @@ -114,12 +116,13 @@ class NeuralNet: #nom de la class à changer # Vu qu'on recule, on insère au début au lieu de la fin deltas.insert(0,layerError) # Mise à jour des poids - print("Mise à jour des poids. Les deltas sont: "+str(deltas)) + # print("Mise à jour des poids. Les deltas sont: "+str(deltas)) for j in range(len(self.layers)): # Pour chaque neurone k for k in range(len(self.layers[j])): self.layers[j][k].update_weights(output[j],alpha,deltas[j][k]) - return self.test(train, train_labels) + learning_curve.append(self.test(train, train_labels, verbose)[1]) + return learning_curve def predict(self, exemple, label): """ @@ -131,6 +134,9 @@ class NeuralNet: #nom de la class à changer """ return np.argmax(self.feed_forward(exemple)[-1]) + + def score(self, test, test_labels): + return [self.predict(exemple,label) for exemple,label in zip(test,test_labels)] def test(self, test, test_labels, verbose=True): """ @@ -153,8 +159,7 @@ class NeuralNet: #nom de la class à changer """ start_time = time.time() - prediction_test = [self.predict(exemple,label) for exemple,label in zip(test,test_labels)] - print(prediction_test) + prediction_test = self.score(test,test_labels) cm = metrics.confusion_matrix(test_labels,prediction_test) accuracy, precision, recall = metrics.prediction_metrics(cm,test_labels,prediction_test) compute_time = time.time() - start_time diff --git a/Code/Rapport-Final.ipynb b/Code/Rapport-Final.ipynb new file mode 100644 index 0000000..a39b358 --- /dev/null +++ b/Code/Rapport-Final.ipynb @@ -0,0 +1,407 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction\n", + "\n", + "- Projet final présenté par: **François Pelletier**\n", + "- Matricule: **908144032**\n", + "- Dans le cadre du cours: **IFT-7025**\n", + "\n", + "# Librairies utilisées" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import load_datasets as ld\n", + "import matplotlib.pyplot as plt\n", + "import NeuralNet" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Iris Dataset\n", + "\n", + "La présentation des résultats liés à ce jeu de données servira aussi à expliquer les concepts et répondre aux questions. Pour les autres jeux de données, seul les résultats et la discussion seront détaillés.\n", + "\n", + "- Chargement du jeu de données" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "train1, train_labels1, test1, test_labels1 = ld.load_iris_dataset(train_ratio = 0.7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Choix du nombre de neurones dans la couche cachée\n", + "\n", + "On doit identifier le nombre optimal de neurones dans la couche cachée dans l'intervalle $[4,50]$ pour chacun des 5 jeux de données. On itère sur chacun des jeux de validation croisée, pour chaque dimension et on calcule l'accuracy moyenne. La dimension qui a la meilleure accuracy moyenne est choisie pour construire le réseau de neurones." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "choix_n_neurones = range(4,51)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- Pour faire la séparation du jeu de données en $k_{cv}=5$ jeux de validation croisée, on génère une permutation sur les indices du jeu d'entrainement, puis, on sépare cet ensemble en 5 groupes." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "k_cv = 5\n", + "all_indices = range(len(train_labels1))\n", + "np.random.seed(12345)\n", + "indices_cv_test = np.sort(np.array_split(np.random.permutation(all_indices),k_cv))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 4, 9, 13, 19, 20, 25, 33, 37, 39, 40, 44, 47, 48,\n", + " 54, 58, 62, 72, 76, 78, 87, 89],\n", + " [ 2, 6, 8, 26, 28, 30, 35, 42, 45, 50, 51, 52, 57,\n", + " 60, 63, 69, 74, 79, 90, 92, 96],\n", + " [ 0, 16, 17, 18, 21, 22, 24, 27, 32, 46, 49, 65, 66,\n", + " 68, 75, 83, 84, 85, 86, 88, 99],\n", + " [ 3, 5, 12, 15, 23, 31, 43, 53, 55, 56, 61, 64, 67,\n", + " 70, 71, 93, 94, 95, 97, 100, 104],\n", + " [ 1, 7, 10, 11, 14, 29, 34, 36, 38, 41, 59, 73, 77,\n", + " 80, 81, 82, 91, 98, 101, 102, 103]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "indices_cv_test" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "indices_cv_train = [np.setdiff1d(all_indices,indices_cv_test[i]) for i in range(k_cv)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ce jeux de données a trois classes possibles comme variable de sortie. On utilisera donc un réseau de neurones avec 3 neurones dans la couche de sortie, une pour chacune des valeurs possibles. Les valeurs de sortie du jeu de données sont transformées à l'aide d'un encodage binaire où la valeur de sortie est convertie en rang dans un vecteur (on commence à 0), prenant la valeur 1. Par exemple, la valeur 2 devient $[0,0,1]$." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/francois/ift7025-projet/Code/metrics.py:40: RuntimeWarning: invalid value encountered in double_scalars\n", + " myPrecision = cm[label_num,label_num] / sum(cm[:,label_num])\n" + ] + } + ], + "source": [ + "accuracy_cum = []\n", + "for n_neurones in choix_n_neurones:\n", + " accuracy_cv=[]\n", + " for cv_set in range(k_cv):\n", + " nn1 = NeuralNet.NeuralNet(np.array([4,n_neurones,3]),range(3))\n", + " nn1.train(train1[indices_cv_train[cv_set]], train_labels1[indices_cv_train[cv_set]], 0.1, 1, verbose=False)\n", + " _,accuracy,_,_,_ = nn1.test(train1[indices_cv_test[cv_set]], train_labels1[indices_cv_test[cv_set]], verbose=False)\n", + " accuracy_cv.append(accuracy)\n", + " accuracy_cum.append(np.mean(np.array(accuracy_cv)))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(choix_n_neurones,accuracy_cum)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le nombre de neurones qui maximise l'accuracy est de:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "49" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_neurones_optimal1 = choix_n_neurones[np.where(accuracy_cum==max(accuracy_cum))[0][0]]\n", + "n_neurones_optimal1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Choix du nombre de couches cachées\n", + "\n", + "On choisit un nombre de 1 à 5 couches cachées. Le nombre de couche ayany l'accuracy maximale sera sélectionné pour la construction du réseau. On effectue 10 époques étant donné la taille des réseaux à entrainer." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "choix_n_couches = range(1,6)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy_cum = []\n", + "lc_cum = []\n", + "for n_couches in choix_n_couches:\n", + " accuracy_cv=[]\n", + " nn1 = NeuralNet.NeuralNet(np.hstack((4,np.repeat(n_neurones_optimal1,n_couches),3)),range(3))\n", + " lc = nn1.train(train1, train_labels1, 0.1, 10, verbose=False)\n", + " lc_cum.append(lc)\n", + " _,accuracy,_,_,_ = nn1.test(train1, train_labels1, verbose=False)\n", + " accuracy_cv.append(accuracy)\n", + " accuracy_cum.append(np.mean(np.array(accuracy_cv)))\n", + "lc_cum = np.array(lc_cum)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(choix_n_couches,accuracy_cum)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le nombre de couches cachées qui maximise l'accurary est de:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_couches_optimal1 = choix_n_couches[np.where(accuracy_cum==max(accuracy_cum))[0][0]]\n", + "n_couches_optimal1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Courbes d'apprentissage\n", + "\n", + "Ce graphique présente les courbes d'apprentissage pour chacun des niveaux de profondeur du réseau" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2jTuv/9+lixZwpIlS4LymSMCKVEsFqSioImJQejUn/1YYdu2baSmplJQUMBbWz7F7HARo9cyLTMeg84zadvXNbd3714uveQSUuOjSZ0+ia8vXADGWtITopASaowWaowWWrrstHbZKas4QkZGBoWFnryU8fHx3eNYuHAhMTYbjtpa8jIzaQYsLheVNTXceOONgOemMWfOHOLi4jAYDPziF79g0aJFLF68OKDfScT9+gOhyENJXxMtWq32pH0Oh6Pf9sBJ8bharRa3242UkilTpvC3v/3ttPZ/+tOf2L17N1u3buUvf/kL//73v9GNEYMnFQWlsxN3ezvu9nako8fToU6HJjoaER2DJiba+9rzb7D9qWOZgRR5MNi3bx9bt25ly9aPcTjs2KwW/vaHR3j00Ue72/R1zfW23aDXkJQUR7xBy1k5ybSZnbhdTtotTo6cMGG2uznW3EVKbBRJsXo0QqDY7Wi7unBUVqJJSECflIRISwOzmXPOOadXt+uLL77I9u3b2bx5My+99BLPPvtswL4TdSI3gCxcuJC///3vgEdxd3V1MXfuXLZs2YLVasVisfDhhx9y9tlnk5aWhtFopL29HYfDwbZt2wCPOsjMzGTLli2A52ZgtVr7PGd+fj5tbW0UFxcDHrVw5MiRbpfQggULuPvuuzGZTFgsliB/A+FFuly4WlqwHzmCde9e7IcO4WptRRMXR9TkyRimT0efk4MuJRWEwN3RjrO2Fvvhw9j278eyaxfWkhLshw7jqK3F1dyM22RCulzh/mgqQ+Sm27/Lr579B48+8zK/+J9HOGfhwpMMPvR9zc2dO5d33323Ow3M7t27mT17NllZWRw7dgyhuInTOKko2UNeehznnjWTjrZWdu0roaLJxGfltdSXVeA8fhzpdhM1eTLRBQUIb/qEoqIi9u3bR01NDQBWq5WqqiosFgsmk4lFixZx3333UVFREdDvZGzIvgDw4x//mF27dtHe3s6FF17Id7/7Xa644oqT2tx333089NBD/Pvf/0ar1fLAAw8wZ84cLrvsMq677jrAM5FbUFAAwB133MH111/PxIkTT4osePjhh1m7di1/+tOf0Ol03RO5vaHX6/ntb3/Lo48+SldXF263m+uvv57c3Fx++tOfYjKZkFKyatWqfucRIhXFbsfd1oa7rR2ly+QJd9Pr0aWmoU1JRpOYiNB8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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.subplot(111)\n", + "for i in choix_n_couches:\n", + " plt.plot(range(10),lc_cum[i-1], label=\"%d couches\"%(i,))\n", + "leg = plt.legend(loc='best', ncol=2, mode=\"expand\", shadow=True, fancybox=True)\n", + "leg.get_frame().set_alpha(0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Choix des poids initiaux\n", + "Les poids initiaux ont été choisis à partir d'une distribution uniforme sur $[-1,1]$. On compare ici les courbes d'apprentissage en initialisant les poids à 0 et en initialisant les poids aléatoirement, pour le réseau de dimension et de profondeur optimale sélectionnées précédemment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Entrainement et tests\n", + "On reprend les résultats du dernier entrainement, puisqu'il utilise les poids aléatoires et les hyperparamètres optimaux." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Code/Rapport-Partiel.ipynb b/Code/Rapport-Partiel.ipynb index 15ad55b..d42421b 100644 --- a/Code/Rapport-Partiel.ipynb +++ b/Code/Rapport-Partiel.ipynb @@ -1528,7 +1528,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.1" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/Code/main.py b/Code/main.py index 15ff192..f8ab11a 100644 --- a/Code/main.py +++ b/Code/main.py @@ -44,7 +44,7 @@ dt5.train(train5, train_labels5) dt5.predict(test5[0],test_labels5[0]) dt5.test(test5, test_labels5) -nn1 = NeuralNet.NeuralNet(np.array([4,8,3]),range(3)) +nn1 = NeuralNet.NeuralNet(np.array([4,4,3]),range(3)) nn1.train(train1, train_labels1, 0.1, 10) nn1.predict(test1[0],test_labels1[0]) nn1.test(test1,test_labels1)