Example #1
0
        public void Treinar(int numPadroes, double[,] conjTreinamento, double[,] saidasEsperadas)
        {
            int contEpocas = 0;

            while (erroGlobal > nivelErro && contEpocas < maxEpocas)
            {
                for (int padrao = 0; padrao < numPadroes; padrao++)
                {
                    double[] x       = new double[numEntradas];
                    double[] entrada = new double[numEntradas];

                    for (int tmp = 0; tmp < numEntradas; tmp++)
                    {
                        x[tmp]       = conjTreinamento[padrao, tmp];
                        entrada[tmp] = conjTreinamento[padrao, tmp];
                    }

                    double[] saidas = new double[numSaidas];
                    for (int tmp = 0; tmp < numSaidas; tmp++)
                    {
                        saidas[tmp] = saidasEsperadas[padrao, tmp];
                    }

                    double erro          = 1;
                    int    contIteracoes = 0;
                    while (erro > nivelErro) // && contIteracoes < maxEpocas*5)
                    {
                        contIteracoes++;

                        /*
                         * FASE FORWARD
                         */
                        x = new double[numEntradas];
                        entrada.CopyTo(x, 0);

                        foreach (Camada camada in camadas)
                        {
                            x = camada.Gerar(x);
                        }

                        /*
                         * FASE BACKWARD
                         */

                        // Calcula o erro global
                        erro = 0;
                        String outStr = "";
                        for (int saida = 0; saida < numSaidas; saida++)
                        {
                            double e = saidas[saida] - x[saida];
                            outStr += " " + x[saida];
                            erro    = erro + Math.Abs(e);
                            //erroGlobal = erroGlobal + ((e * e)/2);
                        }
                        erroGlobal = erroGlobal + (erro * erro) / 2;
                        erroGlobal = erroGlobal / 2;

                        Console.WriteLine("Epoca:" + contEpocas + "\tIteração:" + contIteracoes + "\tPadrao:" + padrao + "\t\tErro:" + erro + " " + outStr);

                        //Atualiza pesos da última camada

                        if (numCamadas > 1)
                        {
                            camadas[numCamadas - 1].CorrigePesos(camadas[numCamadas - 2].Saida, saidas);
                        }
                        else
                        {
                            camadas[numCamadas - 1].CorrigePesos(entrada, saidas);
                        }

                        // Atualiza pesos das camadas intermediárias

                        for (int indiceCamada = numCamadas - 2; indiceCamada >= 0; indiceCamada--)
                        {
                            Camada   camada         = camadas[indiceCamada];
                            Camada   camadaAnterior = camadas[indiceCamada + 1];
                            double[] entradaCamada;
                            if (indiceCamada != 0)
                            {
                                entradaCamada = camadas[indiceCamada - 1].Saida;
                            }
                            else
                            {
                                entradaCamada = entrada;
                            }

                            for (int neuronio = 0; neuronio < camada.NumeroNeuronios; neuronio++)
                            {
                                double err = 0;
                                for (int neuronioAnt = 0; neuronioAnt < camadaAnterior.NumeroNeuronios; neuronioAnt++)
                                {
                                    err = err
                                          + (camadaAnterior.Neuronios[neuronioAnt].Erro
                                             * camadaAnterior.Neuronios[neuronioAnt].Pesos[neuronio]);
                                }

                                err = ativacao.Derivada(camada.Neuronios[neuronio].Net) * err;

                                camada.Neuronios[neuronio].CorrigePesos(entradaCamada, err);
                            }
                        }
                    }
                }

                contEpocas++;
            }
        }