Redes Neurais Artificiais - implementação em C

46 views
Skip to first unread message

Renato Ximenes

unread,
Jan 20, 2016, 2:17:58 PM1/20/16
to Redes Neurais Artificiais Br
Boa tarde pessoal, eu estou estudando alguns livros de redes neurais, e ao tentar implementar o código do livro fundamentos e aplicações com programas em C (perceptron multicamadas), percebi que a convergência não estava certa, os erros estavam altos mesmo com muitas iterações. Alguém sabe me dizer qual o problema? Ou alguém pode me indicar um código para rede PMC? 
Uma outra dúvida particular é sobre essa parte:  Erromg = (Erromg * (x * exemplos + y) + Erroinst) / (x * exemplos + (y + 1));
Eu não consegui entender a relação disso com o erro global médio... x representa as épocas, y os exemplos, erroinst é o erro instantâneo.
Muito obrigado desde já pela atenção!


#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

#define ncesc 2
#define entrada 2
#define saida 1
#define exemplos 4


main(){
    float w[saida][ncesc], W[ncesc][entrada], errodes, Erroinst,
            Erromg = 0, erro[saida], niesc[ncesc], ni[saida],
            biasesc[ncesc], biass[saida], eta, phiesc[ncesc],
            phi[saida], philesc[ncesc], phil[saida],
            delta[saida], deltaesc[ncesc];
    int x, y, cont2, contt, epocas, funcao;
    float entradas[entrada][exemplos], saidas[saida][exemplos];
    system("cls");

    printf("\nBias e pesos iniciais...\n\n");
    for(y = 0; y < ncesc; y++){
        for(x = 0; x < saida; x++)
            w[x][y] = rand()%2 + .5;
        for(x = 0; x < entrada; x++)
            W[y][x] = rand()%2 + .5;
            biasesc[y] = rand()%2;
            }

    for(x = 0; x < saida; x++)
        biass[x] = rand()%2 + .5;
    for(y = 0; y < saida; y++)
        printf("Neuronio de Saida: bias[%d] = %f\n", y, biass[y]);
    for(y = 0; y < ncesc; y++)
        printf("bias[%d] = %f\n",y,biass[y]);

     printf("\nEntre com o numero de epocas de treinamento:\n");
    scanf("%d", &epocas);

    printf("Entre com os vetores de exemplos de treinamento de entrada:\n");
    for(x = 0; x < entrada; x++)
        for(y = 0; y < exemplos; y++)
            scanf("%f", &entradas[x][y]);

    printf("Entre com os vetores de exemplos de treinamento de saida:\n");
    for(x = 0; x < saida; x++)
        for(y = 0; y < exemplos; y++)
            scanf("%f", &saidas[x][y]);

    printf("Entre com o valor da taxa de aprendizagem:\n");
    scanf("%f", &eta);

    printf("Entre com o erro desejado:\n");
    scanf("%f", &errodes);

    printf("Entre com a funcao desejada [(1)degrau,(2)sigmoide]: \n");
    scanf("%d", &funcao);

    system("cls");

    printf("Pesos iniciais:\n");
    for(y = 0;y < ncesc;y++){
        for(x = 0; x < saida;x++)
            printf("w[%d][%d] = %f\n", x, y, w[x][y]);
        for(x = 0; x < entrada;x++)
        printf("W[%d][%d] = %f\n", x, y, W[y][x]);
    }

    printf("Iniciando processo iterativo...\n");
    for(x = 0; x < epocas; x++){
        for(y = 0; y < exemplos; y++){
                
                
            for(contt = 0; contt < ncesc; contt++){
                niesc[contt] = 0;
                for(cont2 = 0; cont2 < entrada; cont2++)
                    niesc[contt] = niesc[contt] + W[contt][cont2] * entradas[cont2][y];
                niesc[contt] = niesc[contt] + biasesc[contt];
                switch(funcao){
                    case 1:
                        if(niesc[contt] > 0) phiesc[contt] = 1;
                        else phiesc[contt] = 0;
                        break;
                    case 2:
                        phiesc[contt] = 1/(1 + exp(-niesc[contt]));
                        break;
                    }
                }
                
                
            for(contt = 0; contt < saida; contt++){
                ni[contt] = 0;
                for(cont2 = 0; cont2 < ncesc; cont2++)
                    ni[contt] = ni[contt] + w[contt][cont2] * phiesc[cont2];
                ni[contt] = ni[contt] + biass[contt];
                switch(funcao){
                    case 1:
                        if(ni[contt] > 0) phi[contt] = 1;
                        else phi[contt] = 0;
                        break;
                    case 2:
                        phi[contt] = 1/(1 + exp(-ni[contt]));
                        break;
                    }
                }
                

            for(contt = 0; contt < saida; contt++)
                erro[contt] = saidas[contt][y] - phi[contt];
            Erroinst = 0;
            for(contt = 0; contt < saida; contt++)
                Erroinst = Erroinst + erro[contt] * erro[contt] / 2;
            Erromg = (Erromg * (x * exemplos + y) + Erroinst) / (x * exemplos + (y + 1));
            if(Erromg < errodes)
                break;
            for(cont2 = 0; cont2 < saida; cont2++){
                phil[cont2] = exp(-ni[cont2])/((1 + exp(-ni[cont2])) * (1 + exp(-ni[cont2])));
                delta[cont2] = -erro[cont2] * phil[cont2];
                }
            for(cont2 = 0; cont2 < ncesc; cont2++){
                philesc[cont2] = exp(-niesc[cont2])/((1 + exp(-niesc[cont2])) * (1 + exp(-niesc[cont2])));
                deltaesc[cont2] = 0;
                for(contt = 0; contt < saida; contt++)
                    deltaesc[cont2] = deltaesc[cont2] + philesc[cont2] * delta[contt] * w[contt][cont2];
                }
            for(cont2 = 0; cont2 < saida; cont2++){
                for(contt = 0; contt < ncesc; contt++)
                    w[cont2][contt] = w[cont2][contt] - eta * delta[cont2] * phiesc[contt];
                biass[cont2] = biass[cont2] - eta * delta[cont2]*phiesc[contt];
                }
            for(cont2 = 0; cont2 < ncesc; cont2++){
                for(contt = 0; contt < entrada; contt++)
                    W[cont2][contt] = W[cont2][contt] - eta * deltaesc[cont2] * entradas[contt][y];
                biasesc[cont2] = biasesc[cont2] - eta * deltaesc[cont2] * entradas[contt][y];
                }
            }
        if(Erromg < errodes){
            printf("Finalizado pelo erro em %d epocas de treinamento!\n", x);
            break;
            }
        }
    printf("\nbias finais:\n");
    for(y = 0; y < ncesc; y++)
    printf("%f ", biasesc[y]);
    printf("\n");
    for(y = 0; y < saida; y++)
        printf("%f ", biass[y]);
        printf("\nPesos finais:\n\n");
    for(y = 0; y < ncesc; y++){
        for(x = 0; x < saida; x++)
            printf("w[%d][%d] = %f\n", x, y, w[x][y]);
        for(x = 0; x < entrada; x++)
            printf("W[%d][%d] = %f\n", x, y, W[y][x]);
    }
    printf("Finalizado!\n");
    for(x = 0; x < exemplos; x++){
        printf("\nEntradas: ");
        for(y = 0; y < entrada; y++)
            printf("%f ", entradas[y][x]);
        printf("\n\nSaidas esperadas: ");
        for(y = 0; y < saida; y++)
            printf("%f ", saidas[y][x]);
        printf("\nSaidas da rede: ");
        for(contt = 0; contt < ncesc; contt++){
            niesc[contt] = 0;
            for(cont2 = 0; cont2 < entrada; cont2++)
                niesc[contt] = niesc[contt] + W[contt][cont2] * entradas[cont2][x];
        niesc[contt] = niesc[contt] + biasesc[contt];
        switch(funcao){
            case 1:
                if(niesc[contt] > 0) phiesc[contt] = 1;
                else phiesc[contt] = 0;
                break;
            case 2:
                phiesc[contt] = 1/(1 + exp(-niesc[contt]));
                break;
                }
            }
        for(contt = 0; contt < saida; contt++){
            ni[contt] = 0;
            for(cont2 = 0; cont2 < ncesc; cont2++)
            ni[contt] = ni[contt] + w[contt][cont2] * phiesc[cont2];
        ni[contt] = ni[contt] + biass[contt];
        switch(funcao){
            case 1:
                if (ni[contt] > 0) phi[contt] = 1;
                else phi[contt] = 0;
                break;
            case 2:
                phi[contt] = 1/(1 + exp(-ni[contt]));
                break;
            }
        printf("%f ", phi[contt]);
        }
    }
printf("\n\nErro medio global: %f", Erromg);
getch();
}

Reply all
Reply to author
Forward
0 new messages