public void Initialize(int NbInputs)
 {
     nbOfInputs = NbInputs;
     Neurons.Clear();
     for (var i = 0; i < nbOfNeurons; i++)
     {
         var Node = new NNNeuron();
         Node.Initialize(nbOfInputs);
         Neurons.Add(Node);
     }
 }
        private int BackwardPropagateError(NNNeuralNetwork nn, double[] expected)
        {
            if (nn.nbOfOutputs == expected.Length)
            {
                // Parcours inverse des layers
                for (int i = nn.nbOfHiddenLayers; i >= 0; i--)
                {
                    NNLayer  Layer  = nn.Layers[i];
                    double[] errors = new double[Layer.nbOfNeurons];

                    // Si ce n'est pas le dernier layer
                    if (i != nn.nbOfHiddenLayers)
                    {
                        // Parcours des neurones du layer courant
                        // Calcul de l'erreur
                        for (int j = 0; j < Layer.nbOfNeurons; j++)
                        {
                            var error = 0.0;
                            // Parcours des neurones du layers précédent
                            nn.Layers[i + 1].Neurons.ForEach(Neuron => {
                                error += Neuron.weights[j] * Neuron.delta;
                            });
                            errors[i] = error;
                        }
                    }
                    // Si c'est le dernier layer
                    else
                    {
                        // Parcours des neurones du layer courant
                        // Calcul de l'erreur
                        for (int j = 0; j < Layer.nbOfNeurons; j++)
                        {
                            errors[j] = (expected[j] - Layer.Neurons[j].output);
                        }
                    }

                    // Parcours des neurones du layer courant
                    // Calcul de delta
                    for (int j = 0; j < Layer.nbOfNeurons; j++)
                    {
                        NNNeuron Neuron = Layer.Neurons[j];
                        Neuron.delta = errors[j] * NNNeuron.TransfertDerivative(Neuron.output);
                    }
                }

                return(0);
            }
            else
            {
                return(1);
            }
        }