Aller au contenu


Photo
- - - - -

[Aide] Expliquation reseau neuronal

IA reseau neuronal

47 réponses à ce sujet

#21 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 05 août 2015 - 08:56

un réseau de neurones c'est des neurones qui sont connectés entre eux par les sorties.

Euh, non.
Un réseau de neurones artificiel est un ensemble de neurones artificiels (qui sont des unités de calcul simple) connectés entre eux par des poids. Chaque neurone a un niveau d'activité, qui correspond à la valeur de sortie y = f( produit_scalaire(poids, entrée) ), avec f une fonction mathématique (souvent non-linéaire et dérivable, mais passons).
Le principe d'un réseau, c'est d'avoir une "couche" de neurones, non-connectés entre eux (dans le cas simple), connectée par les poids à une autre couche de neurones. L'entrée d'un réseau génère de l'activité sur la première couche, l'activité générée passe par les poids pour provoquer de l'activité dans la deuxième couche, et ainsi de suite si on rajoute d'autres couches de neurones.
 

j'ai réessayé et voilà ce que ça donne:

float           dataset[10][3] = {
  {0.0 , 0.0 , 0.0},
  {0.0 , 1.0 , 0.0},
  {1.0 , 0.0 , 0.0},
  {1.0 , 1.0 , 1.0},
  {0.2 , 0.4 , 0.0},
  {0.2 , 0.2 , 0.0},
  {0.5 , 0.5 , 1.0},
  {0.5 , 0.7 , 0.0},
  {0.3 , 0.8 , 0.0},
  {0.7 , 0.7 , 1.0},
};

Ça, ok : on a 10 exemples, chaque exemple contient les deux informations d'entrée et l'information de sortie. L'ensemble des exemples correspont au comportement d'une fonction logique ET, sauf pour le cas ((0.5, 0.7), 0.0), mais on peut vouloir apprendre une fonction différente.

float           poids[10][3];

Là, pas d'accord : pourquoi tes poids font 10x3 ? Un réseau qui prend deux entrées et renvoie 1 sortie n'a besoin que de deux poids.

void    init()
{
  int   i;
  int   j;

  i = 0;
  j = 0;
  srand(time(NULL));
  for(j = 0; j < 10;j++)
    for(i = 0;i < 30;i++)
      poids[j][i]=(float)(rand() / (RAND_MAX + (0.9 / 0.01)));
}

Je ne comprends pas à quelle valeur tu initialises tes poids. Un simple "rand() % valeur maximale" suffit à mon avis, par contre, les poids peuvent être négatifs, donc ça devrait rentrer en compte dans l'initialisation (pour ne pas biaiser l'apprentissage).

int     calcul(int num, int num2)
{
  int i;
  int   j = 0;
  float total=0;
  for(i=0;i<30;i++)
    {
      if(dataset[num][j]==1)
        {
          total+=poids[num2][j];
          j++;
        }
    }
  return (total>0?1:0);
}

Si ta fonction calcule sert à calculer l'activité de tes neurones (la valeur de sortie y), il n'y a pas de raison que le dataset entre en jeu. Pour calculer la sortie de ton neurone, tu fais simplement le produit scalaire entre l'entrée et les poids.
Pour deux neurones et deux poids, c'est neurone_sortie = f( poids_1 * neurone_1 + poids_2 * neurone_2 ), mais c'est une bonne habitude d'écrire un code générique avec une boucle.

float calcule_poids(float valeur, int valeur_desiree, int valeur_obtenue,int valeur_entree)
{
  float result;

  result = (valeur + (valeur_desiree - valeur_obtenue) * valeur_entree * 10.0);
  return result;
}

Ici, c'est presque bon : pourquoi faire * 10.0 à la fin ?
Si tu veux simplifier un peu cette fonction, tu peux ne lui faire calculer que la variation du poids, c'est-à-dire "(valeur_desiree - valeur_obtenue) * valeur_entree".

void            apprendre(int num, int num2)
{
  int   i;
  int   j;
  int result;

  result = calcul(num,num2);
  while(i < 30)
    {
      poids[num2][0] = calcule_poids((float)poids[num2][0],num==num2,result, dataset[num][0]);
      i++;
      j++;
    }
}

Pourquoi faire un test num==num2 dans l'appel de ta fonction ? Déjà, tu vas renvoyer un booléen qui devrait faire un warning à la compilation, et ça n'a pas vraiment de sens. Ta variable j ne sert pas ici.
Je pense que tu n'es pas loin de comprendre, mais il manque un tout petit peu.

