[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.

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus