Python Data Science Program
📓 Abrir notebook en GitHub

Clase 104 — Callbacks, TensorBoard, guardar/restaurar modelos

Parte: 2 — Deep Learning · Fuente: Géron, cap. 10 § Using Callbacks y § Using TensorBoard for Visualization. ⏱️ Duración estimada: 60 min.

🎯 Objetivo

Inyectar lógica al loop de entrenamiento sin modificarlo, mediante callbacks (EarlyStopping, ModelCheckpoint, ReduceLROnPlateau, custom). Visualizar el progreso del training en TensorBoard (loss, métricas, histogramas de pesos, embeddings). Saber guardar y restaurar correctamente — arquitectura + pesos + estado del optimizador.

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. EarlyStopping + Checkpoint: entrenar Fashion-MNIST con ambos callbacks. Verificar que cortó cuando val_loss se estancó y que 'best.keras' contiene los mejores pesos.
  2. TensorBoard: agregar TensorBoard(log_dir=f'./logs/run-{time}'), entrenar 10 épocas. Lanzar tensorboard --logdir=./logs y revisar scalars + histograms.
  3. ReduceLROnPlateau: configurar factor=0.5, patience=3, min_lr=1e-6. Graficar el LR a lo largo de las épocas (usar el logs del callback).
  4. Custom callback: escribir uno que loggee a un CSV el (epoch, loss, val_loss, lr_actual) para análisis offline.
  5. Restaurar y continuar: entrenar 10 épocas, guardar, recargar y continuar 5 épocas más. Verificar que el optimizer state (momentum de Adam) se preservó.

📝 Homework verificable

Entrenamiento "production-ready" sobre Fashion-MNIST:

  1. MLP [300, 100].
  2. Callbacks: EarlyStopping(patience=10), ModelCheckpoint('best.keras', save_best_only=True), ReduceLROnPlateau(patience=3), TensorBoard('./logs/').
  3. Entrenar epochs=100 (sabiendo que EarlyStopping cortará antes).
  4. Recargar best.keras y evaluar en test.
  5. Capturar un screenshot del TensorBoard mostrando loss y val_loss a lo largo del training.

Criterio de aceptación: el modelo final restaurado debe ser el del epoch con menor val_loss; accuracy en test ≥ 0.87.

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
EarlyStopping corta en la primera época con patience=0 Default es patience=0. Fix: patience=5-10 razonable.
ModelCheckpoint guarda en cada época con save_best_only=False Llena el disco. Fix: save_best_only=True.
model.save_weights('w.h5') y al cargar dice "model not built" Hay que reconstruir la arquitectura antes de cargar pesos. Fix: guardar el modelo completo con .keras, o reconstruir + load_weights.
TensorBoard no muestra nada en localhost:6006 El log_dir está mal o aún no se escribió nada. Fix: verificar que logs/... tiene archivos events.out.tfevents.*.
ReduceLROnPlateau y LearningRateScheduler juntos Conflicto, ambos cambian el LR. Fix: elegí uno (RLOP para reactivo, scheduler para proactivo).

❓ Preguntas frecuentes

❓ ¿save_best_only=True con qué métrica?

monitor='val_loss' por default (modo min). Si monitoreás accuracy, agregá mode='max'.

❓ ¿Puedo usar varios ModelCheckpoint?

Sí. Útil para guardar el mejor por val_loss y el mejor por val_accuracy en dos archivos.

❓ ¿TensorBoard funciona en Colab?

Sí: %load_ext tensorboard + %tensorboard --logdir=./logs. Funciona inline.

❓ ¿Custom callback necesita herencia explícita?

Sí: class MyCB(keras.callbacks.Callback). La base provee self.model y manejo de logs.

❓ ¿Format .keras vs .h5?

.keras (Keras 3+) es zip transparente, futuro-proof. .h5 aún funciona pero deprecado para nuevos proyectos.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 105 — Keras Tuner (+ Optuna, Ray Tune)