Redes neuronales, el perceptrón

Consulte acerca de programas, técnicas, algoritmos etc.

Redes neuronales, el perceptrón

Notapor lacabra25 » Sab May 02, 2009 11:24 pm

Hola, estoi tratando un poco las redes neuronales, quisiera saber si sabeis de buenos manuales y tutoriales que además de dar un enfoque teorico (esos que dicen que son, que tratan...) que den un enfoque practico (con informacion sobre algun tipo de red neuronal, codigo en C para crearlas...); yo por ahora del que más informacion he podido encontrar gracias a wikipedia a sido del perceptron y he comenzado a programar un pequeño programa con el que intentar enseñar a un percepton solo a hacer un AND de 2 bit y un OR que segun wikipedia es algo que puede aprender un solo percepton sin necesidad de tener varios conectados formando una red, el problema esta cuando recive como entrada un bit a 1 y el otro a 0 en cuyo caso devuelve un resultado incorrecto, si por el contrario recive como entrada o los dos bits a 1 o los dos a 0 devuelve 1 o 0 respectivamente, este problema se nota sobretodo en el caso de OR.

El perceptron que estoi intentando programar recive dos int como entrada (aunque esto es lo de menos ya que la salida es o 1 o 0 por lo que al conectarlos en una red a varios solo son de entrada recivirian un valor distinto de 0 o 1, los que estuviesen despues recivirian de estos o 0 o 1) y tiene dos salidas independientes (como si fuesen dos perceptones pero en uno) de forma que la entrada es tratada para obtener el resultado de una salida de forma independiente a la otra salida y los valores de entrada no se cambian para no interferir con la otra salida y cada salida tiene su variable de poderacion para no interferir una con la otra.

El codigo que tengo por el momento es el siguiente:
.h
Código: Seleccionar todo
typedef struct neurona_{
int x, y, *za, *zb, wa, wb, da, db;
/*variable que indica si la neurona esta aprendiendo o no*/
char a, b;
} neurona;

int actualiza_neurona(neurona *n);

Nota: x e y son las dos entradas, *za y *zb son punteros a las dos salidas (son punteros para poder apuntar a las entradas de otros perceptones individuales para poder formar una red neuronal), wa y wb son las ponderaciones respectivamente de cada salida, da y db es el valor esperado para que se pueda "entrenar" a la neurona y a y b son simplemente para que la funcion con la que actualizo los valores de la estructura diferencie de cuando solamente debe de actualizar la salida en funcion de la entrada y cuando ademas debera de cambiar los valores de ponderacion para que la neurona aprenda.

El .c:
Código: Seleccionar todo
#include <stdio>
#include "main.h"

int main(void){
int a=0, b=0, i=0;
neurona n;
n.wa= 1;
n.wb= 1;
n.za= &a;
n.zb= &b;
for(i=0; i<20>za))= ((n->x + n->y)*(n->wa));
(*(n->zb))= ((n->x + n->y)*(n->wb));
if(*(n->za) > 0){
   *(n->za)=1;
}else{
   *(n->za)=0;
}
if(*(n->zb) > 0){
   *(n->zb)=1;
}else{
   *(n->zb)=0;
}
/*comprobando si la neurona esta aprendiendo y corrigiendo la variable de la suma ponderada*/
if(n->a != 0){
   n->wa+= 0.5*(n->da - ((n->x + n->y)*(n->wa)))*(n->x + n->y);
}
if(n->b != 0){
   n->wb+= 0.5*(n->db - ((n->x + n->y)*(n->wb)))*(n->x + n->y);
}
return 0;
}


Aunque estoi programando un perceptrón, tambien estoy buscando sobre otras redes neuronales, por lo que si sabeis de otras tambien me interesaria.

Gracias de antemano.

EDITO:
He conseguido arreglar el problema del perceptrón, el problema estava en el umbral de activacion que llevaba a error en el redodneo del float cuando se pasa a un int.

