Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

martes, 20 de noviembre de 2012

Reporte entrega final de redes neuronales

Esta publicación esta dedicada a ser un reporte para la entrega final de la clase de redes neuronales con una explicación de mi aportación al proyecto de la red neuronal para controlar el brazo robótico.

Nuestro proyecto

Componentes
1.- El brazo robótico es el siguiente (Link) esta la compramos en Steren, este tiene cinco motores de directa, para utilizarlo desarmamos el dispositivo y controlamos utilizando un Arduino cada motor por separado para mapear cada uno con una salida de nuestra red neuronal.


[Imagen obtenida de: http://www.steren.com.mx/_imgs/prod/grande/k-682.jpg]

2.-  Electroencefalograma del juguete The Star Wars Force Trainer el cual es un sensor que mide la actividad electrica del cerebro.


[Image obtenida de: http://cdn2-b.examiner.com/sites/default/files/styles/image_content_width/hash/e2/93/e293a53f702510273b7481b9ce4d9462.jpg]



3.- Dos Arduinos , la idea es utilizarlo como interfaz de las señales recibidas del sensor y también para las señales mandadas al brazo robótico controlando cada motor del brazo mecánico.

[Imagen obtenida de:http://arduino.cc/en/uploads/Main/arduino_uno_test.jpg]


Funcionamiento
La idea es que utilizando el electroencefalograma como entrada  ala red, esta sea capaz de mapear pensamientos específicos como arriba, abajo izquierda y derecha a movimientos del brazo robótico directamente relacionados como moverse a esas direcciones.

Mi aportación

Algoritmo heurístico para configurar la red neuronal
Una vez teniendo una red capaz de entrenarse para el proyecto nos dimos cuenta que escoger una configuración de conexiones para la red neuronal era algo complicado y que necesitábamos un análisis minucioso sobre los valores de entrada  ala red para poder elegir una configuración correcta, pero dado que tardamos mucho tiempo en elegir un aparato que nos diera señales de entrada decidimos implementar un algoritmo heurístico que buscara la configuración con el menor error posible para no tener que preocuparnos por la configuración de la misma.

Algoritmo voraz 

El algoritmo voraz fue el seleccionado para configurar la red debido a su simplesa, el algoritmo genera grafos aleatorios y utiliza el error del entrenamiento de una red como función objetivo, es decir entrena n cantidad de veces la red neuronal y el error en n cantidad de entrenamientos finales es el valor de salida en la función objetivo.

Una vez teniendo definido esto solo se crean diferentes redes aleatorias y se modifican seleccionando siempre la que reduzca mas el error.

Esta es una gráfica del programa minimizando el error de una red neuronal

Aquí se muestra una red óptima generada por el programa:



Una nueva red mas flexible

Para que el programa heurístico pudiera minimizar el error de entrenamiento necesitábamos una  red neuronal mas flexible que fuera capaz de evaluar y entrenar una red neuronal con las características ya mencionadas por lo cual tuvimos que implementar una nueva red neuronas, utilizando Backpropagation otra vez como algoritmo de entrenamiento de entrenamiento.

El algoritmo funciona como una búsqueda de profundidad BFS, para evaluar empieza con las neuronas de la capa de entrada, después busca las neuronas con las que tiene conexión y visita las mismas, evalúa las salidas para las mismas y pasa  alas siguientes mas cercanas cuidando no volver a visitar neuronas que ya han sido visitadas antes.

Para el backpropagation utiliza la misma lógica pero esta vez empieza a visitar a las neuronas desde la capa de salida.

Exor
Como prueba para el algoritmo empezamos creando una red para un exór y entrenándola para lo cual esta fue el resultado: 
 
Salidas

[0, 0] (0.08847382273808657, [-0.42065145367176987])
[0, 1] (0.003901019389583797, [0.9116708497767153])
[1, 0] (0.0031196995578053406, [0.9210101328295162])
[1, 1] (0.039653499234460134, [-0.2816149826783374])
Error:  0.346610025801

Entrenando la red con entradas del EGG
Una vez teniendo la red, empezamos a entrenar la red con valores que habiamos tomado del egg con anterioridad, los valores fueron tomados.
Para mandar los valores a la red se creo un parser muy sencillo y se metieron todas las entradas en un vector junto con su salida esperada y se dieron com entrada a la red.

def cargar_archivos(archivos):
    muestras = list()

    for i in range(len(archivos)):
        fl = open(archivos[0])
        for j in fl:
            temp = j.split(",")
            for h in range(len(temp)):
  temp[h] = int(temp[h])
            muestras.append([temp, [i]])
        fl.close()

    random.shuffle(muestras)

    return muestras

El resultado de la red fue el siguiente:

Debido a un problema con la red neuronal, las entradas no siempre se entrenan de forma correcta y eso provoca que el algoritmo heuristico funcione mal y lanze males valores.

La gráfica del entrenamiento es la siguiente:

La red optima que me lanzo es la siguiente:


Programa
El programa se encuentra para descargar en Github desde el siguiente enlace:

https://github.com/SaulG/redesNeuronales

Con las versiones mas estables del programa.

Pero para modificar directamente y mantener una copia automática en tiempo real de lo que modificaba utilice mi cuenta de Dropbox para la cual por cuestiones de seguridad solo daré permiso de acceder a la doctora que imparte la clase.

Esta es la dirección del Dropbox
https://www.dropbox.com/sh/nsn458htcnvcoqo/ydTh4nYjc0

En esta página se puede ver el registro de actividades
https://www.dropbox.com/events?ns=160486657&n=1&d

1 comentario: