From b30beaed628c3667692f20bb0a043c98880bd0c6 Mon Sep 17 00:00:00 2001 From: JulianoSL <juliano.souzaluz@hes-so.ch> Date: Wed, 15 Nov 2023 20:57:51 +0100 Subject: [PATCH] Update print and testing --- perceptron-tp3.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/perceptron-tp3.py b/perceptron-tp3.py index 3623e40..ef9d6fb 100644 --- a/perceptron-tp3.py +++ b/perceptron-tp3.py @@ -6,25 +6,35 @@ # ############################################## # -# Réponse à la question : -# Comme notre modèle d'apprentissage est assez simple, moins il y a de neurones dans la couche cachée, plus c'est +# Après la phase d’apprentissage, pour les données « student-data-train.csv » et « student-data-test.csv »mesurer le taux de classifications correctes. +# On essayera un nombre de neurones dans la couche cachée égal à : 10 ; 50 ; 100 ; 200. +# A vous de décider le nombre d’itérations et la valeur du paramètre d’apprentissage. +# "Réponse" : +# En changeant plusieurs fois le taux d'apprentissage, on se rend compte de : (et en limitant suffisamment le n iter max pour trouver des résultats différents significativement) +# 1: Qu'un taux presque "parfait" va rendre un changement de nombre de neurones de cachés presque "inutiles" +# 2: Si un taux est un peu moins élevé (p.e 0.020 a la place de 0.030 (taux le plus effiface trouvé)), dans ce cas le nombre de neurones +# varie le résultat en fonction de , + de neurones = meilleur % accuracy (grossièrement) import numpy as np import pandas as pd from matplotlib import pyplot as plt + # Fonction pour mettre à jour les poids de la couche cachée def upd_weights_hidden(wi_old, learning, delta, xi): return wi_old + learning * np.outer(xi, delta) + # Fonction pour mettre à jour les poids de la couche de sortie def upd_weights_output(wi_old, learning, delta, y): return wi_old + learning * delta * y + # Fonction d'activation sigmoïde def sigmoide(x): return 1 / (1 + np.exp(-x)) + # Fonction de prédiction def predict(poids_input_hidden, poids_hidden_output, input_data): hidden_input = np.dot(input_data, poids_input_hidden) @@ -45,14 +55,17 @@ if __name__ == '__main__': num_features = X.shape[1] # Paramètres d'apprentissage - learning_rate = 0.034 + learning_rate = np.random.uniform(0, 0.5) # good one around 0.030 -> 100% accuracy + # learning_rate = 0.030 max_iterations = 2000 - num_hidden = 10 + tab = [10, 50, 100, 200] + num_hidden = np.random.choice(tab) # prend une valeur aléatoire de nombre de neurones + # num_hidden = 10 # Initialiser les poids pour l'entrée dans la couche cachée et masqués dans la couche de sortie weights_input_hidden = np.random.rand(num_features + 1, num_hidden) - 0.5 weights_hidden_output = np.random.rand(num_hidden + 1) - 0.5 - error_points = np.empty((0,2)) + error_points = np.empty((0, 2)) print("Weights input to hidden:", weights_input_hidden) print("Weights hidden to output:", weights_hidden_output) @@ -78,7 +91,7 @@ if __name__ == '__main__': total_error += (target - output) ** 2 / 2 - if (iteration % 10 == 0) or iteration == 0: # print tous les 5 iterations + if (iteration % 1 == 0) or iteration == 0: # print tous les 5 iterations print(f"Iteration {iteration + 1}: Error = {total_error}") # Calcul du taux de classification correcte @@ -94,6 +107,8 @@ if __name__ == '__main__': error_points = np.vstack((error_points, X[i])) accuracy = correct_classifications / len(X) + print('Learning rate: ', learning_rate) + print("num_hidden: ", num_hidden) print(f"Taux de classifications correctes: {accuracy * 100}%") # Tracer la droite de séparation @@ -106,5 +121,3 @@ if __name__ == '__main__': plt.ylabel('Norm_Grade_2') plt.legend() plt.show() - - -- GitLab