3 Maneras de construir un modelo de Aprendizaje Profundo con Keras y Tensorflow 2.0 en R
En este artículo veremos 3 formas en la que podemos crear modelos de aprendizaje profundo usando Keras y Tensorflow 2.0. Lo implementaremos usando el lenguaje de programación R. En esta publicación lo implementamos en Python.
Empecemos.
Índice
Preparando los datos
Antes de probar las 3 maneras de construir un modelo de Aprendizaje profundo con Keras y Tensorflow, necesitamos un problema a resolver.
Para esta publicación usaremos el conjunto Fashion MNIST. Este conjunto de datos consiste de imágenes de prendas con su correspondiente clase. El objetivo es entrenar un modelo que pueda predecir, ingresando una imagen, el tipo de prenda que corresponde. La siguiente imagen muestra el diagrama que vamos a desarrollar:
- Tenemos un conjunto de imágenes.
- Entrenamos un modelo, en este caso un modelo Red Neuronal Convolucional (CNN en sus siglas en inglés)
- Usamos el modelo entrenado para predecir la clase que corresponde a imágenes de prendas no vistas.
Empecemos importando las librerías que necesitaremos:
Ahora vamos a descargar el conjunto de datos Fashion MNIST:
El siguiente script grafica una muestra de imágenes junto con su correspondiente clase:
Podemos ver una muestra de 16 imágenes y sus clases.
El siguiente paso es normalizar las imágenes. La normalización ayuda a que nuestro modelo de aprendizaje profundo entrene correctamente (no haya fuga de gradiente) y pueda entrenar rápidamente. En el caso de imágenes la normalización consiste en mantener los valores de la matriz de imágenes en el rango 0-1.
También añadiremos una entrada más a nuestras imágenes ya que se encuentran en escala de grises (la red neuronal convolucional necesita 3 entradas RGB).
Arquitectura del modelo y proceso de evaluación
En esta publicación usaremos la siguiente arquitectura de nuestra red neuronal. Esta arquitectura consta de las siguientes partes:
- 3 capas convolucionales + Max pooling + Dropout
- 1 capa densa
- Dropout
- Capa de salida softmax
Nuestro modelo consta de 110,474 parámetros que aprenderán usando el conjunto de entrenamiento.
Usaremos la siguiente función para entrenar nuestro modelo:
- Compilaremos nuestro modelo usando el optimizador Adam.
- Como función de pérdida usaremos la entropía cruzada multiclase.
- Como métrica usaremos la precisión.
- Entrenaremos en el conjunto de entrenamiento y validaremos en el conjunto de prueba.
Listo, ya tenemos todo lo necesario para empezar a probar las distintas formar de construir una red neuronal.
3 formas para construir un modelo con Keras y Tensorflow en Python
Hay tres métodos para construir un modelo de Keras en Tensorflow:
- Modelo secuencial
- API funcional
- Modelo subclase
Modelo secuencial
Tal como dice el nombre, en un modelo secuencial creamos los modelos capa por capa, o paso por paso. Al igual que una secuencia, con la API secuencial, podemos crear en secuencia una serie de capas, donde cada capa solo tiene un tensor de entrada y un tensor de salida.
La imagen siguiente muestra la implementación de una capa convolucional + max pooling + dropout usando modelo secuencial:
Ejemplos de arquitecturas que se pueden crear de manera secuencial:
Si bien un modelo secuencial es fácil de implementar, tiene las siguientes limitaciones:
- Múltiples entradas y salidas: El enfoque secuencial solo admite una entrada, si necesitamos modelos con múltiples entradas (por ejemplo, si queremos comparar dos o más imágenes), no es posible usar la vía secuencial. Lo mismo sucede si nuestro modelo tiene más de una salida.
- Alguna capa individual tiene múltiples entradas o salidas: similar al punto anterior, solo que en lugar de tener
- Compartir capas: supongamos que queremos entrenar una red neuronal siamesa, es decir, que la misma red neuronal pase por dos inputs distintos (imágenes, texto, audio, …), esto no es posible en la api secuencial.
Implementando y probando el modelo secuencial
En Keras podemos crear un modelo secuencial usando pipe (%>%):
Veamos la línea 4 de la función. Usando %>% podemos agregar capas. Luego de este pipe, tenemos que indicar la capa que queremos agregar. En este caso, estamos agregando una capa convolucional.
Vamos a entrenar el modelo:
Algo que me gusta de keras en R es que podemos visualizar el proceso de entrenamiento. Veamos:
La arquitectura y número de parámetros lo podemos ver usando la función summary():
API Funcional
La API funcional de keras proporciona una forma más flexible de definir modelos.
Con la API funcional podemos hacer:
- Crear modelos complejos.
- Tener múltiples entradas y múltiples salidas.
- Compartir capas dentro de una arquitectura.
Ejemplos de arquitecturas que se pueden crear con la API funcional:
Implementando y probando la API funcional
Vamos a crear la misma red neuronal usando la API funcional:
Miremos un poco la función:
- Usamos layer_input() con la dimensión (shape) para definir la capa de entrada. En este caso usamos como argumento shape=[28, 28, 1]. Lo podemos ver en la línea 3.
- Cada capa necesita como entrada un tensor y retorna como salida un tensor. Lo podemos ver en la línea 4.
- Para definir el modelo necesitamos usar la función keras_model() y necesita dos argumentos: tensores de entrada y tensores de salida. Lo podemos ver en la línea 25.
Vamos a entrenar el modelo:
El resultado del entrenamiento es el siguiente:
La arquitectura y número de parámetros lo podemos ver usando la función summary():
Múltiples entradas y múltiples salidas en API funcional
Los modelos con múltiples entradas y múltiples salidas son buenos casos del uso de la API funcional, veamos algunos ejemplos:
- Múltiples entradas y una salida:
- Redes siamesas. Queremos comparar si dos imágenes pertenecen a la misma clase. En este caso, la misma red neuronal pasa por dos entradas. La salida es 1 o 0, donde 1 indica que las imágenes pertenecen a la misma clase y 0 que no.
- Analizar texto e imágenes. Por ejemplo,
- Una entrada y múltiples salidas:
- Predecir de la imagen de un rostro, la edad (salida numérica) y si está sonriendo (salida categórica).
- Múltiples entradas y múltiples salidas:
- Predecir, usando como entradas imagen y texto, las salida numérica y categórica.
En una siguiente publicación probaremos distintas arquitecturas usando la API funcional.
API Model Custom
La última forma de implementar un modelo con Keras y Tensorflow 2.0 en R es usando la función keras_model_custom. Usando esta función podemos crear nuestro propio modelo personalizado.
Implementando y probando la API subclase
Empezamos creando una función que usa la función (disculpad la redundancia) keras_model_custom:
Hay dos métodos importantes en esta función especial:
- function(self): con este método podemos inicializar los atributos de nuestro modelo, como, por ejemplo, las capas. Podemos agregar argumentos en este método, como, por ejemplo, los filtros de la capa CNN, o, el número de neuronas en la capa final. Lo podemos ver en la línea 3. Es similar al método __init__ en Python.
- function(inputs, …): luego de definir nuestras capas, en esta función se definen las operaciones. Lo podemos ver en la línea 26.
Vamos a entrenar el modelo:
El resultado del entrenamiento es el siguiente:
La arquitectura y número de parámetros lo podemos ver usando la función summary():
Conclusión
En esta publicación hemos visto 3 maneras para crear modelos con Keras y Tensorflow 2.0 en Python:
- Secuencial
- Funcional
- Subclases
Veamos algunas diferencia entre los 3 métodos:
Característica | Secuencial | Funcional | Subclase |
---|---|---|---|
Personalización | Baja | Media | Alta |
Dificultad para construir | Baja | Media | Alta |
Compartir capas | No | Si | Si |
Múltiples entradas | No | Si | Si |
Múltiples salidas | No | Si | Si |
Múltiples capas | No | Si | Si |
Adecuado para | Principiantes | Profesionales | Investigadores |
El código está en el siguiente enlace: https://github.com/Jazielinho/DeepLearningSpecialization/blob/master/Tensorflow/Maneras_crear_modelos/ways_create_tensorflow_models.r
Todo comentario es bienvenido.
Una respuesta a «3 Maneras de construir un modelo de Aprendizaje Profundo con Keras y Tensorflow 2.0 en R»