[C#] Réseaux neuronaux avec AForge.NET
Dans le cadre d’un projet, j’ai travaillé sur les réseaux neuronaux afin de faire de la reconnaissance de caractères. Lors de mes recherches je suis tombé sur une librairie plutôt sympa qui permet de créer des ANN (Artificial Neural Network) très simplement : AForge.NET
Création du réseau
Cette librairie (que vous retrouvez aussi via NuGet) vous permet de créer des réseaux simples ou multi-couches :
// Creation d'un réseau à 128 entrées, 50 neurones cachés et 10 sorties ActivationNetwork network = new ActivationNetwork(new SigmoidFunction(2), 128, 50, 10);
Dans cet exemple on utilise une fonction d’activation de type sigmoid mais vous pouvez créer votre propre fonction en héritant de IActivationFunction.
Entrainer le réseau
L’entrainement d’un réseau est là encore très simple… au niveau de la syntaxe. Car créer un réseau et l’entrainer est une science complexe et beaucoup de paramètres rentrent en compte (le nombre de couches à utiliser, fonction d’activation, taux d’apprentissage, méthode d’apprentissage…).
// Creation d'un réseau à 2 entrées et 2 sorties ActivationNetwork network = new ActivationNetwork(new SigmoidFunction(2), 4, 2); // Initialiser le poids des neurones aléatoirement network.Randomize(); // Création de l'apprentissage par la méthode de Back Propagation BackPropagationLearning learning = new BackPropagationLearning(network); learning.LearningRate = 0.01; learning.Momentum = 0.1; // Données de test var inputs = new double[][] { new double[] {0,1,0,0}, new double[] {0,1,1,0}, new double[] {0,0,1,0}, new double[] {0,0,0,0} }; // Résultats souhaités pour nos données de test var outputs = new double[][] { new double[] {1,0}, new double[] {1,1}, new double[] {0,1}, new double[] {0,0} }; bool isTrainingNeeded = false; while (!isTrainingNeeded) { // Lancement de l'entrainement var error = learning.RunEpoch(inputs, outputs); // Tant que l'erreur est trop grande, on continue l'entrainement if (error < 0.01) isTrainingNeeded = true; }
Dans cet exemple on utilise la méthode dite de Back Propagation mais plusieurs autres méthodes sont disponibles.
Tester le réseau
Une fois le réseau entrainé, on peut obtenir des résultats grâce à la méthode Compute() :
// En sortie, on doit avoir quelque chose ressemblant à { 0.962, 0.029 } var output = network.Compute(new double[] { 0, 1, 0, 0 }); // En sortie, on doit avoir quelque chose ressemblant à { 0.032, 0.024 } output = network.Compute(new double[] { 0, 0, 0, 0 });
Les valeurs de retours seront surement légèrement différentes du fait que les poids sont initialisés aléatoirement et que le réglage de l’apprentissage peut changer.
Sauvegarde et chargement
Une fois notre réseau validé, il ne reste plus qu’à le sauvegarder pour pouvoir le réutiliser :
ActivationNetwork network = new ActivationNetwork(new BipolarSigmoidFunction(2), 30, 6); network.Save("network.nnt"); ActivationNetwork loadedNetwork = (ActivationNetwork)Network.Load("network.nnt");
Les réseaux neuronaux sont un sujet très vaste et extrêmement complexe, je vous recommande fortement de faire un gros travail d’apprentissage théorique pour bien comprendre le fonctionnement d’un tel système.
Commentaires