/// <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. } } } }
/// <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); } } } }