コード例 #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);
        }