Пример #1
0
        private void Simular(float[,] arraydeentradas)
        {
            string binariodesalida = "";
            Dictionary <int, float[, ]> diccionariodelassalidasdecapa = new Dictionary <int, float[, ]>();
            int pt = 0;

            float[,] arraydematrizdepesos;
            float[] arraydeumbrales;
            float[,] arraydesalidadelacapaanterior = null;
            float[,] arraydesalidadelacapaactual   = null;
            for (int cp = 0; cp <= capasocultas; cp++)
            {
                arraydematrizdepesos        = diccionariodearraydematrizdepesos[cp];
                arraydeumbrales             = diccionariodearraydeumbrales[cp];
                arraydesalidadelacapaactual = new float[patrones, arraydematrizdepesos.GetLength(0)];
                if (cp > 0)
                {
                    arraydesalidadelacapaanterior = diccionariodelassalidasdecapa[cp - 1];
                }
                for (int i = 0; i < arraydematrizdepesos.GetLength(0); i++)
                {
                    arraydesalidadelacapaactual[pt, i] = 0;
                    if (cp == 0)
                    {
                        for (int j = 0; j < entradas; j++)
                        {
                            arraydesalidadelacapaactual[pt, i] += arraydeentradas[pt, j] * arraydematrizdepesos[i, j];
                        }
                    }
                    else if (cp > 0 && cp < capasocultas)
                    {
                        for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++)
                        {
                            arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j];
                        }
                    }
                    else if (cp == capasocultas)
                    {
                        for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++)
                        {
                            arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j];
                        }
                    }
                    arraydesalidadelacapaactual[pt, i] -= arraydeumbrales[i];
                    if (cp != capasocultas)
                    {
                        arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(grilladecapasocultas.Rows[cp].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, i]).getfunActivacion();
                    }
                    else
                    {
                        arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(comboBox1, arraydesalidadelacapaactual[pt, i]).getfunActivacion();
                        binariodesalida += Math.Round(double.Parse(arraydesalidadelacapaactual[pt, i].ToString())).ToString();
                    }
                }
                diccionariodelassalidasdecapa.Add(cp, arraydesalidadelacapaactual);
            }
            string   resultadodediagnostico = new Binarioacaracteres(binariodesalida).ConvertirDeBinarioACadenaDeCaracteres().ToUpper();
            Packages pack = new Packages();

            if (pack.verify(resultadodediagnostico) == false)
            {
                MessageBox.Show("El diagnostico obtenido mediante la tecnología es que usted padece de: " + resultadodediagnostico, "Diagnostico inteligente.");
                label4.Text = resultadodediagnostico;
                // Open the file to read from.
                string path = @"c:\error_red.txt";
                using (StreamReader sr = File.OpenText(path))
                {
                    string s = "";
                    while ((s = sr.ReadLine()) != null)
                    {
                        Console.WriteLine(s);
                        double error = Convert.ToDouble(s) * 100;
                        MessageBox.Show("Tener en cuenta que la red tiene un error de: " + error + "%");
                    }
                }
            }
            else
            {
                MessageBox.Show("No coincide con ninguno de los patrones presentados para el entrenamiento");
                label4.Text = binariodesalida;
            }
        }
