/// <summary>
        /// Coloriage de l’image suivant les appartenances des pixels aux 6 classes
        /// </summary>
        private void Coloriage_Button_Click(object sender, EventArgs e)
        {
            List <Color> Couleurs = new List <Color> {
                Color.Red, Color.Blue, Color.Green, Color.Brown, Color.Orange, Color.Purple
            };

            for (int i = 0; i < 800; i++)
            {
                for (int j = 0; j < 800; j++)
                {
                    // Définition du neurone (= pixel)
                    Neurone Pixel = new Neurone(2, 800);
                    Pixel.ModifierPoids(i, j);

                    // Modification du pixel en fonction du numéro de classe
                    Image.SetPixel(i, j, Couleurs[RechercherClasse(Pixel)]);
                }
            }

            // Calcul du pourcentage de bonne classification et de mauvaise
            int BonneClassification    = 0;
            int MauvaiseClassification = 0;

            for (int i = 0; i < 6; i++)
            {
                Neurone Observation = new Neurone(2, 800);
                Observation.ModifierPoids((int)Math.Floor(ObservationsTriees[i * 500].Ligne), (int)Math.Floor(ObservationsTriees[i * 500].Colonne));
                int NumeroClasse = RechercherClasse(Observation);

                for (int j = 0; j < 500; j++)
                {
                    Observation = new Neurone(2, 800);
                    Observation.ModifierPoids((int)Math.Floor(ObservationsTriees[i * 500 + j].Ligne), (int)Math.Floor(ObservationsTriees[i * 500 + j].Colonne));
                    if (NumeroClasse != RechercherClasse(Observation))
                    {
                        MauvaiseClassification++;
                    }
                    else
                    {
                        BonneClassification++;
                    }
                }
            }

            // Affichage du résultat
            AfficherDonnees();
            Resultat_PictureBox.Refresh();

            MessageBox.Show("Pourcentage de bonne classification : " + Math.Round(BonneClassification / 3000.0, 2) +
                            "\nPourcentage de mauvaise classification : " + Math.Round(MauvaiseClassification / 3000.0, 2), "Information",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        /// <summary>
        /// Affichage des neurones sur la carte
        /// </summary>
        private void AfficherNeurones()
        {
            Crayon.Color = Color.Blue;

            for (int i = 0; i < NbLignes; i++)
            {
                for (int j = 0; j < NbColonnes; j++)
                {
                    int x = Convert.ToInt32(Carte.RecupererNeurone(i, j).RecupererPoids(0));
                    int y = Convert.ToInt32(Carte.RecupererNeurone(i, j).RecupererPoids(1));
                    Graphe.DrawEllipse(Crayon, x - 2, y - 2, 4, 4);
                }
            }

            Resultat_PictureBox.Refresh();
        }
        /// <summary>
        /// Coloration des neurones suivant la classe à laquelle ils appartiennent
        /// </summary>
        private void AfficherClasses()
        {
            List <Color> Couleurs = new List <Color> {
                Color.Red, Color.Blue, Color.Green, Color.Brown, Color.Orange, Color.Purple
            };

            for (int i = 0; i < 6; i++)
            {
                Crayon.Color = Couleurs[i];

                foreach (Neurone neurone in Classes[i].ListeNeurones)
                {
                    int x = Convert.ToInt32(neurone.RecupererPoids(0));
                    int y = Convert.ToInt32(neurone.RecupererPoids(1));
                    Graphe.DrawEllipse(Crayon, x - 2, y - 2, 4, 4);
                }
            }

            Resultat_PictureBox.Refresh();
        }
示例#4
0
        /// <summary>
        /// Création, apprentissage et test du réseau en fonction des souhaits de l’utilisateur
        /// (nombre de couches du réseau et nombre de neurones par couches cachées, nombre d’itérations
        /// dans l’apprentissage et coefficient d’apprentissage) pour les données fournies dans
        /// « dataetclassif.txt »
        /// </summary>
        private void Reseau_Button_Click(object sender, EventArgs e)
        {
            // Initialisation des variables
            int    NbCouches         = 0;
            int    NbNeurones        = 0;
            int    NbIterations      = 0;
            double CoefApprentissage = 0;

            try
            {
                // Récupération des données inscrites dans les champs par l’utilisateur
                NbCouches = Convert.ToInt32(NbCouches_TextBox.Text);
                if (NbCouches <= 1)
                {
                    throw new Exception("Le nombre de couches doit être au minimum de 2.");
                }
                NbNeurones = Convert.ToInt32(NbNeurones_TextBox.Text);
                if (NbNeurones <= 0)
                {
                    throw new Exception("Le nombre de neurones par couches cachées doit être au minimum de 1.");
                }
                NbIterations = Convert.ToInt32(NbIterations_TextBox.Text);
                if (NbIterations <= 0)
                {
                    throw new Exception("Le nombre d’itérations doit être au minimum de 1.");
                }
                CoefApprentissage = Convert.ToDouble(CoefApprentissage_TextBox.Text);
                if (CoefApprentissage <= 0 && CoefApprentissage >= 1)
                {
                    throw new Exception("Le coefficient d’apprentissage doit être compris entre 0 et 1 exclus.");
                }

                // Création du réseau (3 entrées car un couple de données + le biais)
                Reseau = new Reseau(3, NbCouches, NbNeurones);

                // Récupération des valeurs d’entrées
                List <List <double> > Entrees = this.RecupererDonnees();

                // Récupération des sorties désirées
                List <double> Sorties = new List <double>();
                for (int i = 0; i < 3000; i++)
                {
                    if (i < 1500)
                    {
                        Sorties.Add(0.1);
                    }
                    else
                    {
                        Sorties.Add(0.9);
                    }
                }

                // Mélange des listes
                List <List <double> > EntreesM = new List <List <double> >();
                List <double>         SortiesM = new List <double>();
                for (int i = 0; i < 1500; i++)
                {
                    EntreesM.Add(new List <double> {
                        Entrees[i][0] / 800.0, Entrees[i][1] / 800.0
                    });
                    SortiesM.Add(Sorties[i]);
                    EntreesM.Add(new List <double> {
                        Entrees[i + 1500][0] / 800.0, Entrees[i + 1500][1] / 800.0
                    });
                    SortiesM.Add(Sorties[1500 + i]);
                }

                // Apprentissage supervisé
                Secondes = 0;
                Chrono_Timer.Start();
                Reseau.Retropropagation(EntreesM, SortiesM, CoefApprentissage, NbIterations);
                Chrono_Timer.Stop();

                // Affichage de l’image de résultat
                Tests();

                // Affichage des valeurs du fichier
                for (int i = 0; i < 3000; i++)
                {
                    Entrees[i][0] = Math.Floor(Entrees[i][0]);
                    Entrees[i][1] = Math.Floor(Entrees[i][1]);
                    if (i < 1500)
                    {
                        Supervise_Form.Image.SetPixel((int)Entrees[i][0], (int)Entrees[i][1], Color.Black);
                    }
                    else
                    {
                        Supervise_Form.Image.SetPixel((int)Entrees[i][0], (int)Entrees[i][1], Color.White);
                    }
                }

                // Calcul du pourcentage de bonne et mauvaise classification et calcul de l’erreur résiduelle
                List <double> SortiesCalculees       = Reseau.TesterReseau(EntreesM);
                double        ErreurResiduelle       = 0;
                int           BonneClassification    = 0;
                int           MauvaiseClassification = 0;

                for (int i = 0; i < SortiesCalculees.Count; i++)
                {
                    if (i % 2 == 0)
                    {
                        if (SortiesCalculees[i] < 0.5)
                        {
                            BonneClassification++;
                        }
                        else
                        {
                            MauvaiseClassification++;
                        }
                        ErreurResiduelle += Math.Abs(SortiesCalculees[i] - 0.1);
                    }

                    else
                    {
                        if (SortiesCalculees[i] > 0.5)
                        {
                            BonneClassification++;
                        }
                        else
                        {
                            MauvaiseClassification++;
                        }
                        ErreurResiduelle += Math.Abs(SortiesCalculees[i] - 0.9);
                    }
                }

                // Rafraîchissement de l’image et affiche des performances dans une boîte de dialogue
                Resultat_PictureBox.Refresh();
                string Message = "Pourcentage de bonne classification : " + Math.Round(BonneClassification / 3000.0, 4) * 100 +
                                 "\nPourcentage de mauvaise classification : " + Math.Round(MauvaiseClassification / 3000.0, 4) * 100 +
                                 "\nErreur résiduelle : " + Math.Round(ErreurResiduelle / 3000.0, 2);
                MessageBox.Show(Message, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }