¿Qué son las Redes Neuronales Convolucionales (CNNs)?

Las Redes Neuronales Convolucionales (CNNs) son un tipo de red neuronal especialmente eficaz para tareas de procesamiento de imágenes y reconocimiento de patrones. Las CNNs se inspiran en la organización del cerebro animal, específicamente en la forma en que la corteza visual procesa la información visual.

Características Clave de las CNNs

  1. Convoluciones: Operaciones matemáticas que permiten a la red extraer características locales de la imagen.
  2. Capas de Pooling: Reducen la dimensionalidad de los datos, manteniendo las características más importantes.
  3. Capas Completamente Conectadas: Conectan todas las neuronas de una capa a todas las neuronas de la siguiente capa, similar a las redes neuronales tradicionales.
  4. Funciones de Activación: Introducen no linealidades en la red, permitiendo que la red aprenda representaciones más complejas.

Arquitectura Básica de una CNN

  1. Entrada: Imagen de entrada.
  2. Capas Convolucionales: Aplican filtros para extraer características.
  3. Capas de Pooling: Reducen la dimensionalidad.
  4. Capas Completamente Conectadas: Realizan la clasificación final.

Ejemplo Práctico: Construyendo una CNN Simple

Vamos a construir una CNN simple utilizando TensorFlow y Keras para clasificar imágenes del conjunto de datos MNIST (dígitos escritos a mano).

Paso 1: Importar las Bibliotecas Necesarias

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

Paso 2: Cargar y Preprocesar los Datos

# Cargar el conjunto de datos MNIST
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# Normalizar las imágenes a valores entre 0 y 1
train_images, test_images = train_images / 255.0, test_images / 255.0

# Redimensionar las imágenes para que tengan un canal adicional (grayscale)
train_images = train_images.reshape((train_images.shape[0], 28, 28, 1))
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1))

Paso 3: Definir la Arquitectura de la CNN

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
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=5, 
                    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 los 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: Modificar la Arquitectura de la CNN

Modifica la arquitectura de la CNN para mejorar su precisión. Puedes intentar agregar más capas convolucionales, cambiar el tamaño de los filtros, o ajustar los hiperparámetros.

Solución Sugerida

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
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.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

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

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

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

Conclusión

En esta lección, hemos introducido las Redes Neuronales Convolucionales (CNNs) y su arquitectura básica. También hemos construido una CNN simple para clasificar imágenes del conjunto de datos MNIST. En el próximo módulo, profundizaremos en la construcción de una CNN más compleja y exploraremos técnicas avanzadas para mejorar su rendimiento.

© Copyright 2024. Todos los derechos reservados