En una red neuronal, la salida de cada neurona es una función de la suma de todas sus entradas, ponderadas por unos parámetros θ (cuyos valores hemos obtenido entrenando la red neuronal en Matlab). Para esta función, llamada función de activación, suele utilizarse una sigmoide; con el fin de implementarla en el PIC32 nos informamos sobre diversas formas de realizar aproximaciones de la función sigmoide, siendo la más sencilla por tramos de rectas.
Pero a la hora de llevarlo a la práctica determinamos finalmente hacer uso de la función exp de la librería matemática en punto flotante para PIC32 incluida en el compilador de MPLAB. La función exp requiere 133 ciclos, y para calcular la sigmoide se necesita además una división. Dado que nuestra capa oculta es de 25 neuronas y, por tener un set de 12 gestos posibles, la capa de salida consta de 12 neuronas, se realizaran un total de 37 operaciones de sigmoide por imagen.
Además de esto, para obtener la salida de cada neurona sería necesario multiplicar el valor de cada una de las entradas por un theta y sumarlas, lo cual supone un gran número de operaciones de multiplicación, costosas en tiempo. Pero debido a que trabajamos con sólo dos niveles de color, la imagen de entrada está compuesta por píxeles con valor únicamente 1 ó 0. Esto implica que, para cada neurona de la capa oculta, ponderar cada entrada por los valores theta equivale simplemente a sumar el valor de theta si la entrada vale 1, o no sumarlo si vale 0. En lugar de las 577 (incluyendo neurona de bias) * 25 operaciones de multiplicación tenemos el mismo número de estructuras if y sumas, lo cual es un ahorro muy importante de ciclos de trabajo.
Para obtener la salida de la red neuronal sí será necesario tomar el valor de cada neurona de la capa oculta (mas la de bias), ponderarla por un theta y aplicarle la sigmoide a la suma de todas ellas; pero el número de operaciones de multiplicación en este caso (12(número de neuronas de salida)*26(salidas de la capa oculta)) es mucho menor que las que tendríamos que haber efectuado en la capa anterior de no ser por la enorme simplificación que supone trabajar a dos niveles de color.
Toda la red neuronal puede implementarse de esta forma mediante dos sencillos bucles for. El método en el que está implementada devuelve además el número de neurona cuya salida es máxima, que se corresponde con el número del gesto identificado. De esta forma hemos conseguido trabajar a tiempo real, a pesar de no haber realizado una aproximación menos costosa en tiempo para la sigmoide, identificando el gesto en cada fotograma capturado.
Esta función podría ser modificada en el futuro si queremos tener en cuenta otros datos en la salida de la red neuronal, como la varianza de las salidas, la diferencia en la estimación de las dos salidas más altas, etc.
Métodos de sigmoid y predict (red neuronal).
No hay comentarios:
Publicar un comentario