{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<div align=\"center\"><h1><blod>Detección de fracturas de la columna cervical mediante técnicas de aprendizaje automático</blod></h1></div>\n\n<br>\n\n<div align=\"center\"><h2>TRABAJO FIN DE GRADO</h2></div>\n<div align=\"center\"><h3>2022-2023</h3></div>\n\n<br>\n\n<div align=\"center\"><h2>Domingo José Caballero Navarro</h2></div>\n\n<br>\n\n<div align=\"center\"><h2>Tutorizado por:</h2></div>\n\n<div align=\"center\"><h3>José Antonio Gámez Martín</h3></div>\n<div align=\"center\"><h3>Juan Carlos Alfaro Jiménez</h3></div>","metadata":{}},{"cell_type":"markdown","source":"---","metadata":{}},{"cell_type":"markdown","source":"## Índice\n1. **[Datos necesarios](#datos)**\n    \n2. **[Diseño del modelo](#modelo)**\n\n3. **[Resultados y discusión](#resultados)**\n\n---","metadata":{}},{"cell_type":"markdown","source":"# 1. Datos necesarios <a name=\"datos\"></a>\n<div align=\"justify\">Hola</div>\n","metadata":{}},{"cell_type":"code","source":"! pip install python-gdcm\n! pip install pylibjpeg pylibjpeg-libjpeg pydicom","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:18.60846Z","iopub.execute_input":"2023-05-05T09:24:18.608936Z","iopub.status.idle":"2023-05-05T09:24:40.020517Z","shell.execute_reply.started":"2023-05-05T09:24:18.608852Z","shell.execute_reply":"2023-05-05T09:24:40.01932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 270221","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:40.022898Z","iopub.execute_input":"2023-05-05T09:24:40.023522Z","iopub.status.idle":"2023-05-05T09:24:40.028837Z","shell.execute_reply.started":"2023-05-05T09:24:40.023478Z","shell.execute_reply":"2023-05-05T09:24:40.027913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:40.030508Z","iopub.execute_input":"2023-05-05T09:24:40.030857Z","iopub.status.idle":"2023-05-05T09:24:44.495206Z","shell.execute_reply.started":"2023-05-05T09:24:40.03082Z","shell.execute_reply":"2023-05-05T09:24:44.494174Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device_type = \"GPU\"  # The device type\ndevices = tf.config.list_physical_devices(device_type)\n\nif not devices:\n    # Raise an informative message when there are no devices in the host runtime\n    raise RuntimeError(f\"No {device_type} devices are used in the host.\")","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:44.497999Z","iopub.execute_input":"2023-05-05T09:24:44.498652Z","iopub.status.idle":"2023-05-05T09:24:44.675444Z","shell.execute_reply.started":"2023-05-05T09:24:44.498614Z","shell.execute_reply":"2023-05-05T09:24:44.673738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\ndata_df = pd.read_csv(\"../input/rsna-2022-cervical-spine-fracture-detection/train.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:44.676892Z","iopub.execute_input":"2023-05-05T09:24:44.677327Z","iopub.status.idle":"2023-05-05T09:24:44.697059Z","shell.execute_reply.started":"2023-05-05T09:24:44.677285Z","shell.execute_reply":"2023-05-05T09:24:44.696219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_df, test_df = train_test_split(data_df, test_size=0.1, stratify=data_df.patient_overall, random_state=seed)","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:44.698404Z","iopub.execute_input":"2023-05-05T09:24:44.698767Z","iopub.status.idle":"2023-05-05T09:24:44.977122Z","shell.execute_reply.started":"2023-05-05T09:24:44.698732Z","shell.execute_reply":"2023-05-05T09:24:44.976167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Train: \", train_df.shape)\nprint(\"Test: \", test_df.shape)","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:44.979261Z","iopub.execute_input":"2023-05-05T09:24:44.980023Z","iopub.status.idle":"2023-05-05T09:24:44.986528Z","shell.execute_reply.started":"2023-05-05T09:24:44.979982Z","shell.execute_reply":"2023-05-05T09:24:44.98523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df_t1 = train_df[:360]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df_t1, val_df_t1 = train_test_split(train_df_t1, test_size=0.1, stratify=train_df_t1.patient_overall, random_state=seed)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df_t1.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:44.988198Z","iopub.execute_input":"2023-05-05T09:24:44.989255Z","iopub.status.idle":"2023-05-05T09:24:45.008065Z","shell.execute_reply.started":"2023-05-05T09:24:44.989218Z","shell.execute_reply":"2023-05-05T09:24:45.007217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os \nfrom os import listdir\n\npath = \"../input/rsna-2022-cervical-spine-fracture-detection\"\npath_train_images = os.path.join(path, \"train_images\")\npath_segmentations = os.path.join(path, \"segmentations\")","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:45.010322Z","iopub.execute_input":"2023-05-05T09:24:45.011309Z","iopub.status.idle":"2023-05-05T09:24:45.01695Z","shell.execute_reply.started":"2023-05-05T09:24:45.011274Z","shell.execute_reply":"2023-05-05T09:24:45.01605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata_df = pd.read_csv(\"../input/explicacionrsna/metadata_df.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:45.022105Z","iopub.execute_input":"2023-05-05T09:24:45.022404Z","iopub.status.idle":"2023-05-05T09:24:47.40235Z","shell.execute_reply.started":"2023-05-05T09:24:45.022379Z","shell.execute_reply":"2023-05-05T09:24:47.401359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:47.403963Z","iopub.execute_input":"2023-05-05T09:24:47.404334Z","iopub.status.idle":"2023-05-05T09:24:47.418819Z","shell.execute_reply.started":"2023-05-05T09:24:47.404294Z","shell.execute_reply":"2023-05-05T09:24:47.417596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div align=\"justify\">En este caso podemos apreciar la forma de la vértebra, en este caso podemos apreciar cómo esta mínimamente desplaza hacía arriba. Teniendo esto en cuenta, deberemos comprobar con otros ejemplos si esto sucede también en los demás pacientes dado que de ser negativo tendríamos que centrar todas las imágenes. Por lo tanto, comprobaremos el segundo paciente del conjunto de entrenamiento.</div>","metadata":{}},{"cell_type":"code","source":"train_df_t1.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:47.420207Z","iopub.execute_input":"2023-05-05T09:24:47.421452Z","iopub.status.idle":"2023-05-05T09:24:47.436178Z","shell.execute_reply.started":"2023-05-05T09:24:47.421415Z","shell.execute_reply":"2023-05-05T09:24:47.435231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preprocesamiento","metadata":{}},{"cell_type":"code","source":"train_segmented = pd.read_csv(\"../input/segmentation/train_segmented.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:47.437565Z","iopub.execute_input":"2023-05-05T09:24:47.437922Z","iopub.status.idle":"2023-05-05T09:24:52.051029Z","shell.execute_reply.started":"2023-05-05T09:24:47.437887Z","shell.execute_reply":"2023-05-05T09:24:52.049955Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_segmented = train_segmented[['SOPInstanceUID','C1','C2','C3','C4','C5','C6','C7']]\ntrain_segmented.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_segmented[['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7']] = train_segmented[['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7']].applymap(lambda x: 1 if x >= 0.5 else 0)\ntrain_segmented.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:52.05249Z","iopub.execute_input":"2023-05-05T09:24:52.052891Z","iopub.status.idle":"2023-05-05T09:24:52.072536Z","shell.execute_reply.started":"2023-05-05T09:24:52.052853Z","shell.execute_reply":"2023-05-05T09:24:52.07113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_segmented[train_segmented['SOPInstanceUID']=='1.2.826.0.1.3680043.14723.1.100'][['C1','C2','C3','C4','C5','C6','C7']]","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:52.074336Z","iopub.execute_input":"2023-05-05T09:24:52.07504Z","iopub.status.idle":"2023-05-05T09:24:52.133016Z","shell.execute_reply.started":"2023-05-05T09:24:52.075001Z","shell.execute_reply":"2023-05-05T09:24:52.132003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Diseño del modelo <a name=\"modelo\"></a>\n<div align=\"justify\">Modelo</div>","metadata":{}},{"cell_type":"markdown","source":"# RSNA Efficient-net Baseline","metadata":{}},{"cell_type":"code","source":"import os\nimport cv2\nimport glob\nimport traceback\nimport numpy as np\nimport pandas as pd\nfrom path import Path\nfrom tqdm import tqdm\nimport nibabel as nib\nimport pydicom\nimport tensorflow as tf\nfrom keras import layers\nfrom pydicom import dcmread\nfrom tensorflow import keras\nimport tensorflow_hub as hub\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras import backend as K\nfrom pydicom.data import get_testdata_files\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.model_selection import StratifiedKFold\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2D\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:52.134663Z","iopub.execute_input":"2023-05-05T09:24:52.135032Z","iopub.status.idle":"2023-05-05T09:24:53.723581Z","shell.execute_reply.started":"2023-05-05T09:24:52.134998Z","shell.execute_reply":"2023-05-05T09:24:53.722602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_train_png = '../input/images-preprocessed/images_preprocessed/train_images_preprocessed'","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.738787Z","iopub.execute_input":"2023-05-05T09:24:53.739574Z","iopub.status.idle":"2023-05-05T09:24:53.752736Z","shell.execute_reply.started":"2023-05-05T09:24:53.73952Z","shell.execute_reply":"2023-05-05T09:24:53.75176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport cv2\nfrom PIL import Image","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.75584Z","iopub.execute_input":"2023-05-05T09:24:53.756096Z","iopub.status.idle":"2023-05-05T09:24:53.763672Z","shell.execute_reply.started":"2023-05-05T09:24:53.756072Z","shell.execute_reply":"2023-05-05T09:24:53.762766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom(path, size = 64):\n    try:\n        img=pydicom.dcmread(path)\n        img.PhotometricInterpretation = 'YBR_FULL'\n        data=img.pixel_array\n        data=data-np.min(data)\n        if np.max(data) != 0:\n            data=data/np.max(data)\n        data=(data*255).astype(np.uint8)        \n        return cv2.cvtColor(data.reshape(512, 512), cv2.COLOR_GRAY2RGB)\n    except:        \n        return np.zeros((512, 512, 3))\n    \ndef load_png(path, size = 64):\n    img = Image.open(path).convert(\"RGB\")\n    img = img.resize((size, size))\n    img_array = np.array(img) / 255.0\n    return img_array","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.765185Z","iopub.execute_input":"2023-05-05T09:24:53.765444Z","iopub.status.idle":"2023-05-05T09:24:53.776093Z","shell.execute_reply.started":"2023-05-05T09:24:53.76542Z","shell.execute_reply":"2023-05-05T09:24:53.775209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pydicom\nfrom pydicom import dcmread\nfrom pydicom.data import get_testdata_files\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\n\nimport tensorflow as tf\nfrom keras import layers\nfrom tensorflow import keras\nimport tensorflow_hub as hub\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.layers import Input, Dense, Flatten, Conv2D\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.790535Z","iopub.execute_input":"2023-05-05T09:24:53.79097Z","iopub.status.idle":"2023-05-05T09:24:53.800196Z","shell.execute_reply.started":"2023-05-05T09:24:53.790936Z","shell.execute_reply":"2023-05-05T09:24:53.799289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_indices = train_df_t1.index.tolist()","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.817251Z","iopub.execute_input":"2023-05-05T09:24:53.817608Z","iopub.status.idle":"2023-05-05T09:24:53.825097Z","shell.execute_reply.started":"2023-05-05T09:24:53.817574Z","shell.execute_reply":"2023-05-05T09:24:53.824176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def data_generator():\n    \n    for i in train_indices: \n        \n        idt = train_df_t1.loc[i, 'StudyInstanceUID']\n        path_png = os.path.join(path_train_png, idt)\n            \n        for im in os.listdir(path_png):\n            train_label = []\n            img = load_png(os.path.join(path_png , im))\n                \n            sop_uid = idt+'.1.'+im\n            sop_uid = sop_uid.split(\".png\")[0]\n                \n            if sop_uid in np.array(train_segmented['SOPInstanceUID']):\n                vert_prob = np.array(train_segmented[train_segmented['SOPInstanceUID']==sop_uid][['C1','C2','C3','C4','C5','C6','C7']])\n                vert_prob = vert_prob[0]\n                vert_prob = np.array(vert_prob)\n                \n                train_label.extend([\n                    train_df_t1.loc[i, \"C1\"],\n                    train_df_t1.loc[i, \"C2\"],\n                    train_df_t1.loc[i, \"C3\"],\n                    train_df_t1.loc[i, \"C4\"],\n                    train_df_t1.loc[i, \"C5\"],\n                    train_df_t1.loc[i, \"C6\"],\n                    train_df_t1.loc[i, \"C7\"]\n                ])\n\n                train_label = np.array(train_label)\n\n                fracture_label = vert_prob * train_label\n                \n                    \n                yield (img, vert_prob), fracture_label","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def data_generator_without_vert():\n    \n    for i in train_indices: \n        \n        idt = train_df_t1.loc[i, 'StudyInstanceUID']\n        path_png = os.path.join(path_train_png, idt)\n            \n        for im in os.listdir(path_png):\n            train_label = []\n\n            img = load_png(os.path.join(path_png,im))\n                \n            img = cv2.resize(img, (64 , 64))\n            image = img_to_array(img)\n            image = image / 255.0\n            \n            train_label.extend([\n                train_df_t1.loc[i, \"patient_overall\"],\n                train_df_t1.loc[i, \"C1\"],\n                train_df_t1.loc[i, \"C2\"],\n                train_df_t1.loc[i, \"C3\"],\n                train_df_t1.loc[i, \"C4\"],\n                train_df_t1.loc[i, \"C5\"],\n                train_df_t1.loc[i, \"C6\"],\n                train_df_t1.loc[i, \"C7\"]\n            ])\n                    \n            yield image, train_label\n                ","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.86319Z","iopub.execute_input":"2023-05-05T09:24:53.863621Z","iopub.status.idle":"2023-05-05T09:24:53.87399Z","shell.execute_reply.started":"2023-05-05T09:24:53.863586Z","shell.execute_reply":"2023-05-05T09:24:53.873373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_indices = val_df_t1.index.tolist()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def val_generator():\n    \n    for i in val_indices: \n        \n        idt = val_df_t1.loc[i, 'StudyInstanceUID']\n        path_png = os.path.join(path_train_png, idt)\n            \n        for im in os.listdir(path_png):\n            train_label = []\n            img = load_png(os.path.join(path_png , im))\n                \n            sop_uid = idt+'.1.'+im\n            sop_uid = sop_uid.split(\".png\")[0]\n                \n            if sop_uid in np.array(train_segmented['SOPInstanceUID']):\n                vert_prob = np.array(train_segmented[train_segmented['SOPInstanceUID']==sop_uid][['C1','C2','C3','C4','C5','C6','C7']])\n                vert_prob = vert_prob[0]\n                vert_prob = np.array(vert_prob)\n                \n                train_label.extend([\n                    val_df_t1.loc[i, \"C1\"],\n                    val_df_t1.loc[i, \"C2\"],\n                    val_df_t1.loc[i, \"C3\"],\n                    val_df_t1.loc[i, \"C4\"],\n                    val_df_t1.loc[i, \"C5\"],\n                    val_df_t1.loc[i, \"C6\"],\n                    val_df_t1.loc[i, \"C7\"]\n                ])\n\n                train_label = np.array(train_label)\n\n                fracture_label = vert_prob * train_label\n                \n                    \n                yield (img, vert_prob), fracture_label","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def val_generator_without_vert():\n    \n    for i in val_indices: \n        \n        idt = val_df_t1.loc[i, 'StudyInstanceUID']\n        path_dcm = os.path.join(path_train_images, idt)\n        path_png = os.path.join(path_train_png, idt)\n            \n        for im in os.listdir(path_png):\n            train_label = []\n\n            img = load_png(os.path.join(path_png,im))\n                \n            img = cv2.resize(img, (64 , 64))\n            image = img_to_array(img)\n            image = image / 255.0\n            \n            train_label.extend([\n                val_df_t1.loc[i, \"patient_overall\"],\n                val_df_t1.loc[i, \"C1\"],\n                val_df_t1.loc[i, \"C2\"],\n                val_df_t1.loc[i, \"C3\"],\n                val_df_t1.loc[i, \"C4\"],\n                val_df_t1.loc[i, \"C5\"],\n                val_df_t1.loc[i, \"C6\"],\n                val_df_t1.loc[i, \"C7\"]\n            ])\n                    \n            yield image, train_label\n                ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model():\n    inp1 = keras.layers.Input(shape=(None, None, 1), name='image')\n    inp2 = keras.layers.Input(shape=(7,), name='vert_prob')\n    \n    x = Conv2D(3, 3, padding='SAME')(inp1)\n    \n    x = keras.applications.efficientnet.EfficientNetB5(include_top=False)(x)\n    x = keras.layers.GlobalAveragePooling2D()(x)\n    x = keras.layers.BatchNormalization()(x)\n    \n    x2 = keras.layers.Dense(32, activation='relu')(inp2)\n    \n    x = keras.layers.concatenate([x, x2])\n    \n    x = keras.layers.Dropout(0.2)(x)\n    \n    out = keras.layers.Dense(7, 'sigmoid')(x)\n    \n    model = keras.models.Model(inputs=[inp1, inp2], outputs=out)\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.909691Z","iopub.execute_input":"2023-05-05T09:24:53.909976Z","iopub.status.idle":"2023-05-05T09:24:53.920194Z","shell.execute_reply.started":"2023-05-05T09:24:53.909951Z","shell.execute_reply":"2023-05-05T09:24:53.91929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model_without_vert():\n    inp = keras.layers.Input(shape=(None, None, 1), name='image')\n    \n    x = Conv2D(3, 3, padding='SAME')(inp)\n    \n    x = keras.applications.EfficientNetV2.pretrained()(x)\n    \n    x = keras.layers.GlobalAveragePooling2D()(x)\n    \n    x = keras.layers.Dense(16, activation='relu')(x)\n    x = keras.layers.Dropout(0.2)(x)\n    out = keras.layers.Dense(8, 'softmax')(x)\n    \n    model = keras.models.Model(inputs=inp, outputs=out)\n    \n    return model","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.92258Z","iopub.execute_input":"2023-05-05T09:24:53.923315Z","iopub.status.idle":"2023-05-05T09:24:53.931753Z","shell.execute_reply.started":"2023-05-05T09:24:53.923278Z","shell.execute_reply":"2023-05-05T09:24:53.930813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import traceback\nfrom sklearn.model_selection import StratifiedKFold","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.945237Z","iopub.execute_input":"2023-05-05T09:24:53.945673Z","iopub.status.idle":"2023-05-05T09:24:53.953098Z","shell.execute_reply.started":"2023-05-05T09:24:53.945635Z","shell.execute_reply":"2023-05-05T09:24:53.952201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def configure_for_performance(data):\n    data = data.cache()\n    data = data.batch(8)\n    data = data.prefetch(buffer_size=tf.data.AUTOTUNE)\n    return data","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:56.435974Z","iopub.execute_input":"2023-05-05T09:24:56.436324Z","iopub.status.idle":"2023-05-05T09:24:56.442659Z","shell.execute_reply.started":"2023-05-05T09:24:56.436289Z","shell.execute_reply":"2023-05-05T09:24:56.441588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = tf.data.Dataset.from_generator(data_generator, ((tf.float32, tf.int8), tf.int8))","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.967304Z","iopub.execute_input":"2023-05-05T09:24:53.967666Z","iopub.status.idle":"2023-05-05T09:24:53.975995Z","shell.execute_reply.started":"2023-05-05T09:24:53.967632Z","shell.execute_reply":"2023-05-05T09:24:53.975071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data = configure_for_performance(train_data)","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:56.444612Z","iopub.execute_input":"2023-05-05T09:24:56.44534Z","iopub.status.idle":"2023-05-05T09:24:56.452288Z","shell.execute_reply.started":"2023-05-05T09:24:56.445303Z","shell.execute_reply":"2023-05-05T09:24:56.451343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_data = tf.data.Dataset.from_generator(val_generator, ((tf.float32, tf.int8), tf.int8))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_data = configure_for_performance(val_data)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train_data_wv = tf.data.Dataset.from_generator(data_generator_without_vert, (tf.float32, tf.int8))","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:53.977694Z","iopub.execute_input":"2023-05-05T09:24:53.978035Z","iopub.status.idle":"2023-05-05T09:24:56.434629Z","shell.execute_reply.started":"2023-05-05T09:24:53.978001Z","shell.execute_reply":"2023-05-05T09:24:56.433675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train_data_wv = configure_for_performance(train_data_wv)","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:56.453942Z","iopub.execute_input":"2023-05-05T09:24:56.454351Z","iopub.status.idle":"2023-05-05T09:24:56.46764Z","shell.execute_reply.started":"2023-05-05T09:24:56.454316Z","shell.execute_reply":"2023-05-05T09:24:56.46675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#val_data_wv = tf.data.Dataset.from_generator(val_generator_without_vert, (tf.float32, tf.int8))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#val_data_wv = configure_for_performance(val_data_wv)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model_wv = get_model_without_vert()\n#model_wv.summary()","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:24:56.469278Z","iopub.execute_input":"2023-05-05T09:24:56.469722Z","iopub.status.idle":"2023-05-05T09:25:06.095558Z","shell.execute_reply.started":"2023-05-05T09:24:56.469688Z","shell.execute_reply":"2023-05-05T09:25:06.094595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.callbacks import ModelCheckpoint\nfrom tensorflow.keras.callbacks import EarlyStopping\n\ncheckpoint_filepath = 'p1_best_model_efficientnetb5.h5'\n\nmodel_checkpoint_callback = ModelCheckpoint(\n    checkpoint_filepath,\n    save_best_only=True,\n    monitor='val_accuracy',\n    mode='max',\n    verbose=1)\n\nearly_stopping = EarlyStopping(monitor='val_loss', \n                               min_delta=0, \n                               patience=5, \n                               verbose=1)\n\ncallbacks = [early_stopping, model_checkpoint_callback]","metadata":{"execution":{"iopub.status.busy":"2023-05-06T06:50:55.680715Z","iopub.execute_input":"2023-05-06T06:50:55.681332Z","iopub.status.idle":"2023-05-06T06:51:01.359042Z","shell.execute_reply.started":"2023-05-06T06:50:55.681246Z","shell.execute_reply":"2023-05-06T06:51:01.358091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"model_wv.compile(optimizer=tf.keras.optimizers.Adam(), \n              loss=tf.keras.losses.CategoricalCrossentropy(),\n              metrics=[tf.keras.metrics.CategoricalAccuracy()]\n             )\"\"\"","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:25:06.097032Z","iopub.execute_input":"2023-05-05T09:25:06.097389Z","iopub.status.idle":"2023-05-05T09:25:06.123834Z","shell.execute_reply.started":"2023-05-05T09:25:06.097343Z","shell.execute_reply":"2023-05-05T09:25:06.122958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#hist = model_wv.fit(train_data_wv, validation_data=val_data_wv, epochs = 25, callbacks=callbacks)","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:25:06.125295Z","iopub.execute_input":"2023-05-05T09:25:06.125687Z","iopub.status.idle":"2023-05-05T09:34:47.511592Z","shell.execute_reply.started":"2023-05-05T09:25:06.125651Z","shell.execute_reply":"2023-05-05T09:34:47.510477Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model_wv.fit(val_data_wv, epochs=2)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model_wv.save('t3_model_without_vert_efficientnetb5.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model = get_model()\n    \n#hist = model.fit(train_data, steps_per_epoch=len(train_indices) // batch_size, epochs = 2)","metadata":{"execution":{"iopub.status.busy":"2023-05-05T09:34:47.513332Z","iopub.execute_input":"2023-05-05T09:34:47.513763Z","iopub.status.idle":"2023-05-05T09:34:47.518158Z","shell.execute_reply.started":"2023-05-05T09:34:47.513715Z","shell.execute_reply":"2023-05-05T09:34:47.517143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = get_model()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer=tf.keras.optimizers.Adam(), \n                loss=tf.keras.losses.BinaryCrossentropy(),\n                metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.AUC(multi_label=True)]\n                )","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_data, validation_data=val_data, epochs = 25, callbacks=callbacks)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"try:\n    model.load_weights('/kaggle/working/p1_best_model_efficientnetb5.h5')\nexcept:\n    print(\"No se han cargado los pesos\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(val_data, epochs=2)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save('p1_model_efficientnetb5.h5')","metadata":{},"execution_count":null,"outputs":[]}]}