{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":18647,"databundleVersionId":1126921,"sourceType":"competition"},{"sourceId":187731,"sourceType":"datasetVersion","datasetId":80814},{"sourceId":1153338,"sourceType":"datasetVersion","datasetId":636745}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import json\nimport math\nimport cv2\nimport PIL\nfrom PIL import Image\nimport numpy as np\nfrom keras import layers\nfrom keras.applications import DenseNet121, VGG16\nfrom keras.callbacks import Callback, ModelCheckpoint\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential\nfrom keras.optimizers import Adam\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import cohen_kappa_score, accuracy_score\nimport scipy\nimport tensorflow as tf\nfrom tqdm import tqdm\nfrom sklearn.metrics import f1_score\n%matplotlib inline","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:10:08.756969Z","iopub.execute_input":"2024-12-07T19:10:08.757643Z","iopub.status.idle":"2024-12-07T19:10:08.76486Z","shell.execute_reply.started":"2024-12-07T19:10:08.757605Z","shell.execute_reply":"2024-12-07T19:10:08.763949Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport os\n# There are two ways to load the data from the PANDA dataset:\n# Option 1: Load images using openslide\nimport openslide\n# Option 2: Load images using skimage (requires that tifffile is installed)\nimport skimage.io\n# General packages\nfrom IPython.display import display\n# Plotly for the interactive viewer (see last section)\nimport plotly.graph_objs as go\n\nBATCH_SIZE = 15\nTRAIN_VAL_RATIO = 0.27\nEPOCHS = 11\nLR = 0.00010409613402110064\n\ntrain_df = pd.read_csv('../input/prostate-cancer-grade-assessment/train.csv')\ntest_df = pd.read_csv('../input/prostate-cancer-grade-assessment/test.csv')\nprint(train_df.shape)\nprint(test_df.shape)\ntrain_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:10:09.859449Z","iopub.execute_input":"2024-12-07T19:10:09.860279Z","iopub.status.idle":"2024-12-07T19:10:09.890736Z","shell.execute_reply.started":"2024-12-07T19:10:09.860243Z","shell.execute_reply":"2024-12-07T19:10:09.889856Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def preprocess_image(image_path, desired_size=224):\n    biopsy = openslide.OpenSlide(image_path)\n    im = np.array(biopsy.get_thumbnail(size=(desired_size,desired_size)))\n    im = Image.fromarray(im)\n    im = im.resize((desired_size,desired_size)) \n    im = np.array(im)\n    return im","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:10:11.412093Z","iopub.execute_input":"2024-12-07T19:10:11.412505Z","iopub.status.idle":"2024-12-07T19:10:11.418632Z","shell.execute_reply.started":"2024-12-07T19:10:11.412472Z","shell.execute_reply":"2024-12-07T19:10:11.417501Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# get the number of training images from the target\\id dataset\nN = train_df.shape[0]\n# create an empty matrix for storing the images\nx_train = np.empty((N, 224, 224, 3), dtype=np.uint8)\n# loop through the images from the images ids from the target\\id dataset\n# then grab the cooresponding image from disk, pre-process, and store in matrix in memory\nfor i, image_id in enumerate(tqdm(train_df['image_id'])):\n    x_train[i, :, :, :] = preprocess_image(\n        f'../input/prostate-cancer-grade-assessment/train_images/{image_id}.tiff'\n    )\n\ny_train = pd.get_dummies(train_df['isup_grade']).values\n\nprint(x_train.shape)\nprint(y_train.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:10:12.631396Z","iopub.execute_input":"2024-12-07T19:10:12.632141Z","iopub.status.idle":"2024-12-07T19:38:33.382882Z","shell.execute_reply.started":"2024-12-07T19:10:12.632102Z","shell.execute_reply":"2024-12-07T19:38:33.381748Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Further target pre-processing\n\n# Instead of predicting a single label, we will change our target to be a multilabel problem; \n# i.e., if the target is a certain class, then it encompasses all the classes before it. \n# E.g. encoding a class 4 retinopathy would usually be [0, 0, 0, 1], \n# but in our case we will predict [1, 1, 1, 1]. For more details, \n# please check out Lex's kernel.\n\ny_train_multi = np.empty(y_train.shape, dtype=y_train.dtype)\ny_train_multi[:, 5] = y_train[:, 5]\n\nfor i in range(4, -1, -1):\n    y_train_multi[:, i] = np.logical_or(y_train[:, i], y_train_multi[:, i+1])\n\nprint(\"Original y_train:\", y_train.sum(axis=0))\nprint(\"Multilabel version:\", y_train_multi.sum(axis=0))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:38:35.419564Z","iopub.execute_input":"2024-12-07T19:38:35.420073Z","iopub.status.idle":"2024-12-07T19:38:35.4356Z","shell.execute_reply.started":"2024-12-07T19:38:35.420035Z","shell.execute_reply":"2024-12-07T19:38:35.43455Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"x_train, x_val, y_train, y_val = train_test_split(\n    x_train, y_train_multi, \n    test_size=TRAIN_VAL_RATIO, \n    random_state=2020\n)\n\ndef create_datagen():\n    return ImageDataGenerator(\n        zoom_range=0.15,  # set range for random zoom\n        # set mode for filling points outside the input boundaries\n        fill_mode='constant',\n        cval=0.,  # value used for fill_mode = \"constant\"\n        horizontal_flip=True,  # randomly flip images\n        vertical_flip=True,  # randomly flip images\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:38:37.535088Z","iopub.execute_input":"2024-12-07T19:38:37.535458Z","iopub.status.idle":"2024-12-07T19:38:38.004333Z","shell.execute_reply.started":"2024-12-07T19:38:37.535425Z","shell.execute_reply":"2024-12-07T19:38:38.003037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras import backend as K\n\n\ndef precision_m(y_true, y_pred):\n    y_true = K.cast(y_true, 'float32')\n    y_pred = K.cast(y_pred, 'float32')\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))\n    precision = true_positives / (predicted_positives + K.epsilon())\n    return precision\n\ndef recall_m(y_true, y_pred):\n    y_true = K.cast(y_true, 'float32')\n    y_pred = K.cast(y_pred, 'float32')\n    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))\n    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))\n    recall = true_positives / (possible_positives + K.epsilon())\n    return recall\n\ndef f1_m(y_true, y_pred):\n    precision = precision_m(y_true, y_pred)\n    recall = recall_m(y_true, y_pred)\n    return 2 * ((precision * recall) / (precision + recall + K.epsilon()))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:38:39.20055Z","iopub.execute_input":"2024-12-07T19:38:39.201603Z","iopub.status.idle":"2024-12-07T19:38:39.21124Z","shell.execute_reply.started":"2024-12-07T19:38:39.201537Z","shell.execute_reply":"2024-12-07T19:38:39.210146Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## DenseNet121","metadata":{}},{"cell_type":"code","source":"# Using original generator\ndata_generator = create_datagen().flow(x_train, y_train, batch_size=BATCH_SIZE, seed=2019)\n\ndensenet = DenseNet121(\n    weights='../input/densenet-keras/DenseNet-BC-121-32-no-top.h5',\n    include_top=False,\n    input_shape=(224,224,3)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:32:16.070317Z","iopub.execute_input":"2024-12-07T18:32:16.070589Z","iopub.status.idle":"2024-12-07T18:32:22.125463Z","shell.execute_reply.started":"2024-12-07T18:32:16.070562Z","shell.execute_reply":"2024-12-07T18:32:22.124661Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model(LR=LR):\n    model = Sequential()\n    model.add(densenet)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dropout(0.80))\n    model.add(layers.Dense(128, activation='relu'))\n    model.add(layers.Dropout(0.3))\n    model.add(layers.Dense(64, activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dense(6, activation='sigmoid'))\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=Adam(learning_rate=LR),\n        metrics=['accuracy', f1_m,precision_m, recall_m]\n    )\n    \n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:32:22.126736Z","iopub.execute_input":"2024-12-07T18:32:22.127014Z","iopub.status.idle":"2024-12-07T18:32:22.133964Z","shell.execute_reply.started":"2024-12-07T18:32:22.126988Z","shell.execute_reply":"2024-12-07T18:32:22.13307Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = build_model()\nmodel.summary()\n\nx_train.shape[0]// BATCH_SIZE\n\nhistory = model.fit(\n    data_generator,\n    steps_per_epoch=x_train.shape[0] // BATCH_SIZE,\n    epochs=EPOCHS,\n    validation_data=(x_val, y_val)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:32:22.138112Z","iopub.execute_input":"2024-12-07T18:32:22.138353Z","iopub.status.idle":"2024-12-07T18:46:06.09516Z","shell.execute_reply.started":"2024-12-07T18:32:22.13833Z","shell.execute_reply":"2024-12-07T18:46:06.09428Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df[['loss', 'val_loss']].plot()\nhistory_df[['accuracy', 'val_accuracy']].plot()\nhistory_df[['precision_m', 'val_precision_m']].plot()\nhistory_df[['recall_m', 'val_recall_m']].plot()\nhistory_df[['f1_m', 'val_f1_m']].plot()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:46:06.097185Z","iopub.execute_input":"2024-12-07T18:46:06.097502Z","iopub.status.idle":"2024-12-07T18:46:08.022042Z","shell.execute_reply.started":"2024-12-07T18:46:06.097471Z","shell.execute_reply":"2024-12-07T18:46:08.021185Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## VGG16","metadata":{}},{"cell_type":"code","source":"# Using original generator\ndata_generator = create_datagen().flow(x_train, y_train, batch_size=BATCH_SIZE, seed=2019)\n\ndensenet = VGG16(\n    weights='imagenet',\n    include_top=False,\n    input_shape=(224,224,3)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:55:02.36085Z","iopub.execute_input":"2024-12-07T18:55:02.361762Z","iopub.status.idle":"2024-12-07T18:55:05.789965Z","shell.execute_reply.started":"2024-12-07T18:55:02.361723Z","shell.execute_reply":"2024-12-07T18:55:05.789121Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model(LR=LR):\n    model = Sequential()\n    model.add(densenet)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dropout(0.80))\n    model.add(layers.Dense(128, activation='relu'))\n    model.add(layers.Dropout(0.3))\n    model.add(layers.Dense(64, activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dense(6, activation='sigmoid'))\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=Adam(learning_rate=LR),\n        metrics=['accuracy', f1_m,precision_m, recall_m]\n    )\n    \n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:55:05.791578Z","iopub.execute_input":"2024-12-07T18:55:05.79191Z","iopub.status.idle":"2024-12-07T18:55:05.797778Z","shell.execute_reply.started":"2024-12-07T18:55:05.79188Z","shell.execute_reply":"2024-12-07T18:55:05.796875Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"modelVGG = build_model()\nmodelVGG.summary()\n\nx_train.shape[0]// BATCH_SIZE\n\nhistoryVGG = modelVGG.fit(\n    data_generator,\n    steps_per_epoch=x_train.shape[0] // BATCH_SIZE,\n    epochs=EPOCHS,\n    validation_data=(x_val, y_val)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:55:05.798798Z","iopub.execute_input":"2024-12-07T18:55:05.799077Z","iopub.status.idle":"2024-12-07T19:08:10.465856Z","shell.execute_reply.started":"2024-12-07T18:55:05.799046Z","shell.execute_reply":"2024-12-07T19:08:10.46474Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df[['loss', 'val_loss']].plot()\nhistory_df[['accuracy', 'val_accuracy']].plot()\nhistory_df[['precision_m', 'val_precision_m']].plot()\nhistory_df[['recall_m', 'val_recall_m']].plot()\nhistory_df[['f1_m', 'val_f1_m']].plot()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:08:10.468359Z","iopub.execute_input":"2024-12-07T19:08:10.475373Z","iopub.status.idle":"2024-12-07T19:08:11.631442Z","shell.execute_reply.started":"2024-12-07T19:08:10.475338Z","shell.execute_reply":"2024-12-07T19:08:11.63049Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## ENet 7","metadata":{}},{"cell_type":"code","source":"from keras.applications import EfficientNetB7","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:38:54.776406Z","iopub.execute_input":"2024-12-07T19:38:54.777253Z","iopub.status.idle":"2024-12-07T19:38:54.781216Z","shell.execute_reply.started":"2024-12-07T19:38:54.777216Z","shell.execute_reply":"2024-12-07T19:38:54.780298Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Using original generator\ndata_generator = create_datagen().flow(x_train, y_train, batch_size=BATCH_SIZE, seed=2019)\n\nenet = EfficientNetB7(\n    weights='imagenet',\n    include_top=False,\n    input_shape=(224,224,3)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:38:55.888632Z","iopub.execute_input":"2024-12-07T19:38:55.889375Z","iopub.status.idle":"2024-12-07T19:39:04.053556Z","shell.execute_reply.started":"2024-12-07T19:38:55.889336Z","shell.execute_reply":"2024-12-07T19:39:04.052742Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model(LR=LR):\n    model = Sequential()\n    model.add(enet)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dropout(0.80))\n    model.add(layers.Dense(128, activation='relu'))\n    model.add(layers.Dropout(0.3))\n    model.add(layers.Dense(64, activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dense(6, activation='sigmoid'))\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=Adam(learning_rate=LR),\n        metrics=['accuracy', f1_m,precision_m, recall_m]\n    )\n    \n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:39:04.055833Z","iopub.execute_input":"2024-12-07T19:39:04.056524Z","iopub.status.idle":"2024-12-07T19:39:04.062677Z","shell.execute_reply.started":"2024-12-07T19:39:04.056478Z","shell.execute_reply":"2024-12-07T19:39:04.061686Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"enet_model = build_model()\nenet_model.summary()\n\nx_train.shape[0]// BATCH_SIZE\n\nenet_history = enet_model.fit(\n    data_generator,\n    steps_per_epoch=x_train.shape[0] // BATCH_SIZE,\n    epochs=EPOCHS,\n    validation_data=(x_val, y_val)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:39:04.063758Z","iopub.execute_input":"2024-12-07T19:39:04.064157Z","iopub.status.idle":"2024-12-07T20:17:48.362166Z","shell.execute_reply.started":"2024-12-07T19:39:04.064128Z","shell.execute_reply":"2024-12-07T20:17:48.361079Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"enet_history_df = pd.DataFrame(enet_history.history)\nenet_history_df[['loss', 'val_loss']].plot()\nenet_history_df[['accuracy', 'val_accuracy']].plot()\nenet_history_df[['precision_m', 'val_precision_m']].plot()\nenet_history_df[['recall_m', 'val_recall_m']].plot()\nenet_history_df[['f1_m', 'val_f1_m']].plot()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:17:48.365053Z","iopub.execute_input":"2024-12-07T20:17:48.365391Z","iopub.status.idle":"2024-12-07T20:17:49.623741Z","shell.execute_reply.started":"2024-12-07T20:17:48.365361Z","shell.execute_reply":"2024-12-07T20:17:49.622889Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## NASNet 7","metadata":{}},{"cell_type":"code","source":"from keras.applications import NASNetMobile","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:17:49.625156Z","iopub.execute_input":"2024-12-07T20:17:49.625531Z","iopub.status.idle":"2024-12-07T20:17:49.630044Z","shell.execute_reply.started":"2024-12-07T20:17:49.625492Z","shell.execute_reply":"2024-12-07T20:17:49.629036Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Using original generator\ndata_generator = create_datagen().flow(x_train, y_train, batch_size=BATCH_SIZE, seed=2019)\n\nNASnet = NASNetMobile(\n    weights='imagenet',\n    include_top=False,\n    input_shape=(224,224,3)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:17:49.631044Z","iopub.execute_input":"2024-12-07T20:17:49.631316Z","iopub.status.idle":"2024-12-07T20:17:55.046059Z","shell.execute_reply.started":"2024-12-07T20:17:49.63129Z","shell.execute_reply":"2024-12-07T20:17:55.045001Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model(LR=LR):\n    model = Sequential()\n    model.add(NASnet)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dropout(0.80))\n    model.add(layers.Dense(128, activation='relu'))\n    model.add(layers.Dropout(0.3))\n    model.add(layers.Dense(64, activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dense(6, activation='sigmoid'))\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=Adam(learning_rate=LR),\n        metrics=['accuracy', f1_m,precision_m, recall_m]\n    )\n    \n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:17:55.047548Z","iopub.execute_input":"2024-12-07T20:17:55.047971Z","iopub.status.idle":"2024-12-07T20:17:55.054211Z","shell.execute_reply.started":"2024-12-07T20:17:55.047917Z","shell.execute_reply":"2024-12-07T20:17:55.053324Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"NASnet_model = build_model()\nNASnet_model.summary()\n\nx_train.shape[0]// BATCH_SIZE\n\nNASnet_history = NASnet_model.fit(\n    data_generator,\n    steps_per_epoch=x_train.shape[0] // BATCH_SIZE,\n    epochs=EPOCHS,\n    validation_data=(x_val, y_val)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:17:55.055343Z","iopub.execute_input":"2024-12-07T20:17:55.055595Z","iopub.status.idle":"2024-12-07T20:32:30.933349Z","shell.execute_reply.started":"2024-12-07T20:17:55.055569Z","shell.execute_reply":"2024-12-07T20:32:30.932534Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"NASnet_history_df = pd.DataFrame(NASnet_history.history)\nNASnet_history_df[['loss', 'val_loss']].plot()\nNASnet_history_df[['accuracy', 'val_accuracy']].plot()\nNASnet_history_df[['precision_m', 'val_precision_m']].plot()\nNASnet_history_df[['recall_m', 'val_recall_m']].plot()\nNASnet_history_df[['f1_m', 'val_f1_m']].plot()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:32:30.935175Z","iopub.execute_input":"2024-12-07T20:32:30.93589Z","iopub.status.idle":"2024-12-07T20:32:32.037255Z","shell.execute_reply.started":"2024-12-07T20:32:30.935836Z","shell.execute_reply":"2024-12-07T20:32:32.036207Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## MobileNet","metadata":{}},{"cell_type":"code","source":"from keras.applications import MobileNet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:32:32.039726Z","iopub.execute_input":"2024-12-07T20:32:32.040107Z","iopub.status.idle":"2024-12-07T20:32:32.044666Z","shell.execute_reply.started":"2024-12-07T20:32:32.040076Z","shell.execute_reply":"2024-12-07T20:32:32.043687Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Using original generator\ndata_generator = create_datagen().flow(x_train, y_train, batch_size=BATCH_SIZE, seed=2019)\n\nMobileNet_keras = MobileNet(\n    weights='imagenet',\n    include_top=False,\n    input_shape=(224,224,3)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:32:32.04613Z","iopub.execute_input":"2024-12-07T20:32:32.046491Z","iopub.status.idle":"2024-12-07T20:32:39.575831Z","shell.execute_reply.started":"2024-12-07T20:32:32.04645Z","shell.execute_reply":"2024-12-07T20:32:39.575102Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model(LR=LR):\n    model = Sequential()\n    model.add(MobileNet_keras)\n    model.add(layers.GlobalAveragePooling2D())\n    model.add(layers.Dropout(0.80))\n    model.add(layers.Dense(128, activation='relu'))\n    model.add(layers.Dropout(0.3))\n    model.add(layers.Dense(64, activation='relu'))\n    model.add(layers.BatchNormalization())\n    model.add(layers.Dense(6, activation='sigmoid'))\n    \n    model.compile(\n        loss='binary_crossentropy',\n        optimizer=Adam(learning_rate=LR),\n        metrics=['accuracy', f1_m,precision_m, recall_m]\n    )\n    \n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:32:39.576946Z","iopub.execute_input":"2024-12-07T20:32:39.577232Z","iopub.status.idle":"2024-12-07T20:32:39.583105Z","shell.execute_reply.started":"2024-12-07T20:32:39.577205Z","shell.execute_reply":"2024-12-07T20:32:39.582121Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"MobileNet_model = build_model()\nMobileNet_model.summary()\n\nx_train.shape[0]// BATCH_SIZE\n\nMobileNet_history = MobileNet_model.fit(\n    data_generator,\n    steps_per_epoch=x_train.shape[0] // BATCH_SIZE,\n    epochs=EPOCHS,\n    validation_data=(x_val, y_val)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:32:39.584318Z","iopub.execute_input":"2024-12-07T20:32:39.584787Z","iopub.status.idle":"2024-12-07T20:41:08.374242Z","shell.execute_reply.started":"2024-12-07T20:32:39.584749Z","shell.execute_reply":"2024-12-07T20:41:08.373167Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"MobileNet_history_df = pd.DataFrame(MobileNet_history.history)\nMobileNet_history_df[['loss', 'val_loss']].plot()\nMobileNet_history_df[['accuracy', 'val_accuracy']].plot()\nMobileNet_history_df[['precision_m', 'val_precision_m']].plot()\nMobileNet_history_df[['recall_m', 'val_recall_m']].plot()\nMobileNet_history_df[['f1_m', 'val_f1_m']].plot()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T20:41:08.376492Z","iopub.execute_input":"2024-12-07T20:41:08.376943Z","iopub.status.idle":"2024-12-07T20:41:09.782636Z","shell.execute_reply.started":"2024-12-07T20:41:08.376897Z","shell.execute_reply":"2024-12-07T20:41:09.781787Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}