public void Run() { int i = 0; double totalError = Double.PositiveInfinity; double oldError = Double.PositiveInfinity; double totalGeneralisationError = Double.PositiveInfinity; double oldGeneralisationError = Double.PositiveInfinity; Boolean betterGeneralisation = true; while (i < maxIterations && totalError > maxError && betterGeneralisation) { /* On met à jour les erreurs de l’itération précédente et on initialise les erreurs pour * cette itération.*/ oldError = totalError; totalError = 0; oldGeneralisationError = totalGeneralisationError; totalGeneralisationError = 0; // Evaluation foreach (DataPoint point in data.Points()) { /* Pour chaque point d’apprentissage, on calcule sa sortie et l’erreur commise, * et on adapte les poids du réseau.*/ double[] outputs = network.Evaluate(point); // Tableau des sorties des différents neurones de sortie. for (int outNb = 0; outNb < outputs.Length; outNb++) { // Calcal de l'erreur globale dans l'ensemble d'Apprentissage. double error = point.Outputs[outNb] - outputs[outNb]; totalError += (error * error); } // Calcul des nouveaux poids par rétropropagation network.AdjustWeights(point, learningRate); } // Généralisation foreach (DataPoint point in data.GeneralisationPoints()) { /*Pour chaque point de généralisation, on calcule la sortie et l’erreur.*/ double[] outputs = network.Evaluate(point); for (int outNb = 0; outNb < outputs.Length; outNb++) { // Calcal de l'erreur globale dans l'ensemble de Généralisation. double error = point.Outputs[outNb] - outputs[outNb]; totalGeneralisationError += (error * error); } } if (totalGeneralisationError > oldGeneralisationError) { betterGeneralisation = false; // Surapprentissage. } // Changer le taux if (totalError >= oldError) { /* Si l’erreur en apprentissage augmente, c’est que le taux d’apprentissage est trop fort, * on le divise alors par deux.*/ learningRate = learningRate / 2.0; } // Information et incrément ihm.PrintMsg("Iteration n°" + i + " - Total error : " + totalError + " - Gener Error : " + totalGeneralisationError + " - Rate : " + learningRate + " - Mean : " + String.Format("{0:0.00}", Math.Sqrt(totalError / data.Points().Length), "%2")); i++; // Affichage des valeurs sur l’itération en cours (erreurs et taux). } }