int             main(int argc, char *argv[])
{
  init();
  int   i;
  int   j;

  i = 0;
  j = 0;
  for(j = 0; j <7;j++)
    {
      for(i=0;i<7;i++)
        {
          printf("t: %i ",calcul(i,j));
        }
      printf("\n");
    }
  /*on fait relier tous les poids avec tous les caractères*/
  for(j=0;j<7;j++)
    {
      for(i=0;i<7;i++)
        apprendre(i,j);
    }
  return (0);
}
c'est bon ? Si ce n'ai pas bon j'ai rien pigé de tout ça

Attention, j'ai l'impression que tu as un peu de mal avec la portée des variables. Il vaut mieux déclarer principalement des variables locales, et faire des return/passage en argument pour les informations que tu veux utiliser dans plusieurs fonctions.
Dans ton main, tu ne fais qu'apprendre, mais tu ne peux pas savoir si ça a marché sans tester ton réseau ensuite (comment il se comporte - càd que vaut sa sortie - quand on lui envoie de nouvelles entrées)
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#22 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 06 août 2015 - 07:31

Merci beaucoup pour ton aide. Quand tu dis:

 

 

Si ta fonction calcule sert à calculer l'activité de tes neurones (la valeur de sortie y), il n'y a pas de raison que le dataset entre en jeu. Pour calculer la sortie de ton neurone, tu fais simplement le produit scalaire entre l'entrée et les poids.
Pour deux neurones et deux poids, c'est neurone_sortie = f( poids_1 * neurone_1 + poids_2 * neurone_2 ), mais c'est une bonne habitude d'écrire un code générique avec une boucle.

 

 

ou tu les prends les neurones ?
 

quand tu dis:
 

 

Dans ton main, tu ne fais qu'apprendre, mais tu ne peux pas savoir si ça a marché sans tester ton réseau ensuite (comment il se comporte - càd que vaut sa sortie - quand on lui envoie de nouvelles entrées)

 

comment faire pour tester le réseau ?

 

Pour les poids c'est : float poids[2]; qu'il faut faire ?


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#23 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 08 août 2015 - 05:52

ou tu les prends les neurones ?

Tu ne les prends pas, tu les crées. En général, tu peux simplement déclarer des tableaux pour stocker l'activité des couches.

comment faire pour tester le réseau ?

Le principe d'apprendre comme on le fait (de manière supervisée), c'est que le réseau soit capable de fournir la sortie attendue pour une certaine entrée, ou de trouver la bonne réponse pour une entrée jamais vue (on parle de capacité de généralisation du réseau).

Pour les poids c'est : float poids[2]; qu'il faut faire ?

Pour cet exemple où on veut apprendre la fonction ET, oui, c'est comme ça que tu déclares un tableau de taille 2x1.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#24 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 08 août 2015 - 06:02

OK Merci mais quand tu dis

 

Tu ne les prends pas, tu les crées. En général, tu peux simplement déclarer des tableaux pour stocker l'activité des couches.

comment je fais pour avoir l'activité des couches ?

 

Le principe d'apprendre comme on le fait (de manière supervisée), c'est que le réseau soit capable de fournir la sortie attendue pour une certaine entrée, ou de trouver la bonne réponse pour une entrée jamais vue (on parle de capacité de généralisation du réseau).

tu veux dire que je dois entrer 0,0 et il doit me sortir les bonnes valeurs ? du coup il faut que je stockes bien les poids et ensuite je me ballade avec mes poids pour trouver la réponse non ?


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#25 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 09 août 2015 - 07:07

comment je fais pour avoir l'activité des couches ?

Pour la première couche, ce sont les valeurs d'entrées données soit par tes capteurs pour un robot, soit par les données de ton dataset. Pour les couches suivantes, ce sont les valeurs y, calculée par le produit scalaire des entrées et des poids.
 

tu veux dire que je dois entrer 0,0 et il doit me sortir les bonnes valeurs ? du coup il faut que je stockes bien les poids et ensuite je me ballade avec mes poids pour trouver la réponse non ?

Oui. Mais c'est le principe du réseau de neurones : on créé les neurones, on les connecte entre eux, puis on fait apprendre le réseau pour pouvoir l'utiliser ensuite.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#26 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 10 août 2015 - 09:56

