{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cd8bae89",
   "metadata": {},
   "source": [
    "# Red Neuronal Convolucional - Experimentación y Análisis\n",
    "\n",
    "**Proyecto Profesional de Ingeniería de Datos**\n",
    "\n",
    "Este notebook demuestra cómo usar el proyecto modular para entrenar y evaluar modelos CNN."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09a32e9a",
   "metadata": {},
   "source": [
    "## 1. Setup Inicial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d033b77",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "from pathlib import Path\n",
    "\n",
    "# Agregar raíz del proyecto al path\n",
    "project_root = Path.cwd()\n",
    "sys.path.insert(0, str(project_root))\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf\n",
    "\n",
    "print(f\"TensorFlow versión: {tf.__version__}\")\n",
    "print(f\"Proyecto raíz: {project_root}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d85f710b",
   "metadata": {},
   "source": [
    "## 2. Importar Módulos del Proyecto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ed4b0528",
   "metadata": {},
   "outputs": [],
   "source": [
    "from src.config import mnist_config, cats_dogs_config\n",
    "from src.data import MNISTDataLoader, CatsVsDogsDataLoader\n",
    "from src.models import build_mnist_model, build_cats_dogs_model, ModelTrainer\n",
    "from src.utils import setup_logging, Visualizer, MetricsCalculator\n",
    "\n",
    "# Configurar logging\n",
    "logger = setup_logging(mnist_config)\n",
    "logger.info(\"Módulos del proyecto importados exitosamente\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6db22b80",
   "metadata": {},
   "source": [
    "## 3. Exploración de MNIST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "89dc9008",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Cargar datos MNIST\n",
    "logger.info(\"Cargando dataset MNIST...\")\n",
    "data_loader = MNISTDataLoader(batch_size=32)\n",
    "train_data, test_data, metadata = data_loader.load()\n",
    "\n",
    "logger.info(f\"Classes: {metadata.features['label'].names}\")\n",
    "logger.info(f\"Dataset cargado exitosamente\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03502d94",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Visualizar algunas muestras de MNIST\n",
    "plt.figure(figsize=(12, 4))\n",
    "\n",
    "for i, (imagenes, etiquetas) in enumerate(train_data.take(1)):\n",
    "    for j in range(min(10, len(imagenes))):\n",
    "        plt.subplot(1, 10, j + 1)\n",
    "        plt.imshow(imagenes[j].numpy().squeeze(), cmap='gray')\n",
    "        plt.title(str(etiquetas[j].numpy().item()))\n",
    "        plt.axis('off')\n",
    "\n",
    "plt.suptitle('Muestras MNIST')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a60c9ae",
   "metadata": {},
   "source": [
    "## 4. Construcción y Visualización de Modelo MNIST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f777eae3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Construir modelo\n",
    "logger.info(\"Construyendo modelo MNIST...\")\n",
    "model_mnist = build_mnist_model(mnist_config)\n",
    "\n",
    "# Mostrar arquitectura\n",
    "logger.info(\"Arquitectura del modelo:\")\n",
    "model_mnist.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "225b746b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Contar parámetros\n",
    "total_params = model_mnist.count_params()\n",
    "trainable_params = sum([tf.size(w).numpy() for w in model_mnist.trainable_weights])\n",
    "\n",
    "print(f\"\\nTotal de parámetros: {total_params:,}\")\n",
    "print(f\"Parámetros entrenables: {trainable_params:,}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0e59032",
   "metadata": {},
   "source": [
    "## 5. Comparación de Configuraciones"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "79b46006",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Mostrar configuraciones\n",
    "import json\n",
    "\n",
    "print(\"\\n=== CONFIGURACIÓN MNIST ===\")\n",
    "print(f\"Image shape: {mnist_config.image_shape}\")\n",
    "print(f\"Batch size: {mnist_config.batch_size}\")\n",
    "print(f\"Epochs: {mnist_config.epochs}\")\n",
    "print(f\"Learning rate: {mnist_config.learning_rate}\")\n",
    "print(f\"Dropout: {mnist_config.dropout_rate}\")\n",
    "\n",
    "print(\"\\n=== CONFIGURACIÓN CATS VS DOGS ===\")\n",
    "print(f\"Image shape: {cats_dogs_config.image_shape}\")\n",
    "print(f\"Batch size: {cats_dogs_config.batch_size}\")\n",
    "print(f\"Epochs: {cats_dogs_config.epochs}\")\n",
    "print(f\"Learning rate: {cats_dogs_config.learning_rate}\")\n",
    "print(f\"Dropout: {cats_dogs_config.dropout_rate}\")\n",
    "print(f\"Early stopping patience: {cats_dogs_config.early_stopping_patience}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "531aeae2",
   "metadata": {},
   "source": [
    "## 6. Testing de Arquitectura"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0f79ec1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Test predicción con entrada dummy\n",
    "dummy_input = np.random.randn(1, 28, 28, 1).astype(np.float32)\n",
    "output = model_mnist(dummy_input)\n",
    "\n",
    "print(f\"Input shape: {dummy_input.shape}\")\n",
    "print(f\"Output shape: {output.shape}\")\n",
    "print(f\"Output probabilities: {output[0].numpy()}\")\n",
    "print(f\"Predicción: {np.argmax(output[0])}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebfde625",
   "metadata": {},
   "source": [
    "## 7. Análisis de Rutas y Configuración"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c1e9ee0d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from src.config import Config\n",
    "\n",
    "# Mostrar rutas configuradas\n",
    "print(\"=== RUTAS DEL PROYECTO ===\")\n",
    "print(f\"Project root: {mnist_config.project_root}\")\n",
    "print(f\"Data dir: {mnist_config.data_dir}\")\n",
    "print(f\"Models dir: {mnist_config.models_dir}\")\n",
    "print(f\"Logs dir: {mnist_config.logs_dir}\")\n",
    "\n",
    "# Verificar existencia\n",
    "print(\"\\n=== DIRECTORIOS EXISTENTES ===\")\n",
    "print(f\"Data dir existe: {mnist_config.data_dir.exists()}\")\n",
    "print(f\"Models dir existe: {mnist_config.models_dir.exists()}\")\n",
    "print(f\"Logs dir existe: {mnist_config.logs_dir.exists()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "988be903",
   "metadata": {},
   "source": [
    "## 8. Recursos Disponibles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "90c79c12",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Información del sistema\n",
    "print(\"=== INFORMACIÓN DEL SISTEMA ===\")\n",
    "print(f\"GPUs disponibles: {len(tf.config.list_physical_devices('GPU'))}\")\n",
    "print(f\"CPUs disponibles: {len(tf.config.list_physical_devices('CPU'))}\")\n",
    "\n",
    "# Si hay GPU\n",
    "gpus = tf.config.list_physical_devices('GPU')\n",
    "if gpus:\n",
    "    print(f\"\\nDetalles GPU:\")\n",
    "    for gpu in gpus:\n",
    "        print(f\"  - {gpu.name}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8979efd",
   "metadata": {},
   "source": [
    "## 9. Próximos Pasos\n",
    "\n",
    "Para entrenar los modelos, ejecutar desde terminal:\n",
    "\n",
    "```bash\n",
    "# Entrenar MNIST\n",
    "python -m scripts.train_mnist\n",
    "\n",
    "# Entrenar Cats vs Dogs\n",
    "python -m scripts.train_cats_dogs\n",
    "\n",
    "# Realizar predicciones\n",
    "python -m scripts.predict --model mnist --image ruta/imagen.png\n",
    "```\n",
    "\n",
    "O usar el Makefile:\n",
    "\n",
    "```bash\n",
    "make train-all      # Entrena ambos modelos\n",
    "make help          # Ver todos los comandos\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
