Last active
January 14, 2022 18:11
-
-
Save RodolfoFerro/a4ba7dfd40e0fe7aec89e2c8f9ab234f to your computer and use it in GitHub Desktop.
Introducción a las redes neuronales convolucionales con TensorFlow y Keras
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "name": "Introducción a las redes neuronales convolucionales con TensorFlow y Keras", | |
| "provenance": [], | |
| "collapsed_sections": [], | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| }, | |
| "accelerator": "GPU" | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/RodolfoFerro/a4ba7dfd40e0fe7aec89e2c8f9ab234f/redes-neuronales-profundas.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "R6jO_1gISKxk" | |
| }, | |
| "source": [ | |
| "# Introducción a las redes neuronales convolucionales con TensorFlow y Keras\n", | |
| "\n", | |
| "> **Rodolfo Ferro** <br>\n", | |
| "> Google Dev Expert en ML, 2022.\n", | |
| "\n", | |
| "## Contenidos\n", | |
| "\n", | |
| "#### **Sección III**\n", | |
| "\n", | |
| "1. **Bases:** Aprendizaje de neuronas\n", | |
| "2. **Código:** Entrenamiento de una neurona\n", | |
| "3. **Bases:** Conceptos importantes\n", | |
| "4. **Bases:** Imágenes\n", | |
| "\n", | |
| "#### **Sección IV**\n", | |
| "\n", | |
| "4. **Bases:** El dataset de modas\n", | |
| "5. **Código:** Preparación de datos\n", | |
| "6. **Código:** Creación del modelo multicapa (MLP)\n", | |
| "7. **Código:** Entrenamiento del modelo\n", | |
| "8. **Código:** Evaluación y predicción\n", | |
| "\n", | |
| "#### **Sección V**\n", | |
| "\n", | |
| "9. **Bases:** Convoluciones\n", | |
| "10. **Código:** Creación del modelo convolucional (CNN)\n", | |
| "11. **Código:** Entrenamiento del modelo\n", | |
| "12. **Código:** Evaluación y predicción\n", | |
| "\n", | |
| "\n", | |
| "9. **Cierre:** Sesión de preguntas y respuestas" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "xNVG2PnSEtQN" | |
| }, | |
| "source": [ | |
| "## **Sección III**" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Aprendizaje de neuronas\n", | |
| "\n", | |
| "Veamos cómo se puede entrenar una sola neurona para hacer una predicción.\n", | |
| "\n", | |
| "Para este problema construiremos un perceptrón simple, como el propuesto por McCulloch & Pitts, usando la función sigmoide.\n", | |
| "\n", | |
| "#### **Planteamiento del problema:**\n", | |
| "\n", | |
| "Queremos mostrarle a una neurona simple un conjunto de ejemplos para que pueda aprender cómo se comporta una función. El conjunto de ejemplos es el siguiente:\n", | |
| "\n", | |
| "- `(1, 0)` debería devolver `1`.\n", | |
| "- `(0, 1)` debe devolver `1`.\n", | |
| "- `(0, 0)` debería devolver `0`.\n", | |
| "\n", | |
| "Entonces, si ingresamos a la neurona el valor de `(1, 1)`, debería poder predecir el número `1`.\n", | |
| "\n", | |
| "> ¿Puedes adivinar la función?\n", | |
| "\n", | |
| "#### ¿Que necesitamos hacer?\n", | |
| "\n", | |
| "Programar y entrenar una neurona para hacer predicciones.\n", | |
| "\n", | |
| "En concreto, vamos a hacer lo siguiente:\n", | |
| "\n", | |
| "- Construir la clase y su constructor.\n", | |
| "- Definir la función sigmoidea y su derivada\n", | |
| "- Definir el número de épocas para el entrenamiento.\n", | |
| "- Resolver el problema y predecir el valor de la entrada deseada" | |
| ], | |
| "metadata": { | |
| "id": "2k4ZBY7drHpQ" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import numpy as np\n", | |
| "\n", | |
| "\n", | |
| "class sigmoid_neuron():\n", | |
| " def __init__(self, n):\n", | |
| " \"\"\"Constructor of the class.\"\"\"\n", | |
| " np.random.seed(123)\n", | |
| " self.synaptic_weights = 2 * np.random.random((n, 1)) - 1\n", | |
| "\n", | |
| " def __sigmoid(self, x):\n", | |
| " \"\"\"Sigmoid function.\"\"\"\n", | |
| " # TODO.\n", | |
| " pass\n", | |
| "\n", | |
| " def __sigmoid_derivative(self, x):\n", | |
| " \"\"\"Derivative of the Sigmoid function.\"\"\"\n", | |
| " # TODO.\n", | |
| " pass\n", | |
| "\n", | |
| " def train(self, training_inputs, training_output, iterations):\n", | |
| " \"\"\"Training function.\"\"\"\n", | |
| " for iteration in range(iterations):\n", | |
| " output = self.predict(training_inputs)\n", | |
| " error = training_output.reshape((len(training_inputs), 1)) - output\n", | |
| " adjustment = np.dot(training_inputs.T, error *\n", | |
| " self.__sigmoid_derivative(output))\n", | |
| " self.synaptic_weights += adjustment\n", | |
| "\n", | |
| " def predict(self, inputs):\n", | |
| " \"\"\"Prediction function.\"\"\"\n", | |
| " return self.__sigmoid(np.dot(inputs, self.synaptic_weights))" | |
| ], | |
| "metadata": { | |
| "id": "2NKx40hxqmo4" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Generando las muestras\n", | |
| "\n", | |
| "Ahora podemos generar una lista de ejemplos basados en la descripción del problema." | |
| ], | |
| "metadata": { | |
| "id": "Ym_oEzbhxYKT" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Training samples:\n", | |
| "input_values = [] # TODO. Define the input values as a list of tuples.\n", | |
| "output_values = [] # TODO. Define the desired outputs.\n", | |
| "\n", | |
| "training_inputs = np.array(input_values)\n", | |
| "training_output = np.array(output_values).T.reshape((3, 1))" | |
| ], | |
| "metadata": { | |
| "id": "BYW9aYSCxc1q" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Entrenando la neurona\n", | |
| "\n", | |
| "Para hacer el entrenamiento, primero definiremos una neurona. De forma predeterminada, contendrá pesos aleatorios (ya que aún no se ha entrenado):" | |
| ], | |
| "metadata": { | |
| "id": "DJUYV8H-xf7Y" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Initialize Sigmoid Neuron:\n", | |
| "neuron = sigmoid_neuron(2)\n", | |
| "print(\"Initial random weights:\")\n", | |
| "neuron.synaptic_weights" | |
| ], | |
| "metadata": { | |
| "id": "cThkcQGMxrX8" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# TODO.\n", | |
| "# We can modify the number of epochs to see how it performs.\n", | |
| "epochs = 0\n", | |
| "\n", | |
| "# We train the neuron a number of epochs:\n", | |
| "neuron.train(training_inputs, training_output, epochs)\n", | |
| "print(\"New synaptic weights after training: \")\n", | |
| "neuron.synaptic_weights" | |
| ], | |
| "metadata": { | |
| "id": "WnuCP6eHxtQk" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### Haciendo predicciones" | |
| ], | |
| "metadata": { | |
| "id": "7vPb5a65x0bA" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# We predict to verify the performance:\n", | |
| "one_one = np.array((1, 1))\n", | |
| "print(\"Prediction for (1, 1): \")\n", | |
| "neuron.predict(one_one)" | |
| ], | |
| "metadata": { | |
| "id": "SrYM3ODKxwvD" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "Rtpuj0PBqWYc" | |
| }, | |
| "source": [ | |
| "## **Sección IV**" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "1Z7JrTygMDSx" | |
| }, | |
| "source": [ | |
| "### El dataset de modas\n", | |
| "\n", | |
| "Comencemos importando TensorFlow." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "LPB4nBh8MFDm", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "5fa8ceab-355d-4046-cd21-0c25db37bb96" | |
| }, | |
| "source": [ | |
| "import tensorflow as tf\n", | |
| "print(tf.__version__)" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "2.5.0\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "p65n1ePSMYm8" | |
| }, | |
| "source": [ | |
| "Los datos de Fashion MNIST están disponibles directamente en la API de conjuntos de datos de `tf.keras`. Los cargas así:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "Wgked3UaMJW4" | |
| }, | |
| "source": [ | |
| "fashion_mnist = tf.keras.datasets.fashion_mnist" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "UsEGBNwrMSac" | |
| }, | |
| "source": [ | |
| "Llamar a `load_data` en este objeto nos dará dos conjuntos con los valores de entrenamiento y prueba para los gráficos que contienen las prendas y sus etiquetas." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "1XdP6qF1MLR6", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "b80eed3d-826b-4b5d-82cb-27a859dc0d9f" | |
| }, | |
| "source": [ | |
| "(training_images, training_labels), (test_images, test_labels) = fashion_mnist.load_data()" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz\n", | |
| "32768/29515 [=================================] - 0s 0us/step\n", | |
| "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz\n", | |
| "26427392/26421880 [==============================] - 1s 0us/step\n", | |
| "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz\n", | |
| "8192/5148 [===============================================] - 0s 0us/step\n", | |
| "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz\n", | |
| "4423680/4422102 [==============================] - 0s 0us/step\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "6c0eSrlvMs6H" | |
| }, | |
| "source": [ | |
| "¿Cómo se ven estos valores?\n", | |
| "\n", | |
| "Imprimamos una imagen de entrenamiento y una etiqueta de entrenamiento para ver." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "3CdTltfNM0qF", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 771 | |
| }, | |
| "outputId": "de9afc15-a8e0-4477-b382-b45c6b1f8a01" | |
| }, | |
| "source": [ | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "np.set_printoptions(linewidth=200)\n", | |
| "\n", | |
| "\n", | |
| "# Set index of image to be seen\n", | |
| "img_index = 5999 # 6000 -1\n", | |
| "\n", | |
| "# Plot image\n", | |
| "plt.imshow(training_images[img_index], cmap='gray')\n", | |
| "plt.axis(False)\n", | |
| "\n", | |
| "print(\"Label:\", training_labels[img_index])\n", | |
| "print(\"Matrix:\", training_images[img_index])" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Label: 0\n", | |
| "Matrix: [[ 0 0 0 0 0 0 0 0 0 0 120 54 0 0 0 0 13 124 0 0 0 0 2 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 64 173 207 218 206 232 184 168 202 205 218 202 126 12 0 0 1 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 56 199 223 222 207 205 211 223 227 231 230 214 203 209 220 213 164 0 0 2 0 0 0]\n", | |
| " [ 0 0 0 0 0 191 219 200 200 206 206 205 206 206 203 202 201 202 201 195 198 222 149 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 72 224 201 205 208 202 204 204 205 205 208 205 192 188 203 202 200 189 198 23 0 0 0 0]\n", | |
| " [ 0 0 0 0 160 221 211 200 204 203 204 203 201 202 201 203 201 185 203 203 188 194 207 126 0 0 0 0]\n", | |
| " [ 0 0 0 0 227 212 224 205 201 204 203 202 202 201 201 200 201 195 198 191 182 199 202 202 0 0 0 0]\n", | |
| " [ 0 0 0 20 208 205 224 219 201 200 202 202 201 201 199 198 199 199 197 183 195 210 191 189 11 0 0 0]\n", | |
| " [ 0 0 0 138 223 201 218 229 216 202 202 200 200 197 197 199 197 194 186 178 214 205 180 193 84 0 0 0]\n", | |
| " [ 0 0 0 104 181 212 234 254 219 208 204 201 201 199 199 199 197 197 192 191 250 220 199 197 141 0 0 0]\n", | |
| " [ 0 0 0 0 0 40 131 193 219 207 205 202 202 199 199 199 193 197 188 200 174 111 56 15 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 2 248 208 202 199 200 197 197 200 194 187 192 186 0 0 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 2 0 0 228 217 199 200 201 202 198 198 203 188 200 162 0 0 2 3 1 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 0 200 218 203 200 198 201 199 197 203 188 203 136 0 0 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 0 181 220 202 200 200 201 200 195 200 191 202 85 0 1 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 0 168 220 200 200 201 201 199 198 195 193 198 82 0 1 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 0 157 220 199 200 199 199 195 200 191 194 199 106 0 7 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 0 0 0 165 217 199 200 200 199 194 199 192 193 203 109 0 1 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 1 0 0 175 210 200 200 200 200 192 198 195 188 208 125 0 0 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 2 0 0 197 205 201 199 197 194 192 198 195 186 205 134 0 0 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 4 0 16 206 201 201 199 197 194 191 199 197 191 199 160 0 0 0 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 5 0 31 209 195 200 198 197 194 184 194 193 195 192 167 0 0 2 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 5 0 32 207 200 197 197 197 197 183 197 195 195 190 184 5 0 3 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 7 0 68 210 197 197 194 198 199 187 199 199 195 190 190 20 0 4 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 7 0 89 210 194 199 195 199 203 195 200 200 197 192 190 22 0 4 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 7 0 116 207 193 195 191 195 194 188 190 197 197 190 192 47 0 5 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 5 0 172 225 207 207 225 225 225 224 225 229 211 206 210 88 0 6 0 0 0 0 0]\n", | |
| " [ 0 0 0 0 0 2 0 48 94 103 119 123 132 128 122 119 114 97 88 102 27 0 4 0 0 0 0 0]]\n" | |
| ], | |
| "name": "stdout" | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [], | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "CxfNdPU3NQge" | |
| }, | |
| "source": [ | |
| "### Preparación de los datos\n", | |
| "\n", | |
| "Notarás que todos los valores están entre 0 y 255. Si estamos entrenando una red neuronal, por varias razones es más fácil si transformamos los valores para tratar todos con valores entre 0 y 1. Este proceso se llama **normalización**." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "vWoPQWCGNdnB" | |
| }, | |
| "source": [ | |
| "training_images = training_images / 255.0\n", | |
| "test_images = test_images / 255.0" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 1000 | |
| }, | |
| "id": "32Dx5PzgJ3gK", | |
| "outputId": "6ee1bf82-4e8a-4b19-f7f5-78afffb52346" | |
| }, | |
| "source": [ | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "np.set_printoptions(linewidth=200)\n", | |
| "\n", | |
| "\n", | |
| "# Set index of image to be seen\n", | |
| "img_index = 3000 # 6000 -1\n", | |
| "\n", | |
| "# Plot image\n", | |
| "plt.imshow(training_images[img_index], cmap='gray')\n", | |
| "plt.axis(False)\n", | |
| "\n", | |
| "print(\"Label:\", training_labels[img_index])\n", | |
| "print(\"Matrix:\", training_images[img_index])" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Label: 6\n", | |
| "Matrix: [[0. 0. 0. 0. 0. 0. 0. 0. 0.00392157 0.00392157 0. 0. 0.47058824 0.51372549 0.35686275 0.57647059 0.11764706\n", | |
| " 0. 0. 0.00392157 0.00392157 0. 0. 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0.00392157 0.01176471 0. 0. 0. 0. 0.98431373 0.78039216 0.6745098 0.76470588 0.59607843\n", | |
| " 0. 0. 0. 0. 0.01176471 0.00392157 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.16862745 0.48627451 0.75686275 0.65098039 0.9372549 1. 0.84705882 0.6745098\n", | |
| " 0.89411765 0.49411765 0.23921569 0. 0. 0. 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0. 0.37647059 0.65490196 0.60784314 0.62352941 0.67058824 0.69803922 0.82745098 0.84313725 0.82352941 0.76862745\n", | |
| " 0.74117647 0.61960784 0.64313725 0.62352941 0.42352941 0. 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0.3254902 0.61568627 0.51372549 0.45882353 0.47058824 0.58039216 0.58039216 0.56862745 0.69803922 0.62352941 0.68235294\n", | |
| " 0.62745098 0.48235294 0.51764706 0.55686275 0.6745098 0.14901961 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0.62352941 0.50196078 0.4627451 0.47058824 0.47843137 0.43921569 0.36470588 0.48627451 0.63137255 0.42745098 0.50196078\n", | |
| " 0.50196078 0.50588235 0.57254902 0.54117647 0.65490196 0.47843137 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0.67058824 0.52941176 0.47058824 0.44705882 0.4627451 0.46666667 0.41960784 0.49019608 0.48235294 0.45882353 0.48627451\n", | |
| " 0.48627451 0.46666667 0.56862745 0.57647059 0.65098039 0.58039216 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.01568627 0.67058824 0.54117647 0.49411765 0.47058824 0.45882353 0.4627451 0.4 0.47843137 0.56862745 0.43529412 0.47058824\n", | |
| " 0.47843137 0.47058824 0.59607843 0.60392157 0.60784314 0.66666667 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.12156863 0.66666667 0.50588235 0.54117647 0.49019608 0.44313725 0.41568627 0.40392157 0.4627451 0.5372549 0.42352941 0.52941176\n", | |
| " 0.50980392 0.61960784 0.71372549 0.54117647 0.56078431 0.72941176 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.22745098 0.63921569 0.44705882 0.5372549 0.56078431 0.46666667 0.40392157 0.39215686 0.42745098 0.4627451 0.42745098 0.50588235\n", | |
| " 0.5254902 0.6745098 0.70980392 0.51372549 0.53333333 0.74509804 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.29803922 0.62745098 0.44313725 0.55294118 0.58039216 0.50196078 0.43529412 0.39607843 0.45490196 0.5372549 0.43529412 0.51372549\n", | |
| " 0.55686275 0.65490196 0.71764706 0.53333333 0.47058824 0.72941176 0.04705882 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.39215686 0.58039216 0.42352941 0.57647059 0.57647059 0.5254902 0.47058824 0.41176471 0.45490196 0.51372549 0.45490196 0.53333333\n", | |
| " 0.5372549 0.64705882 0.75294118 0.5372549 0.44313725 0.73333333 0.11764706 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.44705882 0.56078431 0.42352941 0.61960784 0.57647059 0.50980392 0.49019608 0.41568627 0.44705882 0.47843137 0.46666667 0.50588235\n", | |
| " 0.5254902 0.62745098 0.76862745 0.53333333 0.42745098 0.71372549 0.2 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.47058824 0.54901961 0.45882353 0.59215686 0.58039216 0.51372549 0.48627451 0.42745098 0.47058824 0.56078431 0.47058824 0.50980392\n", | |
| " 0.50196078 0.62352941 0.7372549 0.43529412 0.42352941 0.69803922 0.25882353 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.49019608 0.50588235 0.50196078 0.43921569 0.56862745 0.54901961 0.47843137 0.44313725 0.4627451 0.5254902 0.45882353 0.51764706\n", | |
| " 0.50196078 0.65098039 0.61568627 0.35686275 0.47058824 0.66666667 0.29019608 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.49411765 0.48235294 0.54117647 0.29019608 0.54901961 0.56078431 0.48627451 0.43529412 0.43921569 0.49411765 0.47058824 0.50980392\n", | |
| " 0.50588235 0.68627451 0.47058824 0.34509804 0.50196078 0.64313725 0.35686275 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.48627451 0.48235294 0.61568627 0.17647059 0.56862745 0.56078431 0.48627451 0.44313725 0.46666667 0.58039216 0.47843137 0.51372549\n", | |
| " 0.50588235 0.71764706 0.35294118 0.28627451 0.5372549 0.60784314 0.38823529 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.4627451 0.47843137 0.65490196 0. 0.56078431 0.58431373 0.47843137 0.43921569 0.4627451 0.5372549 0.45490196 0.51764706\n", | |
| " 0.49411765 0.71764706 0.28627451 0.19607843 0.59607843 0.57647059 0.39607843 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.43529412 0.50196078 0.64313725 0. 0.55686275 0.59215686 0.47843137 0.43529412 0.45882353 0.51764706 0.47058824 0.53333333\n", | |
| " 0.49019608 0.71372549 0.35294118 0.07058824 0.64313725 0.56862745 0.41960784 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.42745098 0.51764706 0.61960784 0. 0.57254902 0.58039216 0.47058824 0.42352941 0.49019608 0.61568627 0.47058824 0.53333333\n", | |
| " 0.51372549 0.69019608 0.43529412 0. 0.64313725 0.56078431 0.4627451 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.43529412 0.55294118 0.54901961 0. 0.58039216 0.58431373 0.47058824 0.44705882 0.48235294 0.5372549 0.48627451 0.5372549\n", | |
| " 0.51372549 0.67058824 0.52941176 0. 0.61568627 0.57647059 0.49019608 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.43529412 0.60392157 0.43529412 0. 0.60784314 0.58039216 0.4627451 0.45490196 0.48627451 0.56078431 0.48235294 0.51372549\n", | |
| " 0.50588235 0.65490196 0.60784314 0. 0.50588235 0.61568627 0.50588235 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.42745098 0.60784314 0.34117647 0. 0.61568627 0.56862745 0.46666667 0.45882353 0.49411765 0.60392157 0.49411765 0.50980392\n", | |
| " 0.48235294 0.63137255 0.62745098 0. 0.38039216 0.63921569 0.50980392 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.48627451 0.55686275 0.21176471 0. 0.58431373 0.55294118 0.46666667 0.46666667 0.48627451 0.53333333 0.50588235 0.49411765\n", | |
| " 0.47058824 0.6 0.68627451 0. 0.29803922 0.56862745 0.5372549 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.53333333 0.59215686 0.18431373 0. 0.58431373 0.5372549 0.46666667 0.4627451 0.49411765 0.56078431 0.51764706 0.50980392\n", | |
| " 0.48235294 0.6 0.6745098 0. 0.25882353 0.58039216 0.60392157 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0.42745098 0.68235294 0.18823529 0. 0.60392157 0.54117647 0.46666667 0.45882353 0.48627451 0.54117647 0.50980392 0.50588235\n", | |
| " 0.49019608 0.62352941 0.65490196 0. 0.22745098 0.68235294 0.50196078 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.33333333 0.71372549 0.57647059 0.53333333 0.56078431 0.61960784 0.57254902 0.58039216\n", | |
| " 0.6 0.78039216 0.2745098 0. 0. 0. 0. 0. 0. 0. 0. ]\n", | |
| " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.10196078 0.21176471 0.28235294 0.3254902 0.37647059 0.33333333 0.31372549\n", | |
| " 0.23921569 0.05490196 0. 0. 0. 0. 0. 0. 0. 0. 0. ]]\n" | |
| ], | |
| "name": "stdout" | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [], | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "6QLVhw7SOCd8", | |
| "outputId": "93e51a9a-40e0-4db1-abbb-4e0ec914436e" | |
| }, | |
| "source": [ | |
| "training_images[0].shape" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "(28, 28)" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 14 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "bTaT1RjyNjqV" | |
| }, | |
| "source": [ | |
| "### Creación del modelo\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "g-myY9JWNvtY" | |
| }, | |
| "source": [ | |
| "model = tf.keras.models.Sequential([\n", | |
| " tf.keras.layers.Flatten(), \n", | |
| " tf.keras.layers.Dense(256, activation=tf.nn.relu), \n", | |
| " tf.keras.layers.Dense(128, activation=tf.nn.relu), \n", | |
| " tf.keras.layers.Dense(64, activation=tf.nn.relu), \n", | |
| " tf.keras.layers.Dense(10, activation=tf.nn.softmax)\n", | |
| "])" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "dwkxtrHdNvHg" | |
| }, | |
| "source": [ | |
| "### Entrenamiento del modelo" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "F9LHH0f6N5Hi" | |
| }, | |
| "source": [ | |
| "model.compile(\n", | |
| " optimizer=tf.optimizers.Adam(),\n", | |
| " loss='sparse_categorical_crossentropy',\n", | |
| " metrics=['accuracy']\n", | |
| ")" | |
| ], | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "ybq9AzJiN8ZV", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "e80f2b1b-c31b-41e8-9260-a609571af555" | |
| }, | |
| "source": [ | |
| "model.fit(training_images, training_labels, epochs=15)" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Epoch 1/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.4841 - accuracy: 0.8261\n", | |
| "Epoch 2/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.3620 - accuracy: 0.8674\n", | |
| "Epoch 3/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.3276 - accuracy: 0.8789\n", | |
| "Epoch 4/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.3031 - accuracy: 0.8876\n", | |
| "Epoch 5/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2869 - accuracy: 0.8932\n", | |
| "Epoch 6/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2718 - accuracy: 0.8989\n", | |
| "Epoch 7/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2604 - accuracy: 0.9025\n", | |
| "Epoch 8/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2474 - accuracy: 0.9076\n", | |
| "Epoch 9/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2387 - accuracy: 0.9092\n", | |
| "Epoch 10/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2292 - accuracy: 0.9131\n", | |
| "Epoch 11/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2219 - accuracy: 0.9151\n", | |
| "Epoch 12/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2126 - accuracy: 0.9193\n", | |
| "Epoch 13/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2056 - accuracy: 0.9211\n", | |
| "Epoch 14/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.2023 - accuracy: 0.9233\n", | |
| "Epoch 15/15\n", | |
| "1875/1875 [==============================] - 3s 2ms/step - loss: 0.1940 - accuracy: 0.9257\n" | |
| ], | |
| "name": "stdout" | |
| }, | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "<tensorflow.python.keras.callbacks.History at 0x7f81beae5bd0>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 33 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "cH9mfZMTN8_H" | |
| }, | |
| "source": [ | |
| "### Evaluación del modelo" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "rHCV5BrAN-pq", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "c7e47232-b522-4ef3-fc32-d1954d7d76cc" | |
| }, | |
| "source": [ | |
| "model.evaluate(test_images, test_labels)" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "313/313 [==============================] - 1s 2ms/step - loss: 0.3884 - accuracy: 0.8792\n" | |
| ], | |
| "name": "stdout" | |
| }, | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "[0.3883811831474304, 0.8791999816894531]" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 34 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "w-hQX4NNOd_D" | |
| }, | |
| "source": [ | |
| "### Predicción\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "GaDFuXyROfZY", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 283 | |
| }, | |
| "outputId": "9ee55f05-1703-413f-e1f7-22ed939b3b89" | |
| }, | |
| "source": [ | |
| "import random\n", | |
| "\n", | |
| "test_index = random.randint(0, 10000 - 1)\n", | |
| "\n", | |
| "plt.imshow(test_images[test_index], cmap='viridis')\n", | |
| "plt.axis(False)\n", | |
| "\n", | |
| "print(\"Label:\", test_labels[test_index])\n", | |
| "input_image = np.reshape(test_images[test_index], (1, 784))\n", | |
| "prediction = model.predict(np.expand_dims(input_image, axis=-1))\n", | |
| "print(\"Prediction:\", np.argmax(prediction))" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| "Label: 7\n", | |
| "Prediction: 7\n" | |
| ], | |
| "name": "stdout" | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [], | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "RHA0nk24QEVz", | |
| "outputId": "9d8d9eba-9277-4f90-9892-a2b6da5eaf79" | |
| }, | |
| "source": [ | |
| "prediction" | |
| ], | |
| "execution_count": null, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "array([[3.2021964e-01, 5.1770403e-06, 6.2667266e-03, 4.3357564e-03, 7.5934454e-06, 1.5508351e-05, 6.6891927e-01, 7.4771127e-11, 2.3000537e-04, 2.8293229e-07]], dtype=float32)" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [] | |
| }, | |
| "execution_count": 27 | |
| } | |
| ] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment