El entrenamiento de la red neuronal puede hacerse de diversas formas (algoritmos genéticos, backpropagation, manualmente...). Nosotros hemos elegido utilizar la técnica de backpropagation utilizando una gran base de datos de imágenes de gestos clasificados capturados por nosotros mismos y tratando de minimizar una función de coste que depende entre otras cosas del número de aciertos y de fallos que tiene la red al clasificar los gestos de la base de datos de entrenamiento.
La red neuronal depende de un juego de parámetros libres que serán los que ajustará el algoritmo de entrenamiento. En nuestro caso, cada neurona de la capa intermedia u oculta recibe una entrada de cada una de las neuronas de entrada, y asigna un peso distinto entre 0 y 1 a cada una de estas entradas. La suma de todas las entradas ponderadas por su correspondiente peso se pasa como entrada a una función de activación de tipo sigmoide (en nuestro caso con el sesgo siempre a 0), y el valor que tome esta función será la salida de la neurona. El funcionamiento es análogo entre las capa oculta y la capa de salida. Además, a la capa de entrada y a la capa oculta se les añade una neurona extra que no tiene entradas y siempre vale 1 y que se conoce como "bias unit", y que se incluye para evitar algunos problemas en caso de que ninguna de las neuronas de verdad se active.
Por tanto, con 576 píxeles por imagen (24x24) y sumando la bias unit, habrá 577 neuronas en la capa de entrada. Para la capa intermedia hemos fijado un total de 25 neuronas más la bias unit, total 26. Y la capa de salida tendrá tantas neuronas como gestos, en nuestro caso 12. Por tanto los parámetros libres de la red suman un total de 577x25 + 26*12 = 14737 parámetros. Entrenar la red con backpropagation significa esencialmente buscar los 14737 valores que hacen mínima una función de esos 14737 parámetros, lo cual resulta una tarea muy pesada que realizamos con Matlab.

Una vez entrenada la red tendremos un juego de parámetros entrenados, que llamaremos Theta1 (una matriz de 25 x 577) y Theta2 (12x26). La imagen se pasa a la red como un vector de 576 componentes (más la bias unit) correspondiendo cada componente del vector al valor de un pixel de la imagen. Realizando las operaciones que aparecen en la imágen (g(x) es la función sigmoide 1/(1+exp(-x)) ) obtendremos una hipótesis (un valor real entre 0 y 1) para cada neurona de salida. Las neuronas de salida van numeradas del 1 al 12 igual que nuestros gestos, y el número del gesto reconocido se corresponderá con el número de la neurona de salida cuya hipótesis sea máxima.
La implementación del sistema de entrenamiento está basado en un ejercicio propuesto para un curso online impartido por la universidad de Stanford sobre aprendizaje de máquinas. En este ejercicio se proponía implementar de forma más o menos guiada todo el algoritmo de backpropagation, programando entre otras cosas las funciones que determinan el gradiente de la función de coste y la función que clasifica una imagen una vez esté entrenada la red. El propósito de esta red era el reconocimiento de imágenes de números manuscritos.
Las modificaciones realizadas incluyen la eliminación de toda la parte del código del ejercicio que no tenía que ver con la red neuronal y la programación de todo el sistema que procesa y transforma las imágenes capturadas de la base de datos al formato adecuado (esencialmente idéntico al formato en que se capturan las imágenes en el PIC32) para trabajar con ellas.
También hemos creado un sistema de evaluación del comportamiento de la red que muestra el porcentaje de aciertos para cada uno de los gestos, y te permite visualizar cómo se ha reconocido cada gesto, para ver con cuales tiene más dificultades y poder tomar las decisiones adecuadas para mejorar el comportamiento.
Para pasarle los parámetros entrenados al PIC32 utilizamos un fichero de datos que creamos automáticamente con matlab gracias a un script que genera el fichero con el formato adecuado, listo para copiar, pegar y compilar.
No hay comentarios:
Publicar un comentario