Introducción

En esta sección, aprenderemos cómo utilizar Redes Neuronales Convolucionales (CNN) para la tarea de clasificación de imágenes. Las CNN son especialmente efectivas para procesar datos con una estructura de cuadrícula, como las imágenes, debido a su capacidad para capturar características espaciales y patrones locales.

Objetivos

  • Comprender la arquitectura básica de una CNN.
  • Implementar una CNN simple para la clasificación de imágenes.
  • Evaluar el rendimiento del modelo.
  • Realizar ajustes y mejoras en el modelo.

Conceptos Clave

Arquitectura de una CNN

Una CNN típica consta de las siguientes capas:

  1. Capas Convolucionales: Aplican filtros para extraer características locales de la imagen.
  2. Capas de Pooling: Reducen la dimensionalidad de las características extraídas, manteniendo la información más relevante.
  3. Capas Completamente Conectadas: Realizan la clasificación final basándose en las características extraídas.

Ejemplo de Arquitectura

Tipo de Capa Descripción
Convolucional Filtros de 3x3, 32 canales, activación ReLU
Pooling Max Pooling 2x2
Convolucional Filtros de 3x3, 64 canales, activación ReLU
Pooling Max Pooling 2x2
Completamente Conectada 128 neuronas, activación ReLU
Salida Softmax para clasificación de 10 clases

Implementación Práctica

Paso 1: Importar Librerías

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

Paso 2: Cargar y Preprocesar Datos

Usaremos el conjunto de datos CIFAR-10, que contiene 60,000 imágenes de 10 clases diferentes.

# Cargar el conjunto de datos CIFAR-10
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()

# Normalizar los valores de los píxeles
train_images, test_images = train_images / 255.0, test_images / 255.0

Paso 3: Definir la Arquitectura de la CNN

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, activation='softmax'))

Paso 4: Compilar el Modelo

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

Paso 5: Entrenar el Modelo

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))

Paso 6: Evaluar el Modelo

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')

Paso 7: Visualizar Resultados

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 1: Mejorar la Precisión del Modelo

  1. Ajustar la Arquitectura: Añadir más capas convolucionales y de pooling.
  2. Aumentar el Número de Épocas: Entrenar el modelo durante más tiempo.
  3. Regularización: Implementar técnicas como Dropout para evitar el sobreajuste.
# Añadir más capas convolucionales y de pooling
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.MaxPooling2D((2, 2)))

# Añadir Dropout
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))

# Compilar y entrenar el modelo
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=20, 
                    validation_data=(test_images, test_labels))

Solución

Después de realizar los ajustes, evalúa nuevamente el modelo y compara los resultados con la versión anterior. Observa si hay mejoras en la precisión y si el modelo generaliza mejor en el conjunto de datos de prueba.

Conclusión

En esta sección, hemos aprendido a implementar una CNN básica para la clasificación de imágenes. Hemos cubierto desde la definición de la arquitectura hasta la evaluación del modelo. Además, hemos explorado formas de mejorar el rendimiento del modelo mediante ajustes en la arquitectura y técnicas de regularización. Con estos conocimientos, estás preparado para abordar problemas más complejos y experimentar con diferentes configuraciones de redes neuronales convolucionales.

© Copyright 2024. Todos los derechos reservados