"
]
},
{
"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": [
"
"
]
},
{
"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
}