示例#1
0
        // Função responsável por treinar a rede neural, utilizando backpropagation
        public void Train(int[] ArrayEntrada, int[] ArraySaida)
        {
            // Entrada para Oculta
            Matriz matrizEntrada = Matriz.ArrayToMatriz(ArrayEntrada);
            Matriz matrizOculta  = Matriz.Multiply(this.Pesos_EntradaOculto, matrizEntrada);

            matrizOculta = Matriz.Add(matrizOculta, this.BIAS_EntradaOculto);
            matrizOculta.MapSigmoid();

            // Oculta para Saida
            Matriz matrizSaida = Matriz.Multiply(this.Pesos_OcultoSaida, matrizOculta);

            matrizSaida = Matriz.Add(matrizSaida, this.BIAS_OcultoSaida);
            matrizSaida.MapSigmoid();

            // BackPropagation ->

            // Saida para Oculta
            Matriz matrizEsperada         = Matriz.ArrayToMatriz(ArraySaida);
            Matriz matrizErroSaida        = Matriz.Subtract(matrizEsperada, matrizSaida);
            Matriz matrizSaidaDerivada    = Matriz.MapDerivedSigmoid(matrizSaida);
            Matriz matrizOcultaTransposta = Matriz.Transpose(matrizOculta);

            Matriz matrizGradiente = Matriz.Hadamard(matrizSaidaDerivada, matrizErroSaida);

            matrizGradiente = Matriz.EscalarMultiply(matrizGradiente, this.TaxaAprendizado);

            // Ajustar a BIAS
            this.BIAS_OcultoSaida = Matriz.Add(this.BIAS_OcultoSaida, matrizGradiente);

            // Ajustar os Pesos
            Matriz matrizDeltaPesoOcultaSaida = Matriz.Multiply(matrizGradiente, matrizOcultaTransposta);

            this.Pesos_OcultoSaida = Matriz.Add(this.Pesos_OcultoSaida, matrizDeltaPesoOcultaSaida);

            // Oculta para Entrada
            Matriz matrizPesoSaidaOcultaTransposta = Matriz.Transpose(this.Pesos_OcultoSaida);
            Matriz matrizErroOculta        = Matriz.Multiply(matrizPesoSaidaOcultaTransposta, matrizErroSaida);
            Matriz matrizOcultaDerivada    = Matriz.MapDerivedSigmoid(matrizOculta);
            Matriz matrizEntradaTransposta = Matriz.Transpose(matrizEntrada);

            Matriz matrizOcultaGradiente = Matriz.Hadamard(matrizOcultaDerivada, matrizErroOculta);

            matrizOcultaGradiente = Matriz.EscalarMultiply(matrizOcultaGradiente, this.TaxaAprendizado);

            // Ajustar a BIAS
            this.BIAS_EntradaOculto = Matriz.Add(this.BIAS_EntradaOculto, matrizOcultaGradiente);

            // Ajustar os Pesos
            Matriz matrizDeltaPesoEntradaOculto = Matriz.Multiply(matrizOcultaGradiente, matrizEntradaTransposta);

            this.Pesos_EntradaOculto = Matriz.Add(this.Pesos_EntradaOculto, matrizDeltaPesoEntradaOculto);
        }
示例#2
0
        // Função responsável por retornar uma predição do aprendizado da rede neural
        public double[] Predict(int[] ArrayEntrada)
        {
            // Entrada para Oculta
            Matriz matrizEntrada = Matriz.ArrayToMatriz(ArrayEntrada);

            Matriz matrizOculta = Matriz.Multiply(this.Pesos_EntradaOculto, matrizEntrada);

            matrizOculta = Matriz.Add(matrizOculta, this.BIAS_EntradaOculto);
            matrizOculta.MapSigmoid();

            // Oculta para Saida
            Matriz matrizSaida = Matriz.Multiply(this.Pesos_OcultoSaida, matrizOculta);

            matrizSaida = Matriz.Add(matrizSaida, this.BIAS_OcultoSaida);
            matrizSaida.MapSigmoid();

            double[] ArraySaida = Matriz.MatrizToArray(matrizSaida);
            return(ArraySaida);
        }
示例#3
0
        static void Main(string[] args)
        {
            bool       Train = true;
            RedeNeural rn    = new RedeNeural(2, 3, 1);
            Random     rand  = new Random();

            if (File.Exists("rede.txt"))
            {
                StreamReader sr = new StreamReader("rede.txt");

                string[] ArrayString = new string[2];
                int      Count       = 0;

                while (sr.EndOfStream != true)
                {
                    ArrayString[Count++] = sr.ReadLine();
                }

                var temp   = ArrayString[0].Split(';');
                var Array1 = Array.ConvertAll <string, double>(temp, double.Parse);

                temp = ArrayString[1].Split(';');
                var Array2 = Array.ConvertAll <string, double>(temp, double.Parse);

                Matriz m1 = Matriz.ArrayToMatriz(Array1, 3);
                m1.Print();
                Matriz m2 = Matriz.ArrayToMatriz(Array2, 1);
                m2.Print();

                rn.SetPesoEntradaOculto(m1);
                rn.SetPesoOcultoSaida(m2);

                sr.Close();
            }

            int[] ArrayEntrada = new int[2] {
                0, 0
            };
            int[] ArrayEsperado = new int[2] {
                1, 0
            };

            // XOR Problem
            int[,] datasetEntrada = new int[4, 2]
            {
                { 1, 1 },
                { 1, 0 },
                { 0, 1 },
                { 0, 0 }
            };

            int[,] datasetEsperado = new int[4, 1]
            {
                { 0 },
                { 1 },
                { 1 },
                { 0 }
            };

            while (Train == true)
            {
                for (int i = 0; i < 10000; i++)
                {
                    int   Linha        = rand.Next(0, 4);
                    int[] entradaArray = new int[2];
                    entradaArray[0] = datasetEntrada[Linha, 0];
                    entradaArray[1] = datasetEntrada[Linha, 1];

                    int[] esperadoArray = new int[1];
                    esperadoArray[0] = datasetEsperado[Linha, 0];

                    rn.Train(entradaArray, esperadoArray);
                }

                double[] predict1 = rn.Predict(ArrayEntrada);
                double[] predict2 = rn.Predict(ArrayEsperado);

                Console.WriteLine("Predict 1: " + predict1[0] + " - Predict 2: " + predict2[0]);

                if (predict1[0] < 0.04 && predict2[0] > 0.98)
                {
                    Train = false;
                    Console.WriteLine("Terminou!");

                    rn.GetPesoEntradaOculto().Print();
                    rn.GetPesoOcultoSaida().Print();

                    double[] PesoEntradaOculto = Matriz.MatrizToArray(rn.GetPesoEntradaOculto());
                    double[] PesoOcultoSaida   = Matriz.MatrizToArray(rn.GetPesoOcultoSaida());

                    StreamWriter sm = new StreamWriter("rede.txt");

                    for (int i = 0; i < PesoEntradaOculto.Length; i++)
                    {
                        if (i == PesoEntradaOculto.Length - 1)
                        {
                            sm.Write(PesoEntradaOculto[i]);
                        }
                        else
                        {
                            sm.Write(PesoEntradaOculto[i] + ";");
                        }
                    }

                    sm.WriteLine();

                    for (int i = 0; i < PesoOcultoSaida.Length; i++)
                    {
                        if (i == PesoOcultoSaida.Length - 1)
                        {
                            sm.Write(PesoOcultoSaida[i]);
                        }
                        else
                        {
                            sm.Write(PesoOcultoSaida[i] + ";");
                        }
                    }

                    sm.Close();
                }
            }
        }