{ "cells": [ { "cell_type": "markdown", "id": "lasting-young", "metadata": {}, "source": [ "#
Taller de Aprendizaje Automático
\n", "##
Taller 6: Fashion MNIST
" ] }, { "cell_type": "markdown", "id": "expanded-friendly", "metadata": {}, "source": [ "En esta actividad se diseñará y entrenará una arquitectura para clasificar las imágenes del dataset *Fashion MNIST*. \n", "\n", "## Objetivos\n", "\n", " - Adquirir experiencia práctica en la implementación de redes neuronales con la biblioteca *keras*\n", " - Evaluar la influencia que tienen en el entrenamiento de una *red profunda* la inclusión de técnicas como *Batch Normalization* o *Dropout* en la arquitectura de la red.\n", " - Evaluar el impacto de la *inicialización* de los pesos en el entrenamiento de una *red profunda*.\n", " - Diseñar, entrenar y evaluar arquitecturas para clasificar imágenes. \n" ] }, { "cell_type": "markdown", "id": "stuffed-configuration", "metadata": {}, "source": [ "\n", " \n", "
\n", " Ejecutar en Google Colab\n", "
" ] }, { "cell_type": "code", "execution_count": null, "id": "exempt-invention", "metadata": { "ExecuteTime": { "end_time": "2022-05-18T08:34:33.495506Z", "start_time": "2022-05-18T08:34:30.252315Z" } }, "outputs": [], "source": [ "from comet_ml import Experiment\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import os\n", "import pandas as pd" ] }, { "cell_type": "markdown", "id": "roman-denver", "metadata": {}, "source": [ "Los paquetes faltantes se pueden instalar desde el notebook haciendo: \n", "*!pip install paquete_faltante*" ] }, { "cell_type": "markdown", "id": "marked-transmission", "metadata": {}, "source": [ "### Parte 1 - Levantar los datos" ] }, { "cell_type": "markdown", "id": "optimum-rally", "metadata": {}, "source": [ "Se trabajará con el conjunto de datos *Fashion MNIST* disponible en [*Keras*](https://keras.io/api/datasets/fashion_mnist/). Levantar los datos y separar, de los datos disponibles para entrenamiento, un subconjunto de 10000 muestras para validación. " ] }, { "cell_type": "code", "execution_count": null, "id": "theoretical-inspection", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "prime-opposition", "metadata": {}, "source": [ "### Parte 2 - Exploración de datos\n", "\n", "Como es habitual, una buena práctica es explorar los datos para familiarizarse con el problema. En este caso, además de en keras, el *dataset* está disponible en *Tensorflow Datasets*. Puede explorar éste y otros datasets disponibles en [Know your data](https://knowyourdata-tfds.withgoogle.com/). \n", "\n", "Conteste a las siguientes preguntas: \n", " - ¿Cuántas imágenes hay disponibles? ¿De qué tamaño son? \n", " - ¿Cuál es el tipo de dato? ¿Es adecuado? \n", "Muestre un ejemplo de cada clase u obsérvelos en [Know your data](https://knowyourdata-tfds.withgoogle.com/)." ] }, { "cell_type": "code", "execution_count": null, "id": "together-teacher", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "quarterly-typing", "metadata": {}, "source": [ "### Parte 3 - Un primer modelo" ] }, { "cell_type": "markdown", "id": "curious-victorian", "metadata": {}, "source": [ "Construya una red neuronal totalmente conectada de 20 capas y 100 neuronas por capa. Para ello se sugiere completar la implementación de la función `fully_connected_model`. Utilice *relu* como función de activación y *sgd* como optimizador. Indique cuántos parámetros tiene la red." ] }, { "cell_type": "code", "execution_count": null, "id": "confirmed-expert", "metadata": {}, "outputs": [], "source": [ "def fully_connected_model(input_shape, n_hiddens, n_neurons, activation='relu', \n", " optimizer='sgd', learning_rate = 1e-3):\n", " \n", " '''\n", " Entrada:\n", " input_shape: [M,N]\n", " n_hiddens: número de capas ocultas\n", " n_neurons: número de neuronas en cada capa oculta\n", " activation: función de activación de las neuronas. Por defecto 'relu'.\n", " optimizer: método de optimización. Por defecto 'sgd'.\n", " learning_rate: tasa de aprendizaje del optimizador. Por defecto 1e-3.\n", " Salida:\n", " model: modelo generado\n", " '''\n", "\n", " \n", " return model" ] }, { "cell_type": "markdown", "id": "judicial-concrete", "metadata": {}, "source": [ "### Parte 4 - Un primer entrenamiento" ] }, { "cell_type": "markdown", "id": "moved-hanging", "metadata": {}, "source": [ "Entrene el modelo generado en la parte anterior durante 10 épocas para los siguientes valores de *learning rate*: [1e-4, 5e-4, 1e-3, 5e-3, 1e-2]. Muestre los desempeños en los conjuntos de entrenamiento y validación. " ] }, { "cell_type": "markdown", "id": "popular-underwear", "metadata": {}, "source": [ "### Parte 5: - Cambio de Inicialización " ] }, { "cell_type": "markdown", "id": "banner-function", "metadata": {}, "source": [ "**5a)** Repita el experimento pero cambiando el método de inicialización de los pesos. En vez de utilizar la inicialización por defecto, utilice 'he_normal'. Comente como cambian los resultados." ] }, { "cell_type": "markdown", "id": "innocent-encounter", "metadata": {}, "source": [ "**5b) (opcional):** Probar otras formas de inicialización. Por ejemplo, ¿Qué pasa si se utiliza 'random_normal'?" ] }, { "cell_type": "markdown", "id": "relative-noise", "metadata": {}, "source": [ "### Parte 6 - Batch Normalization" ] }, { "cell_type": "markdown", "id": "portuguese-frank", "metadata": {}, "source": [ "Modifique la implementación de la función *fully_connected_model* para que admita la posibilidad de agregar capas de *batch normalization*. En caso de utilizar *batch normalization* coloque dichas capas luego de las capas densas y antes de las activaciones, tal como fue propuesto en el [paper original](https://arxiv.org/pdf/1502.03167.pdf). " ] }, { "cell_type": "markdown", "id": "precise-celebrity", "metadata": {}, "source": [ "**6a)** ¿Cuántos parámetros tiene el modelo con *batch normalization*? ¿Qué son y para que se usan los *Non-trainable-parameters*?" ] }, { "cell_type": "markdown", "id": "offshore-finger", "metadata": {}, "source": [ "**6b)** Repita el experimento de la **parte 4** pero ahora utilizando el modelo con *batch normalization*. Para este experimento vuelva a la inicialización de los pesos por defecto ('glorot_uniform')." ] }, { "cell_type": "markdown", "id": "emerging-makeup", "metadata": {}, "source": [ "### Parte 7 - Optimizador" ] }, { "cell_type": "markdown", "id": "manual-magic", "metadata": {}, "source": [ "**Parte 7a)** De ser necesario, modifique la implementación de la función `fully_connected_model()` para que permita optimizar utilizando el método *adam*. Repita el experimento de la **parte 4** pero modificando solamente el optimizador. Comente los cambios que observa." ] }, { "cell_type": "markdown", "id": "canadian-heritage", "metadata": {}, "source": [ "**Parte 7b)** ¿Cambian los resultados del entrenamiento si en la parte anterior además de cambiar el optimizador se agrega *batch normalization* ?" ] }, { "cell_type": "code", "execution_count": null, "id": "thermal-pencil", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "ahead-theorem", "metadata": {}, "source": [ "### Parte 8 - Red Neuronal Convolucional" ] }, { "cell_type": "markdown", "id": "confirmed-trust", "metadata": {}, "source": [ "**9a)** Escribir una función similar a la de la **parte 3** pero que construya una red neuronal convolucional con la siguiente arquitectura:\n", " \n", "N * [Conv2D --> Conv2D --> Pool2D] → Flatten → Dense → Dense. \n", "\n", "donde *N* representa la cantidad de bloques [Conv2D --> Conv2D --> Pool2D] a utilizar. " ] }, { "cell_type": "markdown", "id": "irish-alloy", "metadata": {}, "source": [ "**9b)** Entrenar una realización de la red. Por ejemplo, utilizar:\n", "- N=2\n", "- 64 filtros de convolución de tamaño 3 en la primera capa del bloque\n", "- 32 filtros de convolución de tamaño 3 en la segunda capa del bloque\n", "- 128 neuronas en la primera capa densa " ] }, { "cell_type": "markdown", "id": "dietary-travel", "metadata": {}, "source": [ "**9c)** ¿Cuántos parámetros tiene el modelo?" ] }, { "cell_type": "markdown", "id": "cooked-england", "metadata": {}, "source": [ "### Parte 9 - Entrenar la mejor arquitectura posible\n", "\n", "En esta parte el objetivo será entrenar el mejor clasificador posible para *Fashion MNIST*. La única restricción es que el modelo de arquitectura tendrá que ser como el de la **parte 3** o como el de la **parte 9**. En ambos casos se podrán evaluar las siguientes variaciones: \n", " - Número de capas y neuronas por capa en el modelo de la **parte3** \n", " - Número de bloques, cantidad de filtros de bloque y tamaño de los filtros en el caso del modelo de la **parte 9** \n", " - Distintas funciones de activación y métodos de inicialización de pesos \n", " - Agregado de *Batch Normalization* y/o *Dropout* \n", " - Distintos métodos de optimización y sus parámetros " ] }, { "cell_type": "markdown", "id": "catholic-guard", "metadata": {}, "source": [ "Para entrenar los modelos se recomienda la utilización de alguno de los [callbacks](https://keras.io/callbacks/) disponibles en *keras*. Por ejemplo: *early stopping* y *model checkpoint*." ] }, { "cell_type": "code", "execution_count": null, "id": "formed-angle", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }