Ir para conteúdo
Fórum Script Brasil
  • 0

Jefferson201212

Pergunta

Pessoal, não sei se alguém aqui e capaz de me ajudar, mas vocês são minha esperanca. Estou desenvolvendo um codigo de rede neural que preciso entregar na faculdade (não e faculdade de programacao, sou ate bem leigo nisso), e consegui resultados incriveis para uma unica entrada e saida. Porem quando ponho uma serie de dados a saida curiosamente e aproximadamente a media dos dados de entrada.

Tentei de tudo: Alterei a taxa de aprendizado, o layout da camada, o numero de repeticoes, numero de padroes de entrada, etc. Nada deu certo. Segue abaixo o codigo de teste que fiz.

O que diabos esta errado?!!!!!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define PI 3.14159265
#define AN (2*PI)/360

struct neuronio {
    float *pesos;
    float *inputs;
    float delta;
    float somatorio;
    float somatorio_delta;
    float resultado;
};

struct camada {
    int NoNeuronios;
    struct neuronio *neuronio;
};

struct network {
    int NoCamdas;
    struct camada *camada;
};

float sigmoide (float value){
    float resultado;
    resultado = 1/(1+exp(-value));
    //resultado = 20*(1/(1+pow(1.1,-value)));
    return resultado;
}

float derivada_sigmoide (float value){
    float resultado;
    resultado = exp(-value)/(2*exp(-value) + pow(exp(-value),2) + 1);
    //resultado = (20*pow((11/10),-value))*((log(11/10))/(pow((11/10),-2*value)+2*pow((11/10),-value)+1));
    return resultado;
}

void zerarSomatorios(int Layout[], struct network *rede, int num_camadas){
    //ZERA OS SOMATORIOS DOS NEURONIOS
    for (int i = 0; i < num_camadas; i++){                  //CORRE AS CAMADAS
        for (int j = 0; j < Layout; j++){                //CORRE OS NEURONIOS
            //printf("%i##\n",j);
            //printf("%f\n",(*rede).camada.neuronio[j].somatorio);
            rede -> camada.neuronio[j].somatorio = 0.0;
            //printf("%f\n\n",(*rede).camada.neuronio[j].somatorio);
        }
    }
}

void zerarSomatoriosDeltas(int Layout[], struct network *rede, int num_camadas){
    //ZERA OS SOMATORIOS DOS NEURONIOS
    for (int i = 0; i < num_camadas; i++){                  //CORRE AS CAMADAS
        for (int j = 0; j < Layout; j++){                //CORRE OS NEURONIOS
            rede -> camada.neuronio[j].somatorio_delta = 0.0;
        }
    }
}

