{"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":"raw","source":"Transfer learning model","metadata":{}},{"cell_type":"code","source":"pip install plot-keras-history","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:09:14.959336Z","iopub.execute_input":"2023-07-03T09:09:14.959779Z","iopub.status.idle":"2023-07-03T09:09:31.274386Z","shell.execute_reply.started":"2023-07-03T09:09:14.959734Z","shell.execute_reply":"2023-07-03T09:09:31.27282Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow.keras as keras\nfrom collections import defaultdict\nimport warnings\nfrom plot_keras_history import show_history, plot_history\nimport matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:09:31.276999Z","iopub.execute_input":"2023-07-03T09:09:31.277386Z","iopub.status.idle":"2023-07-03T09:09:36.422632Z","shell.execute_reply.started":"2023-07-03T09:09:31.277344Z","shell.execute_reply":"2023-07-03T09:09:36.421742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training = keras.preprocessing.image_dataset_from_directory(directory = '/kaggle/input/data-binary/data/train')","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:09:36.424021Z","iopub.execute_input":"2023-07-03T09:09:36.424389Z","iopub.status.idle":"2023-07-03T09:12:04.330781Z","shell.execute_reply.started":"2023-07-03T09:09:36.424351Z","shell.execute_reply":"2023-07-03T09:12:04.329651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation = keras.preprocessing.image_dataset_from_directory(directory = '/kaggle/input/data-binary/data/valid')","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:12:04.332232Z","iopub.execute_input":"2023-07-03T09:12:04.332616Z","iopub.status.idle":"2023-07-03T09:18:22.037869Z","shell.execute_reply.started":"2023-07-03T09:12:04.332575Z","shell.execute_reply":"2023-07-03T09:18:22.036919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = keras.preprocessing.image_dataset_from_directory(directory = '/kaggle/input/data-binary/data/test', shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:18:22.041333Z","iopub.execute_input":"2023-07-03T09:18:22.041695Z","iopub.status.idle":"2023-07-03T09:26:18.672131Z","shell.execute_reply.started":"2023-07-03T09:18:22.041655Z","shell.execute_reply":"2023-07-03T09:26:18.671087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Instanciamos el modelo","metadata":{}},{"cell_type":"code","source":"models = defaultdict(None)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:18.673848Z","iopub.execute_input":"2023-07-03T09:26:18.674222Z","iopub.status.idle":"2023-07-03T09:26:18.678949Z","shell.execute_reply.started":"2023-07-03T09:26:18.67416Z","shell.execute_reply":"2023-07-03T09:26:18.678089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\n\nweights = \"imagenet\"  # TPesos que de la red\ninclude_top = False  # Si queremos incluir las capas al principio de la red\ninput_shape=(256, 256, 3)\narguments = {\"weights\": weights, \"include_top\": include_top, \"input_shape\": input_shape}\nmodels[\"Transfer learning\"] = tf.keras.applications.Xception(**arguments)\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:18.680372Z","iopub.execute_input":"2023-07-03T09:26:18.681096Z","iopub.status.idle":"2023-07-03T09:26:23.551682Z","shell.execute_reply.started":"2023-07-03T09:26:18.681047Z","shell.execute_reply":"2023-07-03T09:26:23.550509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Congelar las capas del modelo base para evitar que se actualicen durante el entrenamiento","metadata":{}},{"cell_type":"code","source":"models[\"Transfer learning\"].trainable = False","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.553111Z","iopub.execute_input":"2023-07-03T09:26:23.553513Z","iopub.status.idle":"2023-07-03T09:26:23.565614Z","shell.execute_reply.started":"2023-07-03T09:26:23.553471Z","shell.execute_reply":"2023-07-03T09:26:23.564386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Extraemos el vector de características profundas aplanando la salida.","metadata":{}},{"cell_type":"code","source":"x = models[\"Transfer learning\"].output\narguments = {\"data_format\": \"channels_last\"}\nx = keras.layers.Flatten(**arguments)(x)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.567382Z","iopub.execute_input":"2023-07-03T09:26:23.567786Z","iopub.status.idle":"2023-07-03T09:26:23.577884Z","shell.execute_reply.started":"2023-07-03T09:26:23.567745Z","shell.execute_reply":"2023-07-03T09:26:23.577047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Añadimos la capa completamente conectada y la capa de salida.","metadata":{}},{"cell_type":"markdown","source":"Cuando utilizas la activación sigmoid y estableces units en 1, la capa de salida generará una única unidad de salida con un valor en el rango [0, 1]. Este valor representa la probabilidad de que la muestra pertenezca a la clase positiva (en tu caso, \"Embolia\"). Un valor cercano a 0 indica una baja probabilidad de pertenencia a la clase positiva, mientras que un valor cercano a 1 indica una alta probabilidad.\n\nEn cambio, cuando utilizas la activación softmax y estableces units en 2, la capa de salida generará dos unidades de salida, una para cada clase (\"Embolia\" y \"No embolia\"). La activación softmax aplica una función exponencial a los valores de salida, normalizándolos para que sumen 1 y generen una distribución de probabilidad. Cada valor de salida representará la probabilidad de que la muestra pertenezca a la clase correspondiente. La clase con la probabilidad más alta será la clase asignada a la muestra.","metadata":{}},{"cell_type":"code","source":"units = 128\nactivation = \"relu\"\narguments = {\"units\": units, \"activation\": activation} \nx = keras.layers.Dense(**arguments)(x)\n\nunits = 1\nactivation = \"sigmoid\"\narguments = {\"units\": units, \"activation\": activation} \noutputs = keras.layers.Dense(**arguments)(x)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.579505Z","iopub.execute_input":"2023-07-03T09:26:23.579912Z","iopub.status.idle":"2023-07-03T09:26:23.603508Z","shell.execute_reply.started":"2023-07-03T09:26:23.579874Z","shell.execute_reply":"2023-07-03T09:26:23.602684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Agurpamos todo","metadata":{}},{"cell_type":"code","source":"inputs = models[\"Transfer learning\"].input\narguments = {\"inputs\": inputs, \"outputs\": outputs}\nmodels[\"Transfer learning\"] = keras.Model(**arguments)\nmodels[\"Transfer learning\"].summary()","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.605537Z","iopub.execute_input":"2023-07-03T09:26:23.605901Z","iopub.status.idle":"2023-07-03T09:26:23.67589Z","shell.execute_reply.started":"2023-07-03T09:26:23.605865Z","shell.execute_reply":"2023-07-03T09:26:23.675125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Compilamos","metadata":{}},{"cell_type":"code","source":"histories = defaultdict(None)  # Dictionary with the histories","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.677289Z","iopub.execute_input":"2023-07-03T09:26:23.677642Z","iopub.status.idle":"2023-07-03T09:26:23.684593Z","shell.execute_reply.started":"2023-07-03T09:26:23.677604Z","shell.execute_reply":"2023-07-03T09:26:23.683728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss = keras.losses.BinaryCrossentropy()\n\nmodels[\"Transfer learning\"].compile(loss=loss,\n              optimizer=keras.optimizers.Adam(1e-3),\n              metrics=[keras.metrics.AUC(),keras.metrics.Precision(),\n                       keras.metrics.Recall()])","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.685802Z","iopub.execute_input":"2023-07-03T09:26:23.686384Z","iopub.status.idle":"2023-07-03T09:26:23.731001Z","shell.execute_reply.started":"2023-07-03T09:26:23.686355Z","shell.execute_reply":"2023-07-03T09:26:23.730105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"histories['Transfer learning'] = models['Transfer learning'].fit(training, epochs=7, validation_data=validation, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T09:26:23.734911Z","iopub.execute_input":"2023-07-03T09:26:23.735179Z","iopub.status.idle":"2023-07-03T14:33:25.110313Z","shell.execute_reply.started":"2023-07-03T09:26:23.735152Z","shell.execute_reply":"2023-07-03T14:33:25.109319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" models['Transfer learning'].save('/kaggle/working/model-Xception-TransferLearning.h5')","metadata":{"execution":{"iopub.status.busy":"2023-07-03T14:33:25.113052Z","iopub.execute_input":"2023-07-03T14:33:25.113711Z","iopub.status.idle":"2023-07-03T14:33:25.804861Z","shell.execute_reply.started":"2023-07-03T14:33:25.113662Z","shell.execute_reply":"2023-07-03T14:33:25.803677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for model in histories:\n    # Plot the model training history\n    history = histories[model]\n    plot_history(history)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T14:33:25.806236Z","iopub.execute_input":"2023-07-03T14:33:25.806606Z","iopub.status.idle":"2023-07-03T14:33:26.980737Z","shell.execute_reply.started":"2023-07-03T14:33:25.806565Z","shell.execute_reply":"2023-07-03T14:33:26.979672Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Evaluamos el modelo","metadata":{}},{"cell_type":"code","source":"models[\"Transfer learning\"].evaluate(test, batch_size=128)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T14:33:26.981948Z","iopub.execute_input":"2023-07-03T14:33:26.982298Z","iopub.status.idle":"2023-07-03T15:46:38.981092Z","shell.execute_reply.started":"2023-07-03T14:33:26.982247Z","shell.execute_reply":"2023-07-03T15:46:38.979619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"loss:0.4034944474697113 AUC:0.9030622839927673 precision:0.16790111362934113 recall:0.8929089307785034\")","metadata":{"execution":{"iopub.status.busy":"2023-07-03T15:46:38.982659Z","iopub.execute_input":"2023-07-03T15:46:38.983474Z","iopub.status.idle":"2023-07-03T15:46:38.989041Z","shell.execute_reply.started":"2023-07-03T15:46:38.98344Z","shell.execute_reply":"2023-07-03T15:46:38.987682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_proba = model.predict_proba(test)","metadata":{"execution":{"iopub.status.busy":"2023-07-03T15:46:38.99041Z","iopub.execute_input":"2023-07-03T15:46:38.990773Z","iopub.status.idle":"2023-07-03T15:46:39.353203Z","shell.execute_reply.started":"2023-07-03T15:46:38.990735Z","shell.execute_reply":"2023-07-03T15:46:39.351332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_proba[:,0]","metadata":{"execution":{"iopub.status.busy":"2023-07-03T15:46:39.354469Z","iopub.status.idle":"2023-07-03T15:46:39.355181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}