{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"},{"sourceId":75475,"sourceType":"datasetVersion","datasetId":42723}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Library","metadata":{}},{"cell_type":"code","source":"# import tensorflow as tf\n# from tensorflow import keras\n\n# print(\"TensorFlow Version:\", tf.__version__)\n# print(\"Keras Version:\", keras.__version__)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:03:29.245647Z","iopub.execute_input":"2024-06-27T10:03:29.245987Z","iopub.status.idle":"2024-06-27T10:03:29.250698Z","shell.execute_reply.started":"2024-06-27T10:03:29.245956Z","shell.execute_reply":"2024-06-27T10:03:29.249844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport numpy as np\nfrom PIL import Image\nimport pandas as pd\nimport seaborn as sns\nimport cv2\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\n\nfrom keras.callbacks import Callback\nfrom keras.layers import Dense, Conv2D, Flatten, GlobalAveragePooling2D, Dropout\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n# Keras Core\nfrom tensorflow.keras.layers import MaxPooling2D, Convolution2D, AveragePooling2D\nfrom keras.layers import Input, Dropout, Dense, Flatten, Activation\nfrom keras.layers import BatchNormalization\nfrom keras.layers import concatenate\nfrom keras import regularizers\nfrom keras import initializers\nfrom keras import optimizers\nfrom keras.models import Model\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom sklearn.metrics import confusion_matrix, classification_report\n# Backend\nfrom keras import backend as K\n","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:40.228576Z","iopub.execute_input":"2024-07-24T14:24:40.228908Z","iopub.status.idle":"2024-07-24T14:24:54.645535Z","shell.execute_reply.started":"2024-07-24T14:24:40.228883Z","shell.execute_reply":"2024-07-24T14:24:54.644758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare Data","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv(\"../input/aptos2019-blindness-detection/train.csv\") #.sample(200)\n\n# define class mapping\nclass_mapping = {0: 'No DR', 1: 'Mild', 2: 'Moderate', 3: 'Severe', 4: 'Proliferative DR'}\n\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:54.647401Z","iopub.execute_input":"2024-07-24T14:24:54.648365Z","iopub.status.idle":"2024-07-24T14:24:54.682326Z","shell.execute_reply.started":"2024-07-24T14:24:54.648330Z","shell.execute_reply":"2024-07-24T14:24:54.681453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['diagnosis'].hist()\ndf['diagnosis'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:54.683348Z","iopub.execute_input":"2024-07-24T14:24:54.683613Z","iopub.status.idle":"2024-07-24T14:24:55.007820Z","shell.execute_reply.started":"2024-07-24T14:24:54.683591Z","shell.execute_reply":"2024-07-24T14:24:55.006857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing Grayscale","metadata":{}},{"cell_type":"code","source":"# new directory for preprocessing image\n! mkdir '/kaggle/working/no_clahe_images/'","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:55.010421Z","iopub.execute_input":"2024-07-24T14:24:55.011035Z","iopub.status.idle":"2024-07-24T14:24:56.024308Z","shell.execute_reply.started":"2024-07-24T14:24:55.011008Z","shell.execute_reply":"2024-07-24T14:24:56.023349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def resize_with_padding(image, target_size):\n    old_size = image.shape[:2]  # (height, width)\n    ratio = float(target_size) / max(old_size)\n    new_size = tuple([int(x * ratio) for x in old_size])\n\n    # Resize the image with the same aspect ratio\n    image = cv2.resize(image, (new_size[1], new_size[0]))\n\n    # Create a new image and place the resized image at the center\n    delta_w = target_size - new_size[1]\n    delta_h = target_size - new_size[0]\n    top, bottom = delta_h // 2, delta_h - (delta_h // 2)\n    left, right = delta_w // 2, delta_w - (delta_w // 2)\n    color = [0, 0, 0]\n    new_image = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)\n    return new_image","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:56.025994Z","iopub.execute_input":"2024-07-24T14:24:56.026393Z","iopub.status.idle":"2024-07-24T14:24:56.035211Z","shell.execute_reply.started":"2024-07-24T14:24:56.026356Z","shell.execute_reply":"2024-07-24T14:24:56.034208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def grayscale(image):\n    # Convert image to grayscale\n    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n    return gray_image","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:56.036670Z","iopub.execute_input":"2024-07-24T14:24:56.037012Z","iopub.status.idle":"2024-07-24T14:24:56.122160Z","shell.execute_reply.started":"2024-07-24T14:24:56.036980Z","shell.execute_reply":"2024-07-24T14:24:56.121355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_id = 0\nfor index, row in df.iterrows():\n    my_id = my_id + 1\n    if (my_id%100)==0: print('train ... '+str(my_id))\n    my_pic_name = row.id_code\n    im_path = \"../input/aptos2019-blindness-detection/train_images/\"+my_pic_name+\".png\"    \n    img = cv2.imread(im_path)\n#     image = cv2.resize(img, (299, 299))\n    image = resize_with_padding(img, 299)\n    image = grayscale(image)\n    cv2.imwrite(\"/kaggle/working/no_clahe_images/\" +my_pic_name+\".png\", image)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:24:56.123613Z","iopub.execute_input":"2024-07-24T14:24:56.124123Z","iopub.status.idle":"2024-07-24T14:31:37.688622Z","shell.execute_reply.started":"2024-07-24T14:24:56.124091Z","shell.execute_reply":"2024-07-24T14:31:37.687807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import shutil\n\n# # Membuat file zip dari folder output\n# shutil.make_archive('no_clahe_images', 'zip', '/kaggle/working/no_clahe_images')","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:10:43.812129Z","iopub.execute_input":"2024-06-27T10:10:43.812432Z","iopub.status.idle":"2024-06-27T10:11:01.146913Z","shell.execute_reply.started":"2024-06-27T10:10:43.812405Z","shell.execute_reply":"2024-06-27T10:11:01.145982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from IPython.display import FileLink\n\n# # Membuat tautan unduh ke file zip\n# FileLink('no_clahe_images.zip')","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.148231Z","iopub.execute_input":"2024-06-27T10:11:01.148923Z","iopub.status.idle":"2024-06-27T10:11:01.154977Z","shell.execute_reply.started":"2024-06-27T10:11:01.148886Z","shell.execute_reply":"2024-06-27T10:11:01.153989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing CLAHE","metadata":{}},{"cell_type":"code","source":"# new directory for preprocessing image\n! mkdir '/kaggle/working/clahe_images/'","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:31:37.690919Z","iopub.execute_input":"2024-07-24T14:31:37.691224Z","iopub.status.idle":"2024-07-24T14:31:38.687547Z","shell.execute_reply.started":"2024-07-24T14:31:37.691200Z","shell.execute_reply":"2024-07-24T14:31:38.686288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def clahe5(image, clip_limit=5.0, tile_grid_size=(8, 8)):\n    # Convert image to grayscale\n    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n\n    # Create CLAHE object\n    clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=tile_grid_size)\n\n    # Apply CLAHE to the grayscale image\n    clahe_image = clahe.apply(gray_image)\n\n    return clahe_image","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:31:38.688972Z","iopub.execute_input":"2024-07-24T14:31:38.689269Z","iopub.status.idle":"2024-07-24T14:31:38.695165Z","shell.execute_reply.started":"2024-07-24T14:31:38.689244Z","shell.execute_reply":"2024-07-24T14:31:38.694279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_id = 0\nfor index, row in df.iterrows():\n    my_id = my_id + 1\n    if (my_id%100)==0: print('train ... '+str(my_id))\n    my_pic_name = row.id_code\n    im_path = \"../input/aptos2019-blindness-detection/train_images/\"+my_pic_name+\".png\"    \n    img = cv2.imread(im_path)\n#     image = cv2.resize(img, (299, 299))\n    image = resize_with_padding(img, 299)\n    image = clahe5(image)\n    cv2.imwrite(\"/kaggle/working/clahe_images/\" +my_pic_name+\".png\", image)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:31:38.696540Z","iopub.execute_input":"2024-07-24T14:31:38.697436Z","iopub.status.idle":"2024-07-24T14:37:34.316569Z","shell.execute_reply.started":"2024-07-24T14:31:38.697412Z","shell.execute_reply":"2024-07-24T14:37:34.315539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import shutil\n\n# # Membuat file zip dari folder output\n# shutil.make_archive('clahe_images', 'zip', '/kaggle/working/clahe_images')","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.189294Z","iopub.execute_input":"2024-06-27T10:11:01.189593Z","iopub.status.idle":"2024-06-27T10:11:01.196523Z","shell.execute_reply.started":"2024-06-27T10:11:01.189569Z","shell.execute_reply":"2024-06-27T10:11:01.195485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from IPython.display import FileLink\n\n# # Membuat tautan unduh ke file zip\n# FileLink('clahe_images.zip')","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.197609Z","iopub.execute_input":"2024-06-27T10:11:01.197923Z","iopub.status.idle":"2024-06-27T10:11:01.209252Z","shell.execute_reply.started":"2024-06-27T10:11:01.197892Z","shell.execute_reply":"2024-06-27T10:11:01.208474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Show Before After Implementing Preprocessing CLAHE","metadata":{}},{"cell_type":"code","source":"# pick example image in each class \nexample_images = df.groupby('diagnosis').first().reset_index()\nprint(example_images)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:37:34.317850Z","iopub.execute_input":"2024-07-24T14:37:34.318152Z","iopub.status.idle":"2024-07-24T14:37:34.335035Z","shell.execute_reply.started":"2024-07-24T14:37:34.318128Z","shell.execute_reply":"2024-07-24T14:37:34.334055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # pick random 5 pictures from each class\n# image_path = '/kaggle/input/aptos2019-blindness-detection/train_images'\n# clahe_path = '/kaggle/working/clahe_images'\n\n# for i, row in example_images.iterrows():\n#     label = row['diagnosis']\n#     image_name = row['id_code'] + '.png'\n\n#     class_name = class_mapping[label]\n#     print(class_name)\n    \n#     img = cv2.imread(os.path.join(image_path,image_name)) \n#     img_clahe = cv2.imread(os.path.join(clahe_path,image_name))\n\n#     fig = plt.figure()\n#     fig.add_subplot(1,3,1)\n#     plt.title('Original Image')\n#     plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))\n\n#     fig.add_subplot(1,3,2)\n#     plt.title('CLAHE 5.0 Image')\n#     plt.imshow(img_clahe)\n\n#     plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.219483Z","iopub.execute_input":"2024-06-27T10:11:01.219761Z","iopub.status.idle":"2024-06-27T10:11:01.227810Z","shell.execute_reply.started":"2024-06-27T10:11:01.219739Z","shell.execute_reply":"2024-06-27T10:11:01.226984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# fig, axes = plt.subplots(len(example_images), 2, figsize=(20, 5 * len(example_images)))\n\n# for i, row in example_images.iterrows():\n#     label = row['diagnosis']\n#     image_name = row['id_code']\n    \n#     class_name = class_mapping[label]\n    \n#     img_path = os.path.join(image_path, f\"{image_name}.png\")\n#     clahe_img_path = os.path.join(clahe_path, f\"{image_name}.png\")\n\n#     img = cv2.imread(img_path)\n#     img_clahe = cv2.imread(clahe_img_path)\n    \n#     # Subplot untuk histogram gambar asli\n#     plt.subplot(len(example_images), 2, i*2+1)\n#     plt.hist(img.flatten(), bins=256, range=(0, 256), color='b')\n#     plt.title(f'Histogram Original Image (Diagnosis: {class_name})')\n#     plt.xlabel('Pixel Intensity') \n#     plt.ylabel('Frequency')\n    \n#     # Subplot untuk histogram gambar setelah CLAHE\n#     plt.subplot(len(example_images), 2, i*2+2)\n#     plt.hist(img_clahe.flatten(), bins=256, range=(0, 256), color='b', alpha=0.7)\n#     plt.title(f'Histogram After CLAHE (Diagnosis: {class_name})')\n#     plt.xlabel('Pixel Intensity') \n#     plt.ylabel('Frequency')\n\n# plt.tight_layout()\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.228893Z","iopub.execute_input":"2024-06-27T10:11:01.229146Z","iopub.status.idle":"2024-06-27T10:11:01.240999Z","shell.execute_reply.started":"2024-06-27T10:11:01.229124Z","shell.execute_reply":"2024-06-27T10:11:01.240238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Show Before After Implementing Preprocessing CLAHE","metadata":{}},{"cell_type":"code","source":"# pick example image in each class \nexample_images = df.groupby('diagnosis').first().reset_index()\nprint(example_images)","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:37:34.336220Z","iopub.execute_input":"2024-07-24T14:37:34.336894Z","iopub.status.idle":"2024-07-24T14:37:34.345431Z","shell.execute_reply.started":"2024-07-24T14:37:34.336864Z","shell.execute_reply":"2024-07-24T14:37:34.344378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# pick random 5 pictures from each class\nimage_path = '/kaggle/input/aptos2019-blindness-detection/train_images'\nclahe_path = '/kaggle/working/clahe_images'\ngrayscale_path = '/kaggle/working/no_clahe_images'\n\nfor i, row in example_images.iterrows():\n    label = row['diagnosis']\n    image_name = row['id_code'] + '.png'\n\n    class_name = class_mapping[label]\n    print(class_name)\n    \n    img = cv2.imread(os.path.join(image_path,image_name)) \n    img_grayscale = cv2.imread(os.path.join(grayscale_path,image_name))\n    img_clahe = cv2.imread(os.path.join(clahe_path,image_name))\n\n    fig = plt.figure()\n    fig.add_subplot(1,3,1)\n    plt.title('Original Image')\n    plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))\n\n    fig.add_subplot(1,3,2)\n    plt.title('Grayscale Image')\n    plt.imshow(img_grayscale)\n    \n    fig.add_subplot(1,3,3)\n    plt.title('CLAHE Image')\n    plt.imshow(img_clahe)\n\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:38:21.107772Z","iopub.execute_input":"2024-07-24T14:38:21.108464Z","iopub.status.idle":"2024-07-24T14:38:25.957298Z","shell.execute_reply.started":"2024-07-24T14:38:21.108431Z","shell.execute_reply":"2024-07-24T14:38:25.956451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(len(example_images), 2, figsize=(20, 5 * len(example_images)))\n\nfor i, row in example_images.iterrows():\n    label = row['diagnosis']\n    image_name = row['id_code']\n    \n    class_name = class_mapping[label]\n    \n    img_path = os.path.join(image_path, f\"{image_name}.png\")\n    grayscale_img_path = os.path.join(grayscale_path, f\"{image_name}.png\")\n    clahe_img_path = os.path.join(clahe_path, f\"{image_name}.png\")\n\n    img = cv2.imread(img_path)\n    img_grayscale = cv2.imread(grayscale_img_path)\n    img_clahe = cv2.imread(clahe_img_path)\n    \n    # Subplot untuk histogram gambar asli\n    plt.subplot(len(example_images), 2, i*2+1)\n    plt.hist(img.flatten(), bins=256, range=(0, 256), color='b')\n    plt.title(f'Histogram Original Image (Diagnosis: {class_name})')\n    plt.xlabel('Pixel Intensity') \n    plt.ylabel('Frequency')\n    \n    # Subplot untuk histogram grayscale\n    plt.subplot(len(example_images), 2, i*2+2)\n    plt.hist(img_grayscale.flatten(), bins=256, range=(0, 256), color='b')\n    plt.title(f'Histogram After Grayscale Image (Diagnosis: {class_name})')\n    plt.xlabel('Pixel Intensity') \n    plt.ylabel('Frequency')\n    \n#     # Subplot untuk histogram gambar setelah CLAHE\n#     plt.subplot(len(example_images), 2, i*2+2)\n#     plt.hist(img_clahe.flatten(), bins=256, range=(0, 256), color='b', alpha=0.7)\n#     plt.title(f'Histogram After CLAHE (Diagnosis: {class_name})')\n#     plt.xlabel('Pixel Intensity') \n#     plt.ylabel('Frequency')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:45:22.016960Z","iopub.execute_input":"2024-07-24T14:45:22.017383Z","iopub.status.idle":"2024-07-24T14:45:30.941985Z","shell.execute_reply.started":"2024-07-24T14:45:22.017353Z","shell.execute_reply":"2024-07-24T14:45:30.941148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(len(example_images), 2, figsize=(20, 5 * len(example_images)))\n\nfor i, row in example_images.iterrows():\n    label = row['diagnosis']\n    image_name = row['id_code']\n    \n    class_name = class_mapping[label]\n    \n    img_path = os.path.join(image_path, f\"{image_name}.png\")\n    grayscale_img_path = os.path.join(grayscale_path, f\"{image_name}.png\")\n    clahe_img_path = os.path.join(clahe_path, f\"{image_name}.png\")\n\n    img = cv2.imread(img_path)\n    img_grayscale = cv2.imread(grayscale_img_path)\n    img_clahe = cv2.imread(clahe_img_path)\n    \n    # Subplot untuk histogram gambar asli\n    plt.subplot(len(example_images), 2, i*2+1)\n    plt.hist(img.flatten(), bins=256, range=(0, 256), color='b')\n    plt.title(f'Histogram Original Image (Diagnosis: {class_name})')\n    plt.xlabel('Pixel Intensity') \n    plt.ylabel('Frequency')\n    \n#     # Subplot untuk histogram grayscale\n#     plt.subplot(len(example_images), 2, i*2+2)\n#     plt.hist(img_grayscale.flatten(), bins=256, range=(0, 256), color='b')\n#     plt.title(f'Histogram After Grayscale Image (Diagnosis: {class_name})')\n#     plt.xlabel('Pixel Intensity') \n#     plt.ylabel('Frequency')\n    \n    # Subplot untuk histogram gambar setelah CLAHE\n    plt.subplot(len(example_images), 2, i*2+2)\n    plt.hist(img_clahe.flatten(), bins=256, range=(0, 256), color='b', alpha=0.7)\n    plt.title(f'Histogram After CLAHE (Diagnosis: {class_name})')\n    plt.xlabel('Pixel Intensity') \n    plt.ylabel('Frequency')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:45:44.741674Z","iopub.execute_input":"2024-07-24T14:45:44.742019Z","iopub.status.idle":"2024-07-24T14:45:53.759462Z","shell.execute_reply.started":"2024-07-24T14:45:44.741993Z","shell.execute_reply":"2024-07-24T14:45:53.758543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(len(example_images), 2, figsize=(20, 5 * len(example_images)))\n\nfor i, row in example_images.iterrows():\n    label = row['diagnosis']\n    image_name = row['id_code']\n    \n    class_name = class_mapping[label]\n    \n    img_path = os.path.join(image_path, f\"{image_name}.png\")\n    grayscale_img_path = os.path.join(grayscale_path, f\"{image_name}.png\")\n    clahe_img_path = os.path.join(clahe_path, f\"{image_name}.png\")\n\n    img = cv2.imread(img_path)\n    img_grayscale = cv2.imread(grayscale_img_path)\n    img_clahe = cv2.imread(clahe_img_path)\n    \n#     # Subplot untuk histogram gambar asli\n#     plt.subplot(len(example_images), 2, i*2+1)\n#     plt.hist(img.flatten(), bins=256, range=(0, 256), color='b')\n#     plt.title(f'Histogram Original Image (Diagnosis: {class_name})')\n#     plt.xlabel('Pixel Intensity') \n#     plt.ylabel('Frequency')\n    \n    # Subplot untuk histogram grayscale\n    plt.subplot(len(example_images), 2, i*2+1)\n    plt.hist(img_grayscale.flatten(), bins=256, range=(0, 256), color='b')\n    plt.title(f'Histogram After Grayscale Image (Diagnosis: {class_name})')\n    plt.xlabel('Pixel Intensity') \n    plt.ylabel('Frequency')\n    \n    # Subplot untuk histogram gambar setelah CLAHE\n    plt.subplot(len(example_images), 2, i*2+2)\n    plt.hist(img_clahe.flatten(), bins=256, range=(0, 256), color='b', alpha=0.7)\n    plt.title(f'Histogram After CLAHE (Diagnosis: {class_name})')\n    plt.xlabel('Pixel Intensity') \n    plt.ylabel('Frequency')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-24T14:46:14.815640Z","iopub.execute_input":"2024-07-24T14:46:14.816446Z","iopub.status.idle":"2024-07-24T14:46:21.288121Z","shell.execute_reply.started":"2024-07-24T14:46:14.816415Z","shell.execute_reply":"2024-07-24T14:46:21.287166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Deep Learning Variables","metadata":{}},{"cell_type":"code","source":"# cnn variable\ntarget_size = (299,299)\nnum_classes = 5\nepochs = 100\n\nlearning_rate_1 = 0.001\nlearning_rate_2 = 0.0001\n\nbatch_size_1 = 16\nbatch_size_2 = 32\n\nvalidation_split_1 = 0.25\nvalidation_split_2 = 0.2\n\n# directory_clahe = \"/kaggle/working/clahe_images/\"\n# directory_no_clahe = \"/kaggle/input/aptos2019-blindness-detection/train_images\"","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.241863Z","iopub.execute_input":"2024-06-27T10:11:01.242106Z","iopub.status.idle":"2024-06-27T10:11:01.250243Z","shell.execute_reply.started":"2024-06-27T10:11:01.242084Z","shell.execute_reply":"2024-06-27T10:11:01.249476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Augmentation Data","metadata":{}},{"cell_type":"markdown","source":"**Model Augmentation 1**\n* split data = 75:25","metadata":{}},{"cell_type":"code","source":"augmetation_1 = ImageDataGenerator(rescale = 1./255,                          \n                         horizontal_flip = True, \n                         vertical_flip = True, \n                         rotation_range = 120, \n                         zoom_range = 0.1, \n                         width_shift_range = 0.2, \n                         shear_range = 0.15, \n                         fill_mode = 'nearest',\n                         validation_split = validation_split_1)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.251433Z","iopub.execute_input":"2024-06-27T10:11:01.251973Z","iopub.status.idle":"2024-06-27T10:11:01.262495Z","shell.execute_reply.started":"2024-06-27T10:11:01.251904Z","shell.execute_reply":"2024-06-27T10:11:01.261640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Augmentation 2**\n* split data = 80:20","metadata":{}},{"cell_type":"code","source":"augmetation_2 = ImageDataGenerator(rescale = 1./255,                          \n                         horizontal_flip = True, \n                         vertical_flip = True, \n                         rotation_range = 120, \n                         zoom_range = 0.1, \n                         width_shift_range = 0.2, \n                         shear_range = 0.15, \n                         fill_mode = 'nearest',\n                         validation_split = validation_split_2)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.263593Z","iopub.execute_input":"2024-06-27T10:11:01.263873Z","iopub.status.idle":"2024-06-27T10:11:01.272046Z","shell.execute_reply.started":"2024-06-27T10:11:01.263850Z","shell.execute_reply":"2024-06-27T10:11:01.271269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.id_code=df.id_code.apply(lambda x: x+\".png\")\ndf['diagnosis'] = df['diagnosis'].astype('str')\n\n# df['id_code'] = df['id_code'].apply(lambda x: x.replace('.png', ''))","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.272939Z","iopub.execute_input":"2024-06-27T10:11:01.273207Z","iopub.status.idle":"2024-06-27T10:11:01.285635Z","shell.execute_reply.started":"2024-06-27T10:11:01.273185Z","shell.execute_reply":"2024-06-27T10:11:01.284764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.286767Z","iopub.execute_input":"2024-06-27T10:11:01.287066Z","iopub.status.idle":"2024-06-27T10:11:01.299341Z","shell.execute_reply.started":"2024-06-27T10:11:01.287034Z","shell.execute_reply":"2024-06-27T10:11:01.298498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 1**\n* batch size = 16\n* split data = 75:25\n* CLAHE","metadata":{}},{"cell_type":"code","source":"train_generator_1=augmetation_1.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\", \n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_1, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'training',\n#                                         seed=SEED,\n                                        shuffle=False)\n\nvalid_generator_1=augmetation_1.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\",\n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_1, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'validation', \n#                                         seed=SEED,\n                                        shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.300252Z","iopub.execute_input":"2024-06-27T10:11:01.300496Z","iopub.status.idle":"2024-06-27T10:11:01.308589Z","shell.execute_reply.started":"2024-06-27T10:11:01.300474Z","shell.execute_reply":"2024-06-27T10:11:01.307758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# one batch from train generator\nimages, labels = next(train_generator_1)\n\n# show augmentation in a batch\nfig, axes = plt.subplots(1, len(images), figsize=(20, 20))\nfor i in range(len(images)):\n    axes[i].imshow(images[i])\n    axes[i].axis('off')\n    axes[i].set_title(f'Class: {np.argmax(labels[i])}')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.309676Z","iopub.execute_input":"2024-06-27T10:11:01.310620Z","iopub.status.idle":"2024-06-27T10:11:01.320618Z","shell.execute_reply.started":"2024-06-27T10:11:01.310578Z","shell.execute_reply":"2024-06-27T10:11:01.319777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 2**\n* batch size = 32\n* split data = 75:25\n* CLAHE","metadata":{}},{"cell_type":"code","source":"train_generator_2=augmetation_1.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\", \n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_2, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'training',\n#                                         seed=SEED,\n                                        shuffle=False)\n\nvalid_generator_2=augmetation_1.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\",\n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_2, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'validation', \n#                                         seed=SEED,\n                                        shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.321783Z","iopub.execute_input":"2024-06-27T10:11:01.322152Z","iopub.status.idle":"2024-06-27T10:11:01.330761Z","shell.execute_reply.started":"2024-06-27T10:11:01.322123Z","shell.execute_reply":"2024-06-27T10:11:01.329909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# one batch from train generator\nimages, labels = next(train_generator_2)\n\n# show augmentation in a batch\nfig, axes = plt.subplots(1, len(images), figsize=(20, 20))\nfor i in range(len(images)):\n    axes[i].imshow(images[i])\n    axes[i].axis('off')\n    axes[i].set_title(f'Class: {np.argmax(labels[i])}')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.331824Z","iopub.execute_input":"2024-06-27T10:11:01.332089Z","iopub.status.idle":"2024-06-27T10:11:01.342873Z","shell.execute_reply.started":"2024-06-27T10:11:01.332053Z","shell.execute_reply":"2024-06-27T10:11:01.342082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 3**\n* batch size = 16\n* split data = 80:20\n* CLAHE","metadata":{}},{"cell_type":"code","source":"train_generator_3=augmetation_2.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\", \n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_1, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'training',\n#                                         seed=SEED,\n                                        shuffle=False)\n\nvalid_generator_3=augmetation_2.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\",\n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_1, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'validation', \n#                                         seed=SEED,\n                                        shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.343891Z","iopub.execute_input":"2024-06-27T10:11:01.345682Z","iopub.status.idle":"2024-06-27T10:11:01.351917Z","shell.execute_reply.started":"2024-06-27T10:11:01.345658Z","shell.execute_reply":"2024-06-27T10:11:01.351196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# one batch from train generator\nimages, labels = next(train_generator_3)\n\n# show augmentation in a batch\nfig, axes = plt.subplots(1, len(images), figsize=(20, 20))\nfor i in range(len(images)):\n    axes[i].imshow(images[i])\n    axes[i].axis('off')\n    axes[i].set_title(f'Class: {np.argmax(labels[i])}')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.352989Z","iopub.execute_input":"2024-06-27T10:11:01.353893Z","iopub.status.idle":"2024-06-27T10:11:01.364883Z","shell.execute_reply.started":"2024-06-27T10:11:01.353861Z","shell.execute_reply":"2024-06-27T10:11:01.364033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 4**\n* batch size = 32\n* split data = 80:20\n* CLAHE","metadata":{}},{"cell_type":"code","source":"train_generator_4=augmetation_2.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\", \n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_2, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'training',\n#                                         seed=SEED,\n                                        shuffle=False)\n\nvalid_generator_4=augmetation_2.flow_from_dataframe(dataframe = df, \n                                        directory = \"/kaggle/working/clahe_images/\",\n                                        x_col = \"id_code\",\n                                        y_col = \"diagnosis\",\n                                        batch_size = batch_size_2, \n                                        class_mode = \"categorical\", \n                                        target_size = target_size,\n                                        subset = 'validation', \n#                                         seed=SEED,\n                                        shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.365940Z","iopub.execute_input":"2024-06-27T10:11:01.366303Z","iopub.status.idle":"2024-06-27T10:11:01.374166Z","shell.execute_reply.started":"2024-06-27T10:11:01.366272Z","shell.execute_reply":"2024-06-27T10:11:01.373384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# one batch from train generator\nimages, labels = next(train_generator_4)\n\n# show augmentation in a batch\nfig, axes = plt.subplots(1, len(images), figsize=(20, 20))\nfor i in range(len(images)):\n    axes[i].imshow(images[i])\n    axes[i].axis('off')\n    axes[i].set_title(f'Class: {np.argmax(labels[i])}')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.382182Z","iopub.execute_input":"2024-06-27T10:11:01.382724Z","iopub.status.idle":"2024-06-27T10:11:01.386542Z","shell.execute_reply.started":"2024-06-27T10:11:01.382700Z","shell.execute_reply":"2024-06-27T10:11:01.385762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 5**\n* batch size = 16\n* split data = 75:25\n* No CLAHE","metadata":{}},{"cell_type":"code","source":"# train_generator_5=augmetation_1.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\", \n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_1, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'training',\n# #                                         seed=SEED,\n#                                         shuffle=False)\n\n# valid_generator_5=augmetation_1.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\",\n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_1, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'validation', \n# #                                         seed=SEED,\n#                                         shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.387773Z","iopub.execute_input":"2024-06-27T10:11:01.388100Z","iopub.status.idle":"2024-06-27T10:11:01.482158Z","shell.execute_reply.started":"2024-06-27T10:11:01.388070Z","shell.execute_reply":"2024-06-27T10:11:01.481510Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # one batch from train generator\n# images, labels = next(train_generator_5)\n\n# # show augmentation in a batch\n# fig, axes = plt.subplots(1, len(images), figsize=(20, 20))\n# for i in range(len(images)):\n#     axes[i].imshow(images[i])\n#     axes[i].axis('off')\n#     axes[i].set_title(f'Class: {np.argmax(labels[i])}')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:01.483149Z","iopub.execute_input":"2024-06-27T10:11:01.483469Z","iopub.status.idle":"2024-06-27T10:11:02.959386Z","shell.execute_reply.started":"2024-06-27T10:11:01.483442Z","shell.execute_reply":"2024-06-27T10:11:02.957458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 6**\n* batch size = 32\n* split data = 75:25\n* No CLAHE","metadata":{}},{"cell_type":"code","source":"# train_generator_6=augmetation_1.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\", \n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_2, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'training',\n# #                                         seed=SEED,\n#                                         shuffle=False)\n\n# valid_generator_6=augmetation_1.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\",\n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_2, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'validation', \n# #                                         seed=SEED,\n#                                         shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:02.962563Z","iopub.execute_input":"2024-06-27T10:11:02.963135Z","iopub.status.idle":"2024-06-27T10:11:03.068356Z","shell.execute_reply.started":"2024-06-27T10:11:02.963078Z","shell.execute_reply":"2024-06-27T10:11:03.067362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # one batch from train generator\n# images, labels = next(train_generator_6)\n\n# # show augmentation in a batch\n# fig, axes = plt.subplots(1, len(images), figsize=(20, 20))\n# for i in range(len(images)):\n#     axes[i].imshow(images[i])\n#     axes[i].axis('off')\n#     axes[i].set_title(f'Class: {np.argmax(labels[i])}')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:03.069714Z","iopub.execute_input":"2024-06-27T10:11:03.070016Z","iopub.status.idle":"2024-06-27T10:11:05.946821Z","shell.execute_reply.started":"2024-06-27T10:11:03.069988Z","shell.execute_reply":"2024-06-27T10:11:05.945981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 7**\n* batch size = 16\n* split data = 80:20\n* No CLAHE","metadata":{}},{"cell_type":"code","source":"# train_generator_7=augmetation_2.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\", \n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_1, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'training',\n# #                                         seed=SEED,\n#                                         shuffle=False)\n\n# valid_generator_7=augmetation_2.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\",\n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_1, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'validation', \n# #                                         seed=SEED,\n#                                         shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:05.947819Z","iopub.execute_input":"2024-06-27T10:11:05.948077Z","iopub.status.idle":"2024-06-27T10:11:06.039270Z","shell.execute_reply.started":"2024-06-27T10:11:05.948054Z","shell.execute_reply":"2024-06-27T10:11:06.038536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # one batch from train generator\n# images, labels = next(train_generator_7)\n\n# # show augmentation in a batch\n# fig, axes = plt.subplots(1, len(images), figsize=(20, 20))\n# for i in range(len(images)):\n#     axes[i].imshow(images[i])\n#     axes[i].axis('off')\n#     axes[i].set_title(f'Class: {np.argmax(labels[i])}')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:06.040175Z","iopub.execute_input":"2024-06-27T10:11:06.040421Z","iopub.status.idle":"2024-06-27T10:11:07.418449Z","shell.execute_reply.started":"2024-06-27T10:11:06.040398Z","shell.execute_reply":"2024-06-27T10:11:07.417572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model Generator 8**\n* batch size = 32\n* split data = 80:20\n* No CLAHE","metadata":{}},{"cell_type":"code","source":"# train_generator_8=augmetation_2.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\", \n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_2, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'training',\n# #                                         seed=SEED,\n#                                         shuffle=False)\n\n# valid_generator_8=augmetation_2.flow_from_dataframe(dataframe = df, \n#                                         directory = \"/kaggle/working/no_clahe_images/\",\n#                                         x_col = \"id_code\",\n#                                         y_col = \"diagnosis\",\n#                                         batch_size = batch_size_2, \n#                                         class_mode = \"categorical\", \n#                                         target_size = target_size,\n#                                         subset = 'validation', \n# #                                         seed=SEED,\n#                                         shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:07.419740Z","iopub.execute_input":"2024-06-27T10:11:07.420082Z","iopub.status.idle":"2024-06-27T10:11:07.512101Z","shell.execute_reply.started":"2024-06-27T10:11:07.420052Z","shell.execute_reply":"2024-06-27T10:11:07.511272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # one batch from train generator\n# images, labels = next(train_generator_8)\n\n# # show augmentation in a batch\n# fig, axes = plt.subplots(1, len(images), figsize=(20, 20))\n# for i in range(len(images)):\n#     axes[i].imshow(images[i])\n#     axes[i].axis('off')\n#     axes[i].set_title(f'Class: {np.argmax(labels[i])}')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:07.513159Z","iopub.execute_input":"2024-06-27T10:11:07.513431Z","iopub.status.idle":"2024-06-27T10:11:09.967763Z","shell.execute_reply.started":"2024-06-27T10:11:07.513408Z","shell.execute_reply":"2024-06-27T10:11:09.966910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inception V4","metadata":{}},{"cell_type":"code","source":"WEIGHTS_PATH = 'https://github.com/kentsommer/keras-inceptionV4/releases/download/2.1/inception-v4_weights_tf_dim_ordering_tf_kernels.h5'\nWEIGHTS_PATH_NO_TOP = 'https://github.com/kentsommer/keras-inceptionV4/releases/download/2.1/inception-v4_weights_tf_dim_ordering_tf_kernels_notop.h5'\n\n\ndef preprocess_input(x):\n    x = np.divide(x, 255.0)\n    x = np.subtract(x, 0.5)\n    x = np.multiply(x, 2.0)\n    return x\n\n\ndef conv2d_bn(x, nb_filter, num_row, num_col,\n              padding='same', strides=(1, 1), use_bias=False):\n    \"\"\"\n    Utility function to apply conv + BN. \n    (Slightly modified from https://github.com/fchollet/keras/blob/master/keras/applications/inception_v3.py)\n    \"\"\"\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n    x = Convolution2D(nb_filter, (num_row, num_col),\n                      strides=strides,\n                      padding=padding,\n                      use_bias=use_bias,\n                      kernel_regularizer=regularizers.l2(0.00004),\n                      kernel_initializer=initializers.VarianceScaling(scale=2.0, mode='fan_in', distribution='normal', seed=None))(x)\n    x = BatchNormalization(axis=channel_axis, momentum=0.9997, scale=False)(x)\n    x = Activation('relu')(x)\n    return x\n\n\ndef block_inception_a(input):\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n\n    branch_0 = conv2d_bn(input, 96, 1, 1)\n\n    branch_1 = conv2d_bn(input, 64, 1, 1)\n    branch_1 = conv2d_bn(branch_1, 96, 3, 3)\n\n    branch_2 = conv2d_bn(input, 64, 1, 1)\n    branch_2 = conv2d_bn(branch_2, 96, 3, 3)\n    branch_2 = conv2d_bn(branch_2, 96, 3, 3)\n\n    branch_3 = AveragePooling2D((3,3), strides=(1,1), padding='same')(input)\n    branch_3 = conv2d_bn(branch_3, 96, 1, 1)\n\n    x = concatenate([branch_0, branch_1, branch_2, branch_3], axis=channel_axis)\n    return x\n\n\ndef block_reduction_a(input):\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n\n    branch_0 = conv2d_bn(input, 384, 3, 3, strides=(2,2), padding='valid')\n\n    branch_1 = conv2d_bn(input, 192, 1, 1)\n    branch_1 = conv2d_bn(branch_1, 224, 3, 3)\n    branch_1 = conv2d_bn(branch_1, 256, 3, 3, strides=(2,2), padding='valid')\n\n    branch_2 = MaxPooling2D((3,3), strides=(2,2), padding='valid')(input)\n\n    x = concatenate([branch_0, branch_1, branch_2], axis=channel_axis)\n    return x\n\n\ndef block_inception_b(input):\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n\n    branch_0 = conv2d_bn(input, 384, 1, 1)\n\n    branch_1 = conv2d_bn(input, 192, 1, 1)\n    branch_1 = conv2d_bn(branch_1, 224, 1, 7)\n    branch_1 = conv2d_bn(branch_1, 256, 7, 1)\n\n    branch_2 = conv2d_bn(input, 192, 1, 1)\n    branch_2 = conv2d_bn(branch_2, 192, 7, 1)\n    branch_2 = conv2d_bn(branch_2, 224, 1, 7)\n    branch_2 = conv2d_bn(branch_2, 224, 7, 1)\n    branch_2 = conv2d_bn(branch_2, 256, 1, 7)\n\n    branch_3 = AveragePooling2D((3,3), strides=(1,1), padding='same')(input)\n    branch_3 = conv2d_bn(branch_3, 128, 1, 1)\n\n    x = concatenate([branch_0, branch_1, branch_2, branch_3], axis=channel_axis)\n    return x\n\n\ndef block_reduction_b(input):\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n\n    branch_0 = conv2d_bn(input, 192, 1, 1)\n    branch_0 = conv2d_bn(branch_0, 192, 3, 3, strides=(2, 2), padding='valid')\n\n    branch_1 = conv2d_bn(input, 256, 1, 1)\n    branch_1 = conv2d_bn(branch_1, 256, 1, 7)\n    branch_1 = conv2d_bn(branch_1, 320, 7, 1)\n    branch_1 = conv2d_bn(branch_1, 320, 3, 3, strides=(2,2), padding='valid')\n\n    branch_2 = MaxPooling2D((3, 3), strides=(2, 2), padding='valid')(input)\n\n    x = concatenate([branch_0, branch_1, branch_2], axis=channel_axis)\n    return x\n\n\ndef block_inception_c(input):\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n\n    branch_0 = conv2d_bn(input, 256, 1, 1)\n\n    branch_1 = conv2d_bn(input, 384, 1, 1)\n    branch_10 = conv2d_bn(branch_1, 256, 1, 3)\n    branch_11 = conv2d_bn(branch_1, 256, 3, 1)\n    branch_1 = concatenate([branch_10, branch_11], axis=channel_axis)\n\n\n    branch_2 = conv2d_bn(input, 384, 1, 1)\n    branch_2 = conv2d_bn(branch_2, 448, 3, 1)\n    branch_2 = conv2d_bn(branch_2, 512, 1, 3)\n    branch_20 = conv2d_bn(branch_2, 256, 1, 3)\n    branch_21 = conv2d_bn(branch_2, 256, 3, 1)\n    branch_2 = concatenate([branch_20, branch_21], axis=channel_axis)\n\n    branch_3 = AveragePooling2D((3, 3), strides=(1, 1), padding='same')(input)\n    branch_3 = conv2d_bn(branch_3, 256, 1, 1)\n\n    x = concatenate([branch_0, branch_1, branch_2, branch_3], axis=channel_axis)\n    return x\n\n\ndef inception_v4_base(input):\n    if K.image_data_format() == 'channels_first':\n        channel_axis = 1\n    else:\n        channel_axis = -1\n\n    # Input Shape is 299 x 299 x 3 (th) or 3 x 299 x 299 (th)\n    net = conv2d_bn(input, 32, 3, 3, strides=(2,2), padding='valid')\n    net = conv2d_bn(net, 32, 3, 3, padding='valid')\n    net = conv2d_bn(net, 64, 3, 3)\n\n    branch_0 = MaxPooling2D((3,3), strides=(2,2), padding='valid')(net)\n\n    branch_1 = conv2d_bn(net, 96, 3, 3, strides=(2,2), padding='valid')\n\n    net = concatenate([branch_0, branch_1], axis=channel_axis)\n\n    branch_0 = conv2d_bn(net, 64, 1, 1)\n    branch_0 = conv2d_bn(branch_0, 96, 3, 3, padding='valid')\n\n    branch_1 = conv2d_bn(net, 64, 1, 1)\n    branch_1 = conv2d_bn(branch_1, 64, 1, 7)\n    branch_1 = conv2d_bn(branch_1, 64, 7, 1)\n    branch_1 = conv2d_bn(branch_1, 96, 3, 3, padding='valid')\n\n    net = concatenate([branch_0, branch_1], axis=channel_axis)\n\n    branch_0 = conv2d_bn(net, 192, 3, 3, strides=(2,2), padding='valid')\n    branch_1 = MaxPooling2D((3,3), strides=(2,2), padding='valid')(net)\n\n    net = concatenate([branch_0, branch_1], axis=channel_axis)\n\n    # 35 x 35 x 384\n    # 4 x Inception-A blocks\n    for idx in range(4):\n    \tnet = block_inception_a(net)\n\n    # 35 x 35 x 384\n    # Reduction-A block\n    net = block_reduction_a(net)\n\n    # 17 x 17 x 1024\n    # 7 x Inception-B blocks\n    for idx in range(7):\n    \tnet = block_inception_b(net)\n\n    # 17 x 17 x 1024\n    # Reduction-B block\n    net = block_reduction_b(net)\n\n    # 8 x 8 x 1536\n    # 3 x Inception-C blocks\n    for idx in range(3):\n    \tnet = block_inception_c(net)\n\n    return net\n\n\ndef inception_v4(num_classes, dropout_keep_prob, weights, include_top):\n    '''\n    Creates the inception v4 network\n\n    Args:\n    \tnum_classes: number of classes\n    \tdropout_keep_prob: float, the fraction to keep before final layer.\n    \n    Returns: \n    \tlogits: the logits outputs of the model.\n    '''\n\n    # Input Shape is 299 x 299 x 3 (tf) or 3 x 299 x 299 (th)\n    if K.image_data_format() == 'channels_first':\n        inputs = Input((3, 299, 299))\n    else:\n        inputs = Input((299, 299, 3))\n\n    # Make inception base\n    x = inception_v4_base(inputs)\n\n\n    # Final pooling and prediction\n    if include_top:\n        # 1 x 1 x 1536\n        x = AveragePooling2D((8,8), padding='valid')(x)\n        x = Dropout(dropout_keep_prob)(x)\n        x = Flatten()(x)\n        # 1536\n        x = Dense(units=num_classes, activation='softmax')(x)\n\n    model = Model(inputs, x, name='inception_v4')\n\n    # load weights\n    if weights == 'imagenet':\n        if K.image_data_format() == 'channels_first':\n            if K.backend() == 'tensorflow':\n                warnings.warn('You are using the TensorFlow backend, yet you '\n                              'are using the Theano '\n                              'image data format convention '\n                              '(`image_data_format=\"channels_first\"`). '\n                              'For best performance, set '\n                              '`image_data_format=\"channels_last\"` in '\n                              'your Keras config '\n                              'at ~/.keras/keras.json.')\n        if include_top:\n            weights_path = get_file(\n                'inception-v4_weights_tf_dim_ordering_tf_kernels.h5',\n                WEIGHTS_PATH,\n                cache_subdir='models',\n                md5_hash='9fe79d77f793fe874470d84ca6ba4a3b')\n        else:\n            weights_path = get_file(\n                'inception-v4_weights_tf_dim_ordering_tf_kernels_notop.h5',\n                WEIGHTS_PATH_NO_TOP,\n                cache_subdir='models',\n                md5_hash='9296b46b5971573064d12e4669110969')\n        model.load_weights(weights_path, by_name=True)\n    return model\n\n\ndef create_model(num_classes=1001, dropout_prob=0.2, weights=None, include_top=False):\n    return inception_v4(num_classes, dropout_prob, weights, include_top)\n# ----------------------------------------------------------\nincept_model = create_model(num_classes=1001, dropout_prob=0.2, weights=None, include_top=False)\nincept_model.load_weights('../input/inceptionv4-weight-file-notop/inception-v4_weights_tf_dim_ordering_tf_kernels_notop.h5')\n\n\nfor l in incept_model.layers: \n    if l is not None: l.trainable = True \n        \nx = incept_model.output\nx = GlobalAveragePooling2D(data_format='channels_last')(x)\nx = BatchNormalization()(x)\nx = Dense(512, activation='relu')(x)\npredictions = Dense(num_classes, activation='softmax')(x)\n\nmodel = Model(inputs=incept_model.input, outputs=predictions)        \n# model.summary()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2024-06-27T10:11:09.969087Z","iopub.execute_input":"2024-06-27T10:11:09.969430Z","iopub.status.idle":"2024-06-27T10:11:16.462663Z","shell.execute_reply.started":"2024-06-27T10:11:09.969400Z","shell.execute_reply":"2024-06-27T10:11:16.461694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # plot model architecture\n# from keras.utils import plot_model\n# plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2024-06-27T10:11:16.463975Z","iopub.execute_input":"2024-06-27T10:11:16.464703Z","iopub.status.idle":"2024-06-27T10:11:26.394882Z","shell.execute_reply.started":"2024-06-27T10:11:16.464667Z","shell.execute_reply":"2024-06-27T10:11:26.393208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Learning Rate 1 = 0.001","metadata":{}},{"cell_type":"markdown","source":"# Model 1\n\n* batch size = 16\n* split data = 75:25\n* CLAHE\n* learning_rate = 0.001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_1 = ModelCheckpoint(\"best_model_1.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.396238Z","iopub.execute_input":"2024-06-27T10:11:26.396798Z","iopub.status.idle":"2024-06-27T10:11:26.401416Z","shell.execute_reply.started":"2024-06-27T10:11:26.396739Z","shell.execute_reply":"2024-06-27T10:11:26.400291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 1\n# model_1 = Model(inputs=incept_model.input, outputs=predictions)\n# model_1.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.402469Z","iopub.execute_input":"2024-06-27T10:11:26.402810Z","iopub.status.idle":"2024-06-27T10:11:26.413925Z","shell.execute_reply.started":"2024-06-27T10:11:26.402778Z","shell.execute_reply":"2024-06-27T10:11:26.413019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_1 = model_1.fit(train_generator_1, \n#                       validation_data=valid_generator_1,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_1])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.415016Z","iopub.execute_input":"2024-06-27T10:11:26.415312Z","iopub.status.idle":"2024-06-27T10:11:26.423385Z","shell.execute_reply.started":"2024-06-27T10:11:26.415279Z","shell.execute_reply":"2024-06-27T10:11:26.422440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_1.evaluate(valid_generator_1)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.424449Z","iopub.execute_input":"2024-06-27T10:11:26.424742Z","iopub.status.idle":"2024-06-27T10:11:26.432880Z","shell.execute_reply.started":"2024-06-27T10:11:26.424718Z","shell.execute_reply":"2024-06-27T10:11:26.432005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_1.history['val_accuracy'])\n# max_train_acc = max(history_1.history['accuracy'])\n# min_val_loss = min(history_1.history['val_loss'])\n# min_train_loss = min(history_1.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.434376Z","iopub.execute_input":"2024-06-27T10:11:26.434860Z","iopub.status.idle":"2024-06-27T10:11:26.445472Z","shell.execute_reply.started":"2024-06-27T10:11:26.434830Z","shell.execute_reply":"2024-06-27T10:11:26.444556Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_1.history['accuracy']\n# val_acc = history_1.history['val_accuracy']\n# loss = history_1.history['loss']\n# val_loss = history_1.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 1, CLAHE, BS 16, LR 0.001, Split 75:25\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 1, CLAHE, BS 16, LR 0.001, Split 75:25\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.446636Z","iopub.execute_input":"2024-06-27T10:11:26.446937Z","iopub.status.idle":"2024-06-27T10:11:26.455883Z","shell.execute_reply.started":"2024-06-27T10:11:26.446910Z","shell.execute_reply":"2024-06-27T10:11:26.454979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_1 = valid_generator_1.classes\n\n# # predict data validation\n# y_pred_1 = np.argmax(model_1.predict(valid_generator_1, steps=len(valid_generator_1)), axis=1)\n\n# # dataframe from prediction\n# df_model_1 = pd.DataFrame({'Actual': y_val_1, 'Prediction': y_pred_1})\n# print(df_model_1)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.457204Z","iopub.execute_input":"2024-06-27T10:11:26.457600Z","iopub.status.idle":"2024-06-27T10:11:26.466396Z","shell.execute_reply.started":"2024-06-27T10:11:26.457566Z","shell.execute_reply":"2024-06-27T10:11:26.465539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_1 = confusion_matrix(y_val_1, y_pred_1)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_1, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.467569Z","iopub.execute_input":"2024-06-27T10:11:26.467874Z","iopub.status.idle":"2024-06-27T10:11:26.476380Z","shell.execute_reply.started":"2024-06-27T10:11:26.467846Z","shell.execute_reply":"2024-06-27T10:11:26.475450Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_1 = classification_report(y_val_1, y_pred_1, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_1)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.477450Z","iopub.execute_input":"2024-06-27T10:11:26.477746Z","iopub.status.idle":"2024-06-27T10:11:26.489123Z","shell.execute_reply.started":"2024-06-27T10:11:26.477723Z","shell.execute_reply":"2024-06-27T10:11:26.488089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 2\n\n* batch size = 32\n* split data = 75:25\n* CLAHE\n* learning_rate = 0.001","metadata":{}},{"cell_type":"code","source":"# !rm -rf \"/kaggle/working/best_model_2.keras\"","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.490121Z","iopub.execute_input":"2024-06-27T10:11:26.490378Z","iopub.status.idle":"2024-06-27T10:11:26.497693Z","shell.execute_reply.started":"2024-06-27T10:11:26.490354Z","shell.execute_reply":"2024-06-27T10:11:26.496870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_2 = ModelCheckpoint(\"best_model_2.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.498662Z","iopub.execute_input":"2024-06-27T10:11:26.498907Z","iopub.status.idle":"2024-06-27T10:11:26.507007Z","shell.execute_reply.started":"2024-06-27T10:11:26.498885Z","shell.execute_reply":"2024-06-27T10:11:26.506180Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 2\n# model_2 = Model(inputs=incept_model.input, outputs=predictions)\n# model_2.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.508161Z","iopub.execute_input":"2024-06-27T10:11:26.508539Z","iopub.status.idle":"2024-06-27T10:11:26.517041Z","shell.execute_reply.started":"2024-06-27T10:11:26.508494Z","shell.execute_reply":"2024-06-27T10:11:26.516092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_2 = model_2.fit(train_generator_2, \n#                                   validation_data=valid_generator_2,\n#                                   epochs=epochs,\n#                                   callbacks=[checkpoint_2])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.518055Z","iopub.execute_input":"2024-06-27T10:11:26.518312Z","iopub.status.idle":"2024-06-27T10:11:26.526175Z","shell.execute_reply.started":"2024-06-27T10:11:26.518289Z","shell.execute_reply":"2024-06-27T10:11:26.525192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_2.evaluate(valid_generator_2)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.527210Z","iopub.execute_input":"2024-06-27T10:11:26.527470Z","iopub.status.idle":"2024-06-27T10:11:26.535325Z","shell.execute_reply.started":"2024-06-27T10:11:26.527446Z","shell.execute_reply":"2024-06-27T10:11:26.534432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_2.history['val_accuracy'])\n# max_train_acc = max(history_2.history['accuracy'])\n# min_val_loss = min(history_2.history['val_loss'])\n# min_train_loss = min(history_2.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.536458Z","iopub.execute_input":"2024-06-27T10:11:26.536870Z","iopub.status.idle":"2024-06-27T10:11:26.544764Z","shell.execute_reply.started":"2024-06-27T10:11:26.536842Z","shell.execute_reply":"2024-06-27T10:11:26.543910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_2.history['accuracy']\n# val_acc = history_2.history['val_accuracy']\n# loss = history_2.history['loss']\n# val_loss = history_2.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 2, CLAHE, BS 32, LR 0.001, Split 75:25\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 2, CLAHE, BS 32, LR 0.001, Split 75:25\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.545834Z","iopub.execute_input":"2024-06-27T10:11:26.546123Z","iopub.status.idle":"2024-06-27T10:11:26.554484Z","shell.execute_reply.started":"2024-06-27T10:11:26.546096Z","shell.execute_reply":"2024-06-27T10:11:26.553611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# # collect all validation label\n# y_val_2 = valid_generator_2.classes\n\n# # predict data validation\n# y_pred_2 = np.argmax(model_2.predict(valid_generator_2, steps=len(valid_generator_2)), axis=1)\n\n# # dataframe from prediction\n# df_model_2 = pd.DataFrame({'Actual': y_val_2, 'Prediction': y_pred_2})\n# print(df_model_2)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.555653Z","iopub.execute_input":"2024-06-27T10:11:26.555938Z","iopub.status.idle":"2024-06-27T10:11:26.567765Z","shell.execute_reply.started":"2024-06-27T10:11:26.555915Z","shell.execute_reply":"2024-06-27T10:11:26.566939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_2 = confusion_matrix(y_val_2, y_pred_2)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_2, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.568852Z","iopub.execute_input":"2024-06-27T10:11:26.569116Z","iopub.status.idle":"2024-06-27T10:11:26.578790Z","shell.execute_reply.started":"2024-06-27T10:11:26.569093Z","shell.execute_reply":"2024-06-27T10:11:26.577787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_2 = classification_report(y_val_2, y_pred_2, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_2)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.579989Z","iopub.execute_input":"2024-06-27T10:11:26.580845Z","iopub.status.idle":"2024-06-27T10:11:26.589236Z","shell.execute_reply.started":"2024-06-27T10:11:26.580819Z","shell.execute_reply":"2024-06-27T10:11:26.588333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 3\n\n* batch size = 16\n* split data = 80:20\n* CLAHE\n* learning_rate = 0.001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_3 = ModelCheckpoint(\"best_model_3.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.590354Z","iopub.execute_input":"2024-06-27T10:11:26.590724Z","iopub.status.idle":"2024-06-27T10:11:26.599419Z","shell.execute_reply.started":"2024-06-27T10:11:26.590655Z","shell.execute_reply":"2024-06-27T10:11:26.598525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 3\n# model_3 = Model(inputs=incept_model.input, outputs=predictions)\n# model_3.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.600451Z","iopub.execute_input":"2024-06-27T10:11:26.600741Z","iopub.status.idle":"2024-06-27T10:11:26.609525Z","shell.execute_reply.started":"2024-06-27T10:11:26.600718Z","shell.execute_reply":"2024-06-27T10:11:26.608575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_3 = model_3.fit(train_generator_3, \n#                                   validation_data=valid_generator_3,\n#                                   epochs=epochs,\n#                                   callbacks=[checkpoint_3])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.610608Z","iopub.execute_input":"2024-06-27T10:11:26.610877Z","iopub.status.idle":"2024-06-27T10:11:26.623420Z","shell.execute_reply.started":"2024-06-27T10:11:26.610855Z","shell.execute_reply":"2024-06-27T10:11:26.622627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_3.evaluate(valid_generator_3)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.624319Z","iopub.execute_input":"2024-06-27T10:11:26.625389Z","iopub.status.idle":"2024-06-27T10:11:26.632293Z","shell.execute_reply.started":"2024-06-27T10:11:26.625348Z","shell.execute_reply":"2024-06-27T10:11:26.631451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_3.history['val_accuracy'])\n# max_train_acc = max(history_3.history['accuracy'])\n# min_val_loss = min(history_3.history['val_loss'])\n# min_train_loss = min(history_3.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.633362Z","iopub.execute_input":"2024-06-27T10:11:26.633639Z","iopub.status.idle":"2024-06-27T10:11:26.642572Z","shell.execute_reply.started":"2024-06-27T10:11:26.633616Z","shell.execute_reply":"2024-06-27T10:11:26.641731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_3.history['accuracy']\n# val_acc = history_3.history['val_accuracy']\n# loss = history_3.history['loss']\n# val_loss = history_3.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 3, CLAHE, BS 16, LR 0.001, Split 80:20\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 3, CLAHE, BS 16, LR 0.001, Split 80:20\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.643630Z","iopub.execute_input":"2024-06-27T10:11:26.643904Z","iopub.status.idle":"2024-06-27T10:11:26.653124Z","shell.execute_reply.started":"2024-06-27T10:11:26.643881Z","shell.execute_reply":"2024-06-27T10:11:26.652161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# # collect all validation label\n# y_val_3 = valid_generator_3.classes\n\n# # predict data validation\n# y_pred_3 = np.argmax(model_3.predict(valid_generator_3, steps=len(valid_generator_3)), axis=1)\n\n# # dataframe from prediction\n# df_model_3 = pd.DataFrame({'Actual': y_val_3, 'Prediction': y_pred_3})\n# print(df_model_3)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.654168Z","iopub.execute_input":"2024-06-27T10:11:26.654476Z","iopub.status.idle":"2024-06-27T10:11:26.666283Z","shell.execute_reply.started":"2024-06-27T10:11:26.654452Z","shell.execute_reply":"2024-06-27T10:11:26.665464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_3 = confusion_matrix(y_val_3, y_pred_3)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_3, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.667441Z","iopub.execute_input":"2024-06-27T10:11:26.667730Z","iopub.status.idle":"2024-06-27T10:11:26.676538Z","shell.execute_reply.started":"2024-06-27T10:11:26.667707Z","shell.execute_reply":"2024-06-27T10:11:26.675541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_3 = classification_report(y_val_3, y_pred_3, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_3)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.677475Z","iopub.execute_input":"2024-06-27T10:11:26.677750Z","iopub.status.idle":"2024-06-27T10:11:26.687252Z","shell.execute_reply.started":"2024-06-27T10:11:26.677728Z","shell.execute_reply":"2024-06-27T10:11:26.686288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 4\n\n* batch size = 32\n* split data = 80:20\n* CLAHE\n* learning_rate = 0.001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_4 = ModelCheckpoint(\"best_model_4.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.688399Z","iopub.execute_input":"2024-06-27T10:11:26.688700Z","iopub.status.idle":"2024-06-27T10:11:26.697866Z","shell.execute_reply.started":"2024-06-27T10:11:26.688676Z","shell.execute_reply":"2024-06-27T10:11:26.696937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 4\n# model_4 = Model(inputs=incept_model.input, outputs=predictions)\n# model_4.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.698884Z","iopub.execute_input":"2024-06-27T10:11:26.699114Z","iopub.status.idle":"2024-06-27T10:11:26.707841Z","shell.execute_reply.started":"2024-06-27T10:11:26.699094Z","shell.execute_reply":"2024-06-27T10:11:26.707025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_4 = model_4.fit(train_generator_4, \n#                       validation_data=valid_generator_4,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_4])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.709226Z","iopub.execute_input":"2024-06-27T10:11:26.709752Z","iopub.status.idle":"2024-06-27T10:11:26.719677Z","shell.execute_reply.started":"2024-06-27T10:11:26.709716Z","shell.execute_reply":"2024-06-27T10:11:26.718988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_4.evaluate(valid_generator_4)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.720770Z","iopub.execute_input":"2024-06-27T10:11:26.721022Z","iopub.status.idle":"2024-06-27T10:11:26.729777Z","shell.execute_reply.started":"2024-06-27T10:11:26.721000Z","shell.execute_reply":"2024-06-27T10:11:26.728863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_4.history['val_accuracy'])\n# max_train_acc = max(history_4.history['accuracy'])\n# min_val_loss = min(history_4.history['val_loss'])\n# min_train_loss = min(history_4.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.730962Z","iopub.execute_input":"2024-06-27T10:11:26.731561Z","iopub.status.idle":"2024-06-27T10:11:26.739642Z","shell.execute_reply.started":"2024-06-27T10:11:26.731528Z","shell.execute_reply":"2024-06-27T10:11:26.738772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_4.history['accuracy']\n# val_acc = history_4.history['val_accuracy']\n# loss = history_4.history['loss']\n# val_loss = history_4.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 4, CLAHE, BS 32, LR 0.001, Split 80:20\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 4, CLAHE, BS 32, LR 0.001, Split 80:20\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.740669Z","iopub.execute_input":"2024-06-27T10:11:26.740922Z","iopub.status.idle":"2024-06-27T10:11:26.748841Z","shell.execute_reply.started":"2024-06-27T10:11:26.740900Z","shell.execute_reply":"2024-06-27T10:11:26.748060Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_4 = valid_generator_4.classes\n\n# # predict data validation\n# y_pred_4 = np.argmax(model_4.predict(valid_generator_4, steps=len(valid_generator_4)), axis=1)\n\n# # dataframe from prediction\n# df_model_4 = pd.DataFrame({'Actual': y_val_4, 'Prediction': y_pred_4})\n# print(df_model_4)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.749913Z","iopub.execute_input":"2024-06-27T10:11:26.750166Z","iopub.status.idle":"2024-06-27T10:11:26.758883Z","shell.execute_reply.started":"2024-06-27T10:11:26.750144Z","shell.execute_reply":"2024-06-27T10:11:26.758043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_4 = confusion_matrix(y_val_4, y_pred_4)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_4, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.759946Z","iopub.execute_input":"2024-06-27T10:11:26.760291Z","iopub.status.idle":"2024-06-27T10:11:26.772293Z","shell.execute_reply.started":"2024-06-27T10:11:26.760266Z","shell.execute_reply":"2024-06-27T10:11:26.771413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_4 = classification_report(y_val_4, y_pred_4, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_4)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.773604Z","iopub.execute_input":"2024-06-27T10:11:26.774312Z","iopub.status.idle":"2024-06-27T10:11:26.782330Z","shell.execute_reply.started":"2024-06-27T10:11:26.774277Z","shell.execute_reply":"2024-06-27T10:11:26.781478Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 5\n\n* batch size = 16\n* split data = 75:25\n* No CLAHE\n* learning_rate = 0.001","metadata":{}},{"cell_type":"code","source":"# !rm -rf \"/kaggle/working/best_model_5.keras\"","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.783252Z","iopub.execute_input":"2024-06-27T10:11:26.783862Z","iopub.status.idle":"2024-06-27T10:11:26.792995Z","shell.execute_reply.started":"2024-06-27T10:11:26.783836Z","shell.execute_reply":"2024-06-27T10:11:26.792175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_5 = ModelCheckpoint(\"best_model_5.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.793931Z","iopub.execute_input":"2024-06-27T10:11:26.794160Z","iopub.status.idle":"2024-06-27T10:11:26.803372Z","shell.execute_reply.started":"2024-06-27T10:11:26.794139Z","shell.execute_reply":"2024-06-27T10:11:26.802494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 5\n# model_5 = Model(inputs=incept_model.input, outputs=predictions)\n# model_5.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.804600Z","iopub.execute_input":"2024-06-27T10:11:26.805320Z","iopub.status.idle":"2024-06-27T10:11:26.813361Z","shell.execute_reply.started":"2024-06-27T10:11:26.805287Z","shell.execute_reply":"2024-06-27T10:11:26.812541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_5 = model_5.fit(train_generator_5, \n#                       validation_data=valid_generator_5,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_5])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.814421Z","iopub.execute_input":"2024-06-27T10:11:26.814715Z","iopub.status.idle":"2024-06-27T10:11:26.823691Z","shell.execute_reply.started":"2024-06-27T10:11:26.814691Z","shell.execute_reply":"2024-06-27T10:11:26.822817Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_5.evaluate(valid_generator_5)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.824637Z","iopub.execute_input":"2024-06-27T10:11:26.824864Z","iopub.status.idle":"2024-06-27T10:11:26.833252Z","shell.execute_reply.started":"2024-06-27T10:11:26.824844Z","shell.execute_reply":"2024-06-27T10:11:26.832442Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_5.history['val_accuracy'])\n# max_train_acc = max(history_5.history['accuracy'])\n# min_val_loss = min(history_5.history['val_loss'])\n# min_train_loss = min(history_5.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.834210Z","iopub.execute_input":"2024-06-27T10:11:26.834603Z","iopub.status.idle":"2024-06-27T10:11:26.843420Z","shell.execute_reply.started":"2024-06-27T10:11:26.834579Z","shell.execute_reply":"2024-06-27T10:11:26.842723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_5.history['accuracy']\n# val_acc = history_5.history['val_accuracy']\n# loss = history_5.history['loss']\n# val_loss = history_5.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 5, No CLAHE, BS 16, LR 0.001, Split 75:25\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 5, No CLAHE, BS 16, LR 0.001, Split 75:25\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.862865Z","iopub.execute_input":"2024-06-27T10:11:26.863128Z","iopub.status.idle":"2024-06-27T10:11:26.867445Z","shell.execute_reply.started":"2024-06-27T10:11:26.863105Z","shell.execute_reply":"2024-06-27T10:11:26.866551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_5 = valid_generator_5.classes\n\n# # predict data validation\n# y_pred_5 = np.argmax(model_5.predict(valid_generator_5, steps=len(valid_generator_5)), axis=1)\n\n# # dataframe from prediction\n# df_model_5 = pd.DataFrame({'Actual': y_val_5, 'Prediction': y_pred_5})\n# print(df_model_5)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.868581Z","iopub.execute_input":"2024-06-27T10:11:26.868855Z","iopub.status.idle":"2024-06-27T10:11:26.876606Z","shell.execute_reply.started":"2024-06-27T10:11:26.868817Z","shell.execute_reply":"2024-06-27T10:11:26.875855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_5 = confusion_matrix(y_val_5, y_pred_5)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_5, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.877721Z","iopub.execute_input":"2024-06-27T10:11:26.878010Z","iopub.status.idle":"2024-06-27T10:11:26.886094Z","shell.execute_reply.started":"2024-06-27T10:11:26.877986Z","shell.execute_reply":"2024-06-27T10:11:26.885210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_5 = classification_report(y_val_5, y_pred_5, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_5)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.887257Z","iopub.execute_input":"2024-06-27T10:11:26.887813Z","iopub.status.idle":"2024-06-27T10:11:26.898641Z","shell.execute_reply.started":"2024-06-27T10:11:26.887782Z","shell.execute_reply":"2024-06-27T10:11:26.897862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 6\n\n* batch size = 32\n* split data = 75:25\n* No CLAHE\n* learning rate = 0.001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_6 = ModelCheckpoint(\"best_model_6.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.899848Z","iopub.execute_input":"2024-06-27T10:11:26.900327Z","iopub.status.idle":"2024-06-27T10:11:26.908486Z","shell.execute_reply.started":"2024-06-27T10:11:26.900296Z","shell.execute_reply":"2024-06-27T10:11:26.907664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 6\n# model_6 = Model(inputs=incept_model.input, outputs=predictions)\n# model_6.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.909557Z","iopub.execute_input":"2024-06-27T10:11:26.909882Z","iopub.status.idle":"2024-06-27T10:11:26.918661Z","shell.execute_reply.started":"2024-06-27T10:11:26.909851Z","shell.execute_reply":"2024-06-27T10:11:26.917864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_6 = model_6.fit(train_generator_6, \n#                       validation_data=valid_generator_6,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_6])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.919789Z","iopub.execute_input":"2024-06-27T10:11:26.920462Z","iopub.status.idle":"2024-06-27T10:11:26.928769Z","shell.execute_reply.started":"2024-06-27T10:11:26.920430Z","shell.execute_reply":"2024-06-27T10:11:26.928070Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_6.evaluate(valid_generator_6)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.929856Z","iopub.execute_input":"2024-06-27T10:11:26.930122Z","iopub.status.idle":"2024-06-27T10:11:26.938925Z","shell.execute_reply.started":"2024-06-27T10:11:26.930100Z","shell.execute_reply":"2024-06-27T10:11:26.938034Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_6.history['val_accuracy'])\n# max_train_acc = max(history_6.history['accuracy'])\n# min_val_loss = min(history_6.history['val_loss'])\n# min_train_loss = min(history_6.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.939885Z","iopub.execute_input":"2024-06-27T10:11:26.941276Z","iopub.status.idle":"2024-06-27T10:11:26.948560Z","shell.execute_reply.started":"2024-06-27T10:11:26.941251Z","shell.execute_reply":"2024-06-27T10:11:26.947775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_6.history['accuracy']\n# val_acc = history_6.history['val_accuracy']\n# loss = history_6.history['loss']\n# val_loss = history_6.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 6, No CLAHE, BS 32, LR 0.001, Split 75:25\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 6, No CLAHE, BS 32, LR 0.001, Split 75:25\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.949650Z","iopub.execute_input":"2024-06-27T10:11:26.949902Z","iopub.status.idle":"2024-06-27T10:11:26.959365Z","shell.execute_reply.started":"2024-06-27T10:11:26.949879Z","shell.execute_reply":"2024-06-27T10:11:26.958562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_6 = valid_generator_6.classes\n\n# # predict data validation\n# y_pred_6 = np.argmax(model_6.predict(valid_generator_6, steps=len(valid_generator_6)), axis=1)\n\n# # dataframe from prediction\n# df_model_6 = pd.DataFrame({'Actual': y_val_6, 'Prediction': y_pred_6})\n# print(df_model_6)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.960271Z","iopub.execute_input":"2024-06-27T10:11:26.960566Z","iopub.status.idle":"2024-06-27T10:11:26.971941Z","shell.execute_reply.started":"2024-06-27T10:11:26.960538Z","shell.execute_reply":"2024-06-27T10:11:26.971106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_6 = confusion_matrix(y_val_6, y_pred_6)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_6, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.972969Z","iopub.execute_input":"2024-06-27T10:11:26.973206Z","iopub.status.idle":"2024-06-27T10:11:26.981997Z","shell.execute_reply.started":"2024-06-27T10:11:26.973186Z","shell.execute_reply":"2024-06-27T10:11:26.981161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_6 = classification_report(y_val_6, y_pred_6, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_6)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.982968Z","iopub.execute_input":"2024-06-27T10:11:26.983273Z","iopub.status.idle":"2024-06-27T10:11:26.991245Z","shell.execute_reply.started":"2024-06-27T10:11:26.983248Z","shell.execute_reply":"2024-06-27T10:11:26.990413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 7\n\n* batch size = 16\n* split data = 80:20\n* No CLAHE\n* learning rate = 0.001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_7 = ModelCheckpoint(\"best_model_7.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:26.992365Z","iopub.execute_input":"2024-06-27T10:11:26.992688Z","iopub.status.idle":"2024-06-27T10:11:27.000048Z","shell.execute_reply.started":"2024-06-27T10:11:26.992661Z","shell.execute_reply":"2024-06-27T10:11:26.999163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 7\n# model_7 = Model(inputs=incept_model.input, outputs=predictions)\n# model_7.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.001168Z","iopub.execute_input":"2024-06-27T10:11:27.001806Z","iopub.status.idle":"2024-06-27T10:11:27.009456Z","shell.execute_reply.started":"2024-06-27T10:11:27.001774Z","shell.execute_reply":"2024-06-27T10:11:27.008752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_7 = model_7.fit(train_generator_7, \n#                       validation_data=valid_generator_7,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_7])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.010615Z","iopub.execute_input":"2024-06-27T10:11:27.011102Z","iopub.status.idle":"2024-06-27T10:11:27.022856Z","shell.execute_reply.started":"2024-06-27T10:11:27.011071Z","shell.execute_reply":"2024-06-27T10:11:27.022045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_7.evaluate(valid_generator_7)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.023797Z","iopub.execute_input":"2024-06-27T10:11:27.024026Z","iopub.status.idle":"2024-06-27T10:11:27.032678Z","shell.execute_reply.started":"2024-06-27T10:11:27.024006Z","shell.execute_reply":"2024-06-27T10:11:27.031763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_7.history['val_accuracy'])\n# max_train_acc = max(history_7.history['accuracy'])\n# min_val_loss = min(history_7.history['val_loss'])\n# min_train_loss = min(history_7.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.033567Z","iopub.execute_input":"2024-06-27T10:11:27.033841Z","iopub.status.idle":"2024-06-27T10:11:27.042341Z","shell.execute_reply.started":"2024-06-27T10:11:27.033804Z","shell.execute_reply":"2024-06-27T10:11:27.041554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_7.history['accuracy']\n# val_acc = history_7.history['val_accuracy']\n# loss = history_7.history['loss']\n# val_loss = history_7.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 7, No CLAHE, BS 16, LR 0.001, Split 80:20\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 7, No CLAHE, BS 16, LR 0.001, Split 80:20\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.043415Z","iopub.execute_input":"2024-06-27T10:11:27.045271Z","iopub.status.idle":"2024-06-27T10:11:27.052495Z","shell.execute_reply.started":"2024-06-27T10:11:27.045245Z","shell.execute_reply":"2024-06-27T10:11:27.051652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_7 = valid_generator_7.classes\n\n# # predict data validation\n# y_pred_7 = np.argmax(model_7.predict(valid_generator_7, steps=len(valid_generator_7)), axis=1)\n\n# # dataframe from prediction\n# df_model_7 = pd.DataFrame({'Actual': y_val_7, 'Prediction': y_pred_7})\n# print(df_model_7)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.053547Z","iopub.execute_input":"2024-06-27T10:11:27.054740Z","iopub.status.idle":"2024-06-27T10:11:27.062018Z","shell.execute_reply.started":"2024-06-27T10:11:27.054715Z","shell.execute_reply":"2024-06-27T10:11:27.061238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_7 = confusion_matrix(y_val_7, y_pred_7)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_7, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.063038Z","iopub.execute_input":"2024-06-27T10:11:27.063267Z","iopub.status.idle":"2024-06-27T10:11:27.074821Z","shell.execute_reply.started":"2024-06-27T10:11:27.063246Z","shell.execute_reply":"2024-06-27T10:11:27.073921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_7 = classification_report(y_val_7, y_pred_7, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_7)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.075801Z","iopub.execute_input":"2024-06-27T10:11:27.076078Z","iopub.status.idle":"2024-06-27T10:11:27.083738Z","shell.execute_reply.started":"2024-06-27T10:11:27.076055Z","shell.execute_reply":"2024-06-27T10:11:27.083015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 8\n\n* batch size = 32\n* split data = 80:20\n* No CLAHE\n* learning rate = 0.001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_8 = ModelCheckpoint(\"best_model_8.keras\", save_best_only=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.084599Z","iopub.execute_input":"2024-06-27T10:11:27.084875Z","iopub.status.idle":"2024-06-27T10:11:27.094584Z","shell.execute_reply.started":"2024-06-27T10:11:27.084852Z","shell.execute_reply":"2024-06-27T10:11:27.093531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 8\n# model_8 = Model(inputs=incept_model.input, outputs=predictions)\n# model_8.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_1),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.095893Z","iopub.execute_input":"2024-06-27T10:11:27.096154Z","iopub.status.idle":"2024-06-27T10:11:27.185214Z","shell.execute_reply.started":"2024-06-27T10:11:27.096131Z","shell.execute_reply":"2024-06-27T10:11:27.184550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_8 = model_8.fit(train_generator_8, \n#                       validation_data=valid_generator_8,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_8])","metadata":{"execution":{"iopub.status.busy":"2024-06-27T10:11:27.186140Z","iopub.execute_input":"2024-06-27T10:11:27.186438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_8.evaluate(valid_generator_8)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_8.history['val_accuracy'])\n# max_train_acc = max(history_8.history['accuracy'])\n# min_val_loss = min(history_8.history['val_loss'])\n# min_train_loss = min(history_8.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_8.history['accuracy']\n# val_acc = history_8.history['val_accuracy']\n# loss = history_8.history['loss']\n# val_loss = history_8.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 8, No CLAHE, BS 32, LR 0.001, Split 80:20\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 8, No CLAHE, BS 32, LR 0.001, Split 80:20\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_8 = valid_generator_8.classes\n\n# # predict data validation\n# y_pred_8 = np.argmax(model_8.predict(valid_generator_8, steps=len(valid_generator_8)), axis=1)\n\n# # dataframe from prediction\n# df_model_8 = pd.DataFrame({'Actual': y_val_8, 'Prediction': y_pred_8})\n# print(df_model_8)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_8 = confusion_matrix(y_val_8, y_pred_8)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_8, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_8 = classification_report(y_val_8, y_pred_8, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_8)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Learning Rate 2 = 0.0001","metadata":{}},{"cell_type":"markdown","source":"# Model 9\n\n* batch size = 16\n* split data = 75:25\n* CLAHE\n* learning rate = 0.0001\n\n","metadata":{}},{"cell_type":"code","source":"# define callback to save best model\ncheckpoint_9 = ModelCheckpoint(\"best_model_9.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# compile model 9\nmodel_9 = Model(inputs=incept_model.input, outputs=predictions)\nmodel_9.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n                loss = 'categorical_crossentropy',\n                metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_9 = model_9.fit(train_generator_1, \n                      validation_data=valid_generator_1,\n                      epochs=epochs,\n                      callbacks=[checkpoint_9])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# evaluate validation data\nvalidation_loss, validation_accuracy = model_9.evaluate(valid_generator_1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# show best accuracy and loss result\nmax_val_acc = max(history_9.history['val_accuracy'])\nmax_train_acc = max(history_9.history['accuracy'])\nmin_val_loss = min(history_9.history['val_loss'])\nmin_train_loss = min(history_9.history['loss'])\n\nprint('Akurasi Training Tertinggi:', max_train_acc)\nprint('Akurasi Validasi Tertinggi:', max_val_acc)\nprint('Loss Training Terendah:', min_train_loss)\nprint('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# visualize accuracy and loss\nacc = history_9.history['accuracy']\nval_acc = history_9.history['val_accuracy']\nloss = history_9.history['loss']\nval_loss = history_9.history['val_loss']\n\nplt.figure(figsize=(20, 5))\n\n# train and validation acc\nplt.subplot(1, 2, 1)\nplt.title(\"Akurasi Model 9, CLAHE, BS 16, LR 0.0001, Split 75:25\")\nplt.plot(acc,label=\"Accuracy\")\nplt.plot(val_acc, label=\"Validation Accuracy\")\nplt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\n# plt.figure()\n\n# train and validation loss\nplt.subplot(1, 2, 2)\nplt.title(\"Loss Model 9, CLAHE, BS 16, LR 0.0001, Split 75:25\")\nplt.plot(loss, label=\"Loss\")\nplt.plot(val_loss, label=\"Validation loss\")\nplt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Loss\")\nplt.legend();\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"from keras.models import Model\n\n# collect all validation label\ny_val_9 = valid_generator_1.classes\n\n# predict data validation\ny_pred_9 = np.argmax(model_9.predict(valid_generator_1, steps=len(valid_generator_1)), axis=1)\n\n# dataframe from prediction\ndf_model_9 = pd.DataFrame({'Actual': y_val_9, 'Prediction': y_pred_9})\nprint(df_model_9)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"cm_9 = confusion_matrix(y_val_9, y_pred_9)\n\n# heatmap from confussion_matrix\nax = plt.subplot()\nsns.heatmap(cm_9, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\nax.set_xlabel('Predicted labels')\nax.set_ylabel('True labels')\nax.set_title('Confusion Matrix')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\nreport_9 = classification_report(y_val_9, y_pred_9, target_names=class_names)\n\nprint(\"Classification Report:\")\nprint(report_9)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 10\n\n* batch size = 32\n* split data = 75:25\n* CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# define callback to save best model\ncheckpoint_10 = ModelCheckpoint(\"best_model_10.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# compile model 10\nmodel_10 = Model(inputs=incept_model.input, outputs=predictions)\nmodel_10.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n                loss = 'categorical_crossentropy',\n                metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_10 = model_10.fit(train_generator_2, \n                      validation_data=valid_generator_2,\n                      epochs=epochs,\n                      callbacks=[checkpoint_10])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# evaluate validation data\nvalidation_loss, validation_accuracy = model_10.evaluate(valid_generator_2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# show best accuracy and loss result\nmax_val_acc = max(history_10.history['val_accuracy'])\nmax_train_acc = max(history_10.history['accuracy'])\nmin_val_loss = min(history_10.history['val_loss'])\nmin_train_loss = min(history_10.history['loss'])\n\nprint('Akurasi Training Tertinggi:', max_train_acc)\nprint('Akurasi Validasi Tertinggi:', max_val_acc)\nprint('Loss Training Terendah:', min_train_loss)\nprint('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# visualize accuracy and loss\nacc = history_10.history['accuracy']\nval_acc = history_10.history['val_accuracy']\nloss = history_10.history['loss']\nval_loss = history_10.history['val_loss']\n\nplt.figure(figsize=(20, 5))\n\n# train and validation acc\nplt.subplot(1, 2, 1)\nplt.title(\"Akurasi Model 10, CLAHE, BS 32, LR 0.0001, Split 75:25\")\nplt.plot(acc,label=\"Accuracy\")\nplt.plot(val_acc, label=\"Validation Accuracy\")\nplt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\n# plt.figure()\n\n# train and validation loss\nplt.subplot(1, 2, 2)\nplt.title(\"Loss Model 10, CLAHE, BS 32, LR 0.0001, Split 75:25\")\nplt.plot(loss, label=\"Loss\")\nplt.plot(val_loss, label=\"Validation loss\")\nplt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Loss\")\nplt.legend();\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"from keras.models import Model\n\n# collect all validation label\ny_val_10 = valid_generator_2.classes\n\n# predict data validation\ny_pred_10 = np.argmax(model_10.predict(valid_generator_2, steps=len(valid_generator_2)), axis=1)\n\n# dataframe from prediction\ndf_model_10 = pd.DataFrame({'Actual': y_val_10, 'Prediction': y_pred_10})\nprint(df_model_10)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"cm_10 = confusion_matrix(y_val_10, y_pred_10)\n\n# heatmap from confussion_matrix\nax = plt.subplot()\nsns.heatmap(cm_10, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\nax.set_xlabel('Predicted labels')\nax.set_ylabel('True labels')\nax.set_title('Confusion Matrix')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\nreport_10 = classification_report(y_val_10, y_pred_10, target_names=class_names)\n\nprint(\"Classification Report:\")\nprint(report_10)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 11\n\n* batch size = 16\n* split data = 80:20\n* CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# define callback to save best model\ncheckpoint_11 = ModelCheckpoint(\"best_model_11.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# compile model 11\nmodel_11 = Model(inputs=incept_model.input, outputs=predictions)\nmodel_11.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n                loss = 'categorical_crossentropy',\n                metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_11 = model_11.fit(train_generator_3, \n                      validation_data=valid_generator_3,\n                      epochs=epochs,\n                      callbacks=[checkpoint_11])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# evaluate validation data\nvalidation_loss, validation_accuracy = model_11.evaluate(valid_generator_3)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# show best accuracy and loss result\nmax_val_acc = max(history_11.history['val_accuracy'])\nmax_train_acc = max(history_11.history['accuracy'])\nmin_val_loss = min(history_11.history['val_loss'])\nmin_train_loss = min(history_11.history['loss'])\n\nprint('Akurasi Training Tertinggi:', max_train_acc)\nprint('Akurasi Validasi Tertinggi:', max_val_acc)\nprint('Loss Training Terendah:', min_train_loss)\nprint('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# visualize accuracy and loss\nacc = history_11.history['accuracy']\nval_acc = history_11.history['val_accuracy']\nloss = history_11.history['loss']\nval_loss = history_11.history['val_loss']\n\nplt.figure(figsize=(20, 5))\n\n# train and validation acc\nplt.subplot(1, 2, 1)\nplt.title(\"Akurasi Model 11, CLAHE, BS 16, LR 0.0001, Split 80:20\")\nplt.plot(acc,label=\"Accuracy\")\nplt.plot(val_acc, label=\"Validation Accuracy\")\nplt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\n# plt.figure()\n\n# train and validation loss\nplt.subplot(1, 2, 2)\nplt.title(\"Loss Model 11, CLAHE BS 16, LR 0.0001,, Split 80:20\")\nplt.plot(loss, label=\"Loss\")\nplt.plot(val_loss, label=\"Validation loss\")\nplt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Loss\")\nplt.legend();\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"from keras.models import Model\n\n# collect all validation label\ny_val_11 = valid_generator_3.classes\n\n# predict data validation\ny_pred_11 = np.argmax(model_11.predict(valid_generator_3, steps=len(valid_generator_3)), axis=1)\n\n# dataframe from prediction\ndf_model_11 = pd.DataFrame({'Actual': y_val_11, 'Prediction': y_pred_11})\nprint(df_model_11)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"cm_11 = confusion_matrix(y_val_11, y_pred_11)\n\n# heatmap from confussion_matrix\nax = plt.subplot()\nsns.heatmap(cm_11, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\nax.set_xlabel('Predicted labels')\nax.set_ylabel('True labels')\nax.set_title('Confusion Matrix')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\nreport_11 = classification_report(y_val_11, y_pred_11, target_names=class_names)\n\nprint(\"Classification Report:\")\nprint(report_11)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 12\n\n* batch size = 32\n* split data = 80:20\n* CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# define callback to save best model\ncheckpoint_12 = ModelCheckpoint(\"best_model_12.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# compile model 12\nmodel_12 = Model(inputs=incept_model.input, outputs=predictions)\nmodel_12.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n                loss = 'categorical_crossentropy',\n                metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history_12 = model_12.fit(train_generator_4, \n                      validation_data=valid_generator_4,\n                      epochs=epochs,\n                      callbacks=[checkpoint_12])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# evaluate validation data\nvalidation_loss, validation_accuracy = model_12.evaluate(valid_generator_4)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# show best accuracy and loss result\nmax_val_acc = max(history_12.history['val_accuracy'])\nmax_train_acc = max(history_12.history['accuracy'])\nmin_val_loss = min(history_12.history['val_loss'])\nmin_train_loss = min(history_12.history['loss'])\n\nprint('Akurasi Training Tertinggi:', max_train_acc)\nprint('Akurasi Validasi Tertinggi:', max_val_acc)\nprint('Loss Training Terendah:', min_train_loss)\nprint('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# visualize accuracy and loss\nacc = history_12.history['accuracy']\nval_acc = history_12.history['val_accuracy']\nloss = history_12.history['loss']\nval_loss = history_12.history['val_loss']\n\nplt.figure(figsize=(20, 5))\n\n# train and validation acc\nplt.subplot(1, 2, 1)\nplt.title(\"Akurasi Model 12, CLAHE, BS 32, LR 0.0001, Split 80:20\")\nplt.plot(acc,label=\"Accuracy\")\nplt.plot(val_acc, label=\"Validation Accuracy\")\nplt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\n# plt.figure()\n\n# train and validation loss\nplt.subplot(1, 2, 2)\nplt.title(\"Loss Model 12, CLAHE, BS 32, LR 0.0001, Split 80:20\")\nplt.plot(loss, label=\"Loss\")\nplt.plot(val_loss, label=\"Validation loss\")\nplt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Loss\")\nplt.legend();\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"from keras.models import Model\n\n# collect all validation label\ny_val_12 = valid_generator_4.classes\n\n# predict data validation\ny_pred_12 = np.argmax(model_12.predict(valid_generator_4, steps=len(valid_generator_4)), axis=1)\n\n# dataframe from prediction\ndf_model_12 = pd.DataFrame({'Actual': y_val_12, 'Prediction': y_pred_12})\nprint(df_model_12)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"cm_12 = confusion_matrix(y_val_12, y_pred_12)\n\n# heatmap from confussion_matrix\nax = plt.subplot()\nsns.heatmap(cm_12, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\nax.set_xlabel('Predicted labels')\nax.set_ylabel('True labels')\nax.set_title('Confusion Matrix')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\nreport_12 = classification_report(y_val_12, y_pred_12, target_names=class_names)\n\nprint(\"Classification Report:\")\nprint(report_12)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 13\n\n* batch size = 16\n* split data = 75:25\n* No CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_13 = ModelCheckpoint(\"best_model_13.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 13\n# model_13 = Model(inputs=incept_model.input, outputs=predictions)\n# model_13.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_13 = model_13.fit(train_generator_5, \n#                       validation_data=valid_generator_5,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_13])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_13.evaluate(valid_generator_5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_13.history['val_accuracy'])\n# max_train_acc = max(history_13.history['accuracy'])\n# min_val_loss = min(history_13.history['val_loss'])\n# min_train_loss = min(history_13.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_13.history['accuracy']\n# val_acc = history_13.history['val_accuracy']\n# loss = history_13.history['loss']\n# val_loss = history_13.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 13, No CLAHE, BS 16, LR 0.0001, Split 75:25\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 13, No CLAHE, BS 16, LR 0.0001, Split 75:25\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_13 = valid_generator_5.classes\n\n# # predict data validation\n# y_pred_13 = np.argmax(model_13.predict(valid_generator_5, steps=len(valid_generator_5)), axis=1)\n\n# # dataframe from prediction\n# df_model_13 = pd.DataFrame({'Actual': y_val_13, 'Prediction': y_pred_13})\n# print(df_model_13)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_13 = confusion_matrix(y_val_13, y_pred_13)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_13, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_13 = classification_report(y_val_13, y_pred_13, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_13)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 14\n\n* batch size = 32\n* split data = 75:25\n* No CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# !rm -rf \"/kaggle/working/best_model_14.keras\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_14 = ModelCheckpoint(\"best_model_14.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 14\n# model_14 = Model(inputs=incept_model.input, outputs=predictions)\n# model_14.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_14 = model_14.fit(train_generator_6, \n#                       validation_data=valid_generator_6,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_14])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_14.evaluate(valid_generator_6)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_14.history['val_accuracy'])\n# max_train_acc = max(history_14.history['accuracy'])\n# min_val_loss = min(history_14.history['val_loss'])\n# min_train_loss = min(history_14.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_14.history['accuracy']\n# val_acc = history_14.history['val_accuracy']\n# loss = history_14.history['loss']\n# val_loss = history_14.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 14, No CLAHE, BS 32, LR 0.0001, Split 75:25\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 14, No CLAHE, BS 32, LR 0.0001, Split 75:25\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_14 = valid_generator_6.classes\n\n# # predict data validation\n# y_pred_14 = np.argmax(model_14.predict(valid_generator_6, steps=len(valid_generator_6)), axis=1)\n\n# # dataframe from prediction\n# df_model_14 = pd.DataFrame({'Actual': y_val_14, 'Prediction': y_pred_14})\n# print(df_model_14)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_14 = confusion_matrix(y_val_14, y_pred_14)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_14, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_14 = classification_report(y_val_14, y_pred_14, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_14)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 15\n\n* batch size = 16\n* split data = 80:20\n* No CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_15 = ModelCheckpoint(\"best_model_15.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 15\n# model_15 = Model(inputs=incept_model.input, outputs=predictions)\n# model_15.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_15 = model_15.fit(train_generator_7, \n#                       validation_data=valid_generator_7,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_15])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_15.evaluate(valid_generator_7)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_15.history['val_accuracy'])\n# max_train_acc = max(history_15.history['accuracy'])\n# min_val_loss = min(history_15.history['val_loss'])\n# min_train_loss = min(history_15.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_15.history['accuracy']\n# val_acc = history_15.history['val_accuracy']\n# loss = history_15.history['loss']\n# val_loss = history_15.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 15, No CLAHE, BS 16, LR 0.0001, Split 80:20\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 15, No CLAHE, BS 16, LR 0.0001, Split 80:20\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_15 = valid_generator_7.classes\n\n# # predict data validation\n# y_pred_15 = np.argmax(model_15.predict(valid_generator_7, steps=len(valid_generator_7)), axis=1)\n\n# # dataframe from prediction\n# df_model_15 = pd.DataFrame({'Actual': y_val_15, 'Prediction': y_pred_15})\n# print(df_model_15)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_15 = confusion_matrix(y_val_15, y_pred_15)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_15, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_15 = classification_report(y_val_15, y_pred_15, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_15)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model 16\n\n* batch size = 32\n* split data = 80:20\n* No CLAHE\n* learning rate = 0.0001","metadata":{}},{"cell_type":"code","source":"# # define callback to save best model\n# checkpoint_16 = ModelCheckpoint(\"best_model_16.keras\", save_best_only=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # compile model 16\n# model_16 = Model(inputs=incept_model.input, outputs=predictions)\n# model_16.compile(optimizer = keras.optimizers.SGD(learning_rate=learning_rate_2),\n#                 loss = 'categorical_crossentropy',\n#                 metrics = ['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# history_16 = model_16.fit(train_generator_8, \n#                       validation_data=valid_generator_8,\n#                       epochs=epochs,\n#                       callbacks=[checkpoint_16])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # evaluate validation data\n# validation_loss, validation_accuracy = model_16.evaluate(valid_generator_8)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # show best accuracy and loss result\n# max_val_acc = max(history_16.history['val_accuracy'])\n# max_train_acc = max(history_16.history['accuracy'])\n# min_val_loss = min(history_16.history['val_loss'])\n# min_train_loss = min(history_16.history['loss'])\n\n# print('Akurasi Training Tertinggi:', max_train_acc)\n# print('Akurasi Validasi Tertinggi:', max_val_acc)\n# print('Loss Training Terendah:', min_train_loss)\n# print('Loss Validasi Terendah:', min_val_loss)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Accuracy and Loss","metadata":{}},{"cell_type":"code","source":"# # visualize accuracy and loss\n# acc = history_16.history['accuracy']\n# val_acc = history_16.history['val_accuracy']\n# loss = history_16.history['loss']\n# val_loss = history_16.history['val_loss']\n\n# plt.figure(figsize=(20, 5))\n\n# # train and validation acc\n# plt.subplot(1, 2, 1)\n# plt.title(\"Akurasi Model 16, No CLAHE, BS 32, LR 0.0001, Split 80:20\")\n# plt.plot(acc,label=\"Accuracy\")\n# plt.plot(val_acc, label=\"Validation Accuracy\")\n# plt.plot( np.argmax(val_acc), np.max(val_acc), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Accuracy\")\n# plt.legend()\n# # plt.figure()\n\n# # train and validation loss\n# plt.subplot(1, 2, 2)\n# plt.title(\"Loss Model 16, No CLAHE, BS 32, LR 0.0001, Split 80:20\")\n# plt.plot(loss, label=\"Loss\")\n# plt.plot(val_loss, label=\"Validation loss\")\n# plt.plot( np.argmin(val_loss), np.min(val_loss), marker=\"x\", color=\"r\", label=\"Best model\")\n# plt.xlabel(\"Epochs\")\n# plt.ylabel(\"Loss\")\n# plt.legend();\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict Data Validation ","metadata":{}},{"cell_type":"code","source":"# from keras.models import Model\n\n# # collect all validation label\n# y_val_16 = valid_generator_8.classes\n\n# # predict data validation\n# y_pred_16 = np.argmax(model_16.predict(valid_generator_8, steps=len(valid_generator_8)), axis=1)\n\n# # dataframe from prediction\n# df_model_16 = pd.DataFrame({'Actual': y_val_16, 'Prediction': y_pred_16})\n# print(df_model_16)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Confussion Matrix","metadata":{}},{"cell_type":"code","source":"# cm_16 = confusion_matrix(y_val_16, y_pred_16)\n\n# # heatmap from confussion_matrix\n# ax = plt.subplot()\n# sns.heatmap(cm_16, annot=True, fmt='d', ax=ax, cbar=False, cmap='Blues')\n\n# ax.set_xlabel('Predicted labels')\n# ax.set_ylabel('True labels')\n# ax.set_title('Confusion Matrix')\n# plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Classification Report","metadata":{}},{"cell_type":"code","source":"# class_names = ['No DR', 'Mild', 'Moderate', 'Severe', 'Proliferative DR']\n# report_16 = classification_report(y_val_16, y_pred_16, target_names=class_names)\n\n# print(\"Classification Report:\")\n# print(report_16)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}