{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":7172215,"sourceType":"datasetVersion","datasetId":4144025}],"dockerImageVersionId":30587,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn.metrics import precision_score, recall_score, accuracy_score\nfrom sklearn.preprocessing import LabelEncoder\nfrom tensorflow.keras.losses import SparseCategoricalCrossentropy\nimport tensorflow as tf\nfrom tensorflow.keras.regularizers import l2\nimport warnings\nimport cv2\nimport seaborn as sns\nimport glob\nfrom skimage import io\nimport PIL.Image\nimport matplotlib.pyplot as plt\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:40:47.081444Z","iopub.execute_input":"2023-12-11T02:40:47.082472Z","iopub.status.idle":"2023-12-11T02:40:47.089791Z","shell.execute_reply.started":"2023-12-11T02:40:47.082441Z","shell.execute_reply":"2023-12-11T02:40:47.088775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"main_fol = \"/kaggle/input/UBC-OCEAN/\"\ntrain = pd.read_csv(r\"/kaggle/input/UBC-OCEAN/train.csv\")\ntest = pd.read_csv(r\"/kaggle/input/UBC-OCEAN/test.csv\")\ntrain = pd.read_csv(r\"/kaggle/input/UBC-OCEAN/train.csv\")\ntrain_img = glob.glob(main_fol + \"/train_images/*.png\")\ntrain_img_thumb = glob.glob(main_fol + \"/train_thumbnails/*.png\")\ntrain_images_dir = '/kaggle/input/UBC-OCEAN/train_images/'\nthumbnail_images_dir = '/kaggle/input/UBC-OCEAN/train_thumbnails/'\ntest_images_dir = '/kaggle/input/UBC-OCEAN/test_images/'\ntest_thumbnail_dir = '/kaggle/input/UBC-OCEAN/train_thumbnails/'\nweights_path = '/kaggle/input/modelo/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'\n","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:53:52.737501Z","iopub.execute_input":"2023-12-11T02:53:52.738179Z","iopub.status.idle":"2023-12-11T02:53:52.75644Z","shell.execute_reply.started":"2023-12-11T02:53:52.738146Z","shell.execute_reply":"2023-12-11T02:53:52.755664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"PIL.Image.MAX_IMAGE_PIXELS = None\n","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:53:55.304364Z","iopub.execute_input":"2023-12-11T02:53:55.305274Z","iopub.status.idle":"2023-12-11T02:53:55.309191Z","shell.execute_reply.started":"2023-12-11T02:53:55.305233Z","shell.execute_reply":"2023-12-11T02:53:55.30822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_tma = train[train[\"is_tma\"] == True]\ntrain_no_tma = train[train[\"is_tma\"] == False]\ntrain_tma.loc[:, 'img_id_ext'] = train_tma['image_id'].apply(lambda i: str(i) + \".png\")\ntrain_no_tma.loc[:, 'img_id_ext'] = train_no_tma['image_id'].apply(lambda i: str(i) + \"_thumbnail.png\")\n\ntest['img_id_ext']=[str(i)+\"_thumbnail.png\" for i in test['image_id']]\ntrain_df = pd.concat([train_tma, train_no_tma])\ntrain_df.sort_index(ascending = True, inplace = True)\n   ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-12-11T02:40:59.612796Z","iopub.execute_input":"2023-12-11T02:40:59.613552Z","iopub.status.idle":"2023-12-11T02:40:59.626584Z","shell.execute_reply.started":"2023-12-11T02:40:59.613517Z","shell.execute_reply":"2023-12-11T02:40:59.62578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### **Explorar el dataset**","metadata":{}},{"cell_type":"code","source":"train_data, valid_data = train_test_split(train_df, test_size=0.2, stratify=train_df[\"label\"], random_state=42)\ntrain_data['label'] = train_data['label'].astype(str)\nvalid_data['label'] = valid_data['label'].astype(str)\ntrain_data['full_path'] = train_data.apply(lambda row: os.path.join(train_images_dir if row['is_tma'] else thumbnail_images_dir, row['img_id_ext']), axis=1)    \nvalid_data['full_path'] = valid_data.apply(lambda row: os.path.join(train_images_dir if row['is_tma'] else thumbnail_images_dir, row['img_id_ext']), axis=1)  \ntest.sort_index(ascending = True, inplace = True)\ntest['full_path'] = test.apply(lambda row: os.path.join(test_images_dir, str(row['image_id']) + \".png\"), axis=1)  \n\nIMAGE_SIZE = (1000, 1000)\nBATCH_SIZE = 8\nEPOCHS = 15\n","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:41:03.013534Z","iopub.execute_input":"2023-12-11T02:41:03.013929Z","iopub.status.idle":"2023-12-11T02:41:03.038402Z","shell.execute_reply.started":"2023-12-11T02:41:03.013898Z","shell.execute_reply":"2023-12-11T02:41:03.037592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n        rescale=1./255,\n        rotation_range=10,\n        width_shift_range=0.2,\n        height_shift_range=0.2,\n        shear_range=0.2,\n        zoom_range=0.2,\n        horizontal_flip=True,\n        fill_mode='nearest'\n)\nval_datagen = ImageDataGenerator(\n        rescale=1./255,\n)\ntrain_generator = train_datagen.flow_from_dataframe(\n        dataframe=train_data,\n        x_col='full_path',\n        y_col='label',\n        subset='training',\n        batch_size=BATCH_SIZE,\n        seed=42,\n        shuffle=True,\n        class_mode='categorical',\n        validate_filenames=True,\n        target_size=IMAGE_SIZE\n)\n\nvalid_generator = val_datagen.flow_from_dataframe(\n    dataframe=valid_data,\n    x_col='full_path',\n    y_col='label',\n    batch_size=BATCH_SIZE,\n    seed=42,\n    shuffle=False,\n    class_mode='categorical',\n    target_size=IMAGE_SIZE\n)\n\ntest_generator = val_datagen.flow_from_dataframe(\n    dataframe=test,\n    x_col='full_path',\n    y_col=None,  # No hay etiquetas en el conjunto de prueba\n    batch_size=BATCH_SIZE,\n    seed=42,\n    shuffle=False,  # No mezclar los datos de prueba\n    class_mode=None,  # No hay etiquetas en el conjunto de prueba\n    target_size=IMAGE_SIZE\n)","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:41:05.653287Z","iopub.execute_input":"2023-12-11T02:41:05.654056Z","iopub.status.idle":"2023-12-11T02:41:06.000136Z","shell.execute_reply.started":"2023-12-11T02:41:05.65402Z","shell.execute_reply":"2023-12-11T02:41:05.999326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.callbacks import ReduceLROnPlateau, ModelCheckpoint\nnum_classes = train_df['label'].nunique()\n\nlr_reduce = ReduceLROnPlateau(monitor=\"val_accuracy\", factor=0.5, min_delta=0.0001, patience=1, verbose=1)\nfilepath = \"weights.hdf5\"\ncheckpoint = ModelCheckpoint(filepath, monitor=\"val_accuracy\", verbose=1, save_best_only=True, mode=\"max\")\nbase_model = tf.keras.applications.ResNet50(weights=None, include_top=False, input_shape=(224, 224, 3))\nbase_model.load_weights(weights_path)\nmodel = tf.keras.Sequential([\n    base_model,\n    tf.keras.layers.GlobalAveragePooling2D(),\n    tf.keras.layers.Dropout(0.7),  # Capa de Dropout\n    tf.keras.layers.Dense(num_classes, kernel_regularizer=l2(0.01), activation='softmax')  # Regularización L2\n])\n# Compile the model\nmodel.compile(optimizer=Adam(learning_rate=3e-4), loss='categorical_crossentropy', metrics=['accuracy'])\n# Entrenar el modelo\nhistory = model.fit(\n    train_generator,\n    epochs=EPOCHS,  # Ajustar según sea necesario\n    validation_data=valid_generator,\n    callbacks=[lr_reduce, checkpoint]\n)\nmodel.save('ovarian_cancer_classifier.h5')\nvalidation_loss, validation_accuracy = model.evaluate(valid_generator)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:53:59.630906Z","iopub.execute_input":"2023-12-11T02:53:59.631265Z","iopub.status.idle":"2023-12-11T02:55:02.027719Z","shell.execute_reply.started":"2023-12-11T02:53:59.631239Z","shell.execute_reply":"2023-12-11T02:55:02.026143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_prediction = model.predict(test_generator)\nlabel_map = train_generator.class_indices\nindex_map = {v: k for k, v in label_map.items()}\n\n# Convertir las predicciones en etiquetas\ntrain_predictions_label = [np.argmax(prediction) for prediction in test_prediction]\ntrain_predictions_label = [index_map[i] for i in train_predictions_label]\n\n# Crear un DataFrame para la presentación\nsubmission_df = pd.DataFrame({\n    'image_id': test['image_id'],\n    'label': train_predictions_label\n})\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-12-11T02:55:18.310248Z","iopub.execute_input":"2023-12-11T02:55:18.310595Z","iopub.status.idle":"2023-12-11T02:55:48.310495Z","shell.execute_reply.started":"2023-12-11T02:55:18.310569Z","shell.execute_reply":"2023-12-11T02:55:48.309546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}