Perceptron Simple en C (Redes Neuronales)

Iniciado por Dext3rCode, 14 Diciembre 2015, 20:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Dext3rCode

He aqui un pequeño codigo que hice iniciando en esto de las redes neuronales, no esta muy organizado el codigo ya que solo es para probar el funcionamiento...
Es un Perceptron simple-monocapa que entrena con los patrones que le ofrecemos en el vector "result[]" (OPERACIONES AND Y OR SEGUN EL VECTOR) y luego de estar entrenado con los pesos sinampticos ajustados, es capaz de entregar una salida correcta para los valores de entrada.
Si tienen alguna sugerencia o mejoramiento para la funcionalidad del codigo no duden en avisarme, Gracias!!!.

Para cambiar  a OR: el vector result debe ser  {1,1,1,-1} es decir, un vector con los valores de salida que queremos(patrones).

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

void Perceptron(){
srand(time(NULL));
float intervalos[] = {-0.98,-0.876,-0.654,-0.754,0.453,0.953,-0.322,-0.298,-0.11,-0.065,0.0234,0.232,0.2335,0.4674,0.675,0.7883, 0.752,0.823,0.9876};
float Umbral,defumbral,factor;
int i;
int x1[] = {1,1,-1,-1};
int x2[] = {1,-1,1,-1};
int result[] = {1,-1,-1,-1};
float w[2] = {intervalos[rand() % 18],intervalos[rand() % 18]};
factor = intervalos[rand() % 18];
Umbral = intervalos[rand() % 18];
defumbral = 1;
int verdad = 0;
int op;
int cont = 0;
int n = 0;
//////////// ENTRENAMIENTO DEL PERCEPTRON;
while(verdad == 0){
n++;
for(i=0;i<4;i++){
op = ((x1[i]*w[0])+(x2[i]*w[1])) + (defumbral*Umbral);
if(op >= 0){
op = 1;
}
else{
op = -1;
}
if(op != result[i]){
w[0] = w[0] + (2*factor)*(x1[i]*result[i]);
w[1] = w[1] + (2*factor)*(x2[i]*result[i]);
Umbral = Umbral + (2*factor)*(defumbral*result[i]);
}
}
for(i=0;i<4;i++){
op = ((x1[i]*w[0])+(x2[i]*w[1])) + (defumbral*Umbral);
if(op == result[i]){
cont++;
}
if(cont == 4){
verdad = 1;
}
}
if(n > 200){
printf("[!] Demasiadas epocas realizadas!\n");
printf("[!] Intente nuevamente con otros pesos sinapticos.\n");
exit(1);
}
}
/////////// MOSTRAR RESULTADOS FINALES
system("clear");
printf("\n[*] FINALIZANDO ENTRENAMIENTO...\n");
printf("[*] PERCEPTRON SIMPLE [ENTRENADO]\n");
printf("\n--------------- DATOS FINALES --------------------------------\n\n");
printf("[*] Total de epocas: (%i)\n",n);
printf("[*] Peso Sinaptico 1 w[1]\t\t--> %2.2f\n",w[0]);
printf("[*] Peso Sinaptico 2 w[2]\t\t--> %2.2f\n",w[1]);
printf("[*] Umbral(Polarizacion)\t\t--> %2.2f\n",Umbral);
printf("\n\n--------------- VERFICIACION DE ENTRENAMIENTO ------------------\n\n");
for(i=0;i<4;i++){
op = ((x1[i]*w[0])+(x2[i]*w[1])) + (defumbral*Umbral);
if(op >= 0){
op = 1;
}
else{
op = -1;
}
printf("\n[*] Entradas: (%2i,%2i) --> Salida: %2i",x1[i],x2[i],op);
if(op != result[i]){
system("clear");
printf("\n[!] Demasiadas epocas realizadas!\n");
printf("[!] Intente nuevamente con otros pesos sinapticos.\n");
exit(1);
Perceptron();
}
}
}
int main(int argc, char **argv)
{
Perceptron();
return 0;
}


En Git-hub: https://github.com/Dext3rLab/C-Examples/blob/master/Perceptron_Simple.c

kondrag_X1

muy currado yo estudié redes neuronales en la carrera y no tiene nada que ver la orientación que se le da en practicas y teoria con las aplicaciones que puede tener

0xFer

Gracias por el aporte, me está interesando este tema  ;D
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}