Primeros paso en desarrollo de RNA con Python

Implementando una RNA


Para esta primera entrada sobre el tema quisiera explicar los conceptos básicos de la programación de neuronas y culminar con un ejemplo de una neurona funcional que sea capas de aprender por si misma dándole una cantidad de casos de prueba.

Para ello primero veamos algo de teoría:

Las redes neuronales son un intento de la humanidad de imitar el comportamiento complejo de los cerebros biologicos, los cuales trabajan de manera muy distinta a los ordenadores, dado que mientras los ordenadores procesan de manera secuencial la informacion, los seres biologicos procesamos la informacion de manera paralela.

Las neuronas en el mundo natural son, a grandes rasgos un nucleo, este siendo una celula especializada, rodeada de millones de conexiones con otras.

Para poder realizar el proceso sinaptico, comunicacion entre estas celulas, se utilizan dos tipos de neurotransmisores las dendritas y los axones.

Para pode "exitar" una neurona y que esta dispare su impulso electrico, haciendo un paralelismo seria para que un transistor nos devuelva un uno logico, se necesita que la suma total de las dendritas multiplicada por sus pesos sinapticos, que son la relevancia que tiene la dendrita para la neurona, causan que al pasar el umbral de disparo esta se active y nos de un uno logico.

bajo este modelo trabajaremos la representacion de una neurona y su entrenamiento.

Ahora que ya sabemos lo básico aquí les dejo una explicación de las clases y funciones que estamos utilizando dentro del código para poder llevar a cabo un aprendizaje simple.
Desde aquí podrán encontrar el github con el código fuente.

class caso(builtins.object)
 |  Esta clase la utilizamos para poder hacer casos de prueba para entrenar a la neurona
 |  
 |  Esta implementada de manera que la funcion constructor '__init__' pasandole los valores,
 |  que representan las x en la forma matematica de verlo, las salida deseada, que representa
 |  la d y la neurona que ejecutara el caso de prueba.
 |  
 |  Methods defined here:
 |  
 |  __init__(self, valores, salida_deseada, neurona)
 |      Funcion constructor del caso de prueba. 'valores = []' 'salida_deseada = int' 'neurona = objeto tipo neurona'
 |      
 |      asigna las variables de clase:
 |      x como los valores de prueba, esto normalmente es una lista de los valores que toman las dendritas.
 |      y como el resultado actual procesado con los pesos que poseen las dendritas asociadas a esa neurona.
 |      d como la salida que uno esperaria obtener de la neurona.
 |  
 |  actualizar_salida(self, neurona)
 |      Funcion que nos permite obtener un nuevo resultado de la interaccion de la neurona.
 |      
 |      Esta funcion la utilizamos como una manera de comprobar si los casos son satisfechos
 |      luego de ejecutar el algoritmo de aprendizaje.
 |  
 |  ----------------------------------------------------------------------


class dendrita(builtins.object)
 |  Esta clase representa una dendrita clasica.
 |  
 |  Esta clase cuenta con los atributos:
 |  x que simboliza el valor de entrana de la dendrita.
 |  w que simbolixa el peso del enlace con la neurona.
 |  
 |  Methods defined here:
 |  
 |  __init__(self, peso_sinaptico)
 |      Funcion constructor de la dendrita.
 |      
 |      El valor de la entrada la hacemos 0 para poder inicializar una dendrita que no tiene valor de entrada,
 |      el peso sinaptico es un valor que debemos ingresar su peso por si la dendrita ya cuenta con un peso
 |      por defecto.
 |  
 |  ----------------------------------------------------------------------



class neurona(builtins.object)
 |  Esta clase define una neurona.
 |  
 |  Esta clase esta definida por los valores clave que requiere una neurona para funcionar como un perceptron 
 |  simple a la ves que nos permite entrenarla para obetener los pesos sinapticos optimos.
 |  Los atributos de esta dendrita son:
 |  
 |  dendritas que representa una cadena de objetos dendrita para poder determinar cuantas conexiones tiene de entrada.
 |  frontera que es el valor requerido para lanzar la neurona.
 |  salida que nos da el valor del axon.
 |  
 |  Methods defined here:
 |  
 |  __init__(self, dendritas, frontera, n)
 |      Funcion constructor para la nuerona.
 |      
 |      Esta funcion permite darle a la neurona las dendritas con las que trabajara y de esta manera determinar
 |      la arquitectura de la red, asi mismo la frontera representa el diferencial de pontencial que dispara la 
 |      neurona y la salida que representa el True como 1 en el axon y False como 0 en el axon
 |  
 |  entrenar(self, casos_prueba)
 |      Funcion entrenadora de la neurona.
 |      
 |      Esta funcion capacita a la neurona a aprender a traves del algoritmo de aprendisaje:
 |      w = w + (n*D*x)
 |      Esto lo realizamos apoyandonos de un bucle que solo terminara cuando la salida de la neurona sea True
 |      en todos los caso de prueba, a traves de recorrer cada caso y realizar un recalculo del peso correspondiente
 |      a cada dendrita dentro del caso ejecutando el algoritmo y redondeandolo a 2 decimales.
 |      Una ves obtenido nuestro nuevo peso para cada dendrita se recorren los casos de prueba y se determinan
 |      las salidas de la neurona para cada caso y las almacenamos en la lista cad, para finalizar determinamos
 |      si alguno de los resultados de la diferencia entre la salida y el valor deseado del caso en caso alguna
 |      discrepe se sigue ejecutando el algoritmo de aprendizaje, caso contrario se corta y se determina que la
 |      neurona ya esta entrenada.
 |  
 |  salida_actual(self, valores)
 |      Funcion que devuelve el resultado de un caso dado con los pesos actuales de las dendritas asociadas
 |      a la neurona.
 |      
 |      Atraves de un bucle recorre todas las dendritas y va realizando dinamica de red y asi obtenemos un valor
 |      el cual lo almacenamos en acu y una ves dadas todas las vueltas necesarias y hambiendo obtenido su 
 |      acumulado total le restamos la frontera y asi retornamos el valor de salida si este es mayor a 0
 |      entonces el axon es 1 caso contrario nuestro axon seria 0.
 |  
 |  ----------------------------------------------------------------------
  
Espero que les sea de ayuda, cualquier comentario sera bienvenido o si desean colaborar con cambios, optimizacion u otros en el github tambien se los agradeceria.

Icons made by Darius Dan from www.flaticon.com is licensed by CC 3.0 BY
Tambien editado por mi.

Comentarios

Entradas populares