Пример #2
0
        private void Entrenamientodelared()
        {
            iteracion            = iteracion + Convert.ToInt32(nudIteraciones.Value);
            ratadeaprendizaje    = float.Parse(nudRataaprendizaje.Value.ToString());
            errormaximopermitido = float.Parse(nudErrormaximopermitido.Value.ToString());
            //guardo error en archivo
            string path = @"c:\error_red.txt";

            if (!File.Exists(path))
            {
                using (StreamWriter sw = File.CreateText(path))
                {
                    sw.WriteLine(errormaximopermitido);
                }
            }
            ///////////////////////////////////////

            errordeiteracion = 1000;
            while (errormaximopermitido < errordeiteracion && conti <= iteracion)
            {
                List <string> listadesalidasdelared = new List <string>();
                List <int>    numerodepatrones      = new List <int>();
                arraydeerrordelospatrones = new float[patrones];
                for (int pt = 0; pt < patrones; pt++)
                {
                    float[] arraydeerroresdeneuronasendiccionario = null;
                    float[,] arraydesalidasdecapasocultasanterior = null;
                    diccionariodeerrornolinealdeneuronasporcapaoscultas.Clear();
                    numerodepatrones.Add(pt + 1);
                    diccionariodelassalidasdecapa.Clear();
                    for (int cp = 0; cp <= nudCapasocultas.Value; cp++)
                    {
                        arraydematrizdepesos        = diccionariodearraydematrizdepesos[cp];
                        arraydeumbrales             = diccionariodearraydeumbrales[cp];
                        arraydesalidadelacapaactual = new float[patrones, arraydematrizdepesos.GetLength(0)];
                        if (cp > 0)
                        {
                            arraydesalidadelacapaanterior = diccionariodelassalidasdecapa[cp - 1];
                        }
                        for (int i = 0; i < arraydematrizdepesos.GetLength(0); i++)
                        {
                            arraydesalidadelacapaactual[pt, i] = 0;
                            if (cp == 0)
                            {
                                for (int j = 0; j < entradas; j++)
                                {
                                    arraydesalidadelacapaactual[pt, i] += arraydeentradasdelared[pt, j] * arraydematrizdepesos[i, j];
                                }
                            }
                            else if (cp > 0 && cp < nudCapasocultas.Value)
                            {
                                for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++)
                                {
                                    arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j];
                                }
                            }
                            else if (cp == nudCapasocultas.Value)
                            {
                                for (int j = 0; j < arraydematrizdepesos.GetLength(1); j++)
                                {
                                    arraydesalidadelacapaactual[pt, i] += arraydesalidadelacapaanterior[pt, j] * arraydematrizdepesos[i, j];
                                }
                            }
                            arraydesalidadelacapaactual[pt, i] -= arraydeumbrales[i];
                            if (cp != nudCapasocultas.Value)
                            {
                                arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(grilladecapasocultas.Rows[cp].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, i]).getfunActivacion();
                            }
                            else
                            {
                                arraydesalidadelacapaactual[pt, i] = new Funciondeactivacion(comboBox1.SelectedItem.ToString(), arraydesalidadelacapaactual[pt, i]).getfunActivacion();
                                listadesalidasdelared.Add(i.ToString() + " " + arraydesalidadelacapaactual[pt, i].ToString());
                            }
                        }
                        diccionariodelassalidasdecapa.Add(cp, arraydesalidadelacapaactual);
                    }
                    //Error lineal de las salidas de la red ....
                    arraydeerroreslineales = new float[salidas];
                    for (int i = 0; i < salidas; i++)
                    {
                        arraydeerroreslineales[i] = arraydesalidasdeseadas[pt, i] - arraydesalidadelacapaactual[pt, i];
                    }
                    //COMIENZA AQUÍ LA RETROPROPAGACIÓN, DE CADA NEURONA DESDE LA ÚLTIMA CAPA OCULTA HASTA LA PRIMERA...
                    //Error no lineal por neuronas de las capas ocultas....
                    for (int capOculta = Convert.ToInt32(nudCapasocultas.Value) - 1; capOculta >= 0; capOculta--)
                    {
                        //Última capa oculta con salida...
                        if (capOculta == Convert.ToInt32(nudCapasocultas.Value) - 1)
                        {
                            arraydeerrornolinealporneuronasdecapasocultas = new float[Convert.ToInt32(grilladecapasocultas.Rows[capOculta].Cells[1].Value.ToString())];
                            arraydematrizdepesos = diccionariodearraydematrizdepesos[capOculta + 1];
                            for (int neucapActual = 0; neucapActual < arraydeerrornolinealporneuronasdecapasocultas.Length; neucapActual++)
                            {
                                float sumerr = 0;
                                for (int sal = 0; sal < salidas; sal++)
                                {
                                    sumerr = sumerr + (arraydeerroreslineales[sal] * arraydematrizdepesos[sal, neucapActual]);
                                }
                                arraydeerrornolinealporneuronasdecapasocultas[neucapActual] = sumerr;
                            }
                            diccionariodeerrornolinealdeneuronasporcapaoscultas.Add(capOculta, arraydeerrornolinealporneuronasdecapasocultas);
                        }
                        else
                        //Entre capas ocultas....
                        {
                            float[] Errorneuronasiguiente = diccionariodeerrornolinealdeneuronasporcapaoscultas[capOculta + 1];
                            arraydeerrornolinealporneuronasdecapasocultas = new float[Convert.ToInt32(grilladecapasocultas.Rows[capOculta].Cells[1].Value.ToString())];
                            arraydematrizdepesos = diccionariodearraydematrizdepesos[capOculta + 1];
                            for (int neucapActual = 0; neucapActual < arraydeerrornolinealporneuronasdecapasocultas.Length; neucapActual++)
                            {
                                float sumerr = 0;
                                for (int neucapaSiguiente = 0; neucapaSiguiente < Errorneuronasiguiente.Length; neucapaSiguiente++)
                                {
                                    sumerr = sumerr + (Errorneuronasiguiente[neucapaSiguiente] * arraydematrizdepesos[neucapaSiguiente, neucapActual]);
                                }
                                arraydeerrornolinealporneuronasdecapasocultas[neucapActual] = sumerr;
                            }
                            diccionariodeerrornolinealdeneuronasporcapaoscultas.Add(capOculta, arraydeerrornolinealporneuronasdecapasocultas);
                        }
                    }
                    //TERMINA LA RETROPROPAGACIÓN Y SE MODIFICAR PESOS Y UMBRALES CON LOS ERRORES NO LINEALES POR
                    //CADA NEURONA DE CADA CAPA OCULTA...
                    //Modificacion de pesos y umbrales...
                    for (int capOculta = 0; capOculta <= Convert.ToInt32(nudCapasocultas.Value); capOculta++)
                    {
                        //Desde la capa entrada hasta la última capa oculta....
                        arraydematrizdepesos = diccionariodearraydematrizdepesos[capOculta];
                        arraydeumbrales      = diccionariodearraydeumbrales[capOculta];
                        if (capOculta < Convert.ToInt32(nudCapasocultas.Value))
                        {
                            arraydeerroresdeneuronasendiccionario = diccionariodeerrornolinealdeneuronasporcapaoscultas[capOculta];
                        }
                        arraydesalidadelacapaactual = diccionariodelassalidasdecapa[capOculta];
                        for (int sal = 0; sal < arraydematrizdepesos.GetLength(0); sal++)
                        {
                            if (capOculta < Convert.ToInt32(nudCapasocultas.Value))
                            {
                                arraydeumbrales[sal] += 2 * ratadeaprendizaje * new Funcionderivada(grilladecapasocultas.Rows[capOculta].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, sal]).getfunDerivada() * arraydeerroresdeneuronasendiccionario[sal];
                            }
                            else
                            {
                                arraydeumbrales[sal] += 2 * ratadeaprendizaje * arraydeerroreslineales[sal];
                            }
                            for (int ent = 0; ent < arraydematrizdepesos.GetLength(1); ent++)
                            {
                                if (capOculta == 0)
                                {
                                    arraydematrizdepesos[sal, ent] += 2 * ratadeaprendizaje * new Funcionderivada(grilladecapasocultas.Rows[capOculta].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, sal]).getfunDerivada() * arraydeerroresdeneuronasendiccionario[sal] * arraydeentradasdelared[pt, ent];
                                }
                                if (capOculta > 0 && capOculta < Convert.ToInt32(nudCapasocultas.Value))
                                {
                                    arraydesalidasdecapasocultasanterior = diccionariodelassalidasdecapa[capOculta - 1];
                                    arraydematrizdepesos[sal, ent]      += 2 * ratadeaprendizaje * new Funcionderivada(grilladecapasocultas.Rows[capOculta].Cells[2].Value.ToString(), arraydesalidadelacapaactual[pt, sal]).getfunDerivada() * arraydeerroresdeneuronasendiccionario[sal] * arraydesalidasdecapasocultasanterior[pt, ent];
                                }
                                if (capOculta == Convert.ToInt32(nudCapasocultas.Value))
                                {
                                    arraydesalidasdecapasocultasanterior = diccionariodelassalidasdecapa[capOculta - 1];
                                    arraydematrizdepesos[sal, ent]      += 2 * ratadeaprendizaje * arraydeerroreslineales[sal] * arraydesalidasdecapasocultasanterior[pt, ent];
                                }
                            }
                        }
                        diccionariodearraydematrizdepesos[capOculta] = arraydematrizdepesos;
                        diccionariodearraydeumbrales[capOculta]      = arraydeumbrales;
                    }
                    //Encontrando el error del patron...
                    float totalerrorlineal = 0;
                    for (int i = 0; i < salidas; i++)
                    {
                        totalerrorlineal = totalerrorlineal + Math.Abs(arraydeerroreslineales[i]);
                    }
                    arraydeerrordelospatrones[pt] = totalerrorlineal / salidas;
                }
                //Calculo del error por iteracion...
                errordeiteracion = 0;
                for (int i = 0; i < patrones; i++)
                {
                    errordeiteracion += arraydeerrordelospatrones[i];
                }
                errordeiteracion = errordeiteracion / patrones;
                listadeiteraciones.Add(conti);
                //Graficas generales...

                Graficarerror();
                int times = 3;
                while (times > 0)
                {
                    Application.DoEvents();
                    Thread.Sleep(1);
                    times--;
                }
                label4.Text = "Iteracion: " + conti.ToString();
                label8.Text = "Error RMS: " + errordeiteracion.ToString();
                conti++;
                posiciongrafica++;
            }
            if (errordeiteracion <= errormaximopermitido)
            {
                MessageBox.Show("La red entrenó correctamente y obtuvo su pesos y umbrales optimos en la iteración número " + (listadeiteraciones.Count) + ".", "Red entranada exitosamente.");
                guardarpesosyumbrales(diccionariodearraydematrizdepesos, diccionariodearraydeumbrales);
                btnSimular.Enabled   = true;
                btnSimular.BackColor = Color.LimeGreen;
            }
            else
            {
                MessageBox.Show("La red no termina aún su proceso de aprendizaje. ¡Sigue iterando!", "Red aún sin aprender.");
                nudErrormaximopermitido.Enabled = false;
            }
        }