El objetivo de esta actividad es aplicar un modelo de red neuronal profunda especializado (LSTM o CNN) para resolver un problema de clasificación supervisada. Con este ejercicio los estudiantes explorarán arquitecturas más avanzadas que los MLP, enfocadas en patrones secuenciales (LSTM) o patrones espaciales/locales (CNN), entendiendo su funcionamiento básico y cómo se entrenan en la práctica.
Dependiendo del dataset elegido, la variable objetivo puede ser:
Capa de entrada
Capas ocultas
Capa de salida
Función de pérdida
Entrenamiento
Evaluación
El dataset dependerá de la modalidad elegida:
Entrenar una red neuronal convolucional (CNN) para clasificar imágenes de dígitos escritos a mano (MNIST), y visualizar qué características aprende cada capa. Al final, se evaluará el modelo con una matriz de confusión y un reporte de clasificación.
from tensorflow.keras import Input, Model
from tensorflow.keras import layers
# Definir la entrada de la red (una imagen de 28x28 en escala de grises)
inputs = Input(shape=(alto, ancho, 1)) # 👈 CAMBIA AQUÍ alto, ancho, de la imagen
# Primer bloque convolucional: detecta bordes y patrones simples
x = layers.Conv2D(8, (3, 3), activation='relu', name='conv1')(inputs)
x = layers.MaxPooling2D((2, 2))(x) # Reduce la dimensión y conserva lo más relevante
# Segundo bloque convolucional: detecta combinaciones más complejas (curvas, esquinas)
x = layers.Conv2D(16, (3, 3), activation='relu', name='conv2')(x)
x = layers.MaxPooling2D((2, 2))(x)
# Capa densa para clasificación final
x = layers.Flatten()(x)
x = layers.Dense(64, activation='relu')(x)
outputs = layers.Dense(clases, activation='softmax')(x) # 👈 CAMBIA AQUÍ a 10, clases posibles (0-9)
# Compilar el modelo
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Mostrar resumen del modelo
print(model.summary())
# Entrenar el modelo por 5 épocas
model.fit(x_train, y_train, epochs=5, validation_split=0.1)
(28, 28, 1)? ¿Qué representa cada dimensión?MaxPooling2D sobre la salida de la convolución?softmax en este contexto?Observa el model.summary() y explica:
# Seleccionar una imagen del conjunto de prueba
img = x_test[0:1]
# Crear un modelo que devuelva las salidas intermedias de las capas convolucionales
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers if 'conv' in layer.name]
feature_model = models.Model(inputs=model.input, outputs=layer_outputs)
# Obtener los mapas de características
feature_maps = feature_model.predict(img)
# Visualizar los mapas de cada capa
import matplotlib.pyplot as plt
for i, fmap in enumerate(feature_maps):
num_filters = fmap.shape[-1]
plt.figure(figsize=(12, 4))
for j in range(num_filters):
plt.subplot(1, num_filters, j+1)
plt.imshow(fmap[0, :, :, j], cmap='viridis')
plt.axis('off')
plt.suptitle(f"Feature Maps from Conv Layer {i+1}")
plt.show()
Describe lo que observas en los mapas de características:
- ¿La primera capa detecta bordes o contornos?
- ¿La segunda capa comienza a detectar formas más complejas como bucles o esquinas?
- ¿Qué tanto se reduce la imagen con las capas de
MaxPooling?
from sklearn.metrics import classification_report, ConfusionMatrixDisplay
import numpy as np
# Predecir clases
y_pred_probs = model.predict(x_test)
y_pred = np.argmax(y_pred_probs, axis=1) # Convertir probabilidades en etiquetas
# Matriz de confusión
ConfusionMatrixDisplay.from_predictions(
y_test, y_pred,
cmap='Blues',
colorbar=False,
display_labels=np.arange(10)
)
plt.title("Confusion Matrix - MNIST Classification")
plt.grid(False)
plt.tight_layout()
plt.show()
# Reporte de métricas por clase
print("Classification Report:\n")
print(classification_report(y_test, y_pred))
precision, recall, f1-score) y por qué?Esta actividad tiene como objetivo aplicar un modelo de red neuronal convolucional (CNN) para resolver un problema de clasificación de imágenes de dígitos escritos a mano, usando el conjunto de datos MNIST. Además de entrenar el modelo, se analizará el proceso de aprendizaje a través de mapas de activación y se evaluará su desempeño con una matriz de confusión y un reporte de clasificación.
Se construyó una red neuronal convolucional que recibe imágenes de tamaño 28×28×1 (escala de grises). La arquitectura incluye:
ReLUMaxPoolingsoftmax📄 Resumen del modelo:
input → Conv2D(8 filtros) → MaxPool → Conv2D(16 filtros) → MaxPool → Flatten → Dense(64) → Dense(10)
🧩 Actividad:
(28, 28, 1)?Flatten?Se seleccionó una imagen del dígito 7 del conjunto de prueba y se visualizaron los mapas de activación producidos por cada filtro en las dos capas convolucionales.

🧩 Actividad:
Después del entrenamiento, se evaluó el modelo usando todo el conjunto de prueba. La siguiente figura muestra la matriz de confusión con los resultados obtenidos:

🧩 Actividad:
Después del entrenamiento, se evaluó el modelo CNN con el conjunto de prueba. Se presentan a continuación la matriz de confusión y el reporte de clasificación por clase, que permiten analizar el desempeño del modelo para cada dígito.
📄 Reporte de clasificación (conjunto de prueba):
precision recall f1-score support
0 0.97 1.00 0.98 980
1 0.99 0.99 0.99 1135
2 0.98 0.99 0.98 1032
3 0.99 0.98 0.99 1010
4 0.98 1.00 0.99 982
5 0.99 0.98 0.99 892
6 1.00 0.98 0.99 958
7 1.00 0.98 0.99 1028
8 0.98 0.99 0.99 974
9 0.99 0.99 0.99 1009
accuracy 0.99 10000
macro avg 0.99 0.99 0.99 10000
weighted avg 0.99 0.99 0.99 10000
📊 Actividad:
🧩 Actividad:
⏱️ Tiempo estimado de desarrollo: 2 horas ✍️ Entrega: Informe ejecutivo con respuestas justificadas y discusión de las visualizaciones presentadas.
En esta tarea, el estudiante podrá seleccionar un conjunto de datos de series temporales (univariadas o multivariadas) para aplicar un modelo basado en redes LSTM (Long Short-Term Memory).
Si no dispone de un dataset, se recomienda utilizar alguno de acceso público, como:
El trabajo se desarrollará en Google Colab, asistido por Gemini AI, en modalidad:
Construir un modelo LSTM básico con al menos:
Definir un espacio de búsqueda de hiperparámetros, por ejemplo:
TimeSeriesSplit) o un conjunto de validación separado.Evaluar el modelo con métricas adecuadas:
Visualizar resultados:
Documentar brevemente:
En esta tarea, el estudiante podrá seleccionar un dataset de series temporales (univariada o multivariada) y construir un flujo en KNIME para entrenar un modelo LSTM.
Si no dispone de un dataset propio, se recomienda utilizar alguno de acceso público, por ejemplo:

Utilizar el nodo Keras Network Learner para construir una red con al menos:
Visualizar con:
Reflexionar brevemente: