API funcional de Keras

Contenido abierto de la sección 8.1 del libro DEEP LEARNING Introducción práctica con Keras

Este post es una versión preliminar de la sección 8.1 del capítulo 8 del libro “Deep Learning – Introducción práctica con Keras (SEGUNDA PARTE)” que se publicará este otoño en Kindle Direct Publishing con ISBN 978-1-687-47399-8 en la colección WATCH THIS SPACE – Barcelona (Book 6). Como autor agradeceré que cualquier error o comentario que el lector o lectora encuentre en este texto me lo comunique por email a libro.keras@gmail.com para mejorar su contenido. Muchas gracias de antemano.

Es este punto del libro el lector ya está familiarizado con el uso de keras.Sequential( )para crear modelos. Pero para manejar modelos con topología no secuenciales, modelos con capas compartidas o modelos con múltiples entradas o salidas, Keras ofrece su API funcional que permite construir todo tipo de grafos con las capas. En este apartado presentaremos una visión global de la API funcinal de Keras[1].

 

Modelo secuencial

Para hacernos una idea de cómo funciona la API funcional de Keras proponemos programar con esta API el siguiente modelo de red neuronal que usa keras.Sequential( )que clasifica los dígitos MNIST que tratamos como primer ejemplo en este libro:

Para construir este modelo con la API funcional de Keras, comenzaríamos creando un “nodo” de entrada a un “grafo” en el que especificaríamos la forma de nuestros datos, vectores de 784 píxeles en este caso:

Lo que se retorna en esta capa, inputs, contiene información sobre la forma y el tipo de datos de entrada que espera alimentar a su modelo:

La manera de proceder con esta API es ir creando nuevos nodos en el grafo de capas expresando la conexión entre nodos de la siguiente manera:

La acción realizada con la definición de esta capa se puede visualizar como dibujar en un grafo una flecha desde el nodo “inputs” al nodo “dense1”y donde la flecha representa la capa (en este caso una capa Dense de 64 neuronas con función de activación relu).

Agreguemos las otras dos capas a nuestro gráfico de capas de la siguiente manera:

En este punto, podemos crear un modelo especificando sus entradas y salidas en el grafo de capas de la siguiente manera:

Podemos comprobar con el método summary( )que hemos creado correctamente las capas:

Keras nos ofrece otra forma de visualizar la red, en forma de grafo, para representar gráficamente la red neuronal que hemos construido:

El resto de pasos para entrenar y usar el modelo se realiza de la misma manera que con los modelos secuenciales vistos en los anteriores capítulos de este libro:

Modelos complejos

En la API funcional, los modelos se crean especificando sus entradas y salidas en un grafo de capas, permitiendo usar un solo grafo de capas para generar múltiples modelos. Puede considerarse cualquier modelo como si fuera una capa, llamándolo como argumento en una variable inputo en la variable output de otra capa. Debemos tener en cuenta que al llamar a un modelo no solo se está reutilizando la arquitectura del modelo, también sus pesos.

Un modelo puede contener submodelos (ya que un modelo se considera como una capa), siendo un caso de uso común la anidación de modelos. Como ejemplo, a continuación se muestra cómo agrupar un conjunto de modelos en un solo modelo que promedia sus predicciones:

Usando la representación visual presentada anteriormente, podremos observar el grafo de este modelo de la siguiente manera:

También se puede fácilmente manipular multiples inputsy outputs. Veamos un ejemplo extraído de la página Keras functional API[2]que crea un modelo que “clasifica los tíckets de los clientes por prioridad y los canaliza al departamento correcto con tres entradas y dos salidas”:

De manera visual, el grafo del anterior modelo es el siguiente:

Como el lector puede observar, se pueden construir modelos que consisten en arquitecturas complejas e imposibles de implementar con el modelo secuencial. Es importante resaltar que todos los métodos de Keras están preparados para poder adaptarse a los requerimientos de esta API funcional. Por ejemplo, al compilar un modelo, se pueden asignar diferentes funciones de Lossa cada output(incluso puede asignar diferentes poderaciones a cada Loss, para modular su contribución a la Losstotal de entrenamiento).

Además de los modelos con múltiples entradas y salidas, la API funcional facilita la manipulación de topologías de conectividad no lineal, es decir, modelos donde las capas no están conectadas secuencialmente, por ejemplo las conexiones residuales (Residual Neural Network[3]).

Hay algunas otras funcionalidades muy interesantes que se encuentran detalladas en la pagina Keras functional API[4]. En todo caso, destacar que si el lector no encuentra lo que necesita, es fácil extender la API creando sus propias capas[5]aunque con algunas pequeñas limitaciones[6](pero difícilmente para realizar modelos en producción, en todo caso a nivel de investigación).

Referencias del capítulo

[1] Véase https://www.tensorflow.org/beta/guide/keras/functional [Accedido: 18/08/2019]

[2] Véase https://www.tensorflow.org/beta/guide/keras/functional#manipulating_complex_graph_topologies [Accedido: 18/08/2019]

[3] Véase https://en.wikipedia.org/wiki/Residual_neural_network[Accedido: 18/08/2019]

[4] Véase https://www.tensorflow.org/beta/guide/keras/functional#manipulating_complex_graph_topologies [Accedido: 18/08/2019]

[5] Véase https://www.tensorflow.org/beta/guide/keras/functional#extending_the_api_by_writing_custom_layers [Accedido: 18/08/2019]

[6] Véase https://www.tensorflow.org/beta/guide/keras/functional#here_are_the_ weaknesses_of_the_functional_api [Accedido: 18/08/2019]