Réseau de neurones [C#] aForge

Smudger Messages postés 3 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 15 septembre 2011 - 15 sept. 2011 à 14:34
kheirolook Messages postés 4 Date d'inscription dimanche 20 novembre 2011 Statut Membre Dernière intervention 10 décembre 2012 - 10 déc. 2012 à 23:07
Salut tout le monde !!!
J'ai un big problème et j'ai vraiment, mais vraiment besoin de votre aide et au plus vite, Bref actuellement je travail sur un mini projet de prédiction, où il nous est demandé de prédire la charge électrique en utilisant les Réseaux de neurones Artificiel, le problème c'est que je n'arrive pas a créer un réseau à "plusieurs pas en avant"... svp c'est très très urgent, merci d'avance.
PS : aForge est la librairie utilisée

4 réponses

dodo7263 Messages postés 616 Date d'inscription mercredi 10 septembre 2008 Statut Membre Dernière intervention 9 février 2017 6
15 sept. 2011 à 15:37
Salut,

Qu'as tu déjà fait comme code ?
Quel est ton problème exactement ?

Donnes plus de détails, post les morceaux de code qui te posent problème pour qu'on puisse t'aider et avoir d'éventuelles réponses...

@pluche

SD

[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b
0
Smudger Messages postés 3 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 15 septembre 2011
15 sept. 2011 à 17:48
OK, voila si dessous la partie du code qui a permis de creer le réseau suivi des principales commandes:
erreur = apprentissage.RunEpoch(entrees, sorties); (pour l'apprentissage)
double erreurVal = computiation(entreesval, sortiesdis); (pour la validation) :
Ma question est comment pourrais-je faire plusieurs pas en avant (réinjecter les sorties) sur mon reseau de neurones car ce dernier ne donne pas de résultats satisfaisants et merci d'avance

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Threading;
using System.IO;
using AForge.Neuro;
using AForge.Neuro.Learning;
using AForge.Controls;
using ZedGraph;
using AForge.Genetic;
namespace Network
{
    public partial class Form1 : Form
    {
        double erreur;
        int nbreNeurHidLay = 3;
        double pasDApp = 0.1;
        double momentum = 0;
        int j;

        double[][] entrees = new Double[119][];
        double[][] sorties = new Double[119][];

        double[][] entreesval = new Double[118][];
        double[][] sortiesdis = new Double[118][];

        double[][] entreestest = new Double[7][];
        double[][] sortiestest = new Double[7][];


      ArrayList tabDynErr = new ArrayList();
        ArrayList tabDynVal = new ArrayList();
        ArrayList tabCompO = new ArrayList();

        ArrayList sortiescalculées = new ArrayList();
        bool stop = false;
        double[] Données_semaine_RNA = new double[246];
        //double[] PIBsemaine5ans = new double[265];


        IActivationFunction fonction;
        ActivationNetwork reseau;
        BackPropagationLearning apprentissage;

        public Form1()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            initialisation();
        }

        public void initialisation()
        {
            initgraph();
            limErreurfield.Text = "0,01";
            limIterField.Text = 500.ToString();
            pasDAppField.Text = pasDApp.ToString();
            MomentumField.Text = momentum.ToString();
            alphaField.Text = "2";

           nbreNeuField.Text = nbreNeurHidLay.ToString();

           fonction = new BipolarSigmoidFunction(double.Parse(alphaField.Text));
            reseau = new ActivationNetwork(fonction, 3, int.Parse(nbreNeuField.Text), 1);
            apprentissage = new BackPropagationLearning(reseau);
            apprentissage.LearningRate = double.Parse(pasDAppField.Text);
            apprentissage.Momentum = double.Parse(MomentumField.Text);


            gotya("C:\\Data\\Données_semaine_RNA3.txt", Données_semaine_RNA);
            //gotya2("C:\\Data\\PIB_semaine5ans.txt", PIBsemaine5ans);


            for (int i = 0; i < 119; i++)
                entrees[i] = new double[] { Données_semaine_RNA[i], Données_semaine_RNA[i+1], Données_semaine_RNA[i+2]};

            for (int i = 0; i < 119; i++)
                sorties[i] = new double[] { Données_semaine_RNA[i + 3] };

            for (int i = 0; i < 118; i++)
                entreesval[i] = new double[] { Données_semaine_RNA[i + 119], Données_semaine_RNA[i + 120], Données_semaine_RNA[i + 121] };

            for (int i = 0; i < 118; i++)
                sortiesdis[i] = new double[] { Données_semaine_RNA[i + 122] };

            for (int i = 0; i < 7; i++)
                sortiestest[i] = new double[] { Données_semaine_RNA[i + 236], Données_semaine_RNA[i + 237], Données_semaine_RNA[i + 238] };
            
            for (int i = 0; i < 7; i++)
                sortiestest[i] = new double[] { Données_semaine_RNA[i + 239] };



        }

        public void learnin() {
                        
            int j = 0, cpt=0;;
            while (!stop)
            {
                erreur = apprentissage.RunEpoch(entrees, sorties);
                double erreurVal = computiation(entreesval, sortiesdis);
                listErreur.Items.Add(j.ToString("000") + "\t" + erreur.ToString("0.######") + "\t\t" + erreurVal.ToString("0.######") );
                tabDynErr.Add(erreur);
                tabDynVal.Add(erreurVal);
                listErreur.SelectedIndex = listErreur.Items.Count - 1;
                
                if (erreurVal<double.Parse(limErreurfield.Text) || j+1>int.Parse(limIterField.Text))
                {
                    arreter.Enabled = false;
                    stop = true;
                    CreerGraphique(zg1);
                }

                /*if (j!=0 && (double)tabDynVal[j] > (double)tabDynVal[j - 1])
                {
                    cpt++;
                    if (cpt > 10)
                    {
                        arreter.Enabled = false;
                        stop = true;
                        CreerGraphique(zg1);
                    }
                } 
                //*/
                j++;
            }
        }

        private double computiation(double[][] entreesval, double[][] sortiesdis)
        {
            double totalError = 0;

            for (int i 0, inputVectorsAmount entreesval.Length; i < inputVectorsAmount; i++)
            {
                double[] computedOutput = reseau.Compute(entreesval[i]);
                tabCompO.Add(computedOutput[0]);

                for (int j 0, outputLength sortiesdis[0].Length; j < outputLength; j++)
                {
                    double error = sortiesdis[i][j] - computedOutput[j];
                    totalError += error * error;
                }
            }
            return totalError;
        }

        private void commencer_Click(object sender, EventArgs e)
        {

            zg1.GraphPane.CurveList.Clear();
            zg1.Invalidate();
            commencer.Enabled = false;
            arreter.Enabled = true;
            stop = false;
           // learnin();
            Thread thread = new Thread(new ThreadStart(learnin));
            thread.Start();
        }

        private void arreter_Click(object sender, EventArgs e)
        {
            arreter.Enabled = false;
            stop = true;

            CreerGraphique(zg1);
        }
        public void gotya(String filename, Double[] tabData)
        {
            TextReader sr = new StreamReader(filename);

            string contents = sr.ReadToEnd();
            string[] myArray = contents.Split('\t');

            for (int j = 0; j <246; j++)
            {
              //  string a = myArray[j];

                tabData[j] = Convert.ToDouble(myArray[j]) / 4175.9;
                
            }
        }


0
noaie Messages postés 4 Date d'inscription samedi 25 février 2006 Statut Membre Dernière intervention 18 septembre 2011
18 sept. 2011 à 16:03
Bonjour smudger,

j'avoue que j'ai du mal a comprendre comment ton réseau apprend, on voie du code pour la computation, pour la back propagation, et un calcul d'erreur, mais j'ai l'impression que c'est mal ordonnée.

Ton code semble parler de Retropropagation (algorithme du gradient d'erreur) est-ce bien de celui ci, car il existe plusieurs type de réseau de correction d'erreur:
- le plus simple perceptron (réseau à 2 couches mais limité il ne sais par faire le XOR, en gros quand les ensemble ne sont pas linéairement séparable )
- plus complexe l’algorithme du gradient, retropropagation ou backpropagation (reseau multicouche ex: entree, cache, sortie)
- règle de Widrow-Hoff, voir règle de hebb et de Grossberg (l'architecture dépend de ton besoin).
- Kohonen (ici l'apprentissage est non supervisé)
- les autres que j'utilise jamais HopField, machine de Bolzman, ....

sinon dans ton cas je pense que tu souhaitais une retropropagation :

en gros l'agorthime de learning

Init des poids du réseau
apprend=vrai
tant que apprend
.. apprend=faux
.. pour chaque exemple
..... Erreur = maximun
..... Init de l'entree reseau (copie exemple dans l'entree E et la sortie desire dans DS)
..... Tant que Erreur > epsilon
........ propagation
........ Erreur = calcul de l'erreur (distance entre la sortie du réseau et DS)
........ Si Erreur > epsilon alors
............ rétropagation
............ apprend=vrai
........ fin si
..... fin tant que
.. fin pour
fin tant que


Normalement Epsilon devrait varier de façon progressive pour chaque jeux d'exemple bien appris (i.e apprend = faux), c'est une préconisation de Yann le Cun.

Si tu n'a aucune idée des formules pour la propagation et la rétropagation contacte moi.

@+ NoAie
0
kheirolook Messages postés 4 Date d'inscription dimanche 20 novembre 2011 Statut Membre Dernière intervention 10 décembre 2012
10 déc. 2012 à 23:07
SVP j'ai un big probléme ;;;je veut un exemple de carte kohenen créer avec l API AFORGE...............SVP un petit exemple....pour pouvoir commencer mon travail.................j'ai jaimais travailler sur les reaseau de neuronne......................MERCI
0