En este tema, aprenderemos a construir una Red Neuronal Convolucional (CNN) utilizando TensorFlow. Las CNNs son especialmente efectivas para tareas de visión por computadora, como el reconocimiento de imágenes y la clasificación. Vamos a desglosar el proceso paso a paso, desde la preparación de los datos hasta la construcción y entrenamiento del modelo.
Objetivos
- Comprender la estructura básica de una CNN.
- Aprender a construir una CNN utilizando TensorFlow y Keras.
- Entrenar y evaluar la CNN en un conjunto de datos de imágenes.
- Preparación del Entorno
Antes de comenzar, asegúrate de tener TensorFlow instalado. Puedes instalarlo utilizando pip:
- Importación de Librerías
Primero, importemos las librerías necesarias:
import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt
- Cargando y Preprocesando los Datos
Utilizaremos el conjunto de datos CIFAR-10, que contiene 60,000 imágenes de 32x32 píxeles en 10 clases diferentes.
# Cargar el conjunto de datos CIFAR-10 (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data() # Normalizar los valores de los píxeles a un rango de 0 a 1 train_images, test_images = train_images / 255.0, test_images / 255.0
- Exploración de los Datos
Es útil visualizar algunas imágenes del conjunto de datos para entender mejor con qué estamos trabajando.
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] # Mostrar las primeras 25 imágenes del conjunto de entrenamiento plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i][0]]) plt.show()
- Construcción del Modelo CNN
Ahora, construimos la CNN utilizando la API de Keras en TensorFlow. Nuestra CNN tendrá varias capas convolucionales y de pooling, seguidas de capas densas.
model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10))
Explicación de las Capas
- Conv2D: Capa convolucional que aplica filtros de convolución a la entrada.
- MaxPooling2D: Capa de pooling que reduce la dimensionalidad de la entrada.
- Flatten: Aplana la entrada para que pueda ser alimentada a una capa densa.
- Dense: Capa completamente conectada.
- Compilación del Modelo
Compilamos el modelo especificando el optimizador, la función de pérdida y las métricas.
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
- Entrenamiento del Modelo
Entrenamos el modelo utilizando los datos de entrenamiento.
history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
- Evaluación del Modelo
Evaluamos el modelo utilizando los datos de prueba para ver su rendimiento.
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print(f'\nTest accuracy: {test_acc}')
- Visualización de Resultados
Podemos visualizar la precisión y la pérdida durante el entrenamiento y la validación.
plt.plot(history.history['accuracy'], label='accuracy') plt.plot(history.history['val_accuracy'], label = 'val_accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.ylim([0, 1]) plt.legend(loc='lower right') plt.show()
Ejercicio Práctico
Ejercicio
Modifica la arquitectura de la CNN para mejorar su precisión. Prueba añadiendo más capas convolucionales o cambiando los hiperparámetros.
Solución
model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(128, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(128, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(128, activation='relu')) model.add(layers.Dense(10)) model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
Conclusión
En esta sección, hemos aprendido a construir una CNN básica utilizando TensorFlow y Keras. Hemos cubierto desde la carga y preprocesamiento de datos hasta la construcción, entrenamiento y evaluación del modelo. En el siguiente módulo, profundizaremos en arquitecturas avanzadas de CNN y técnicas para mejorar el rendimiento de nuestros modelos.
Curso de TensorFlow
Módulo 1: Introducción a TensorFlow
- ¿Qué es TensorFlow?
- Configuración de TensorFlow
- Conceptos Básicos de TensorFlow
- Hola Mundo en TensorFlow
Módulo 2: Fundamentos de TensorFlow
Módulo 3: Manejo de Datos en TensorFlow
Módulo 4: Construcción de Redes Neuronales
- Introducción a Redes Neuronales
- Creando una Red Neuronal Simple
- Funciones de Activación
- Funciones de Pérdida y Optimizadores
Módulo 5: Redes Neuronales Convolucionales (CNNs)
Módulo 6: Redes Neuronales Recurrentes (RNNs)
- Introducción a RNNs
- Construyendo una RNN
- Memoria a Largo Plazo (LSTM)
- Unidades Recurrentes Gated (GRUs)
Módulo 7: Técnicas Avanzadas de TensorFlow
- Capas y Modelos Personalizados
- TensorFlow Hub
- Aprendizaje por Transferencia
- Ajuste de Hiperparámetros