int main()
{
    int a = 0;
    int aux = 0;
    int repeticoes = 50;
    int Layout[] = {5,3,1};
    int inputs[] = {1,5,3};
    float saidas[90][2];
    float y = 0.9;
    //float force[] = {2.0, 0.1};
    float obj = 0.4;
    int vp[2];
    float entrada[180] = {};
    float objetivo[10];
    srand((unsigned)time(NULL));
    
    //INICIALIZA A SERIE DE TESTE
    for (int i = 0; i < 180; i++){
        entrada = sin(i*2*AN);
        //printf("%f\n",entrada);
    }
    
    //#######################################PROCESSOS ESTRUTURAIS DA REDE#####################################################
    
    //INICIALIZA A REDE
    struct network rede;
    
    //INICIALIZA A QUANTIDADE DE CAMADAS
    //rede.camada = new camada[sizeof(Layout)/sizeof(int)];
    rede.camada = malloc((sizeof(Layout)/sizeof(int))*sizeof(struct camada));

    //INICIALIZAÇÃO DA QUANTIDADE DE NEURONIOS POR CAMADA
    for (int i = 0; i < sizeof(Layout)/sizeof(int); i++){
        //rede.camada.neuronio = new neuronio[Layout];
        rede.camada.neuronio = malloc(Layout*sizeof(struct neuronio));
    }

    //INICIALIZAÇÃO DA QUANTIDADE DE PESOS E ENTRADAS DOS NEURONIOS DE CADA CAMADA
    for (int i = 0; i < sizeof(Layout)/sizeof(int); i++){
        for (int j = 0; j < Layout; j++){
            //rede.camada.neuronio[j].pesos = new float[inputs];
            rede.camada.neuronio[j].pesos = malloc(inputs*sizeof(float));
            //rede.camada.neuronio[j].inputs = new float[inputs];
            rede.camada.neuronio[j].inputs = malloc(inputs*sizeof(float));
        }
    }
    
    //INICIALIZA OS PESOS DOS NEURONIOS
    for (int i = 0; i < sizeof(Layout)/sizeof(int); i++){   //CORRE AS CAMADAS
        printf("PESOS CAMADA %i\n",i);
        for (int j = 0; j < Layout; j++){                //CORRE OS NEURONIOS
            printf("\tPESOS NEURONIO %i\n",j);
            for (int k = 0; k < inputs; k++){            //CORRE OS PESOS
                if(rand()%2 == 0){
                    rede.camada.neuronio[j].pesos[k] = ((float)rand()/RAND_MAX)*1;
                }else{
                    rede.camada.neuronio[j].pesos[k] = ((float)rand()/RAND_MAX)*(-1.0);
                }
                printf("\t\tPESO %i: %f\n",k,rede.camada.neuronio[j].pesos[k]);
            }
        }
    }
    //###############################FIM DOS PROCESSOS ESTRUTURAIS########################################
    printf("\n\n");
    
    for (int i = 0; i < sizeof(vp)/sizeof(int); i++){
        vp = rand()%(89 - Layout[0]); 
    }
    
    for (int loop = 0; loop < repeticoes; loop++){
    for (int padrão = 0; padrão < (sizeof(vp)/(sizeof(int))); padrão++){
    //*******************************PROCESSOS DE EXECUCAO DA REDE***************************************
    a = 0;
    aux = 0.3;
   
    for (int camada_atual = 0; camada_atual < sizeof(Layout)/sizeof(int); camada_atual++){
        
    zerarSomatorios(Layout, &rede, sizeof(Layout)/sizeof(int));
    
    //PROCESSO DA PRIMEIRA CAMADA
    if (camada_atual == 0){
        printf("CAMADA SETADA %i\n",camada_atual);
        aux = vp[padrão]+Layout[0];
        obj = entrada[aux];
        //obj = entrada[vp[padrão]+Layout[0]];
        for (int i = 0; i < Layout[0]; i++){  //CORRE OS NEURONIOS DA PRIMEIRA CAMADA
            printf("\tNEURONIO SETADO %i\n",i);
            printf("\t\tENTRADA %f\tRESULTADO %f\n",entrada[vp[padrão]+i],sigmoide(entrada[vp[padrão] + i]));
            rede.camada[0].neuronio.resultado = sigmoide(entrada[vp[padrão] + i]);
            objetivo[padrão] = obj;//entrada[vp[padrão] + i + 1]; 
            //printf("%f\n",(entrada[vp[padrão] + i]));
        }
    }        
     
       else {       
       
       //PROCESSO DAS DEMAIS CAMADAS
       printf("CAMADA SETADA %i\n",camada_atual);
       for (int i = 0; i < Layout[camada_atual]; i++){             //CORRE O NUMERO DE NEURONIOS CAMADA ATUAL
         printf("\tNEURONIO SETADO %i\n\t\t",i);
        for (int j = 0; j < inputs[camada_atual]; j++){                //CORRE 0 NUMERO DE ENTRADAS DA CAMADA ATUAL A PARTIR DE UM PONTO
            printf("ENTRADA %i: %f * PESO %i: %f + ",j,rede.camada[camada_atual].neuronio.inputs[j],j,rede.camada[camada_atual].neuronio.pesos[j]);
            rede.camada[camada_atual].neuronio.somatorio += rede.camada[camada_atual].neuronio.inputs[j] * rede.camada[camada_atual].neuronio.pesos[j]; //PROCESSO SOMATORIO
            //printf("%f * %f\n", rede.camada[camada_atual].neuronio.inputs[j],rede.camada[camada_atual].neuronio.pesos[j]);
            //printf("VALOR DO SOMATORIO DO NEURONIO ATUAL ATE AGORA: %f\t\t%i\n", rede.camada[camada_atual].neuronio.somatorio,loop);
            rede.camada[camada_atual].neuronio.resultado = sigmoide(rede.camada[camada_atual].neuronio.somatorio); //PROCESSO FUNCAO DE ATIVACAO
            
        }
        printf("\n\t\tSOMATORIO: %f\t RESULTADO %f\n", rede.camada[camada_atual].neuronio.somatorio, rede.camada[camada_atual].neuronio.resultado);
    }         
       }
    
        //REPASSADOR DOS RESULTADOS PARA OS NEURONIOS DA CAMADA ADIANTE    
        if (camada_atual != (sizeof(Layout)/sizeof(int))-1){    
                for (int j = 0; j < Layout[camada_atual+1]; j++){          //CORRE O NUMERO DE NEURONIOS NA CAMADA POSTERIOR
                       for (int k = 0; k < Layout[camada_atual]; k++){          //CORRE OS NEURONIOS DA CAMADA ATUAL
                        rede.camada[camada_atual+1].neuronio[j].inputs[k] = rede.camada[camada_atual].neuronio[k].resultado;
                     }
                }
        }
        
        saidas[padrão][0] = rede.camada[2].neuronio[0].resultado;
        saidas[padrão][1] = obj;
    }
    //printf("Neuronio de saida 0: %.10f\n\n", rede.camada[2].neuronio[0].resultado);
    //************************************FIM DA EXECUCAO DA REDE*********************************************************
    
    
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%INICIO DO ALGORITMO BACKPROPAGATION%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    zerarSomatoriosDeltas(Layout, &rede, sizeof(Layout)/sizeof(int));
    //int E, e;
    //while (E > e){
        for (int k = 0; k < sizeof(Layout)/sizeof(int); k++){
                
        }
        
        //DELTA DA CAMADA DE SAIDA
        //DELTA = F'(X)*(OBJETIVO - F(X))
        for (int i = 0; i < Layout[(sizeof(Layout)/sizeof(int))-1]; i++){ //CORRE OS NEURONIOS
            rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.delta = derivada_sigmoide(rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.somatorio) * ((obj - rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.resultado));
            //rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.delta = derivada_sigmoide(rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.somatorio) * ((sin(entrada[padrão])+cos(entrada[padrão])) - rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.resultado);
            //printf("\nDERIVADA %f\n", derivada_sigmoide(rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.somatorio));
            //printf("\n%f\n",objetivo[padrão]);
             //printf("\nDELTA %.30f\n", rede.camada[(sizeof(Layout)/sizeof(int))-1].neuronio.delta);
         }
         
         
        //SOMATORIO_DELTA
        for (int i = 1; i > 0; i--){   //CORRE AS CAMADAS INTERMEDIARIAS
    
            for (int j = 0; j < Layout; j++){                //CORRE OS NEURONIOS DA CAMADA SETADA
                  
                  for (int k = 0; k < Layout[i+1]; k++){            //CORRE NEURONIOS DA CAMADA POSTERIOR
                      rede.camada.neuronio[j].somatorio_delta += rede.camada[i+1].neuronio[k].pesos[j] * rede.camada[i+1].neuronio[k].delta;
                }
            }
        }
        
        //DELTA DAS CAMADAS INTERMEDIARIAS
        //DELTA = F'(X)*SOMATORIO(PESOS ASSOCIADOS A SUA SAIDA * DELTAS DOS NEURONIOS REPECTIVOS AOS PESOS CITADOS)
        for (int k = (sizeof(Layout)/sizeof(int))-2; k > 0; k--){ //CORRE AS CAMADAS INTERMEDIARIAS
            for (int j = 0; j < Layout[k]; j++){                   //CORRE OS NEURONIOS
                rede.camada[k].neuronio[j].delta = derivada_sigmoide(rede.camada[k].neuronio[j].somatorio) * rede.camada[k].neuronio[j].somatorio_delta;
            }
        }
        
        //AJUSTE DOS PESOS: VARIACAO PESO = y * SOMATORIO( DELTA * SAIDAS DA CAMADA ATENRIOR )
        for (int k = 1; k < sizeof(Layout)/sizeof(int); k++){        //CORRE AS CAMADA (EXCETO A PRIMEIRA)
            for (int n = 0; n < Layout[k]; n++){                    //CORRE OS NEURONIOS
                for (int p = 0; p < Layout[k-1]; p++){                //CORRE OS PESOS
                    rede.camada[k].neuronio[n].pesos[p] += y*(rede.camada[k].neuronio[n].delta * rede.camada[k].neuronio[n].inputs[p]);
                }
            }
        }
    //}*/
    
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FIM DO ALGORITMO BACKPROPAGATION%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    printf("\n\n");
    //printf("Neuronio de saida %i: %.15f\n\n", padrão, saidas[padrão]);
    }
    for (int p = 0; p < 2; p++){
         printf("Neuronio de saida 0: %.15f\t Objetivo %.15f\n\n", saidas[p][0], saidas[p][1]);
    }
   
    }

    return 0;
}
 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...