Flatten, Dropout y MaxPooling2D
1. Flatten
La capa Flatten
convierte una entrada multidimensional (como en una imagen) en un vector unidimensional, que se puede alimentar a capas densas. Esto es crucial después de usar capas convolucionales y de agrupación, ya que las salidas en esas capas suelen ser tensores 2D o 3D.
Ejemplo:
from tensorflow.keras.layers import Flatten
import numpy as np
# Supongamos una entrada con forma (batch_size, height, width, channels)
input_data = np.random.rand(1, 4, 4, 3) # Imagen de 4x4 con 3 canales
print("Forma antes de Flatten:", input_data.shape)
# Aplicar Flatten
flatten_layer = Flatten()
output = flatten_layer(input_data)
print("Forma después de Flatten:", output.shape)
Salida esperada:
Forma antes de Flatten: (1, 4, 4, 3)
Forma después de Flatten: (1, 48) # 4*4*3=48
2. Dropout
La capa Dropout
se usa para reducir el sobreajuste de una red neuronal, desactivando aleatoriamente un porcentaje de neuronas durante el entrenamiento. Esto ayuda a que el modelo no dependa de neuronas específicas y generalice mejor.
Ejemplo:
from tensorflow.keras.layers import Dropout, Dense
from tensorflow.keras.models import Sequential
model = Sequential([
Dense(64, activation='relu', input_shape=(20,)),
Dropout(0.5), # Desactiva el 50% de las neuronas en esta capa
Dense(10, activation='softmax')
])
model.summary()
En este caso, el Dropout
apaga el 50% de las neuronas en la primera capa Dense
durante el entrenamiento, pero las activa todas durante la evaluación y predicción.
3. MaxPooling2D
La capa MaxPooling2D
reduce la dimensionalidad espacial de la entrada tomando el valor máximo dentro de cada filtro en la ventana. Esta capa es muy común en redes convolucionales para reducir el tamaño de las características manteniendo la información más importante.
Ejemplo:
from tensorflow.keras.layers import MaxPooling2D
import tensorflow as tf
# Ejemplo de entrada con forma (batch_size, height, width, channels)
input_data = tf.constant([[[[1], [2]], [[3], [4]]]], dtype=tf.float32) # Imagen de 2x2
# Aplicar MaxPooling con un tamaño de filtro 2x2
pooling_layer = MaxPooling2D(pool_size=(2, 2))
output = pooling_layer(input_data)
print("Forma de salida después de MaxPooling:", output.shape)
print("Salida después de MaxPooling:", output.numpy())
Salida esperada:
Forma de salida después de MaxPooling: (1, 1, 1, 1)
Salida después de MaxPooling: [[[[4.]]]] # 4 es el valor máximo en la entrada
Ejemplo Completo Usando Flatten
, Dropout
, y MaxPooling2D
en una CNN
Este es un modelo de red neuronal convolucional simple que utiliza estas capas en conjunto para clasificar imágenes de MNIST:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# Cargar y preprocesar datos MNIST
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1) / 255.0
x_test = x_test.reshape(-1, 28, 28, 1) / 255.0
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# Construir el modelo
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(10, activation='softmax')
])
# Compilar y entrenar el modelo
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))
Explicación:
Conv2D
: Detecta características espaciales de la imagen.MaxPooling2D
: Reduce el tamaño espacial.Dropout
: Ayuda a prevenir el sobreajuste.Flatten
: Convierte las características en un vector.Dense
: Capa final de clasificación.