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?