{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":9900,"sourceType":"datasetVersion","datasetId":6209},{"sourceId":187731,"sourceType":"datasetVersion","datasetId":80814},{"sourceId":418031,"sourceType":"datasetVersion","datasetId":131128},{"sourceId":556303,"sourceType":"datasetVersion","datasetId":266957},{"sourceId":562534,"sourceType":"datasetVersion","datasetId":271136},{"sourceId":2822362,"sourceType":"datasetVersion","datasetId":1725862}],"dockerImageVersionId":30236,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","scrolled":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-12-07T08:32:12.176278Z","iopub.execute_input":"2023-12-07T08:32:12.17691Z","iopub.status.idle":"2023-12-07T08:32:46.447508Z","shell.execute_reply.started":"2023-12-07T08:32:12.176756Z","shell.execute_reply":"2023-12-07T08:32:46.445951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"## Importing libraries and modules","metadata":{}},{"cell_type":"code","source":"# Necessary utility modules and libraries\nimport os\nimport shutil\nimport pathlib\nimport random\nimport datetime\nimport cv2\n\n# Plotting libraries \nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nfrom scipy.signal import gaussian, convolve2d\nimport seaborn as sns\nfrom PIL import Image\n\n# Libraries for building the model\nimport tensorflow as tf\nimport tensorflow_hub as hub\nfrom tensorflow import keras\nfrom tensorflow.keras.utils import Sequence\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.layers import Input, Dense, Conv2D, Flatten, MaxPooling2D, Dropout, Activation, GlobalAveragePooling2D, BatchNormalization, GlobalMaxPooling2D\nfrom tensorflow.keras.applications import DenseNet121, ResNet50, InceptionV3, Xception, VGG16 , EfficientNetB3\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras import backend as K\nfrom tensorflow.keras.regularizers import l2, l1\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report, precision_recall_fscore_support, accuracy_score, confusion_matrix","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:46.450369Z","iopub.execute_input":"2023-12-07T08:32:46.4512Z","iopub.status.idle":"2023-12-07T08:32:58.152746Z","shell.execute_reply.started":"2023-12-07T08:32:46.451147Z","shell.execute_reply":"2023-12-07T08:32:58.151218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Loading and Pre-processing","metadata":{}},{"cell_type":"code","source":"classes = ['No_DR', 'Mild', 'Moderate', 'Severe', 'Proliferate_DR']","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:58.154596Z","iopub.execute_input":"2023-12-07T08:32:58.155385Z","iopub.status.idle":"2023-12-07T08:32:58.16676Z","shell.execute_reply.started":"2023-12-07T08:32:58.155341Z","shell.execute_reply":"2023-12-07T08:32:58.164951Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dir_path = '../input/diabetic-retinopathy-resized/resized_train/resized_train'\nos.listdir(dir_path)","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:32:58.170509Z","iopub.execute_input":"2023-12-07T08:32:58.172439Z","iopub.status.idle":"2023-12-07T08:32:58.240036Z","shell.execute_reply.started":"2023-12-07T08:32:58.172384Z","shell.execute_reply":"2023-12-07T08:32:58.238966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_temp = pd.read_csv(\"../input/diabetic-retinopathy-resized/trainLabels.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:58.242064Z","iopub.execute_input":"2023-12-07T08:32:58.242686Z","iopub.status.idle":"2023-12-07T08:32:58.300271Z","shell.execute_reply.started":"2023-12-07T08:32:58.242648Z","shell.execute_reply":"2023-12-07T08:32:58.298872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(df_temp), df_temp","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:58.30201Z","iopub.execute_input":"2023-12-07T08:32:58.302447Z","iopub.status.idle":"2023-12-07T08:32:58.323349Z","shell.execute_reply.started":"2023-12-07T08:32:58.302407Z","shell.execute_reply":"2023-12-07T08:32:58.321819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_temp['level'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:58.325242Z","iopub.execute_input":"2023-12-07T08:32:58.325832Z","iopub.status.idle":"2023-12-07T08:32:58.34626Z","shell.execute_reply.started":"2023-12-07T08:32:58.325777Z","shell.execute_reply":"2023-12-07T08:32:58.343818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_code = {0: \"No_DR\",\n              1: \"Mild\", \n              2: \"Moderate\",\n              3: \"Severe\",\n              4: \"Proliferate_DR\"}\ndf_temp.rename(columns={\"image\": \"id_code\", \"level\": \"diagnosis\"}, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:58.348416Z","iopub.execute_input":"2023-12-07T08:32:58.349598Z","iopub.status.idle":"2023-12-07T08:32:58.359977Z","shell.execute_reply.started":"2023-12-07T08:32:58.349518Z","shell.execute_reply":"2023-12-07T08:32:58.358334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mapping_temp(df, root=dir_path):\n    class_code = {0: \"No_DR\",\n                  1: \"Mild\", \n                  2: \"Moderate\",\n                  3: \"Severe\",\n                  4: \"Proliferate_DR\"}\n    df['label'] = list(map(class_code.get, df['diagnosis']))\n    df['path'] = [i[1]['label']+'/'+i[1]['id_code']+'.jpeg' for i in df.iterrows()]\n    return df\n\ndf_temp = mapping_temp(df_temp)\ndf_temp","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:32:58.361461Z","iopub.execute_input":"2023-12-07T08:32:58.361914Z","iopub.status.idle":"2023-12-07T08:33:00.973338Z","shell.execute_reply.started":"2023-12-07T08:32:58.361833Z","shell.execute_reply":"2023-12-07T08:33:00.972049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# for class_name in ['No_DR', 'Mild', 'Moderate']:    \n#     class_samples = df_temp[df_temp['label'] == class_name]\n#     selected_samples = class_samples.sample(n=1000, random_state=42)\n#     samples_to_delete = class_samples.index.difference(selected_samples.index)\n#     df_temp.drop(samples_to_delete, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:00.978929Z","iopub.execute_input":"2023-12-07T08:33:00.979371Z","iopub.status.idle":"2023-12-07T08:33:00.986406Z","shell.execute_reply.started":"2023-12-07T08:33:00.979333Z","shell.execute_reply":"2023-12-07T08:33:00.98504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Dropping the diagnosis column because the model assigns different codes for prediction\ndf_temp.drop(['diagnosis'], axis=1, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:00.987828Z","iopub.execute_input":"2023-12-07T08:33:00.988302Z","iopub.status.idle":"2023-12-07T08:33:01.013966Z","shell.execute_reply.started":"2023-12-07T08:33:00.98826Z","shell.execute_reply":"2023-12-07T08:33:01.012085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_temp['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.01552Z","iopub.execute_input":"2023-12-07T08:33:01.01736Z","iopub.status.idle":"2023-12-07T08:33:01.040731Z","shell.execute_reply.started":"2023-12-07T08:33:01.017304Z","shell.execute_reply":"2023-12-07T08:33:01.035739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# wiener filter\ndef wiener_filter(img, kernel, K):\n    kernel /= np.sum(kernel)\n    dummy = np.copy(img)\n    dummy = np.fft.fft2(dummy)\n    kernel = np.fft.fft2(kernel, s = img.shape)\n    kernel = np.conj(kernel) / (np.abs(kernel) ** 2 + K)\n    dummy = dummy * kernel\n    dummy = np.abs(np.fft.ifft2(dummy))\n    return dummy\n\ndef gaussian_kernel(kernel_size = 3):\n    h = gaussian(kernel_size, kernel_size / 3).reshape(kernel_size, 1)\n    h = np.dot(h, h.transpose())\n    h /= np.sum(h)\n    return h\n\ndef isbright(image, dim=227, thresh=0.4):\n    # Resize image to 10x10\n    image = cv2.resize(image, (dim, dim))\n    # Convert color space to LAB format and extract L channel\n    L, A, B = cv2.split(cv2.cvtColor(image, cv2.COLOR_BGR2LAB))\n    # Normalize L channel by dividing all pixel values with maximum pixel value\n    L = L/np.max(L)\n    # Return True if mean is greater than thresh else False\n    return np.mean(L) > thresh","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.045107Z","iopub.execute_input":"2023-12-07T08:33:01.048503Z","iopub.status.idle":"2023-12-07T08:33:01.064905Z","shell.execute_reply.started":"2023-12-07T08:33:01.048434Z","shell.execute_reply":"2023-12-07T08:33:01.063078Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def image_preprocessing(img):\n    # 1. Read the image\n#     img = mpimg.imread(img_path)\n    img = img.astype(np.uint8)\n    \n    # 2. Extract the green channel of the image\n    b, g, r = cv2.split(img)\n\n    # Applying wiener filter to reduce noise\n    wiener = wiener_filter(g, gaussian_kernel(3), 10)\n    g = cv2.addWeighted(g, 1.5, wiener.astype(\"uint8\"), -0.5, 0)\n    \n\n    # # 3.1 Intensify the image using CLAHE.\n    clh = cv2.createCLAHE(clipLimit=3.0)\n    g = clh.apply(g.astype('uint8'))\n    \n    merged_bgr_green_fused = cv2.merge((b, g, r))\n    \n    return merged_bgr_green_fused.astype(\"float64\")","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.067603Z","iopub.execute_input":"2023-12-07T08:33:01.068105Z","iopub.status.idle":"2023-12-07T08:33:01.085001Z","shell.execute_reply.started":"2023-12-07T08:33:01.068064Z","shell.execute_reply":"2023-12-07T08:33:01.082346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef scaleRadius(img, scale):\n    x = img[img.shape[0] // 2, :, :].sum(1)\n    r = (x > x.mean() / 10).sum() / 2\n    s = scale * 1.0 / r\n    return cv2.resize(img, (0, 0), fx=s, fy=s)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.087436Z","iopub.execute_input":"2023-12-07T08:33:01.088922Z","iopub.status.idle":"2023-12-07T08:33:01.105981Z","shell.execute_reply.started":"2023-12-07T08:33:01.088858Z","shell.execute_reply":"2023-12-07T08:33:01.104603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def image_preprocessing_new(image):\n    scale = 300\n    # Load the input image\n#     a = cv2.imread(image_filename)\n\n    # Scale img to a given radius\n    a = scaleRadius(image, scale)\n\n    # Subtract local mean color\n    a = cv2.addWeighted(a, 4, cv2.GaussianBlur(a, (0,0), scale / 30), -4, 128)\n\n    # Remove outer 10%\n    b = np.zeros(a.shape)\n    cv2.circle(b, (a.shape[1] // 2, a.shape[0] // 2), int(scale * 0.9), (1, 1, 1), -1, 8, 0)\n    a = a * b + 128 * (1 - b)\n\n    # Display the processed image\n    return a","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.107735Z","iopub.execute_input":"2023-12-07T08:33:01.108182Z","iopub.status.idle":"2023-12-07T08:33:01.121229Z","shell.execute_reply.started":"2023-12-07T08:33:01.108143Z","shell.execute_reply":"2023-12-07T08:33:01.119882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"p = '/kaggle/input/diabetic-retinopathy-resized/resized_train/resized_train/10003_left.jpeg'\nimg = mpimg.imread(p)\npro = image_preprocessing(img)\nfilename = os.path.basename(p)\nplt.imshow(pro.astype(\"uint8\"), cmap=\"gray\");\n# cv2.imwrite(filename, pro)\n# plt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.122449Z","iopub.execute_input":"2023-12-07T08:33:01.122856Z","iopub.status.idle":"2023-12-07T08:33:01.910822Z","shell.execute_reply.started":"2023-12-07T08:33:01.122801Z","shell.execute_reply":"2023-12-07T08:33:01.909234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pro.shape","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.91271Z","iopub.execute_input":"2023-12-07T08:33:01.913251Z","iopub.status.idle":"2023-12-07T08:33:01.925344Z","shell.execute_reply.started":"2023-12-07T08:33:01.913195Z","shell.execute_reply":"2023-12-07T08:33:01.923258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"random_img_path = [dir_path+'/'+img for img in random.sample(os.listdir(dir_path), 50)]\nrandom_img_path","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:33:01.927572Z","iopub.execute_input":"2023-12-07T08:33:01.928061Z","iopub.status.idle":"2023-12-07T08:33:01.9584Z","shell.execute_reply.started":"2023-12-07T08:33:01.928006Z","shell.execute_reply":"2023-12-07T08:33:01.95733Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20, 15))\nplt.suptitle(\"Image Dataset for CLAHE Processed Images\", fontsize=20)\n\nfor i in range(1, 51):\n    plt.subplot(5, 10, i)\n    img = mpimg.imread(random_img_path[i-1])\n    img_pro = image_preprocessing(img)\n    img_pro.shape\n    plt.imshow(img_pro.astype(\"uint8\"), cmap=\"gray\", aspect=\"auto\")\n    plt.axis(False);","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:01.959561Z","iopub.execute_input":"2023-12-07T08:33:01.959991Z","iopub.status.idle":"2023-12-07T08:33:22.227891Z","shell.execute_reply.started":"2023-12-07T08:33:01.959951Z","shell.execute_reply":"2023-12-07T08:33:22.226457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(5):\n    os.mkdir('./'+class_code[i])","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:22.229458Z","iopub.execute_input":"2023-12-07T08:33:22.229904Z","iopub.status.idle":"2023-12-07T08:33:22.238003Z","shell.execute_reply.started":"2023-12-07T08:33:22.229834Z","shell.execute_reply":"2023-12-07T08:33:22.236347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_temp['label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:33:22.240033Z","iopub.execute_input":"2023-12-07T08:33:22.240538Z","iopub.status.idle":"2023-12-07T08:33:22.270036Z","shell.execute_reply.started":"2023-12-07T08:33:22.240492Z","shell.execute_reply":"2023-12-07T08:33:22.268826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport shutil\n# for i in df_temp.iloc[:5, :].iterrows():\n#     print(i[1][2])\nres = [[i[1][1], i[1][2]] for i in df_temp.iterrows()]\nfor i in res:\n    des = './'+i[0]+'/'\n    src = dir_path+'/'+i[1].split('/')[1]\n    shutil.copy(src, des)","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:33:22.271825Z","iopub.execute_input":"2023-12-07T08:33:22.272645Z","iopub.status.idle":"2023-12-07T08:35:56.789796Z","shell.execute_reply.started":"2023-12-07T08:33:22.272596Z","shell.execute_reply":"2023-12-07T08:35:56.788085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The model assigns labels in ascending order\nclasses = sorted(classes)\nclasses","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:56.792234Z","iopub.execute_input":"2023-12-07T08:35:56.793125Z","iopub.status.idle":"2023-12-07T08:35:56.80499Z","shell.execute_reply.started":"2023-12-07T08:35:56.793061Z","shell.execute_reply":"2023-12-07T08:35:56.803679Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Initializing the input size\nIMG_SHAPE = (224, 224)\nEPOCHS = 10\nBATCH_SIZE = 32\n\n# # Specify the classes to augment\n# augmented_classes = ['Mild', 'Severe', 'Proliferate_DR']\n# non_augmented_classes = ['No_DR', 'Moderate']\n\ntrain_df, val_df = train_test_split(df_temp, test_size=0.2, stratify=df_temp['label'], random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:56.80639Z","iopub.execute_input":"2023-12-07T08:35:56.807714Z","iopub.status.idle":"2023-12-07T08:35:56.884546Z","shell.execute_reply.started":"2023-12-07T08:35:56.807667Z","shell.execute_reply":"2023-12-07T08:35:56.883121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1./255,\n                                   rotation_range=10,\n                                   width_shift_range=0.2,\n                                   height_shift_range=0.2,\n                                   preprocessing_function = image_preprocessing)\n\nvalid_datagen = ImageDataGenerator(rescale = 1./255,\n                                   preprocessing_function = image_preprocessing)\n\ntrain_data = train_datagen.flow_from_dataframe(dataframe=train_df, \n                                       x_col='path',\n                                       y_col='label',\n                                       class_mode='categorical',\n                                       target_size=IMG_SHAPE)\n\nvalid_data = valid_datagen.flow_from_dataframe(dataframe=val_df, \n                                       x_col='path',\n                                       y_col='label',\n                                       class_mode=\"categorical\",\n                                       target_size=IMG_SHAPE)\n\n# def combine_gen(*gens):\n#     while True:\n#         for g in gens:\n#             yield next(g)\n        \n# train_data = combine_gen(train_data_augmented, train_data_non_augmented)\n\n# Initializing the early stopping callback\nes = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:56.886415Z","iopub.execute_input":"2023-12-07T08:35:56.886824Z","iopub.status.idle":"2023-12-07T08:35:57.423508Z","shell.execute_reply.started":"2023-12-07T08:35:56.886786Z","shell.execute_reply":"2023-12-07T08:35:57.422474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_image_shape = train_datagen.image_shape","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.425473Z","iopub.execute_input":"2023-12-07T08:35:57.426345Z","iopub.status.idle":"2023-12-07T08:35:57.433337Z","shell.execute_reply.started":"2023-12-07T08:35:57.426285Z","shell.execute_reply":"2023-12-07T08:35:57.431346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_data","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.45143Z","iopub.execute_input":"2023-12-07T08:35:57.451897Z","iopub.status.idle":"2023-12-07T08:35:57.464684Z","shell.execute_reply.started":"2023-12-07T08:35:57.451858Z","shell.execute_reply":"2023-12-07T08:35:57.460542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data.class_indices, valid_data.class_indices, train_data.batch_size, valid_data.batch_size","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.46636Z","iopub.execute_input":"2023-12-07T08:35:57.467188Z","iopub.status.idle":"2023-12-07T08:35:57.48246Z","shell.execute_reply.started":"2023-12-07T08:35:57.467109Z","shell.execute_reply":"2023-12-07T08:35:57.480416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Evaluation metric helper functions","metadata":{}},{"cell_type":"code","source":"def cm(y_true, y_pred):\n    classes.sort()\n    cm = confusion_matrix(y_true, y_pred)\n    cm_df = pd.DataFrame(cm,\n                     index = classes, \n                     columns = classes)\n    #Plotting the confusion matrix\n    plt.figure(figsize=(5,4))\n    sns.heatmap(cm_df, annot=True)\n    plt.title('Confusion Matrix')\n    plt.ylabel('Actal Values')\n    plt.xlabel('Predicted Values')\n    plt.show()\n\ndef metrics(y_true, y_pred):\n#     print(classification_report(y_true, y_pred, target_names=classes))\n    acc = accuracy_score(y_true, y_pred)\n    res = []\n    for l in [0,1,2,3,4]:\n        prec,recall,_,_ = precision_recall_fscore_support(np.array(y_true)==l,\n                                                          np.array(y_pred)==l,\n                                                          pos_label=True,\n                                                          average=None)\n        res.append([classes[l],recall[0],recall[1]])\n    df_res = pd.DataFrame(res,columns = ['class','sensitivity','specificity'])\n    return df_res, acc","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.486315Z","iopub.execute_input":"2023-12-07T08:35:57.486747Z","iopub.status.idle":"2023-12-07T08:35:57.503681Z","shell.execute_reply.started":"2023-12-07T08:35:57.486693Z","shell.execute_reply":"2023-12-07T08:35:57.501933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"int(0.5*(train_data.n//train_data.batch_size))","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.505206Z","iopub.execute_input":"2023-12-07T08:35:57.506471Z","iopub.status.idle":"2023-12-07T08:35:57.531224Z","shell.execute_reply.started":"2023-12-07T08:35:57.506422Z","shell.execute_reply":"2023-12-07T08:35:57.529553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Function to train model\ndef train_model(model_test, epochs=EPOCHS, lr=0.001): \n    # Compile the model\n    model_test.compile(loss='categorical_crossentropy',\n                      optimizer=tf.keras.optimizers.Adam(learning_rate=lr),\n                      metrics=['acc'])\n\n    history = model_test.fit(train_data,\n                           validation_data=valid_data,\n                           steps_per_epoch=int(0.5*(train_data.n//train_data.batch_size)),\n                           epochs=epochs,\n                           validation_steps=int(valid_data.n//valid_data.batch_size),\n                           callbacks=[es])\n    return history.history\n\n# Function to make predictions on the test data\ndef make_predictions(model_test):\n    # Evaluate the model\n    predictions = model_test.predict(valid_data, verbose=1)\n    y_preds = np.argmax(predictions, axis=1)\n    return y_preds","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.53281Z","iopub.execute_input":"2023-12-07T08:35:57.533263Z","iopub.status.idle":"2023-12-07T08:35:57.549341Z","shell.execute_reply.started":"2023-12-07T08:35:57.533225Z","shell.execute_reply":"2023-12-07T08:35:57.547584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Function to plot the performance metrics\ndef plot_result(hist):\n    plt.figure(figsize=(10, 5));\n    plt.suptitle(f\"Performance Metrics\", fontsize=20)\n    \n    # Actual and validation losses\n    plt.subplot(1, 2, 1);\n    plt.plot(hist['loss'], label='train')\n    plt.plot(hist['val_loss'], label='validation')\n    plt.title('Train and val loss curve')\n    plt.legend()\n\n    # Actual and validation accuracy\n    plt.subplot(1, 2, 2);\n    plt.plot(hist['acc'], label='train')\n    plt.plot(hist['val_acc'], label='validation')\n    plt.title('Train and val accuracy curve')\n    plt.legend()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.55198Z","iopub.execute_input":"2023-12-07T08:35:57.554132Z","iopub.status.idle":"2023-12-07T08:35:57.569277Z","shell.execute_reply.started":"2023-12-07T08:35:57.55408Z","shell.execute_reply":"2023-12-07T08:35:57.566448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# View random images in the dataset\ndef view_random_images(root_dir, classes=classes):\n    class_paths = [root_dir + \"/\" + image_class for image_class in classes]\n    # print(class_paths)\n    images_path = []\n    labels = []\n    for i in range(len(class_paths)):\n        random_images = random.sample(os.listdir(class_paths[i]), 10)\n        random_images_path = [class_paths[i]+'/'+img for img in random_images]\n        for j in random_images_path:\n            images_path.append(j)\n            labels.append(classes[i])\n    images_path\n\n    plt.figure(figsize=(17, 10))\n    plt.suptitle(\"Image Dataset\", fontsize=20)\n\n    for i in range(1, 51):\n        plt.subplot(5, 10, i)\n        img = mpimg.imread(images_path[i-1])\n        plt.imshow(img, aspect=\"auto\")\n        plt.title(labels[i-1])\n        plt.axis(False);","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.572204Z","iopub.execute_input":"2023-12-07T08:35:57.57353Z","iopub.status.idle":"2023-12-07T08:35:57.596001Z","shell.execute_reply.started":"2023-12-07T08:35:57.57347Z","shell.execute_reply":"2023-12-07T08:35:57.594619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Observing the images\nview_random_images(root_dir='./')","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:35:57.597223Z","iopub.execute_input":"2023-12-07T08:35:57.597584Z","iopub.status.idle":"2023-12-07T08:36:08.029704Z","shell.execute_reply.started":"2023-12-07T08:35:57.597552Z","shell.execute_reply":"2023-12-07T08:36:08.028387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Modelling (base Models)\nWe'll use the following ImageNet models for training the images and observe the variations of the accuracy of the predicitions as predicted by the models:\n* AlexNet\n* DenseNet121\n* ResNet50\n* InceptionV3\n* VGG-16","metadata":{}},{"cell_type":"code","source":"# !pip install -U '../input/install/efficientnet-0.0.3-py2.py3-none-any.whl'","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:08.031902Z","iopub.execute_input":"2023-12-07T08:36:08.033926Z","iopub.status.idle":"2023-12-07T08:36:08.042365Z","shell.execute_reply.started":"2023-12-07T08:36:08.033825Z","shell.execute_reply":"2023-12-07T08:36:08.040821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# efficientnetb3 = EfficientNetB3(\n#         input_shape=(224,224,3),\n#         include_top=False)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:08.04465Z","iopub.execute_input":"2023-12-07T08:36:08.045095Z","iopub.status.idle":"2023-12-07T08:36:08.063223Z","shell.execute_reply.started":"2023-12-07T08:36:08.045059Z","shell.execute_reply":"2023-12-07T08:36:08.061107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import tensorflow as tf\n# import tensorflow.keras.layers as layers\n# def build_model():\n#     model = Sequential()\n#     model.add(efficientnetb3)\n#     model.add(layers.GlobalAveragePooling2D())\n#     model.add(layers.Dropout(0.5))\n#     model.add(layers.BatchNormalization())\n#     model.add(layers.Dense(5, activation='sigmoid'))\n    \n# #     model.compile(\n# #         loss='binary_crossentropy',\n# #         #loss=kappa_loss,\n# #         optimizer=Adam(lr=1e-4,decay=1e-6),\n# #         metrics=['accuracy']\n# #     )\n    \n#     return model","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:08.06594Z","iopub.execute_input":"2023-12-07T08:36:08.0664Z","iopub.status.idle":"2023-12-07T08:36:08.082158Z","shell.execute_reply.started":"2023-12-07T08:36:08.066358Z","shell.execute_reply":"2023-12-07T08:36:08.079944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_efficient = build_model()\n# model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:08.084364Z","iopub.execute_input":"2023-12-07T08:36:08.085217Z","iopub.status.idle":"2023-12-07T08:36:08.100087Z","shell.execute_reply.started":"2023-12-07T08:36:08.085175Z","shell.execute_reply":"2023-12-07T08:36:08.098971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model_efficient.compile(loss='categorical_crossentropy',\n#                   optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n#                   metrics=['acc'])\n\n# model_history = model_efficient.fit(train_data,\n#                                        validation_data=valid_data,\n#                                        steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n#                                        epochs=150,\n#                                        validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:08.102434Z","iopub.execute_input":"2023-12-07T08:36:08.103261Z","iopub.status.idle":"2023-12-07T08:36:08.120828Z","shell.execute_reply.started":"2023-12-07T08:36:08.103113Z","shell.execute_reply":"2023-12-07T08:36:08.118929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Inception-Resnet-Google**","metadata":{}},{"cell_type":"code","source":"model = tf.keras.applications.inception_resnet_v2.InceptionResNetV2(\n    include_top=False,\n    input_tensor=None,\n    input_shape=(224, 224, 3),\n    pooling=None,\n    classes=1000,\n)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:08.123122Z","iopub.execute_input":"2023-12-07T08:36:08.12449Z","iopub.status.idle":"2023-12-07T08:36:23.584085Z","shell.execute_reply.started":"2023-12-07T08:36:08.12444Z","shell.execute_reply":"2023-12-07T08:36:23.582648Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow.keras.models as models\nimport tensorflow.keras.layers as layers\ndef CNN(model):\n    x = model.outputs[-1]\n    x = layers.GlobalAveragePooling2D()(x)\n    x = layers.Dropout(0.2)(x)\n    x = layers.Dense(256, activation=\"relu\")(x)\n    x = layers.Dropout(0.2)(x)\n    x = layers.Dense(5, activation=\"softmax\")(x)\n\n    model = models.Model(inputs=model.inputs, outputs=x)\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:23.585793Z","iopub.execute_input":"2023-12-07T08:36:23.586357Z","iopub.status.idle":"2023-12-07T08:36:23.597738Z","shell.execute_reply.started":"2023-12-07T08:36:23.586319Z","shell.execute_reply":"2023-12-07T08:36:23.595068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CNN(model)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:23.599461Z","iopub.execute_input":"2023-12-07T08:36:23.599875Z","iopub.status.idle":"2023-12-07T08:36:24.430443Z","shell.execute_reply.started":"2023-12-07T08:36:23.599815Z","shell.execute_reply":"2023-12-07T08:36:24.428043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_history = model.fit(train_data,\n                                       validation_data=valid_data,\n                                       steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                                       epochs=150,\n                                       validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:36:24.433024Z","iopub.execute_input":"2023-12-07T08:36:24.433989Z","iopub.status.idle":"2023-12-07T08:38:54.593813Z","shell.execute_reply.started":"2023-12-07T08:36:24.433894Z","shell.execute_reply":"2023-12-07T08:38:54.590116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_results = model.evaluate(valid_data, batch_size=32)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.595293Z","iopub.status.idle":"2023-12-07T08:38:54.597524Z","shell.execute_reply.started":"2023-12-07T08:38:54.597111Z","shell.execute_reply":"2023-12-07T08:38:54.597156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# ****Inception-Resnet-Proposed****\n","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.layers import Input, Dense, Conv2D, Flatten, MaxPooling2D, Dropout, Activation, GlobalAveragePooling2D, BatchNormalization, GlobalMaxPooling2D, ZeroPadding2D, AveragePooling2D, Lambda, Concatenate,Reshape, Multiply\nfrom tensorflow.keras.models import Model\nimport tensorflow.keras.layers as layers\nfrom keras import backend as K\nfrom tensorflow.keras.models import Model\n# from keras.utils.data_utils import get_file\n\ndef inception_resnet_model(image_height, image_width, n_channels, load_wt = \"Yes\"):\n    # BASE_WEIGHT_URL = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.7/'\n    # weights_filename = 'inception_resnet_v2_weights_tf_dim_ordering_tf_kernels_notop.h5'\n    # weights_path = get_file(weights_filename, BASE_WEIGHT_URL + weights_filename, cache_subdir='models',md5_hash='d19885ff4a710c122648d3b5c3b684e4')\n\n    def conv2d_bn(x,filters,kernel_size,strides=1,padding='same',activation='relu',use_bias=False,name=None):\n        x = Conv2D(filters,kernel_size,strides=strides,padding=padding,use_bias=use_bias,name=name)(x)\n        if not use_bias:\n            bn_axis = 3\n            bn_name = None if name is None else name + '_bn'\n            x = BatchNormalization(axis=bn_axis, scale=False, name=bn_name)(x)\n        if activation is not None:\n            ac_name = None if name is None else name + '_ac'\n            x = Activation(activation, name=ac_name)(x)\n        return x\n\n    def se_block(x, ratio=16):\n        channels = K.int_shape(x)[-1]\n        se = GlobalAveragePooling2D()(x)\n        se = Dense(channels // ratio, activation='relu')(se)\n        se = Dense(channels, activation='sigmoid')(se)\n        se = Reshape((1, 1, channels))(se)\n        x = Multiply()([x, se])\n        return x\n\n    def inception_resnet_block(x, scale, block_type, block_idx, activation='relu'):\n\n        if block_type == 'block35':\n            branch_0 = conv2d_bn(x, 32, 1)\n            branch_1 = conv2d_bn(x, 32, 1)\n            branch_1 = conv2d_bn(branch_1, 32, 3)\n            branch_2 = conv2d_bn(x, 32, 1)\n            branch_2 = conv2d_bn(branch_2, 48, 3)\n            branch_2 = conv2d_bn(branch_2, 64, 3)\n            branches = [branch_0, branch_1, branch_2]\n        elif block_type == 'block17':\n            branch_0 = conv2d_bn(x, 192, 1)\n            branch_1 = conv2d_bn(x, 128, 1)\n            branch_1 = conv2d_bn(branch_1, 160, [1, 7])\n            branch_1 = conv2d_bn(branch_1, 192, [7, 1])\n            branches = [branch_0, branch_1]\n        elif block_type == 'block8':\n            branch_0 = conv2d_bn(x, 192, 1)\n            branch_1 = conv2d_bn(x, 192, 1)\n            branch_1 = conv2d_bn(branch_1, 224, [1, 3])\n            branch_1 = conv2d_bn(branch_1, 256, [3, 1])\n            branches = [branch_0, branch_1]\n        else:\n            raise ValueError('Unknown Inception-ResNet block type. '\n                             'Expects \"block35\", \"block17\" or \"block8\", '\n                             'but got: ' + str(block_type))\n\n        block_name = block_type + '_' + str(block_idx)\n        channel_axis = 3\n        mixed = Concatenate(axis=channel_axis, name=block_name + '_mixed')(branches)\n        mixed = se_block(mixed)\n        up = conv2d_bn(mixed,K.int_shape(x)[channel_axis],1,activation=None,use_bias=True,name=block_name + '_conv')\n\n        x = Lambda(lambda inputs, scale: inputs[0] + inputs[1] * scale,\n                   output_shape=K.int_shape(x)[1:],\n                   arguments={'scale': scale},\n                   name=block_name)([x, up])\n        if activation is not None:\n            x = Activation(activation, name=block_name + '_ac')(x)\n        return x\n\n    channel_axis = 3\n    img_input = Input(shape=(image_height,image_width,n_channels))\n    zero_pad = ZeroPadding2D(((12,12),(0,0)))(img_input)\n\n\n    # Stem block: 35 x 35 x 192\n    x = conv2d_bn(zero_pad, 32, 3, strides=2, padding='valid')\n    x = conv2d_bn(x, 32, 3, padding='valid')\n    x = conv2d_bn(x, 64, 3)\n    x = MaxPooling2D(3, strides=2)(x)\n    x = conv2d_bn(x, 80, 1, padding='valid')\n    x = conv2d_bn(x, 192, 3, padding='valid')\n    x = MaxPooling2D(3, strides=2)(x)\n\n    # Mixed 5b (Inception-A block): 35 x 35 x 320\n    branch_0 = conv2d_bn(x, 96, 1)\n    branch_1 = conv2d_bn(x, 48, 1)\n    branch_1 = conv2d_bn(branch_1, 64, 5)\n    branch_2 = conv2d_bn(x, 64, 1)\n    branch_2 = conv2d_bn(branch_2, 96, 3)\n    branch_2 = conv2d_bn(branch_2, 96, 3)\n    branch_pool = AveragePooling2D(3, strides=1, padding='same')(x)\n    branch_pool = conv2d_bn(branch_pool, 64, 1)\n    branches = [branch_0, branch_1, branch_2, branch_pool]\n\n    x = Concatenate(axis=channel_axis, name='mixed_5b')(branches)\n\n    # 10x block35 (Inception-ResNet-A block): 35 x 35 x 320\n    for block_idx in range(1, 11):\n        x = inception_resnet_block(x,\n                                   scale=0.17,\n                                   block_type='block35',\n                                   block_idx=block_idx)\n\n    # Mixed 6a (Reduction-A block): 17 x 17 x 1088\n    branch_0 = conv2d_bn(x, 384, 3, strides=2, padding='valid')\n    branch_1 = conv2d_bn(x, 256, 1)\n    branch_1 = conv2d_bn(branch_1, 256, 3)\n    branch_1 = conv2d_bn(branch_1, 384, 3, strides=2, padding='valid')\n    branch_pool = MaxPooling2D(3, strides=2, padding='valid')(x)\n    branches = [branch_0, branch_1, branch_pool]\n    x = Concatenate(axis=channel_axis, name='mixed_6a')(branches)\n\n    # 20x block17 (Inception-ResNet-B block): 17 x 17 x 1088\n    for block_idx in range(1, 21):\n        x = inception_resnet_block(x,\n                                   scale=0.1,\n                                   block_type='block17',\n                                   block_idx=block_idx)\n\n    # Mixed 7a (Reduction-B block): 8 x 8 x 2080\n    branch_0 = conv2d_bn(x, 256, 1)\n    branch_0 = conv2d_bn(branch_0, 384, 3, strides=2, padding='valid')\n    branch_1 = conv2d_bn(x, 256, 1)\n    branch_1 = conv2d_bn(branch_1, 288, 3, strides=2, padding='valid')\n    branch_2 = conv2d_bn(x, 256, 1)\n    branch_2 = conv2d_bn(branch_2, 288, 3)\n    branch_2 = conv2d_bn(branch_2, 320, 3, strides=2, padding='valid')\n    branch_pool = MaxPooling2D(3, strides=2, padding='valid')(x)\n    branches = [branch_0, branch_1, branch_2, branch_pool]\n    x = Concatenate(axis=channel_axis, name='mixed_7a')(branches)\n\n    # 10x block8 (Inception-ResNet-C block): 8 x 8 x 2080\n    for block_idx in range(1, 10):\n        x = inception_resnet_block(x,\n                                   scale=0.2,\n                                   block_type='block8',\n                                   block_idx=block_idx)\n    x = inception_resnet_block(x,\n                               scale=1.,\n                               activation=None,\n                               block_type='block8',\n                               block_idx=10)\n\n    # Final convolution block: 8 x 8 x 1536\n    x = conv2d_bn(x, 1536, 1, name='conv_7b')\n\n    x = GlobalMaxPooling2D()(x)\n    x= Dense(5,activation='softmax')(x)\n\n    inputs = img_input\n\n    # Create model\n    model = Model(inputs, x, name='inception_resnet_v2')\n\n#     if load_wt == \"Yes\":\n#         model.load_weights(weights_path)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-12-07T09:31:52.958008Z","iopub.execute_input":"2023-12-07T09:31:52.958809Z","iopub.status.idle":"2023-12-07T09:31:53.015603Z","shell.execute_reply.started":"2023-12-07T09:31:52.958735Z","shell.execute_reply":"2023-12-07T09:31:53.013915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nmodel = inception_resnet_model(224, 224, 3, \"No\")\ntf.keras.utils.plot_model(model)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T09:32:03.005061Z","iopub.execute_input":"2023-12-07T09:32:03.005538Z","iopub.status.idle":"2023-12-07T09:32:27.001287Z","shell.execute_reply.started":"2023-12-07T09:32:03.005503Z","shell.execute_reply":"2023-12-07T09:32:26.999283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:39:16.594693Z","iopub.execute_input":"2023-12-07T08:39:16.596376Z","iopub.status.idle":"2023-12-07T08:39:16.602041Z","shell.execute_reply.started":"2023-12-07T08:39:16.596318Z","shell.execute_reply":"2023-12-07T08:39:16.600446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_history = model.fit(train_data,\n                                       validation_data=valid_data,\n                                       steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                                       epochs=150,\n                                       validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:39:18.453532Z","iopub.execute_input":"2023-12-07T08:39:18.454379Z","iopub.status.idle":"2023-12-07T09:31:48.675524Z","shell.execute_reply.started":"2023-12-07T08:39:18.454314Z","shell.execute_reply":"2023-12-07T09:31:48.673296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_results = model.evaluate(valid_data, batch_size=32)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.614392Z","iopub.status.idle":"2023-12-07T08:38:54.615523Z","shell.execute_reply.started":"2023-12-07T08:38:54.615152Z","shell.execute_reply":"2023-12-07T08:38:54.615186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Performance metrics for Inception-resnet\nplot_result(model_history.history)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.617675Z","iopub.status.idle":"2023-12-07T08:38:54.619026Z","shell.execute_reply.started":"2023-12-07T08:38:54.618604Z","shell.execute_reply":"2023-12-07T08:38:54.61865Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_preds = make_predictions(model)\ny_true = valid_data.classes\n# Evaluation metrics for model_alexnet\nmetrics(y_true, y_preds)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.621475Z","iopub.status.idle":"2023-12-07T08:38:54.622756Z","shell.execute_reply.started":"2023-12-07T08:38:54.622365Z","shell.execute_reply":"2023-12-07T08:38:54.622403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cm(y_true, y_preds)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.62505Z","iopub.status.idle":"2023-12-07T08:38:54.62628Z","shell.execute_reply.started":"2023-12-07T08:38:54.625901Z","shell.execute_reply":"2023-12-07T08:38:54.625941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cm(y_true, y_preds_alexnet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.628526Z","iopub.status.idle":"2023-12-07T08:38:54.629961Z","shell.execute_reply.started":"2023-12-07T08:38:54.629554Z","shell.execute_reply":"2023-12-07T08:38:54.629594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 1. AlexNet","metadata":{}},{"cell_type":"code","source":"# Basic CNN model for AlexNet\nmodel_alexnet = tf.keras.Sequential([\n    Conv2D(input_shape=IMG_SHAPE+(3,), filters=96,kernel_size=11,strides=4,activation='relu'),\n    MaxPooling2D(pool_size=3,strides=2),\n    Conv2D(filters=256,kernel_size=5,strides=1,padding='valid',activation='relu'),\n    MaxPooling2D(pool_size=3,strides=2),\n    Conv2D(filters=384,kernel_size=3,strides=1,padding='same',activation='relu'),\n    Conv2D(filters=384,kernel_size=3,strides=1,padding='same',activation='relu'),\n    Conv2D(filters=256,kernel_size=3,strides=1,padding='same',activation='relu'),\n    MaxPooling2D(pool_size=3,strides=2),\n    Dense(4096, activation='relu'),\n    Dropout(0.5),\n    Dense(4096, activation='relu'),\n    Dropout(0.5),\n    Dropout(0.5),\n    Flatten(),\n    Dense(len(classes), activation='softmax')\n], name=\"model_AlexNet\")","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.632366Z","iopub.status.idle":"2023-12-07T08:38:54.633668Z","shell.execute_reply.started":"2023-12-07T08:38:54.633249Z","shell.execute_reply":"2023-12-07T08:38:54.63331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Summary of AlexNet model\nmodel_alexnet.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.636884Z","iopub.status.idle":"2023-12-07T08:38:54.639094Z","shell.execute_reply.started":"2023-12-07T08:38:54.638439Z","shell.execute_reply":"2023-12-07T08:38:54.638491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_alexnet.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_alexnet_history = model_alexnet.fit(train_data,\n                                       validation_data=valid_data,\n                                       steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                                       epochs=30,\n                                       validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.641785Z","iopub.status.idle":"2023-12-07T08:38:54.643145Z","shell.execute_reply.started":"2023-12-07T08:38:54.6427Z","shell.execute_reply":"2023-12-07T08:38:54.642755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_alexnet_results = model_alexnet.evaluate(valid_data, batch_size=32)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.645563Z","iopub.status.idle":"2023-12-07T08:38:54.646887Z","shell.execute_reply.started":"2023-12-07T08:38:54.646455Z","shell.execute_reply":"2023-12-07T08:38:54.646494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_preds_alexnet = make_predictions(model_alexnet)\ny_true = valid_data.classes\n# Evaluation metrics for model_alexnet\nmetrics(y_true, y_preds_alexnet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.649153Z","iopub.status.idle":"2023-12-07T08:38:54.650422Z","shell.execute_reply.started":"2023-12-07T08:38:54.650025Z","shell.execute_reply":"2023-12-07T08:38:54.650063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cm(y_true, y_preds_alexnet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.652673Z","iopub.status.idle":"2023-12-07T08:38:54.653903Z","shell.execute_reply.started":"2023-12-07T08:38:54.653504Z","shell.execute_reply":"2023-12-07T08:38:54.653542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score\n# Accuracy\n# Calculate accuracy\naccuracy = accuracy_score(y_true, y_preds_alexnet)\n\n# Print accuracy\nprint(f\"Accuracy: {accuracy:.2f}\")\n\nfrom sklearn.metrics import f1_score\n\n# Assuming you have 'y_true' and 'y_preds_alexnet' defined earlier\nf1 = f1_score(y_true, y_preds_alexnet , average='weighted')\n\nprint(f\"F1 Score: {f1:.2f}\")","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.656137Z","iopub.status.idle":"2023-12-07T08:38:54.656831Z","shell.execute_reply.started":"2023-12-07T08:38:54.656482Z","shell.execute_reply":"2023-12-07T08:38:54.656514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import roc_curve, auc\n\n# Assuming you have the true labels and predicted probabilities for a multiclass problem\n# Replace y_true with your true labels (encoded with integers, e.g., 0, 1, 2, ...)\n# Replace y_scores with the predicted probabilities for each class as a 2D array\n\nn_classes = len(y_preds_alexnet[0])  # Number of classes\n\n# Initialize lists to store FPR, TPR, and AUC for each class\nfpr = {}\ntpr = {}\nroc_auc = {}\n\n# Calculate ROC curve for each class\nfor i in range(n_classes):\n    fpr[i], tpr[i], _ = roc_curve(y_true, y_scores[:, i], pos_label=i)\n    roc_auc[i] = auc(fpr[i], tpr[i])\n\n# Plot the ROC curves for each class\nplt.figure(figsize=(8, 6))\nfor i in range(n_classes):\n    plt.plot(fpr[i], tpr[i], label=f'Class {i} (AUC = {roc_auc[i]:.2f})')\n\nplt.plot([0, 1], [0, 1], 'k--')  # Diagonal line for random guessing\nplt.xlim([0.0, 1.0])\nplt.ylim([0.0, 1.05])\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title('Multiclass Receiver Operating Characteristic (ROC) Curve')\nplt.legend(loc='lower right')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.659061Z","iopub.status.idle":"2023-12-07T08:38:54.660734Z","shell.execute_reply.started":"2023-12-07T08:38:54.660349Z","shell.execute_reply":"2023-12-07T08:38:54.660394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Performance metrics for AlexNet\nplot_result(model_alexnet_history.history)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.662643Z","iopub.status.idle":"2023-12-07T08:38:54.664232Z","shell.execute_reply.started":"2023-12-07T08:38:54.663824Z","shell.execute_reply":"2023-12-07T08:38:54.663896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2. DenseNet","metadata":{}},{"cell_type":"code","source":"# Basic architecture of DenseNet\nbase_model_densenet=DenseNet121(weights='/kaggle/input/densenet-keras/DenseNet-BC-121-32-no-top.h5',include_top=False, input_shape=(224, 224, 3)) \nmodel_densenet=Sequential()\nmodel_densenet.add(base_model_densenet)\nmodel_densenet.add(GlobalAveragePooling2D())\nmodel_densenet.add(Dropout(0.5))\nmodel_densenet.add(Dense(5,activation='softmax'))\n# Summary of the denseNet model\nmodel_densenet.summary()","metadata":{"_kg_hide-input":false,"_kg_hide-output":false,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.666095Z","iopub.status.idle":"2023-12-07T08:38:54.666734Z","shell.execute_reply.started":"2023-12-07T08:38:54.666416Z","shell.execute_reply":"2023-12-07T08:38:54.666447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_densenet.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_densenet_history = model_densenet.fit(train_data,\n                                           validation_data=valid_data,\n                                           steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                                           epochs=30,\n                                           validation_steps=int(valid_data.n//valid_data.batch_size),\n                                           callbacks=[tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)])","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.669244Z","iopub.status.idle":"2023-12-07T08:38:54.670697Z","shell.execute_reply.started":"2023-12-07T08:38:54.670325Z","shell.execute_reply":"2023-12-07T08:38:54.670362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluation metrics for denseNet model\nmodel_denseNet_result = model_densenet.evaluate(valid_data, batch_size=32)\nmodel_denseNet_result","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.672532Z","iopub.status.idle":"2023-12-07T08:38:54.673991Z","shell.execute_reply.started":"2023-12-07T08:38:54.673583Z","shell.execute_reply":"2023-12-07T08:38:54.67362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_preds_model_denseNet = make_predictions(model_densenet)\ny_true = valid_data.classes\n# Metrics for denseNet\nmetrics(y_true, y_preds_model_denseNet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.676076Z","iopub.status.idle":"2023-12-07T08:38:54.676786Z","shell.execute_reply.started":"2023-12-07T08:38:54.67644Z","shell.execute_reply":"2023-12-07T08:38:54.676472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Confusion Matrix\ncm(y_true, y_preds_model_denseNet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.679163Z","iopub.status.idle":"2023-12-07T08:38:54.679934Z","shell.execute_reply.started":"2023-12-07T08:38:54.679533Z","shell.execute_reply":"2023-12-07T08:38:54.679568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing the evaluation metrics\nplot_result(model_densenet_history.history)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.683498Z","iopub.status.idle":"2023-12-07T08:38:54.684278Z","shell.execute_reply.started":"2023-12-07T08:38:54.68388Z","shell.execute_reply":"2023-12-07T08:38:54.683923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 3. ResNet50","metadata":{}},{"cell_type":"code","source":"# Basic architecture model of ResNet50\nbase_model_resnet50=ResNet50(include_top=False, input_shape=(224, 224, 3))\nmodel_resnet50 = Sequential()\nmodel_resnet50.add(base_model_resnet50)\nmodel_resnet50.add(GlobalAveragePooling2D())\nmodel_resnet50.add(Dropout(0.5))\nmodel_resnet50.add(Dense(5,activation='softmax'))\n# Summary of the ResNet50 model\nmodel_resnet50.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.686452Z","iopub.status.idle":"2023-12-07T08:38:54.687209Z","shell.execute_reply.started":"2023-12-07T08:38:54.686821Z","shell.execute_reply":"2023-12-07T08:38:54.686871Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_resnet50.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_resnet_history = model_resnet50.fit(train_data,\n                                       validation_data=valid_data,\n                                       steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                                       epochs=150,\n                                       validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.689365Z","iopub.status.idle":"2023-12-07T08:38:54.690184Z","shell.execute_reply.started":"2023-12-07T08:38:54.689759Z","shell.execute_reply":"2023-12-07T08:38:54.689795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluation metrics for resNet model\nmodel_resNet_result = model_resnet50.evaluate(valid_data, batch_size=32)\nmodel_resNet_result","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.691833Z","iopub.status.idle":"2023-12-07T08:38:54.692598Z","shell.execute_reply.started":"2023-12-07T08:38:54.692222Z","shell.execute_reply":"2023-12-07T08:38:54.692257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_preds_resNet = make_predictions(model_resnet50)\n# Evaluation metrics for resNet\nmetrics(y_true, y_preds_resNet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.694126Z","iopub.status.idle":"2023-12-07T08:38:54.69479Z","shell.execute_reply.started":"2023-12-07T08:38:54.694457Z","shell.execute_reply":"2023-12-07T08:38:54.694488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Confusion matrix\ncm(y_true, y_preds_resNet)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.697641Z","iopub.status.idle":"2023-12-07T08:38:54.698346Z","shell.execute_reply.started":"2023-12-07T08:38:54.698015Z","shell.execute_reply":"2023-12-07T08:38:54.698045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing the evaluation metrics\nplot_result(model_resnet_history.history)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.700117Z","iopub.status.idle":"2023-12-07T08:38:54.701052Z","shell.execute_reply.started":"2023-12-07T08:38:54.700599Z","shell.execute_reply":"2023-12-07T08:38:54.700635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4. InceptionV3","metadata":{}},{"cell_type":"code","source":"# Basic architecture model of InceptionV3\nbase_model_inception=InceptionV3(weights='imagenet',include_top=False, input_shape=(224, 224, 3)) \nmodel_inception = Sequential()\nmodel_inception.add(base_model_inception)\nmodel_inception.add(GlobalAveragePooling2D())\nmodel_inception.add(Dropout(0.5))\nmodel_inception.add(Dense(5,activation='softmax'))\n# Summary of the InceptionV3 model\nmodel_inception.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.703468Z","iopub.status.idle":"2023-12-07T08:38:54.704251Z","shell.execute_reply.started":"2023-12-07T08:38:54.703879Z","shell.execute_reply":"2023-12-07T08:38:54.703915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_inception.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_inception_history = model_inception.fit(train_data,\n                                       validation_data=valid_data,\n                                       steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                                       epochs=30,\n                                       validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.706758Z","iopub.status.idle":"2023-12-07T08:38:54.70754Z","shell.execute_reply.started":"2023-12-07T08:38:54.707169Z","shell.execute_reply":"2023-12-07T08:38:54.707204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluation metrics for inception model\nmodel_inception_result = model_inception.evaluate(valid_data, batch_size=32)\nmodel_inception_result","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.709269Z","iopub.status.idle":"2023-12-07T08:38:54.710087Z","shell.execute_reply.started":"2023-12-07T08:38:54.709718Z","shell.execute_reply":"2023-12-07T08:38:54.709753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_preds_inceptionV3 = make_predictions(model_inception)\n# Evaluation metrics for InceptionV3\nmetrics(y_true, y_preds_inceptionV3)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.712496Z","iopub.status.idle":"2023-12-07T08:38:54.713224Z","shell.execute_reply.started":"2023-12-07T08:38:54.712864Z","shell.execute_reply":"2023-12-07T08:38:54.712896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# confusion matrix for inceptionV3\ncm(y_true, y_preds_inceptionV3)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.715015Z","iopub.status.idle":"2023-12-07T08:38:54.715809Z","shell.execute_reply.started":"2023-12-07T08:38:54.715449Z","shell.execute_reply":"2023-12-07T08:38:54.715485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing the evaluation metrics\nplot_result(model_inception_history.history)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.718456Z","iopub.status.idle":"2023-12-07T08:38:54.719155Z","shell.execute_reply.started":"2023-12-07T08:38:54.718804Z","shell.execute_reply":"2023-12-07T08:38:54.718854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5. VGG-16","metadata":{}},{"cell_type":"code","source":"# Basic architecture model of VGG16\nbase_model_vgg=VGG16(weights='imagenet',include_top=False, input_shape=(224, 224, 3)) \nmodel_vgg = Sequential()\nmodel_vgg.add(base_model_vgg)\nmodel_vgg.add(GlobalAveragePooling2D())\nmodel_vgg.add(Dropout(0.5))\nmodel_vgg.add(Dense(5,activation='softmax'))\n# Summary of the VGG16 model\nmodel_vgg.summary()","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.72107Z","iopub.status.idle":"2023-12-07T08:38:54.721763Z","shell.execute_reply.started":"2023-12-07T08:38:54.721418Z","shell.execute_reply":"2023-12-07T08:38:54.72145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_vgg.compile(loss='categorical_crossentropy',\n                  optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n                  metrics=['acc'])\n\nmodel_vgg_history = model_vgg.fit(train_data,\n                               validation_data=valid_data,\n                               steps_per_epoch=int(0.8*(train_data.n//train_data.batch_size)),\n                               epochs=30,\n                               validation_steps=int(valid_data.n//valid_data.batch_size))","metadata":{"_kg_hide-output":false,"scrolled":true,"execution":{"iopub.status.busy":"2023-12-07T08:38:54.724465Z","iopub.status.idle":"2023-12-07T08:38:54.725299Z","shell.execute_reply.started":"2023-12-07T08:38:54.724823Z","shell.execute_reply":"2023-12-07T08:38:54.724877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluation metrics for InceptionV3 model\nmodel_vgg_result = model_vgg.evaluate(valid_data, batch_size=32)\nmodel_vgg_result","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.727245Z","iopub.status.idle":"2023-12-07T08:38:54.727908Z","shell.execute_reply.started":"2023-12-07T08:38:54.727559Z","shell.execute_reply":"2023-12-07T08:38:54.72759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_preds_model_vgg = make_predictions(model_vgg)\n# Evaluate metrics for VGG16\nmetrics(y_true, y_preds_model_vgg)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.72957Z","iopub.status.idle":"2023-12-07T08:38:54.730257Z","shell.execute_reply.started":"2023-12-07T08:38:54.729913Z","shell.execute_reply":"2023-12-07T08:38:54.729944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cm(y_true, y_preds_model_vgg)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.732574Z","iopub.status.idle":"2023-12-07T08:38:54.733331Z","shell.execute_reply.started":"2023-12-07T08:38:54.732962Z","shell.execute_reply":"2023-12-07T08:38:54.732994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualizing the evaluation metrics\nplot_result(model_vgg_history.history)","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.735318Z","iopub.status.idle":"2023-12-07T08:38:54.736086Z","shell.execute_reply.started":"2023-12-07T08:38:54.735711Z","shell.execute_reply":"2023-12-07T08:38:54.735744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Plotting predictions on Test Dataset","metadata":{}},{"cell_type":"code","source":"model_names=[\"DenseNet121\", \"ResNet50\", \"InceptionV3\", \"VGG16\"]","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.738537Z","iopub.status.idle":"2023-12-07T08:38:54.739258Z","shell.execute_reply.started":"2023-12-07T08:38:54.738907Z","shell.execute_reply":"2023-12-07T08:38:54.73894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = [y_preds_model_denseNet, y_preds_resNet, y_preds_inceptionV3, y_preds_model_vgg]\nacc = []\nsns = pd.DataFrame(index=classes, columns=model_names)\nspc = pd.DataFrame(index=classes, columns=model_names)\nfor i in range(len(predictions)):\n    x = metrics(y_true, predictions[i])\n    acc.append((model_names[i], x[1]))\n    for j in range(5):\n        sns[model_names[i]][classes[j]] = np.float32(x[0][x[0]['class']==classes[j]]['sensitivity'])[0]\n        spc[model_names[i]][classes[j]] = np.float32(x[0][x[0]['class']==classes[j]]['specificity'])[0]\nacc, sns, spc;","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.740876Z","iopub.status.idle":"2023-12-07T08:38:54.741516Z","shell.execute_reply.started":"2023-12-07T08:38:54.741194Z","shell.execute_reply":"2023-12-07T08:38:54.741225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Specificity\nspc","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.743976Z","iopub.status.idle":"2023-12-07T08:38:54.744659Z","shell.execute_reply.started":"2023-12-07T08:38:54.744334Z","shell.execute_reply":"2023-12-07T08:38:54.744366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Sensitivity\nsns","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.746363Z","iopub.status.idle":"2023-12-07T08:38:54.747068Z","shell.execute_reply.started":"2023-12-07T08:38:54.746705Z","shell.execute_reply":"2023-12-07T08:38:54.746736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"accuracy = pd.DataFrame(acc, columns=[\"model\", \"accuracy\"])\naccuracy","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.748614Z","iopub.status.idle":"2023-12-07T08:38:54.749257Z","shell.execute_reply.started":"2023-12-07T08:38:54.748931Z","shell.execute_reply":"2023-12-07T08:38:54.748961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plotting the accuracy\naccuracy.plot(kind='bar', figsize=(7, 5), rot=0, title=\"Accuracy metrics for test data\");","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.751304Z","iopub.status.idle":"2023-12-07T08:38:54.751975Z","shell.execute_reply.started":"2023-12-07T08:38:54.751617Z","shell.execute_reply":"2023-12-07T08:38:54.751646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plotting the sensitivity\nsns.plot(kind='bar', subplots=True, layout=(2, 3), figsize=(20, 8), rot=45, title=\"Evaluation metrics for test data\");","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.754394Z","iopub.status.idle":"2023-12-07T08:38:54.755141Z","shell.execute_reply.started":"2023-12-07T08:38:54.754752Z","shell.execute_reply":"2023-12-07T08:38:54.754783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plotting the specificity\nspc.plot(kind='bar', subplots=True, layout=(2, 3), figsize=(20, 8), rot=45, title=\"Evaluation metrics for test data\");","metadata":{"execution":{"iopub.status.busy":"2023-12-07T08:38:54.757526Z","iopub.status.idle":"2023-12-07T08:38:54.758422Z","shell.execute_reply.started":"2023-12-07T08:38:54.758013Z","shell.execute_reply":"2023-12-07T08:38:54.758076Z"},"trusted":true},"execution_count":null,"outputs":[]}]}