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?





