Evite el sobreajuste y aumente la precisión de su modelo de aprendizaje automático mediante la implementación de los métodos de aumento de datos de TensorFlow.

El aumento de datos es el proceso de aplicar varias transformaciones a los datos de entrenamiento. Ayuda a aumentar la diversidad del conjunto de datos y a evitar el sobreajuste. El sobreajuste ocurre principalmente cuando tiene datos limitados para entrenar su modelo.

Aquí, aprenderá a usar el módulo de aumento de datos de TensorFlow para diversificar su conjunto de datos. Esto evitará el sobreajuste al generar nuevos puntos de datos que son ligeramente diferentes de los datos originales.

El conjunto de datos de muestra que utilizará

Utilizará el conjunto de datos de gatos y perros de Kaggle. Este conjunto de datos contiene aproximadamente 3000 imágenes de gatos y perros. Estas imágenes se dividen en conjuntos de entrenamiento, prueba y validación.

La etiqueta 1.0 representa un perro mientras que la etiqueta 0.0 representa un gato.

instagram viewer

El código fuente completo que implementa técnicas de aumento de datos y el que no está disponible en un repositorio GitHub.

Instalar e importar TensorFlow

Para seguir adelante, debe tener un comprensión básica de Python. También debe tener conocimientos básicos de aprendizaje automático. Si necesita un repaso, puede considerar seguir algunos tutoriales sobre aprendizaje automático.

Abierto Colaboración de Google. Cambie el tipo de tiempo de ejecución a GPU. Luego, ejecute el siguiente comando mágico en la primera celda de código para instalar TensorFlow en su entorno.

!pip instalar tensorflow

Importa TensorFlow y sus módulos y clases relevantes.

importar tensorflow como t.f.
de tensorflow.keras.preprocesamiento.imagen importar Generador de datos de imagen
de tensorflow.keras.modelos importar Secuencial
de tensorflow.keras.layers importar Conv2D, MaxPooling2D, Flatten, Dense, Dropout

El tensorflow.keras.preprocesamiento.imagen le permitirá realizar un aumento de datos en su conjunto de datos.

Creación de instancias de la clase ImageDataGenerator

Crear una instancia de la Generador de datos de imagen clase para los datos del tren. Utilizará este objeto para preprocesar los datos de entrenamiento. Generará lotes de datos de imágenes aumentadas en tiempo real durante el entrenamiento del modelo.

En la tarea de clasificar si una imagen es un gato o un perro, puede utilizar las técnicas de aumento de datos de volteo, ancho aleatorio, altura aleatoria, brillo aleatorio y zoom. Estas técnicas generarán nuevos datos que contienen variaciones de los datos originales que representan escenarios del mundo real.

# definir el generador de datos de imagen para el entrenamiento
train_datagen = ImageDataGenerator (reescalar =1./255,
voltear_horizontal=Verdadero,
ancho_cambio_rango=0.2,
altura_cambio_rango=0.2,
rango_brillo=[0.2,1.0],
zoom_rango=0.2)

Crear otra instancia de la Generador de datos de imagen clase para los datos de prueba. Necesitarás el reescalar parámetro. Normalizará los valores de píxel de las imágenes de prueba para que coincidan con el formato utilizado durante el entrenamiento.

# definir el generador de datos de imagen para la prueba
test_datagen = ImageDataGenerator (reescalar =1./255)

Cree una instancia final de la Generador de datos de imagen clase para los datos de validación. Vuelva a escalar los datos de validación de la misma manera que los datos de prueba.

# definir el generador de datos de imagen para la validación
validación_datos = ImageDataGenerator (reescalar =1./255)

No necesita aplicar las otras técnicas de aumento a los datos de prueba y validación. Esto se debe a que el modelo utiliza los datos de prueba y validación únicamente con fines de evaluación. Deben reflejar la distribución de datos original.

Cargando sus datos

Crear un DirectorioIterador objeto del directorio de entrenamiento. Generará lotes de imágenes aumentadas. Luego especifique el directorio que almacena los datos de entrenamiento. Cambiar el tamaño de las imágenes a un tamaño fijo de 64x64 píxeles Especifique el número de imágenes que utilizará cada lote. Por último, especifique el tipo de etiqueta que se va a binario (es decir, gato o perro).

# definir el directorio de entrenamiento
train_data = train_datagen.flow_from_directory (directorio=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
lote_tamaño=32,
modo_clase='binario')

Crea otro DirectorioIterador objeto del directorio de prueba. Establezca los parámetros en los mismos valores que los de los datos de entrenamiento.

# definir el directorio de prueba
test_data = test_datagen.flow_from_directory (directorio='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
lote_tamaño=32,
modo_clase='binario')

crear una final DirectorioIterador objeto del directorio de validación. Los parámetros siguen siendo los mismos que los de los datos de entrenamiento y prueba.

