{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "4eD4BHragtH3" }, "source": [ "Frameworks para Deep Learning\n", "=============================" ] }, { "cell_type": "markdown", "metadata": { "id": "kYqQz_bFgtH9" }, "source": [ "Introducción\n", "------------" ] }, { "cell_type": "markdown", "metadata": { "id": "F9mmrGtBgtH9" }, "source": [ "`PyTorch` y `TensorFlow` son probablemente los framewors de deep learning más populares. Tanto `PyTorch` como `Tensorflow` son muy populares tanto en marcos de academia como de industria. De hecho, los científicos de datos las consideran a menudo las bibliotecas de referencia cuando se trata del desarrollo de aplicaciones innovadoras de aprendizaje profundo o incluso la investigación." ] }, { "cell_type": "markdown", "metadata": { "id": "Hcq5zeulgtH-" }, "source": [ "### DAGs\n", "\n", "Algo importante para tener en cuenta es que estos frameworks utilizan **grafos** para describir cálculos. Usualmente una red se ve como un DAG (Grafo Acíclico Dirigido) el cual se opera con tensores. Un grafo es una estructura de datos que consta de nodos y arcos. Durante el proceso de entrenamiento de las redes neuronales profundas, los grafos de cálculo almacenan las activaciones de la red neuronal durante una pasada \"hacia adelante\". Luego, una pasada hacia atrás (backpropagation) utiliza los grafos de cálculo para calcular las actualizaciones de cada uno de los pesos de la red, entrenando así la red.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "id": "we8AIFEagtH-" }, "source": [ "TensorFlow\n", "----------" ] }, { "cell_type": "markdown", "metadata": { "id": "NN2QOU99gtH_" }, "source": [ "`TensorFlow` es una biblioteca de aprendizaje automático de código abierto creada por el equipo de Google Brain. Su lanzamiento inicial fue en 2015 y está escrito en `Python`, `C++` y `CUDA`.\n", "\n", "De manera similar a `PyTorch`, `TensorFlow` también tiene un gran enfoque en las redes neuronales y deep learning y permite al usuario crear y combinar diferentes tipos de modelos de aprendizaje profundo y generar gráficos del rendimiento del modelo durante el entrenamiento. Aunque es una biblioteca de `Python`, en 2017 `TensorFlow` introdujo además una interfaz en `R` para `RStudio`." ] }, { "cell_type": "markdown", "source": [ "### APIs\n", "\n", "`TensorFlow` posee diferentes APIs (interfaces de programación) y diferentes modos de ejecución. Esta fuera del alcance ver las diferencias entre estos métodos." ], "metadata": { "id": "siWfRQxzg_9T" } }, { "cell_type": "markdown", "metadata": { "id": "KSEMVsYxgtH_" }, "source": [ "#### API secuencial\n", "\n", "Un modelo secuencial es apropiado para crear una red profunda simple de capas donde cada capa tiene exactamente un tensor de entrada y un tensor de salida.\n", "\n", "Por ejemplo:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "DnJDpBmBgtIA" }, "outputs": [], "source": [ "import tensorflow as tf\n", "import tensorflow.keras as keras\n", "import tensorflow.keras.layers as layers\n", "\n", "model = keras.Sequential(\n", " [\n", " layers.Dense(2, activation=\"relu\", name=\"layer1\"),\n", " layers.Dense(3, activation=\"relu\", name=\"layer2\"),\n", " layers.Dense(4, name=\"layer3\"),\n", " ]\n", ")\n", "\n", "x = tf.ones((3, 3))\n", "y = model(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "s2k14-0egtIC", "outputId": "2be5d000-3942-4527-c426-e0ebe0ac4ead" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential_1\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "layer1 (Dense) multiple 8 \n", "_________________________________________________________________\n", "layer2 (Dense) multiple 9 \n", "_________________________________________________________________\n", "layer3 (Dense) multiple 16 \n", "=================================================================\n", "Total params: 33\n", "Trainable params: 33\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "markdown", "metadata": { "id": "7J0_oE3xgtID" }, "source": [ "Noten que no hemos indicado como luce la entrada de nuestra red en el modelo secuencias en ninguna de las capas. Esto se debe a que el modelo secuencial interpreta que la salida de una capa es la entrada de la siguiente, por lo tanto las dimensiones deben de coincidir forzadamente. \n", "\n", "Sin embargo, tampoco indicamos las dimensiones de los vectores de entrada. `TensorFlow` interpreta la entrada de forma dinámica y es por eso que cuando llamamos a `model(x)` con un tensor de dimensiones `(3,3)` en este momento `TensorFlow` sabe que la entrada es un tensor de dimensiones `(3)`.\n", "\n", "Podemos de todas formas explicitar esto:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_mxn_nd3gtID" }, "outputs": [], "source": [ "model = keras.Sequential(\n", " [\n", " layers.Input((3,)),\n", " layers.Dense(2, activation=\"relu\", name=\"layer1\"),\n", " layers.Dense(3, activation=\"relu\", name=\"layer2\"),\n", " layers.Dense(4, name=\"layer3\"),\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "RlwZl_K_gtIE", "outputId": "24252177-9916-41c6-895f-3bd7a3f91582" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential_2\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "layer1 (Dense) (None, 2) 8 \n", "_________________________________________________________________\n", "layer2 (Dense) (None, 3) 9 \n", "_________________________________________________________________\n", "layer3 (Dense) (None, 4) 16 \n", "=================================================================\n", "Total params: 33\n", "Trainable params: 33\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "MIe_NSgegtIE", "outputId": "b5df55c4-f581-4f2a-c70c-6ceda5751afc" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keras.utils.plot_model(model, show_shapes=True)" ] }, { "cell_type": "markdown", "metadata": { "id": "SBJhZGY8gtIF" }, "source": [ "Noten que las dimensiones de entrada que indicamos fueron `(3,)` en lugar de `(3,3)`. **¿Puede identificar porque?**" ] }, { "cell_type": "markdown", "metadata": { "id": "xRym9NU9gtIF" }, "source": [ "Un modelo secuencial no es apropiado cuando:\n", "\n", "- El modelo tiene múltiples entradas o múltiples salidas\n", "- Cualquiera de las capas tiene múltiples entradas o múltiples salidas\n", "- Necesitamos compartir capas\n", "- Necesitamos una topología no lineal (por ejemplo, una conexión residual, un modelo de varias ramas)\n", "\n", "Para mas información recomendamos la lectura de: https://keras.io/guides/sequential_model/" ] }, { "cell_type": "markdown", "metadata": { "id": "Et-Zaa2mgtIF" }, "source": [ "#### API funcional" ] }, { "cell_type": "markdown", "source": [ "
PRECAUCIÓN 😱: El tema presentado en esta sección está clasificado como avanzado. El entendimiento de este contenido es totalmente opcional.
" ], "metadata": { "id": "uk-f_JoDgyWq" } }, { "cell_type": "markdown", "metadata": { "id": "uM0p1OU1gtIG" }, "source": [ "La API funcional de `Keras` es una forma de crear modelos que son más flexibles que la API `tf.keras.Sequential`. La API funcional puede manejar modelos con topología no lineal, capas compartidas e incluso múltiples entradas o salidas.\n", "\n", "La idea principal es que un modelo de aprendizaje profundo suele ser un grafo acíclico dirigido (DAG) de capas. Entonces, la API funcional es una forma de crear grafos de capas. \n", "\n", "El siguiente código genera un modelo identico al anterior:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "d2VgYB0lgtIG" }, "outputs": [], "source": [ "inputs = keras.Input(shape=(3,))\n", "layer1_output = layers.Dense(2, activation=\"relu\", name=\"layer1\")(inputs)\n", "layer2_output = layers.Dense(3, activation=\"relu\", name=\"layer2\")(layer1_output)\n", "outputs = layers.Dense(4, name=\"layer3\")(layer2_output)\n", "\n", "model = keras.Model(inputs=inputs, outputs=outputs, name=\"functional_api\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hdUnehsFgtIG", "outputId": "3e66e5a2-d722-485c-acca-a31645e35e3c" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keras.utils.plot_model(model, show_shapes=True)" ] }, { "cell_type": "markdown", "metadata": { "id": "JIGZkXgHgtIG" }, "source": [ "Lo interesante de esta API es que no solo nos permite conectar cualquier entrada con cualquier salida, sino que ademas poder inspeccionar los tensor intermediarios:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "VuhKW3b1gtIH", "outputId": "2bed0743-b760-4c68-a6e1-51ef9681a9f3" }, "outputs": [ { "data": { "text/plain": [ "TensorShape([None, 3])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "layer2_output.shape" ] }, { "cell_type": "markdown", "metadata": { "id": "QeNYUybsgtIH" }, "source": [ "PyTorch\n", "-------" ] }, { "cell_type": "markdown", "metadata": { "id": "ArcYMsvNgtIH" }, "source": [ "`PyTorch` es una biblioteca de aprendizaje automático desarrollada por Facebook AI Research Lab. Se introdujo por primera vez en 2016 y se distribuye con la licencia BSD como software gratuito de código abierto.\n", "\n", "`PyTorch` tiene está disponible para `Python` y sus funcionalidades están construidas como clases de `Python`, por lo que forman parte del ecosistema de paquetes. Al ser una biblioteca basada en `Python`, es más fácil ampliar sus funcionalidades con otras bibliotecas de Python, como `SciPy` y `NumPy`. Sin embargo, los usuarios de `PyTorch` también pueden programar en `C/C++` ya que la biblioteca comparte algo de backend de `C++` con Torch, que es el núcleo del procesamiento de deep learning." ] }, { "cell_type": "markdown", "metadata": { "id": "WgGO4lDkgtIH" }, "source": [ "> En este curso no trabajaremos con `PyTorch` especificamente pero el lector puede revisar la guia https://pytorch.org/tutorials/beginner/pytorch_with_examples.html para familiarizarse con este framework" ] }, { "cell_type": "markdown", "metadata": { "id": "yVAcb7JrgtII" }, "source": [ "Eligiendo un framework\n", "----------------------" ] }, { "cell_type": "markdown", "metadata": { "id": "u61N1DTAgtII" }, "source": [ "Tanto `PyTorch` como `TensorFlow` son herramientas increíbles; de lo contrario, no serían tan populares. De hecho, han realizado tantas mejoras a lo largo de los años que elegir entre ambos nunca ha sido más desafiante. Esto quiere decir que cualquier elección que hagamos en general estará bien.\n", "\n", "\n", "\n", "Un enfoque útil y muy simple para elegir entre ambas herramientas es que si el usuario está acostumbrado a usar `Python` como lenguaje de programación, entonces `PyTorch` es una buena opción ya que es muy amigable con este lenguaje. `PyTorch` ha ganado mucha popularidad entre los desarrolladores orientados a la investigación, apoyando el entrenamiento dinámico (es decir que los computos se realizan a medida que se define el grafo). Esta ultima caracteristica le da versatilidad a la hora de corregir errores de codigo (funcionalidad que `TensorFlow` agerga a partir de la version 2.2).\n", "\n", "`TensorFlow` ofrece varias opciones para el desarrollo de modelos de alto nivel y, por lo general, se considera una biblioteca más madura que `PyTorch`. Además, este marco ofrece soporte para plataformas móviles. Una de las ventajas más amplias es la alta integración (ya que ahora es parte de este framework) de `Keras` el cual nos permite definir una red neuronal de una forma más amigable y a alto nivel." ] } ], "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.8.2" }, "colab": { "provenance": [] } }, "nbformat": 4, "nbformat_minor": 0 }