# deep-learning-en-python-y-tensorflow
Deep Learning en Python y Tensorflow
Volver a la portada del cursoProyecto Final: Clasificación de Imágenes
Sección 6 · Proyecto Final
Proyecto final: clasificador de prendas de PyShop
Vas a construir, evaluar y entregar una red que etiqueta sola las fotos de ropa del catálogo de PyShop. Se usan Python 3.10 a 3.13, TensorFlow 2.21 con Keras 3, NumPy y Matplotlib. El notebook proyecto-clasificador-de-prendas tiene una solución de referencia: consúltalo al terminar.
Contexto
Los vendedores de PyShop suben miles de fotos de prendas y hoy alguien las etiqueta a mano. El equipo quiere un modelo que ponga la etiqueta sola y diga cuándo duda, más un informe de qué tan bien funciona y dónde falla.
Datos
Se usa Fashion-MNIST (Zalando Research, 2017): 70,000 fotos de 28×28 en escala de grises de 10 tipos de prenda, 60,000 para entrenar y 10,000 de prueba. Keras la descarga la primera vez (unos 30 MB). Copia este código en la primera celda:
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
import keras
import numpy as np
import tensorflow as tf
CLASES = ["camiseta", "pantalon", "sueter",
"vestido", "abrigo", "sandalia", "camisa",
"tenis", "bolsa", "botin"]
def cargar_moda(normalizar=True):
moda = keras.datasets.fashion_mnist
(x_tr, y_tr), (x_te, y_te) = moda.load_data()
if normalizar:
x_tr = x_tr.astype("float32") / 255.0
x_te = x_te.astype("float32") / 255.0
return (x_tr, y_tr), (x_te, y_te)
def semillas(semilla=42):
keras.utils.set_random_seed(semilla)
tf.config.experimental.enable_op_determinism()
(x_tr, y_tr), (x_te, y_te) = cargar_moda()
print(x_tr.shape, x_te.shape)
# (60000, 28, 28) (10000, 28, 28)
Llama a semillas(42) justo antes de crear cada modelo para que cada corrida dé los mismos números. Salvo que se indique otra cosa, compila con optimizer="adam", loss="sparse_categorical_crossentropy" y metrics=["accuracy"], y entrena con batch_size=64 y validation_split=0.1.
Tareas
- Explorar. Con
normalizar=False, reporta formas, tipo, rango y media de los píxeles y fotos por clase. Dibuja una cuadrícula con un ejemplo de cada prenda. - Preparar. Normaliza a $[0, 1]$ y comprueba que la media pase de 72.94 a 0.286. Crea las versiones con canal para la CNN:
x_tr[..., None]. - Modelo base. Entrena
Flatten → Dense(10, softmax)durante 5 épocas. Reporta parámetros y accuracy en prueba. - MLP. Entrena
Flatten → Dense(128, relu) → Dense(10, softmax)durante 10 épocas. Explica de dónde salen sus 101,770 parámetros. - CNN. Entrena la red
Conv2D(32, 3) → MaxPooling2D → Conv2D(64, 3) → MaxPooling2D → Flatten → Dropout(0.3) → Dense(10), con ReLU en las convoluciones y softmax en la salida, durante 10 épocas y conEarlyStopping(patience=3, restore_best_weights=True). Incluye susummary(). - Curvas. Grafica pérdida y accuracy de entrenamiento y validación por época para el MLP y la CNN. Di si hay sobreajuste y en qué te basas.
- Evaluar. Calcula la matriz de confusión de la CNN con
tf.math.confusion_matrix, dibújala como mapa de calor y reporta el acierto por clase del MLP y de la CNN en una tabla. - Analizar errores. Encuentra la confusión más frecuente, muestra al menos 8 fotos mal clasificadas con su etiqueta real y la predicha, y explica por qué crees que el modelo falla en ellas.
- Guardar y cargar. Guarda la CNN con
model.save("moda_cnn.keras"), cárgala conkeras.models.load_modely comprueba que da la misma accuracy. - Predecir. Con el modelo cargado, predice 5 fotos del conjunto de prueba como si fueran fotos nuevas y muestra para cada una la imagen y sus 3 prendas más probables con su probabilidad.
Pistas de implementación
pred = cnn.predict(xc_te, verbose=0).argmax(1)
cm = tf.math.confusion_matrix(y_te, pred).numpy()
acierto = cm.diagonal() / cm.sum(axis=1)
fuera = cm.copy()
np.fill_diagonal(fuera, 0)
i, j = np.unravel_index(fuera.argmax(), fuera.shape)
print(CLASES[i], "->", CLASES[j], fuera[i, j])
p = cargado.predict(xc_te[:1], verbose=0)[0]
top3 = p.argsort()[::-1][:3]
print([(CLASES[k], round(float(p[k]), 3))
for k in top3])
Para comprobar: base 7,850 parámetros y 0.8366; MLP 0.8746; CNN 34,826 parámetros y 0.902; camisa → camiseta, 174 fotos; errores: MLP 1254, CNN 980; archivo de unos 442 KB; la primera foto de prueba es un botín y la CNN le da 0.998. La CNN tarda bastante más en entrenar que el MLP.
Extras opcionales
- Aumento de datos. Agrega
RandomFlip("horizontal")yRandomTranslation(0.1, 0.1)al inicio de la CNN y entrena más épocas. Reporta si cambia el acierto en camisa. - BatchNormalization. Inserta
BatchNormalizationdespués de cadaConv2Dy compara curvas y accuracy. - Tercera capa convolucional. Agrega otra
Conv2Dy revisa las formas consummary(). - Regla de revisión. Elige un umbral de probabilidad máxima y reporta qué fracción de fotos se etiquetaría sola y con qué accuracy, y cuántas irían a revisión humana.
Entregables
proyecto.ipynb, ejecutado de principio a fin sin errores, con las gráficas a la vista ysemillas(42)antes de cada modelo.moda_cnn.keras, el modelo final guardado.INFORME.md(una página): tabla comparativa de los tres modelos (parámetros, accuracy, errores), curvas, la confusión principal con su explicación, las predicciones de las 5 fotos, una recomendación para PyShop sobre cuándo confiar en la etiqueta automática y dos limitaciones del modelo.
Rúbrica (100 puntos, más 10 de extras)
- Exploración y preparación (10 puntos): formas, rango, balance de clases, cuadrícula y normalización comprobada.
- Modelos base y MLP (15 puntos): entrenados con semilla, parámetros explicados y accuracy reportada.
- CNN (20 puntos): arquitectura correcta, canal añadido, EarlyStopping con
restore_best_weightsy resultado cercano a 0.90. - Curvas y sobreajuste (10 puntos): gráficas legibles y diagnóstico justificado con la validación.
- Evaluación y análisis de errores (20 puntos): matriz de confusión, acierto por clase, confusión principal y ejemplos con una explicación razonada.
- Guardar, cargar y predecir (10 puntos): misma accuracy tras cargar y top-3 de 5 fotos.
- Informe (15 puntos): tabla comparativa, recomendación con cifras y limitaciones honestas.
- Extras (hasta 10 puntos): aumento de datos, BatchNormalization, tercera capa o regla de revisión, bien medidos e interpretados.