Tag: deep learning

  • Aprendizaje Profundo – MNIST

    MNIST es un conjunto de datos (dataset) de números escritos a mano y en esta guía entrenaremos un clasificador y lo evaluaremos.

    Usaré Google Colab para esta guía, si no tienes configurado un entorno aún puedes hacerlo siguiendo este post!

    Cargar el conjunto de datos

    Tenemos diversas formas de cargar un conjunto de datos, estos están disponibles en datos tabulados (.csv), imágenes (.jpeg/.png), textos, etc…

    En esta guía lo importaremos haciendo uso de tensorflow. Está disponible a través de la siguiente línea de código

    from tensorflow.keras.datasets import mnist

    Ok lo importé pero falta algo ¿Cómo accedemos a los datos?

    Tenemos un método disponible:

    mnist.load_data()

    Una vez ejecutado podemos entender que es lo que hizo el método, ha descargado mnist.npz y lo devuelve en formato tupla

    Vamos a acceder a estos valores, modificaremos el código a

    (x_train, y_train), (x_test, y_test) = mnist.load_data()

    El dataset está compuesto por 2 tuplas, podemos entender esto como data de entrenamiento y data de validación.

    Veamos el primer valor de x_train y el primer valor de y_train

    ¿Qué valores tenemos ahora?

    • x_train[0]: Un ndarray de tamaño 28×28
    • y_train[0]: un uint8 de valor 5

    Perfecto! están relacionados. Es nuestra data de entrenamiento que podemos entender como imagen y etiqueta.

    Normalicemos nuestros valores

    El proceso de normalización es parte esencial cuando trabajamos con clasificadores. ¿Por qué se normalizan los datos? Las redes neuronales aprenden mejor con datos en rangos pequeños porque evita valores grandes que podrían dificultar la convergencia del modelo.

    x_train, x_test = x_train / 255.0, x_test / 255.0

    ¿Por qué dividimos por 255.0?

    Las imágenes en MNIST tienen píxeles con valores entre 0 y 255 (escala de grises).

    Dividir entre 255.0 normaliza los valores al rango [0, 1]

    Pasamos de esto:

    A esto:

    Aplanemos las capas

    Las imágenes en MNIST tienen forma (28, 28), es decir, una matriz de 28×28 píxeles. Las redes neuronales densas (Dense) esperan vectores como entrada, no matrices. Debemos transformar las imágenes en vectores. 28×28=784.

    Ejecutaremos esta línea de código

    x_train = x_train.reshape(-1, 784)
    x_test = x_test.reshape(-1, 784)

    El dataset se transforma de la siguiente manera:

    ¿Es necesario siempre aplanar los datos? No, esto lo hacemos porque usaremos una red de tipo densa, si quisiéramos usar redes neuronales convolucionales (CNN) en lugar de una red densa, no necesitaríamos aplanar las imágenes. En su lugar, mantendríamos el formato (28,28,1).

    Definamos nuestras capas

    Importaremos el modelo secuencial y las capas densas de Tensorflow

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense

    Obtendremos la estrategia (relacionado al hardware)

    strategy = tf.distribute.get_strategy()

    Y ahora podemos definir nuestra red neuronal, teniendo en cuenta nuestro optimizador, la función de perdida y métricas

    with strategy.scope():
      model = Sequential([
              Dense(512, activation='relu', input_shape=(784,)),
              Dense(256, activation='relu'),
              Dense(128, activation='relu'),
              Dense(10, activation='softmax')
          ])
      model.compile(optimizer='adam',
                      loss='sparse_categorical_crossentropy',
                      metrics=['accuracy'])

    Podemos ver el detalle de nuestra red neuronal con el comando

    model.summary()

    Entrenemos el modelo

    Acá definimos cuantas épocas utilizaremos y de cuanto será el lote de entrenamiento.

    history = model.fit(x_train, y_train, epochs=10, batch_size=128, validation_data=(x_test, y_test))

    Evaluemos el modelo

    Ahora evaluaremos el modelo con nuestro conjunto de validación

    test_loss, test_acc = model.evaluate(x_test, y_test)

    Tenemos un resultado de 97% de exactitud, felicitaciones!

  • Google Colab – Configuremos nuestro entorno

    Elegir y configurar un entorno es vital durante el ciclo de desarrollo de software. En este post analizaremos las funcionalidades que ofrece Google Colab!

    ¿Qué es Google Colab?

    Colab, también conocido como “Colaboratory”, te permite programar y ejecutar Python en tu navegador con las siguientes ventajas: 

    • No requiere configuración
    • Acceso a GPUs sin coste adicional
    • Permite compartir contenido fácilmente

    Creando nuestro primer notebook

    Es sencillo y además cada notebook se guardará en tu almacenamiento de Google Drive.

    Entorno de ejecución

    Podemos configurar nuestro notebook para que utilice diferentes configuraciones en cuanto a hardware. Incluso ejecutar el código de manera local.

    Elijamos nuestra configuración:

    • Entorno de ejecución: Tenemos la opción de usar Python, R o Julia. ¿Cuál debería usar?
    • ¿CPU o TPU? ¿Qué diferencia hay?
      • CPU: Unidad central de procesamiento, opción por defecto, adecuado para tareas ligeras. No recomendado para aprendizaje profundo
      • GPU T4: Unidad de procesamiento gráfico, recomendado para entrenamiento moderado y cuenta soporte para Tensor Cores
      • TPU v2-8: Segunda generación de TPUs, alta velocidad para entrenamientos de aprendizaje profundo, optimizado para operaciones matriciales masivas.

    Una vez elegido el acelerador por hardware podemos verificar que todo esté tal cual lo necesitamos, para este tutorial seleccioné TPU v2-8 y Python 3

    En una celda importaremos os

    import os

    Y podemos verificar con el siguiente comando

    os.environ.get('TPU_ACCELERATOR_TYPE')

    La salida debe ser la siguiente

    Instalemos librerías

    Para instalar librerías en nuestro ambiente solo es necesario ejecutar el gestor de paquetes pip.

    !pip install tensorflow

    La salida debe ser como la siguiente:

    Recuerda que también puedes ejecutar otros comandos