Pour la première couche, ce sont les valeurs d'entrées données soit par tes capteurs pour un robot, soit par les données de ton dataset. Pour les couches suivantes, ce sont les valeurs y, calculée par le produit scalaire des entrées et des poids.

pour la première couche c'est ce que retourne calcul(int num, int num2) non ?
pour les autres couches les entrée ce sont les valeur qu'on a calculé avec calcul(int num, int num2) non ?

pour le produit scalaire peut-tu m'expliquer rapidement ce que c'est ?

dsl mais je ne comprends pas comment utiliser le réseau une fois qu'il a apprit. petite question idiote comment on sais si on a plusieurs couches ? c'est en rapport avec les poids ?


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#27 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 14 août 2015 - 02:50

pour la première couche c'est ce que retourne calcul(int num, int num2) non ?
pour les autres couches les entrée ce sont les valeur qu'on a calculé avec calcul(int num, int num2) non ?
pour le produit scalaire peut-tu m'expliquer rapidement ce que c'est ?
dsl mais je ne comprends pas comment utiliser le réseau une fois qu'il a apprit. petite question idiote comment on sais si on a plusieurs couches ? c'est en rapport avec les poids ?

Commence par faire un schéma de ton réseau, en notant les entrées / sorties / poids, et montre-nous ça, ça devrait t'aider à comprendre (avant toute programmation, il faut avoir une idée de ce que tu veux programmer, comprendre l'algorithme et ses spécificités).
La couche d'entrée, ce sont les neurones qui codent les valeurs d'entrée. Ils n'ont pas de poids, leur activité est directement égale à la valeur de la donnée d'entrée.
Par exemple, dans le cas d'une fonction logique OU, pour l'exemple ((1, 0), 1) d'un dataset, l'entrée est (1, 0), donc l'activité d'un des neurones de la couche d'entrée est 1, celle de l'autre est 0.
Une fois l'entrée fixée, tu calcules l'activité de la couche suivante en utilisant les poids et les entrées de la couche précédente.
Produit scalaire : https://is.gd/uqQ3Ym
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#28 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 16 août 2015 - 09:24

voici le shéma de mon neurone

mini_329518e417a0dbd5ReseauNeuronalSchem


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#29 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 20 août 2015 - 04:39

voici le shéma de mon neurone
mini_329518e417a0dbd5ReseauNeuronalSchem


Euh, quand je parlais d'un schéma, je parlais d'illustrer les différentes variables : indiquer les entrées, les poids, la non-linéarité, la sortie, les informations qui rentrent et qui sortent, pour que tu puisses comprendre à quoi le réseau correspond.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#30 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 20 août 2015 - 07:50

je ne comprends pas comment faire ça.


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#31 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 21 août 2015 - 06:32

je ne comprends pas comment faire ça.


???
Euh, je suis désolé, mais je ne sais pas comment t'aider si tu ne peux pas faire un schéma de ton réseau de neurones qui illustre sa structure. À ce niveau, il y a quelque chose que tu n'as pas compris dans ce qu'est un réseau de neurones, et son utilisation mathématique.
Si tu ne détailles pas ce que tu sais et ce sur quoi tu bloques, je ne peux t'apporter de réponse. Essaie de nous expliquer depuis le départ ton but, pourquoi utiliser des réseaux de neurones, ce que tu as compris sur le sujet. À partir de là, je pourrais fournir des réponses à tes questions. Il faut aussi que tu me précises si tu comprends mes réponses ou si c'est du charabia. Il est possible que je ne sois pas clair, mais j'ai besoin de le savoir pour vraiment t'aider.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#32 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 21 août 2015 - 09:47

c'est ça que tu veux que je fasse ?

https://upload.wikim...el_francais.png

Pour de ce que j'ai compris des réseau c'est t'as des entrées par exemple des capteurs et une sortie. Les neurones sont connectés entre eux grâce aux poids. Ce que je ne comprends pas c'est comment réutiliser le réseau une fois que j'ai bien appris. J'aimerai utiliser un réseau neural pour que mon robot puisse ce déplacer tout seul et je pense l'utiliser pour lui apprendre des ordres puis à long terme à répondre et peu être parler mais je me fixe des objectif. Pour l'instant j'aimerai créer un petit réseau pour que mon robot puisse ce déplacer. j'espère que j'ai été clair. En tout cas je te remercie de tout ton aide.


