예제 #1
0
        /// <summary>
        /// rellena una lista con matrices de sigmas por neurona.
        /// </summary>
        /// <param name="salidasDeseadas">Salidas del archivo de entrenamiento</param>
        private void AgregarSigmas(double[] salidasDeseadas)
        {
            sigmas = new List <double[]>();                        // instanciamos la lista sigma.

            for (int i = 0; i < capas.Count; i++)                  //iteramos las capas.
            {
                sigmas.Add(new double[capas[i].numeroDeNeuronas]); // instanciamos nuevas matrices de dobles con el tamaño igual a la cantidad de neuronas de la capa en cuestion.
            }



            for (int i = capas.Count - 1; i > 0; i--)                                                              // iteramos desde la ultima capa y nos detenemos en la primera.
            {
                for (int j = 0; j < capas[i].numeroDeNeuronas; j++)                                                // iteramos todas las neuronas de la capa en cuestion.
                {
                    if (i == capas.Count - 1)                                                                      // si nos encontramos en la primera capa.
                    {
                        double y = capas[i].neuronas[j].activacionPasada;                                          // obtenemos la activacion pasada de la neurona y en la capa en cuestion.
                        sigmas[i][j] = (Neurona.Sigmoidea(y) - salidasDeseadas[j]) * Neurona.DerivadaSigmoidea(y); // guardamos en la posision ij el resultado (sigmoidea(x) - SalidaDeseada) * DerivadaSigmoidea(x)
                    }
                    else
                    {
                        double buffer = 0;                                                                        // inicializamos un buffer

                        for (int k = 0; k < capas[i + 1].numeroDeNeuronas; k++)                                   // iteramos las capas iniciando desde i + 1.
                        {
                            buffer += capas[i + 1].neuronas[k].pesos[j] * sigmas[i + 1][k];                       // sumamos al buffer los pesos de la neurona en cuestion.
                        }
                        sigmas[i][j] = Neurona.DerivadaSigmoidea(capas[i].neuronas[j].activacionPasada) * buffer; // aplicamos la derivada de la sigmoidea a la activacion pasada de la neurona en cuestion y la multiplicamos por el buffer.
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Agrega los deltas
        /// </summary>
        private void AgregarDeltas()
        {
            for (int i = 1; i < capas.Count; i++)                               //itera las capas
            {
                for (int j = 0; j < capas[i].numeroDeNeuronas; j++)             //itera las neuronas
                {
                    for (int k = 0; k < capas[i].neuronas[j].pesos.Length; k++) //itera los pesos
                    {
                        double t = sigmas[i][j];
                        double u = capas[i - 1].neuronas[k].activacionPasada;
                        double p = t * Neurona.Sigmoidea(u);
                        deltas[i][j, k] += p;

                        //deltas[i][j, k] += sigmas[i][j] * Neurona.Sigmoidea(capas[i - 1].neuronas[k].activacionPasada);
                    }
                }
            }
        }