# definir el directorio de validación
validación_datos = validación_datos.flujo_desde_directorio (directorio='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
lote_tamaño=32,
modo_clase='binario')

Los iteradores de directorio no aumentan los conjuntos de datos de validación y prueba.

Definición de su modelo

Defina la arquitectura de su red neuronal. Usar una Red neuronal convolucional (CNN). Las CNN están diseñadas para reconocer patrones y características en las imágenes.

modelo = Secuencial()

# capa convolucional con 32 filtros de tamaño 3x3
modelo.add (Conv2D(32, (3, 3), activación='relú', forma_entrada=(64, 64, 3)))

# capa de agrupación máxima con tamaño de piscina 2x2
modelo.add (MaxPooling2D(pool_size=(2, 2)))

# capa convolucional con 64 filtros de tamaño 3x3
modelo.add (Conv2D(64, (3, 3), activación='relú'))

# capa de agrupación máxima con tamaño de piscina 2x2
modelo.add (MaxPooling2D(pool_size=(2, 2)))

# aplanar la salida de las capas convolucional y de agrupación
modelo.añadir (Aplanar())

# capa totalmente conectada con 128 unidades y activación ReLU
modelo.add (Denso(128, activación='relú'))

# eliminar aleatoriamente el 50 % de las unidades para evitar el sobreajuste
model.add (Abandono(0.5))

# capa de salida con activación sigmoidea (clasificación binaria)
modelo.add (Denso(1, activación='sigmoideo'))

Compile el modelo usando el binario entropía cruzada función de pérdida. Los problemas de clasificación binaria comúnmente lo usan. Para el optimizador, utilice el Adam optimizador. Es un algoritmo de optimización de la tasa de aprendizaje adaptativo. Finalmente, evalúe el modelo en términos de precisión.

modelo. compilar (pérdida ='binary_crossentropy', optimizador='Adán', métricas=['exactitud'])

Imprime un resumen de la arquitectura del modelo en la consola.

Resumen Modelo()

La siguiente captura de pantalla muestra la visualización de la arquitectura del modelo.

Esto le da una visión general de cómo se ve el diseño de su modelo.

Entrenando a tu modelo

Entrena el modelo usando el adaptar() método. Establezca el número de pasos por época para que sea el número de muestras de entrenamiento dividido por el tamaño del lote. Además, establezca los datos de validación y el número de pasos de validación.

# Entrenar el modelo en los datos de entrenamiento
historia = modelo.ajuste (tren_datos,
steps_per_epoch=train_data.n // train_data.batch_size,
épocas =50,
validación_datos=validación_datos,
validación_pasos=validación_datos.n // validación_datos.tamaño_lote)

El Generador de datos de imagen La clase aplica el aumento de datos a los datos de entrenamiento en tiempo real. Esto hace que el proceso de entrenamiento del modelo sea más lento.

Evaluación de su modelo

Evalúe el rendimiento de su modelo en los datos de prueba usando el evaluar() método. Además, imprima la pérdida de prueba y la precisión en la consola.

prueba_pérdida, prueba_acc = modelo.evaluar (prueba_datos,
pasos=datos_de_prueba.n // datos_de_prueba.tamaño_de_lote)
imprimir(f'Pérdida de prueba: {prueba_pérdida}')
imprimir(Exactitud de la prueba: {test_acc}')

La siguiente captura de pantalla muestra el rendimiento del modelo.

El modelo funciona razonablemente bien en datos nunca vistos.

Cuando ejecuta código que no implementa las técnicas de aumento de datos, la precisión del entrenamiento del modelo es 1. Lo que significa que se sobreajusta. También funciona mal con datos que nunca antes había visto. Esto se debe a que aprende las peculiaridades del conjunto de datos.

¿Cuándo no es útil el aumento de datos?

  • Cuando el conjunto de datos ya es diverso y grande: El aumento de datos aumenta el tamaño y la diversidad de un conjunto de datos. Si el conjunto de datos ya es grande y diverso, el aumento de datos no será útil.
  • Cuando el conjunto de datos es demasiado pequeño: el aumento de datos no puede crear nuevas características que no estén presentes en el conjunto de datos original. Por lo tanto, no puede compensar un conjunto de datos pequeño que carece de la mayoría de las funciones que el modelo requiere para aprender.
  • Cuando el tipo de aumento de datos es inapropiado: Por ejemplo, la rotación de imágenes puede no ser útil cuando la orientación de los objetos es importante.

De qué es capaz TensorFlow

TensorFlow es una biblioteca diversa y poderosa. Es capaz de entrenar modelos complejos de aprendizaje profundo y puede ejecutarse en una variedad de dispositivos, desde teléfonos inteligentes hasta grupos de servidores. Ha ayudado a potenciar los dispositivos informáticos de última generación que utilizan el aprendizaje automático.