Modifié par R2D21995, 21 août 2015 - 09:55 .

Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#33 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 13 octobre 2015 - 01:16

personne ?


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#34 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 19 octobre 2015 - 11:40

Salut

 

Désolé, j'ai eu peu de temps pour répondre depuis août.

 

Oui le schéma que je te suggère de faire ressemble à celui de ton lien. Le but, c'est que pour ton cas, tu fasses un schéma similaire, avec les entrées/sorties que tu veux utiliser. Tu peux aussi le faire pour l'exemple d'une fonction logique pour t'entraîner. Le but, c'est que tu te poses des questions sur ce qui se passe vraiment dans le réseau et comment sont déterminées les différentes valeurs. Que tu écrives les équations pour comprendre les traitements sur les variables. Si tu comrpends l'algorithme, le coder ne devrait pas poser de difficultés.

 

Par exemple, que se passe-t-il pour des poids fixés ? Comment change l'entrée en fonction de la sortie ? etc.


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#35 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 20 octobre 2015 - 07:15

Pas grave. Merci pour la réponse. Quand tu dis:

 

Par exemple, que se passe-t-il pour des poids fixés ?

 

Je n'ai pas compris ce que t'as voulu dire.

et

 

Comment change l'entrée en fonction de la sortie ?

Je sais comment faire en c mais je ne sais pas comment les représenter schématiquement.


Modifié par R2D21995, 20 octobre 2015 - 08:03 .

Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#36 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 20 octobre 2015 - 08:22

Pour l'instant j'ai fais ça.

http://postimg.org/image/74ym2c5jb/

mais je ne sais pas comment y insérer la fonction qui modifie les poids en fonction de la sortie.


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#37 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 21 novembre 2015 - 05:22

Personne ?


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#38 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 23 novembre 2015 - 09:15

Salut,

 

Ce que R1D1 essaye de te dire, c'est que tu dois lister tout de que tu as en entrée et tout ce que tu veux en sortie, sans pensée forcement réseau de neurone.

 

Par exemple, en entrée :

  • Données capteur droit
  • Données capteur avant
  • Données capteur gauche

En sortie

  • Vitesse moteur droit
  • Vitesse moteur gauche

 

Ensuite, à partir de là, tu détermines la plage des valeurs d'entrées (ici valeurs continues de 0 à 1 représentant une distance).

Ainsi que les valeurs de sorties (toujours des valeurs continues de 0 à 1 représentant une vitesse).

Tu détermines ce qu'il se passe en sortie en fonction des entrées (si obstacle uniquement à gauche, on accélère le moteur gauche et on ralenti le droit, etc.).

 

Une fois tout ça déterminé, tu peux rebasculer sur les réseaux de neurones.

Tu fixes le type de réseau (perceptron multi-couches), sa structure (3 neurones d'entrée, deux de sorties, deux couches cachées à 4 puis 3 neurones).

Tu peux coder ton réseau de neurone, fixer une fonction d'activation et réfléchir à une méthode d'apprentissage (rétro-propagation du gradient, algorithmes génétique en simulation, ...).

Petit exemple vidéo (en simulation) :


Mon site internet : http://ferdinandpiette.com/


#39 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 23 novembre 2015 - 12:38

Donc par exemple pour un robot mobile auquel je veux qu'il apprenne à avancer et détecter les obstacles il faut

En entrées:

  1. Valeur capteur gauche
  2. Valeur capteur avancer
  3. Valeur capteur Droite

En sortie

  1. Vitesse moteur Droit
  2. vitesse moteur Gauche

Les valeurs d'entrées sont  entre 0 et 1.

Les valeurs de sortie sont entre 0 et 1.

tant que Valeur capteur Gauche est supérieur à 0,2 vitesse moteur gauche = 1

Si Valeur capteur Gauche est inferieur ou égal à 0,2 vitesse moteur gauche diminue en fonction de l'angle qu'on veut

tant que Valeur capteur Droit est supérieur à 0,2 vitesse moteur droit = 1

Si Valeur capteur Droit est inferieur ou égal à 0,2 vitesse moteur Droit diminue en fonction de l'angle qu'on veut


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#40 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 24 novembre 2015 - 04:07

J'ai une petite question maintenant que je sais combien j'ai d'entrées et combien j'ai de sortie et que je connais les différentes valeurs. Comment je fait pour choisir le nombre de couche de mon réseau la méthode d'apprentissage et comment je le met en code.

Cordialement.


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users