Data augmentation en red convolucional

| Última modificación: 18 de abril de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Data augmentation en red convolucional es una de las estrategias más funcionales dentro del Deep Learning. Por esta razón, a continuación, te explicamos cómo funciona Data augmentation en red convolucional.

Data augmentation en red convolucional

El fine tuning es muy útil cuando nuestros datasets no son muy grandes y estamos limitados por el número de imágenes que tenemos disponibles. No obstante, hay otra forma, muy potente, de conseguir mejores resultados, sobretodo si nuestro dataset es limitado.

Esta técnica se llama Data augmentation en red convolucional, probablemente porque lo que hace es sacar más datos a partir de los que tenemos disponibles. Básicamente, lo que hacemos es girar/trasladar/emborronar/cambiar el color/acercar o alejar/lo que se os ocurra las imágenes que tenemos. De esta forma, damos lugar a muchas más imágenes de las que teníamos inicialmente.

Ahora, ¿cómo sabemos las clases de esas nuevas imágenes generadas?

¡Es una muy buena pregunta! De hecho, es algo que tenemos que tener muy en cuenta: las nuevas imágenes toman la clase de la imagen origen, por lo que las transformaciones no pueden ser muy exageradas y mucho menos ocasionar que se parezcan a otra clase.

Para llevar a cabo este proceso existe una librería muy útil en Python que se llama imgaug.

Ejemplo práctico de Data augmentation en red convolucional

# Ejemplo con Data augmentation en red convolucional

# importamos lo necesario
import tensorflow as tf
from tensorflow.keras import callbacks,optimizers, Model
from tensorflow.keras.layers import Dropout, Flatten, Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import VGG16
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
import numpy as np

# primero cargamos nuestro dataset y lo redimensionamos a las dimensiones mínimas
# permitidas por la VGG16 -> (48, 48, 3)

input_shape = (48, 48, 3)

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
Y_train = to_categorical(y_train)
Y_test = to_categorical(y_test)

# resize train set
X_train_resized = []
for img in X_train:
  X_train_resized.append(np.resize(img, input_shape) / 255)
  
X_train_resized = np.array(X_train_resized)
print(X_train_resized.shape)

# resize test set
X_test_resized = []
for img in X_test:
  X_test_resized.append(np.resize(img, input_shape) / 255)
  
X_test_resized = np.array(X_test_resized)
print(X_test_resized.shape)
(50000, 48, 48, 3)
(10000, 48, 48, 3)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=input_shape)

# data generators => hacemos data augmentation
print('Usando real-time data augmentation.')
# This will do preprocessing and realtime data augmentation:
datagen_train = ImageDataGenerator(
    rotation_range=15,  # randomly rotate images in the range (degrees, 0 to 180)
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    zoom_range=0.1,  # set range for random zoom
    horizontal_flip=True)  # randomly flip images
datagen_train.fit(X_train_resized)

datagen_test = ImageDataGenerator()
datagen_test.fit(X_test_resized)

# permitimos que, además de la etapa de clasificación, se entrenen también el
# último bloque convolucional
for layer in base_model.layers:
  if layer.name == 'block5_conv1':
    break
  layer.trainable = False
  print('Capa ' + layer.name + ' congelada.')

# cogemos la última capa del model y le añadimos nuestro clasificador (top_model)
last = base_model.layers[-1].output
x = Flatten()(last)
x = Dense(1000, activation='relu', name='fc1')(x)
x = Dropout(0.3)(x)
x = Dense(10, activation='softmax', name='predictions')(x)
model = Model(base_model.input, x)

# compilamos el modelo
model.compile(optimizer=Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

# vemos la estructura del modelo
model.summary()
X_train_resized.shape[0]

50000

# comenzamos con el entrenamiento
epochs = 15
batch_size = 256
train_steps_per_epoch = X_train_resized.shape[0] / batch_size
test_steps_per_epoch = X_test_resized.shape[0] / batch_size

# entrenamos con el datagenerator (nos permite aplicar transformaciones en tiempo real)
model.fit_generator(datagen_train.flow(X_train_resized, Y_train, batch_size=batch_size),
                    steps_per_epoch=train_steps_per_epoch,
                    epochs=epochs,
                    validation_data=datagen_test.flow(X_test_resized, Y_test, batch_size=batch_size),
                    validation_steps=test_steps_per_epoch,
                    workers=8)

# comprobamos el accuracy y el loss en el test set
scores = model.evaluate(X_test_resized, Y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

Aprender más del Big Data

Ahora que conoces Data augmentation en red convolucional, te animamos a continuar aprendiendo sobre las demás estrategias para el manejo del Big Data.

No dudes en echarle un vistazo al Bootcamp Full Stack Big Data, Inteligencia Artificial & Machine Learning si lo que deseas es continuar aprendiendo y formarte como un data scientist profesional. Por medio de 11 módulos y de la mano de grandes expertos en el mundo del Big Data, podrás instruirte en los sistemas, lenguajes y programas más importantes para el manejo de los macrodatos. ¡No esperes más para inscribirte!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado