diff --git "a/cnn_breast.ipynb" "b/cnn_breast.ipynb" new file mode 100644--- /dev/null +++ "b/cnn_breast.ipynb" @@ -0,0 +1,887 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Copia de cnn_breast.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true, + "include_colab_link": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "26_Uu_MkfniL" + }, + "source": [ + "# WomanLife" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IMi2uOCOkuMj" + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SSqwgK6Vfwnc" + }, + "source": [ + "\n", + "Proyecto final en SaturdaysAI La Paz, para la detección y clasificación de cáncer de mama en mujeres de 25 a 75 años de edad a partir de imágenes de ultrasonido.\n", + "\n", + "Agradacimiento a los autores del sitio web por proveer una fuente de imágenes abiertas para propósitos de investigación: \n", + "\n", + "https://scholar.cu.edu.eg/?q=afahmy/pages/dataset\n", + "\n", + "\n", + "* Al-Dhabyani W, Gomaa M, Khaled H, Fahmy A. Dataset of breast ultrasound images. Data in Brief. 2020 Feb;28:104863. DOI: 10.1016/j.dib.2019.104863." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ytUoPGQvBuxE" + }, + "source": [ + "## Modulos" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4T1_vz_8CK4F", + "outputId": "b72d9abc-a33b-46b4-be70-9aca78c5e24e" + }, + "source": [ + "# Módulos de Tensorflow\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "from tensorflow.keras import layers\n", + "from tensorflow.keras.utils import plot_model\n", + "from tensorflow.keras.applications import VGG16\n", + "print(tf.__version__)\n", + "\n", + "# Tensorboard\n", + "from tensorflow.keras.callbacks import TensorBoard, EarlyStopping\n", + "from tensorboard import notebook\n", + "\n", + "# Deployment\n", + "from tensorflow import lite" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "2.7.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8_f73j8MBxTm", + "outputId": "7096998a-9e69-4e83-cd05-9904d1bcc979" + }, + "source": [ + "# Utilidades\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K6GQZSMPIQkJ", + "outputId": "1b444d41-5fb0-4e02-ae4c-f23af1c54dc4" + }, + "source": [ + "print(tf.config.get_visible_devices())" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oQTtBVHE9DlM" + }, + "source": [ + "## Lectura de datos" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kNuxzbTuKRrw" + }, + "source": [ + "Si utilizas las imagenes desde la fuente de datos orignal, entonces ejecuta las siguientes instrucciones: \n", + "* Borrar imágenes de máscaras que no aportan información significativa al modelo. Para ello debes ejectuar las sentencias Shell comentadas e ir\n", + "cambiando el nombre del directorio al final de la ruta para acceder a las otras clasificaciones." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "t-Ydm9qoE50k" + }, + "source": [ + "#%cd '/content/drive/SaturdaysAI/Dataset_BUSI_with_GT/normal/'\n", + "#%rm *mask*.png\n", + "\n", + "# Deben existir 437, 210 y 133 imagenes en los directorios benign, malignant y normal, respectivamente para un total de 780 imágenes" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sZA0BE66f14z" + }, + "source": [ + "**VARIABLES DE CONFIGURACIÓN GLOBAL:**" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "a2wJNXkxChIs" + }, + "source": [ + "BATCH_SIZE = 64\n", + "SEED = 1234\n", + "EPOCHS = 30\n", + "LEARNING_RATE = 0.0001\n", + "INPUT_SHAPE = (224, 224, 3)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yRfYMFNMZ8c8" + }, + "source": [ + "Datos para Train y Test:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lefZX2uRBlRt", + "outputId": "6070986e-4b91-49c7-ab52-9dcbf1d93f17" + }, + "source": [ + "# Directorio\n", + "PATH = '/content/drive/MyDrive/SaturdaysAI'\n", + "\n", + "# Parametros reutilizables\n", + "PARAMS = dict(directory = PATH+'/Dataset_BUSI_with_GT', \n", + " seed = SEED, \n", + " label_mode='int', \n", + " validation_split = 0.2,\n", + " batch_size = BATCH_SIZE, \n", + " image_size = INPUT_SHAPE[:2])\n", + "\n", + "train_set = keras.preprocessing.image_dataset_from_directory(**PARAMS, subset='training')\n", + "test_set = keras.preprocessing.image_dataset_from_directory(**PARAMS, subset='validation')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Found 780 files belonging to 3 classes.\n", + "Using 624 files for training.\n", + "Found 780 files belonging to 3 classes.\n", + "Using 156 files for validation.\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "irUqgVC728Bd", + "outputId": "d6f0b736-e088-4afa-9c60-f37f18e1450f" + }, + "source": [ + "class_names = train_set.class_names\n", + "print(class_names)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "['benign', 'malignant', 'normal']\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2TIturq2zgzP", + "outputId": "5c2a2ea2-e7c9-47e1-9216-a2994562522a" + }, + "source": [ + "%%time\n", + "images, labels = next(iter(train_set))" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CPU times: user 5.72 s, sys: 672 ms, total: 6.39 s\n", + "Wall time: 5.11 s\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "Hy8m8MgPy8QA", + "outputId": "f1613d6a-17e4-4f3e-9b00-db1b31dcdcd0" + }, + "source": [ + "fig = plt.figure(figsize=(16, 10))\n", + "axes = fig.subplots(4, 8)\n", + "fig.subplots_adjust(bottom=0, top=.7, hspace=0, wspace=0.2)\n", + "for ax, image, label in zip(axes.flatten(), images, labels):\n", + " ax.set_title(class_names[label])\n", + " ax.imshow(np.squeeze(image), cmap='gray')\n", + " ax.axis('off')" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n", + "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" + ] + }, + { + "output_type": "display_data", + "data": { + "image/png": "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AYwBOC6ljKHWr1s8wfaodlC5DqGW4Qxqrb3xDV8hKeWfPuK2FwAMCiE2ZjS81Z3piTBHPTBHPTBHPTDH1vePAXwBwA8DaEetCyiw/bnjk+bzJwD+EsCwlLIdwNd28JyuJzlP1hmPx220SrH4pwB+VghxQQgRQK3l7x1Z6zLaCFEAOQB5IcQpAP+iQds9yH5BCDEkhOgE8KsAvoFaP/qfX78yJoQQ4fXB2tFH3PZbAGwA/0oI4RVCfAHAC43dfVrHHPXAHPXAHPXAHFtfFLVuiasAQqidl+7Ek+YTBZCSUpaFEC+gVrTu1BKAESFEq5z77xUej9toiT8YKeXrAH4NwDdRq9KfAvA/NPApfhm1A24NtT+QbzRw2wfVnwB4DcA4gHuoDeZ9H7XJhr4KIA3gLoCfedQNSykrqA0S/mcAMgD+KYBvofbGTY3FHPXAHPXAHPXAHFvff0Sty+IcanNgvL2TBzUgn38J4DeEEGuoTeL4nx5hn19d/3dVCHHxER6nOx6P2xCbu9EStSYhxDsAvial/MP93hd6fMxRD8xRD8xRD8yxuTGfg6UV826JlkWi+wkhXhFC9K036/80alNIf2e/94seDXPUA3PUA3PUA3NsbsznYNEhb+9+7wDRYzqJWveLMGpdB/6RlHJhf3eJHgNz1ANz1ANz1ANzbG7M52Bp+bzZDZWIiIiIiIjqsBsqERERERER1WGxSERERERERHUeOmYxnU7LcrmM/v7+vdof+shOF1ndCfY13j8NzdG2bQghYBi8zrPHGpajZVlSSgmfz9eoTdLO8X1VD8xRDw3LMZlMyu7ubmxe+5z2SMNe9Gq1Kr1eL3PcH1u+6A8tFuPxODimkah5SCn5JtripJRwHGe/d4OISBuBQGC/d4EagJ+NzWm7CW5YKe4fXjnVA3PUA3PUA3PUA3PUA3PUA3PUw5Y5si8bERERERER1WGxSERERERERHVYLBIREREREVEdFotERERERERUh8UiERERERER1WGxSERERERERHVYLBIREREREVEdFotERERERERUh8UiERERERER1WGxSERERERERHVYLBIREREREVEdFotERERERERUh8UiERERERER1WGxSEREREREB4LjOFhaWtrv3WgZQkr5sNsfeiPtKtHAbTHH/cMc9cAc9cAc9cAc9cAc9dByOUopYds2vF7vXjxd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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O2hHpLzxBmxU" + }, + "source": [ + "## Creacion de la red neuronal" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tONsX4ahwXmY" + }, + "source": [ + "Model Subclassing para la creación de la red neuronal" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ccKhjC26Oh1k" + }, + "source": [ + "vgg16 = VGG16(include_top=False, input_shape=INPUT_SHAPE)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ypAQujOPO1lk" + }, + "source": [ + "for layer in vgg16.layers:\n", + " layer.trainable=False" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "F65U_eZ7OHj8" + }, + "source": [ + "def base_model(num_classes, learning_rate=0.0001):\n", + " x = layers.Flatten()(vgg16.output)\n", + " x = layers.Dense(256, activation='relu')(x)\n", + " x = layers.Dense(128, activation='relu')(x)\n", + " x = layers.Dropout(.2)(x)\n", + " x = layers.Dense(num_classes, activation='softmax')(x)\n", + "\n", + " model = keras.Model(inputs=vgg16.input, outputs=x)\n", + " model.compile(loss=keras.losses.SparseCategoricalCrossentropy(), \n", + " optimizer=keras.optimizers.Adam(learning_rate), \n", + " metrics=['accuracy'])\n", + " return model" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "VJq6SnDzd4wd" + }, + "source": [ + "model = base_model(len(class_names))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "YXZIRCXhhaLk", + "outputId": "41991eda-98a8-42d8-98b8-aab23d158992" + }, + "source": [ + "model.summary()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Model: \"model_7\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " input_3 (InputLayer) [(None, 224, 224, 3)] 0 \n", + " \n", + " block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 \n", + " \n", + " block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 \n", + " \n", + " block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 \n", + " \n", + " block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 \n", + " \n", + " block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 \n", + " \n", + " block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 \n", + " \n", + " block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 \n", + " \n", + " block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 \n", + " \n", + " block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 \n", + " \n", + " block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 \n", + " \n", + " block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 \n", + " \n", + " block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 \n", + " \n", + " block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 \n", + " \n", + " block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 \n", + " \n", + " block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 \n", + " \n", + " block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 \n", + " \n", + " flatten_7 (Flatten) (None, 25088) 0 \n", + " \n", + " dense_21 (Dense) (None, 256) 6422784 \n", + " \n", + " dense_22 (Dense) (None, 128) 32896 \n", + " \n", + " dropout_10 (Dropout) (None, 128) 0 \n", + " \n", + " dense_23 (Dense) (None, 3) 387 \n", + " \n", + "=================================================================\n", + "Total params: 21,170,755\n", + "Trainable params: 6,456,067\n", + "Non-trainable params: 14,714,688\n", + "_________________________________________________________________\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "v-6bLg7zBgvs" + }, + "source": [ + "## Entrenamiento" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wyh6JfAajgsU" + }, + "source": [ + "Detención temprana:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "y0A96d-WjjpJ" + }, + "source": [ + "earlyStopping_callback = EarlyStopping(monitor='val_accuracy', verbose=2, patience=EPOCHS//4)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LsV6p5-dBl6j", + "outputId": "2a7da70e-1cd3-409d-8bc7-719f7b45549e" + }, + "source": [ + "model.fit(train_set, validation_data=test_set, epochs=30, batch_size=32, \n", + " verbose=2, callbacks=[earlyStopping_callback]\n", + " )" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/30\n", + "10/10 - 12s - loss: 2.9389 - accuracy: 0.4776 - val_loss: 0.9360 - val_accuracy: 0.6987 - 12s/epoch - 1s/step\n", + "Epoch 2/30\n", + "10/10 - 11s - loss: 0.6896 - accuracy: 0.7981 - val_loss: 0.7162 - val_accuracy: 0.7115 - 11s/epoch - 1s/step\n", + "Epoch 3/30\n", + "10/10 - 11s - loss: 0.2787 - accuracy: 0.8926 - val_loss: 0.7473 - val_accuracy: 0.7436 - 11s/epoch - 1s/step\n", + "Epoch 4/30\n", + "10/10 - 11s - loss: 0.1574 - accuracy: 0.9359 - val_loss: 0.7404 - val_accuracy: 0.7628 - 11s/epoch - 1s/step\n", + "Epoch 5/30\n", + "10/10 - 11s - loss: 0.0946 - accuracy: 0.9663 - val_loss: 0.6612 - val_accuracy: 0.7885 - 11s/epoch - 1s/step\n", + "Epoch 6/30\n", + "10/10 - 11s - loss: 0.0535 - accuracy: 0.9792 - val_loss: 0.7419 - val_accuracy: 0.7372 - 11s/epoch - 1s/step\n", + "Epoch 7/30\n", + "10/10 - 11s - loss: 0.0335 - accuracy: 0.9952 - val_loss: 0.6996 - val_accuracy: 0.7949 - 11s/epoch - 1s/step\n", + "Epoch 8/30\n", + "10/10 - 11s - loss: 0.0273 - accuracy: 0.9920 - val_loss: 0.6078 - val_accuracy: 0.8013 - 11s/epoch - 1s/step\n", + "Epoch 9/30\n", + "10/10 - 11s - loss: 0.0240 - accuracy: 0.9920 - val_loss: 0.6764 - val_accuracy: 0.8077 - 11s/epoch - 1s/step\n", + "Epoch 10/30\n", + "10/10 - 11s - loss: 0.0231 - accuracy: 0.9968 - val_loss: 0.6976 - val_accuracy: 0.7949 - 11s/epoch - 1s/step\n", + "Epoch 11/30\n", + "10/10 - 11s - loss: 0.0294 - accuracy: 0.9888 - val_loss: 0.6111 - val_accuracy: 0.8141 - 11s/epoch - 1s/step\n", + "Epoch 12/30\n", + "10/10 - 11s - loss: 0.0234 - accuracy: 0.9920 - val_loss: 0.7094 - val_accuracy: 0.7692 - 11s/epoch - 1s/step\n", + "Epoch 13/30\n", + "10/10 - 11s - loss: 0.0176 - accuracy: 0.9936 - val_loss: 0.7397 - val_accuracy: 0.7821 - 11s/epoch - 1s/step\n", + "Epoch 14/30\n", + "10/10 - 11s - loss: 0.0116 - accuracy: 0.9984 - val_loss: 0.6562 - val_accuracy: 0.8077 - 11s/epoch - 1s/step\n", + "Epoch 15/30\n", + "10/10 - 11s - loss: 0.0157 - accuracy: 0.9936 - val_loss: 0.6721 - val_accuracy: 0.7885 - 11s/epoch - 1s/step\n", + "Epoch 16/30\n", + "10/10 - 11s - loss: 0.0143 - accuracy: 0.9936 - val_loss: 0.7080 - val_accuracy: 0.7692 - 11s/epoch - 1s/step\n", + "Epoch 17/30\n", + "10/10 - 11s - loss: 0.0105 - accuracy: 0.9968 - val_loss: 0.6779 - val_accuracy: 0.7821 - 11s/epoch - 1s/step\n", + "Epoch 18/30\n", + "10/10 - 11s - loss: 0.0100 - accuracy: 0.9984 - val_loss: 0.7542 - val_accuracy: 0.7821 - 11s/epoch - 1s/step\n", + "Epoch 00018: early stopping\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 153 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eiiZmEpoBiQ5" + }, + "source": [ + "## Validación" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Sw14YQYkBpKb", + "outputId": "49eeda52-a858-46fb-86dd-f6544f920550" + }, + "source": [ + "model.evaluate(test_set)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "3/3 [==============================] - 2s 372ms/step - loss: 0.7542 - accuracy: 0.7821\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[0.7541956305503845, 0.7820512652397156]" + ] + }, + "metadata": {}, + "execution_count": 154 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rQDWyJc6Qk9E", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "63a1572a-7259-4866-d63f-6d1a16fd68e2" + }, + "source": [ + "# Visualización del dashboard de Tensorboard una vez entrenado el modelo. Descomentar para desplegar TensorBoard\n", + "notebook.display(port=6006, height=1000)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " (async () => {\n", + " const url = new URL(await google.colab.kernel.proxyPort(6006, {'cache': true}));\n", + " url.searchParams.set('tensorboardColab', 'true');\n", + " const iframe = document.createElement('iframe');\n", + " iframe.src = url;\n", + " iframe.setAttribute('width', '100%');\n", + " iframe.setAttribute('height', '1000');\n", + " iframe.setAttribute('frameborder', 0);\n", + " document.body.appendChild(iframe);\n", + " })();\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pF4ms8W1J8iD" + }, + "source": [ + "## Despliegue" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Lt2up86omwRf" + }, + "source": [ + "**Arquitectura de desarrollo:**\n", + "\n", + "El modelado generado cno Keras será guardado y reutilizará con Tensorflow Lite para llevar a cabo la conversión del modelo.\n", + "Finalmente, la aplicación móvil, desarrollada en Flutter (https://flutter.dev/), tendrá el modelo embebido dentro de los asset. Se seleccinó Flutter ya que cuenta con widgets especiales para la lectura de modelos con Tensorflow Lite. Adicionalmente, tanto Tensorflow y Flutter son tecnologías desarrolladas por Google (Flutter fué liberado hace pocos años) lo que facilita la integración punta a punta." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UjE6R0bhmhkT" + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NwCAakiGl3PM" + }, + "source": [ + "**Guardando el modelo:**\n", + "\n", + "Los modelos y cualquier otro recurso generado en éste notebook se guarda directamente en nuestro espacio de almacenamiento de Google Drive." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "z2KXnGXxwmAT" + }, + "source": [ + "PATH_MODEL = PATH+'/models/tf_breast_cancer_model'" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Q9KD_aRZvive", + "outputId": "3bd711a0-95fa-48e2-b14f-3ca4006c0948" + }, + "source": [ + "tf.saved_model.save(model, PATH_MODEL)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "WARNING:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file \"keras.metadata\" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).\n", + "\n", + "FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "WARNING:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file \"keras.metadata\" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).\n", + "\n", + "FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: /content/drive/MyDrive/SaturdaysAI/models/tf_breast_cancer_model/assets\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Assets written to: /content/drive/MyDrive/SaturdaysAI/models/tf_breast_cancer_model/assets\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "I5AeRGAPwsp0" + }, + "source": [ + "**Conversión a TensorFlow Lite**" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8Jg1uned3PTo" + }, + "source": [ + "PATH_TFLITE_MODEL = PATH+'/models/tflite_cancer_model.tflite'" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "rGHkY0MBvxtV" + }, + "source": [ + "converter = lite.TFLiteConverter.from_saved_model(PATH_MODEL)\n", + "tflite_model = converter.convert()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MZ2NSipg-mhq", + "outputId": "a702ac59-9388-4448-ac70-2bb4ac79599e" + }, + "source": [ + "open(PATH_TFLITE_MODEL, \"wb\").write(tflite_model)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "42850640" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 52 + } + ] + } + ] +} \ No newline at end of file