# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# + [markdown] colab_type="text" id="view-in-github"
# <a href="https://colab.research.google.com/github/bereml/iap/blob/master/libretas/1f_fashion_fcn.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a>
# -

# # Clasificación de Fashion-MNIST con una red densa
#
# Curso: [Introducción al Aprendizaje Profundo](http://turing.iimas.unam.mx/~ricardoml/course/iap/). Profesores: [Bere](https://turing.iimas.unam.mx/~bereml/) y [Ricardo](https://turing.iimas.unam.mx/~ricardoml/) <NAME>.
#
# ---
# ---
#
# En esta libreta debes entrenar dos clasificadores para el conjunto Fashion-MNIST.
#
# 1. El primero usando la misma arquitectura e hiperparámetros que en el ejemplo de MNIST.
# 2. En un segundo clasificador modifica la arquitectura intentando obtener un mejor desempeño.
#
# Para resolver este ejercicio emplea la clase [`FashionMNIST`](https://pytorch.org/vision/0.8/datasets.html#fashion-mnist) proporcionada por PyTorch.
#
# [Fashion-MNIST](https://github.com/zalandoresearch/fashion-mnist) es un conjunto para remplzar MNIST. Fue recolectado con la intención de proveer un conjunto un poco más dificil que MNIST.
#
# <img src="https://miro.medium.com/max/800/1*RNBs0OsymwAzDyYMk3_0Aw.jpeg" width="600"/>
# Conjunto Fashion-MNIST. Imagen tomada de https://medium.com/@sankarchanna2k18/fashion-mnist-data-image-classification-in-tensorflow-bd22f9e680bc.

# ## 1 Preparación

# biblioteca para inspeccionar arquitecturas
# https://github.com/tyleryep/torchinfo
# !pip install torchinfo

# ### 1.1 Bibliotecas

# + colab={} colab_type="code" id="Ny0L2LzogTN-"
# funciones aleatorias
import random
# tomar n elementos de una secuencia
from itertools import islice as take

# gráficas
import matplotlib.pyplot as plt
# arreglos multidimensionales
import numpy as np
# redes neuronales
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision.transforms as T
# procesamiento de imágenes
from skimage import io
# redes neuronales
from torch.utils.data import DataLoader
from torchvision.datasets import FashionMNIST
# inspección de arquitectura
from torchinfo import summary
# barras de progreso
from tqdm import trange
# -

# ### 1.2 Auxiliares

# +
# directorio de datos
DATA_DIR = '../data'

# tamaño del lote
BATCH_SIZE = 32
# filas y columnas de la regilla de imágenes
ROWS, COLS = 4, 8

# Fashion-MNIST classes
CLASSES = {
    0: "T-shirt/top", 
    1: "Trouser",
    2: "Pullover",
    3: "Dress",
    4: "Coat", 
    5: "Sandal",
    6: "Shirt", 
    7: "Sneaker",
    8: "Bag", 
    9: "Ankle boot",
}


def display_grid(xs, titles, rows, cols, figsize=(12, 6)):
    """Displays examples in a grid."""
    fig, ax = plt.subplots(rows, cols, figsize=figsize)
    i = 0
    for r in range(rows):
        for c in range(cols):
            ax[r, c].imshow(xs[i], cmap='gray')
            ax[r, c].set_title(titles[i])
            ax[r, c].set_xticklabels([])
            ax[r, c].set_yticklabels([])
            i += 1
    fig.tight_layout()
    plt.show()


def display_batch(x, titles, rows, cols, figsize=(12, 6)):
    """Displays a batch of processed examples in a grid."""
    # denormalizamos [0, 1] => [0, 255]
    x *= 255
    # rotamos canales (C x H x W) => (H x W x C)
    x = x.permute(0, 2, 3, 1)
    # convertimos a entero
    x = (x.numpy()).astype(np.uint8)
    # aplanamos canal
    x = x.reshape(*x.shape[:3])
    # desplegamos
    display_grid(x, titles, rows, cols, figsize)

    
def set_seed(seed=0):
    """Initializes pseudo-random number generators."""
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)

    
# reproducibilidad
set_seed()

# + [markdown] colab_type="text" id="MjKxreAkoZeT"
# ## 2 Datos
# -

# ### 2.1 Tuberias de datos con PyTorch
#
# <img src="https://raw.githubusercontent.com/bereml/iap/master/fig/mnist_pipeline.png"/>
# &nbsp;
# Tuberia de datos para MNIST.

# ### 2.2 Exploración





# + [markdown] colab_type="text" id="9p_BsiITogUA"
# ### 2.3 Cargadores de datos
#
# <img src="https://raw.githubusercontent.com/bereml/iap/master/fig/eval_trn_tst.svg" width="450"/>
# &nbsp;
# Entrenamiento con una partición de entrenamiento y prueba.
# -

# #### Entrenamiento

# + colab={"base_uri": "https://localhost:8080/", "height": 54} colab_type="code" id="E1aEVpYtuadH" outputId="8df25761-3201-461a-e82b-26b5befd0302"

# -

# #### Prueba

# + colab={"base_uri": "https://localhost:8080/", "height": 54} colab_type="code" id="QXMXXc9DPgqY" outputId="100e6a58-5552-4c5f-b08e-dc83c23c3b21"

# -

# ## 3 Modelo
#
# <img src="https://raw.githubusercontent.com/bereml/iap/master/fig/fcn_arch.png"/>
# &nbsp;
# Arquitectura de la red completamente conectada.

# ### 3.1 Definición de la arquitectura



# ### 3.2 Instancia de la arquitectura





# ### 3.3 Inspección de la arquitectura



# ## 4 Entrenamiento
#
# <img src="https://raw.githubusercontent.com/bereml/iap/master/fig/supervisado.svg" width="700"/>
# &nbsp;
# Ciclo de entrenamiento supervisado.

# ### 4.1 Ciclo de entrenamiento

# + colab={"base_uri": "https://localhost:8080/", "height": 568} colab_type="code" id="xCqwGRD1nz1a" outputId="7dc4823c-865a-41ee-b54b-67117e5d4e95"

# -

# Entrenamos un modelo:



# ### 4.2 Gráficas de pérdidas y exactitud





# ## 5 Evaluación
#
# <img src="https://raw.githubusercontent.com/bereml/iap/master/fig/eval_trn_tst.svg" width="450"/>
# &nbsp;
# Entrenamiento con una partición de entrenamiento y prueba.

# ### 5.1 Evaluación final



# ### 5.2 Inferencia



StarcoderdataJupyterScriptsDedupFiltered