Para poder abordar el problema cambie tambien gran perte del codigo y tuve que quitar una salida para simpleficarlo y poderlo programar, ahora lo mismo le añado la otra salida duplicando el codigo que ya se que funciona en la primera.

El .h:
Código: Seleccionar todo
typedef struct neurona_{
float x, y, wa, wb, da;
int *za;
/*variable que indica si la neurona esta aprendiendo o no*/
char a;
} neurona;

int actualiza_neurona(neurona *n);


En el codigo tambien uso un bucle para entrenar la neurona artificial y no tener que estar tecleando los valores para entrenarla a mano:
Código: Seleccionar todo
#include <stdio>
#include "main.h"

int main(void){
int a=0, i=0;
neurona n;
n.wa= 0;
n.wb= 0;
n.za= &a;
n.a=1;
for(i=0; i<2000; i++){
   n.x= 0;
   n.y= 1;
   n.da= 1;
   actualiza_neurona(&n);
   n.x= 1;
   n.y= 1;
   n.da= 1;
   actualiza_neurona(&n);
   n.x= 1;
   n.y= 0;
   n.da= 0;
   actualiza_neurona(&n);
   n.x= 0;
   n.y= 0;
   n.da= 0;
   actualiza_neurona(&n);
}
for(i=0; i<20>x*n->wa)+(n->y*n->wb))-0.7 > 0){
   *(n->za)=1;
}else{
   *(n->za)=0;
}
/*comprobando si la neurona esta aprendiendo y corrigiendo la variable de la suma ponderada*/
if(n->a != 0){
   if(((n->x*n->wa)+(n->y*n->wb))-0.7 <0>da > 0){
      n->wa+=n->x*0.4;
   }else{
      if(((n->x + n->y)*(n->wa))-0.7 > 0 && n->da <0>wa-=n->x*0.4;
      }
   }
   if(((n->x*n->wa)+(n->y*n->wb))-0.7 <0>da > 0){
      n->wb+=n->y*0.4;
   }else{
      if(((n->x + n->y)*(n->wa))-0.7 > 0 && n->da <0>wb-=n->y*0.4;
      }
   }
}
return 0;
}


Solo unas cuestiones sobre el perceptron, para agrupar varios formando una red neuronal que sea capaz de aprender y resolver problemas (como por ejemplo que jueggue al tres en raya o algo asi) como seria la forma mas apropiada de conectarlos, cuantos y como entrenar a todos los perceptrones si solo se conoce la salida de los que esten como salida de la red neuronal, me refiero que como se entrenaria a los que estuviesen a la entrada y en medio de la red neuronal de los cuales se desconoceria la salida ya que estan conectados a la entrada de otro perceptrón, ¿como se deberia hacer?, ¿como se puede formar una red neuronal con los perceptrones?

Otra cosa, el perceptrón tiene un entrenamiento supervisado off-line y aprende a base de darle la entrada y la salida esperada, ¿sabeis de algun otro tipo de red neuronal que se entrene de forma distinta, que el entrenamiento no sea offline sino online y que pueda aprender por si mismo además de darle los resultados que se esperan como salida y ese tipo de cosas, otra mas eficaz que el perceptrón?
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor Juanxo » Dom May 03, 2009 9:54 pm

Buenas lacabra:
Yo la verdad es que no estoy mu puesto en el tema de AI, pero estuve leyendo un libroque creo que cumple tus requisitos.
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor lacabra25 » Dom May 03, 2009 10:44 pm

Gracias Juanxo, acabo de descargarlo pero dejo lo de comenzar a mirarlo para mañana que ya es tarde. A ver si despues de leerlo consigo proramar algo lo suficiente inteligente para al menos que sepa jugar al tres en raya, jeje. :D
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor Juanxo » Lun May 04, 2009 2:49 pm

Pues ya será mas inteligente que alguno.... jajajaja.
Un placer, para eso estamos
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron