-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Les réseaux neuronaux sont une technique d'intelligence artificielle inspirée du fonctionnement du cerveau. Le code source de ce dépôts implémente un réseau neuronal basique. Le présent wiki décrit son architecture.
Un réseau neuronal est un ensemble de neurones connectés ensemble. Il permet d'analyser des données pour en déduire une information (ex : analyse d'une image pour repérer un objet dessus).
Le réseau est découpé en couches de neurones. L'information à analyser parcours le réseau couche par couche dans un ordre prédéterminé. La première couche traversée par l'information est appelée couche d'entrée. La dernière couche traversée par l'information (qui renvoie donc les résultats finaux) est appelée couche de sortie. Les couches intermédiaires sont appelées couches cachées.
Chaque couche contient un nombre déterminé de neurones. Chaque neurone reçoit des informations de ses homologues de la couche précédente et en déduit un résultat suite un calcul.
Le programme est divisé en plusieurs modules :
- Noyau RN : le cœur du programme. Contient l'implémentation du réseau neuronal.
- La ou les interfaces DataSet : interface entre le réseau neuronal générique et chaque jeu de données spécifiques à analyser (images, fichiers csv, ...). Il traduit les données brutes en une matrice compréhensible par le réseau neuronal. L'interface enveloppe le réseau neuronal.
- L'interface graphique : à voir comment ça marche.
- Les tests unitaires : Pour s'assurer du bon fonctionnement de chaque élément du programme tout au long du projet.
Le noyau est centré autour de 3 principaux éléments : l'objet neurone, l'objet couche de neurone et l'objet réseau neuronal.
En entrée, le neurone reçoit la sortie de chaque neurone de la couche précédente. A partir de ces données d'entrée, il calcule une sortie.
L'opération de calcul s'effectue comme indiqué sur la figure suivante :
Sur cette figure, les valeurs x1, x2, x3, ... sont les entrées du neurone. Chaque valeur est multipliée par un coefficient Wij associé à cette entrée (note : affecter un coefficient nul à une entrée revient à ignorer cette entrée de l'analyse du neurone). Ces produits sont ensuite additionnés pour faire une somme pondérée.
Dans un neurone biologique, l'activation de la sortie est conditionnée par l'intensité de la stimulation d'entrée : une stimulation inférieure à un seuil d'activation est considérée comme négligeable : la sortie n'est pas activée. Dans l'intelligence artificielle, le neurone implémenté inclut une fonction d'activation modéliser ce seuil d'activation :
En dessous du seuil, la sortie est nulle (ou vaut -1). Au dessus du seuil, la sortie est activée (valeur 1). Aux alentours du seuil, il y a une zone de transition.
Dans ce programme, le rôle du neurone se limite à faire le calcul de prédiction lors de la propagation (somme pondérée + activation).
Prototypes : Neurone.h
L'objet couche de neurone a pour rôle de gérer les flux de données transitant par les neurones qu'il contient. La couche de neurone se charge d'aller récupérer les données d'entrée de ses neurones auprès de la couche précédente, de "nourrir", de les faire calculer une sortie puis de stocker cette sortie dans un tableau que la couche suivante n'a qu'à lire pour obtenir les données d'entrée des ses propres neurones.
Prototypes : CoucheNeurone.h
L'objet réseau neuronal a pour rôle de gérer les flux de données transitant par les couches de données qu'il contient. Il reçoit les données de l'interface DataSet, la donne à la couche de neurones d'entrée, fait travailler les couches les unes après les autres lors de la phase de propagation, et renvoie le résultat final.
L'objet réseau neuronal est aussi chargé de faire l'apprentissage de l'ensemble du réseau neuronal : calcul de la prédiction, calcul de l'erreur de prédiction, rétro-propagation de l'erreur à travers le réseau.
Voici une carte heuristique qui représente les diverses fonctionnalités offerte par notre réseau neuronal :

Pour simplifier la conception nous avons utilisé différents diagrammes UML. L'outil mis en œuvre est mermaid : https://github.com/knsv/mermaid un script qui permet de créer différents types de diagramme grâce au langage MarkDown.
Voici un lien vers un éditeur en ligne : https://mermaidjs.github.io/mermaid-live-editor/ Il existe aussi des plugins pour divers éditeur de texte.
Voici un diagramme de classe qui représente les différents liens entre nos structure C

Voici un diagramme de flux qui représente l'initialisation de la structure du RN

Voici quelques diagrammes d'activités récapitulant les appels de fonctions dans les tests unitaires



