Saltar al contenido

Generadores de datos Keras y cómo usarlos

septiembre 22, 2021
1wUDuWchsNha2u9egWQCikg

Generadores de datos Keras y cómo usarlos

Ilya Michlin

5 de oct de 2019·3 min de lectura

1*wUDuWchsNha2u9egWQCikg

Probablemente se encontró con una situación en la que intenta cargar un conjunto de datos pero no hay suficiente memoria en su máquina. A medida que avanza el campo del aprendizaje automático, este problema se vuelve cada vez más común. Hoy en día, este ya es uno de los desafíos en el campo de visión donde se procesan grandes conjuntos de datos de imágenes y archivos de video.

Aquí nos centraremos en cómo construir generadores de datos para cargar y procesar imágenes en Keras.

¿Cuál es la funcionalidad del generador de datos?

En la clase Modelo de Keras, elrHay tres métodos que nos interesan: fit_generator, evalu_generator y predict_generator. Los tres requieren un generador de datos, pero no todos los generadores se crean por igual.

Veamos qué tipo de generador requiere cada método:

fit_generator

Requiere dos generadores, uno para los datos de entrenamiento y otro para la validación. Afortunadamente, ambos deberían devolver una tupla (entradas, objetivos) y ambos pueden ser instancias de la clase Sequence.

evaluar_generador

El generador de datos aquí tiene los mismos requisitos que en fit_generator y puede ser el mismo que el generador de entrenamiento.

predecir_generador

El generador aquí es un poco diferente. Debería devolver solo entradas.

Con eso en mente, construyamos algunos generadores de datos. Debido a la similitud entre el generador en fit_generator y evalu_generator, nos centraremos en construir generadores de datos de fit_generator y predict_generator.

ImageDataGenerator clase

La clase ImageDataGenerator es muy útil en la clasificación de imágenes. Hay varias formas de usar este generador, dependiendo del método que usemos, aquí nos enfocaremos en flow_from_directory toma una ruta al directorio que contiene imágenes ordenadas en subdirectorios y parámetros de aumento de imágenes.

Veamos un ejemplo:

Usaremos un conjunto de datos que se puede descargar desde https://www.kaggle.com/c/dogs-vs-cats/data donde la estructura es la siguiente:

data/
train/
dogs/
dog001.jpg
dog002.jpg
...
cats/
cat001.jpg
cat002.jpg
...
validation/
dogs/
dog001.jpg
dog002.jpg
...
cats/
cat001.jpg
cat002.jpg
...

Primero, importemos todas las bibliotecas necesarias y creemos un generador de datos con algunos aumentos de imagen.

Finalmente, cree un modelo y ejecute el método fit_generator.

ImageDataGenerator es una manera fácil de cargar y aumentar imágenes en lotes para tareas de clasificación de imágenes. ¡Pero! ¿Y si tienes una tarea de segmentación? Para eso, necesitamos construir un generador de datos personalizado.

Generador de datos flexible

Para construir un generador de datos personalizado, necesitamos heredar de la clase Sequence. Hagamos eso y agreguemos los parámetros que necesitamos.

La clase Sequence nos obliga a implementar dos métodos; __len__ y __getitem__. También podemos implementar el método on_epoch_end si queremos que el generador haga algo después de cada época.

El método __len__ debería devolver el número de lotes por época. A continuación se muestra una posible implementación.

on_epoch_end en este ejemplo puede mezclar los índices para el entrenamiento si shuffle = True. Pero aquí puede haber cualquier lógica que queramos ejecutar después de cada época.

El segundo método que debemos implementar es __getitem__ y hace exactamente lo que esperarías. Debería devolver un lote de imágenes y máscaras si estamos prediciendo. Esto se puede controlar estableciendo to_fit en True o False.

Todo el generador de datos debería ser similar a esto:

Suponiendo que tenemos dos directorios, uno contiene las imágenes y el otro contiene las imágenes de máscara y cada imagen tiene una máscara correspondiente con el mismo nombre, el siguiente código entrenará el modelo usando el generador de datos personalizado.

Finalmente, si queremos hacer predicciones con el generador de datos, to_fit debe establecerse en False y debe llamarse predict_generator.

Conclusiones

Si bien Keras proporciona generadores de datos, sus capacidades son limitadas. Una de las razones es que cada tarea necesita un cargador de datos diferente. A veces, cada imagen tiene una máscara y, a veces, varias, a veces la máscara se guarda como una imagen y, a veces, se codifica, etc.

Para cada tarea, probablemente necesitemos modificar nuestro generador de datos, pero la estructura seguirá siendo la misma.

Enlaces de referencia

Un ejemplo detallado de cómo utilizar generadores de datos con Keras de Stanford

Un ejemplo detallado de generadores de datos con Keras

python keras 2 fit_generator multiprocesamiento de grandes conjuntos de datos Por Afshine Amidi y Shervine Amidi ¿Alguna vez has tenido que …

stanford.edu

Clase modelo Keras

Modelo (API funcional) – Documentación de Keras

En la API funcional, dados algunos tensor (es) de entrada y tensor (es) de salida, puedes crear una instancia de un modelo a través de: from…

keras.io

Clase ImageDataGenerator de Keras

Procesamiento previo de imágenes

keras.preprocessing.image.ImageDataGenerator (featurewise_center = False, samplewise_center = False…

keras.io

close