{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers, models\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nimport matplotlib.pyplot as plt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:12:44.633572Z","iopub.execute_input":"2026-09-29T04:12:44.633763Z","iopub.status.idle":"2026-09-29T04:13:03.004909Z","shell.execute_reply.started":"2026-09-29T04:12:44.633744Z","shell.execute_reply":"2026-09-29T04:13:03.004352Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Dataset path\nEYE_DIR = \"/kaggle/input/datasets/faizan729/diabetic-retinopathy-detection\"\nAPTOS_DIR = \"/kaggle/input/competitions/aptos2019-blindness-detection\"\nIMG_SIZE = 128\nimg_size = (128, 128)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:13:03.006977Z","iopub.execute_input":"2026-09-29T04:13:03.007505Z","iopub.status.idle":"2026-09-29T04:13:03.011498Z","shell.execute_reply.started":"2026-09-29T04:13:03.007479Z","shell.execute_reply":"2026-09-29T04:13:03.010839Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# finding lables/folders\n\nprint(\"Train files:\", len(os.listdir(EYE_DIR + \"/train\")))\nprint(\"Valid files:\", len(os.listdir(EYE_DIR + \"/valid\")))\nprint(\"Test files:\", len(os.listdir(EYE_DIR + \"/test\")))\n\nprint(\"\\nTrain sample:\")\nprint(os.listdir(EYE_DIR + \"/train\")[:5])\n\nprint(\"\\nValid sample:\")\nprint(os.listdir(EYE_DIR + \"/valid\")[:5])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:13:03.012318Z","iopub.execute_input":"2026-09-29T04:13:03.012536Z","iopub.status.idle":"2026-09-29T04:13:03.523941Z","shell.execute_reply.started":"2026-09-29T04:13:03.012514Z","shell.execute_reply":"2026-09-29T04:13:03.523309Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# just checking for labeling \nfor root, dirs, files in os.walk(EYE_DIR):\n    for file in files:\n        if file.endswith((\".csv\", \".json\", \".txt\")):\n            print(os.path.join(root, file))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:13:03.524891Z","iopub.execute_input":"2026-09-29T04:13:03.525265Z","iopub.status.idle":"2026-09-29T04:13:29.461987Z","shell.execute_reply.started":"2026-09-29T04:13:03.525195Z","shell.execute_reply":"2026-09-29T04:13:29.46125Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# load eyepacs \neye_csv = os.path.join(EYE_DIR, \"train\", \"_classes.csv\")\n\neye_df = pd.read_csv(eye_csv)\n\nprint(eye_df.head())\nprint(eye_df.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:13:29.462938Z","iopub.execute_input":"2026-09-29T04:13:29.463628Z","iopub.status.idle":"2026-09-29T04:13:29.515954Z","shell.execute_reply.started":"2026-09-29T04:13:29.463602Z","shell.execute_reply":"2026-09-29T04:13:29.515258Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# converting into labling the dataset \nlabel_columns = [\n    \" No_DR\",\n    \" Mild\",\n    \" Moderate\",\n    \" Severe\",\n    \" Proliferate_DR\"\n]\n\neye_df[\"label\"] = eye_df[label_columns].values.argmax(axis=1)\n\nprint(eye_df[\"label\"].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:13:29.516887Z","iopub.execute_input":"2026-09-29T04:13:29.517246Z","iopub.status.idle":"2026-09-29T04:13:29.540768Z","shell.execute_reply.started":"2026-09-29T04:13:29.51721Z","shell.execute_reply":"2026-09-29T04:13:29.540232Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# load images '\n\nX_eye = []\ny_eye = []\n\nfor _, row in eye_df.iterrows():\n\n    img_path = os.path.join(\n        EYE_DIR,\n        \"train\",\n        row[\"filename\"]\n    )\n\n    img = cv2.imread(img_path)\n\n    if img is not None:\n        img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n        img = img / 255.0\n\n        X_eye.append(img)\n        y_eye.append(row[\"label\"])\n\nX_eye = np.array(X_eye, dtype=np.float32)\ny_eye = np.array(y_eye)\n\nprint(\"EyePACS:\", X_eye.shape)\nprint(\"Labels:\", y_eye.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:13:29.542806Z","iopub.execute_input":"2026-09-29T04:13:29.54309Z","iopub.status.idle":"2026-09-29T04:15:21.698906Z","shell.execute_reply.started":"2026-09-29T04:13:29.543071Z","shell.execute_reply":"2026-09-29T04:15:21.69803Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# load aptos \n\naptos_csv = os.path.join(APTOS_DIR, \"train.csv\")\n\naptos_df = pd.read_csv(aptos_csv)\n\nprint(aptos_df.head())\nprint(aptos_df[\"diagnosis\"].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:15:21.699966Z","iopub.execute_input":"2026-09-29T04:15:21.700319Z","iopub.status.idle":"2026-09-29T04:15:21.726828Z","shell.execute_reply.started":"2026-09-29T04:15:21.700296Z","shell.execute_reply":"2026-09-29T04:15:21.726244Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# laod images \nX_aptos = []\ny_aptos = []\n\nfor _, row in aptos_df.iterrows():\n\n    img_path = os.path.join(\n        APTOS_DIR,\n        \"train_images\",\n        row[\"id_code\"] + \".png\"\n    )\n\n    img = cv2.imread(img_path)\n\n    if img is not None:\n        img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n        img = img / 255.0\n\n        X_aptos.append(img)\n        y_aptos.append(row[\"diagnosis\"])\n\nX_aptos = np.array(X_aptos, dtype=np.float32)\ny_aptos = np.array(y_aptos)\n\nprint(\"APTOS:\", X_aptos.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-29T04:25:32.623204Z","iopub.execute_input":"2026-09-29T04:25:32.623454Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# combining both datasets \nX = np.concatenate([X_eye, X_aptos], axis=0)\ny = np.concatenate([y_eye, y_aptos], axis=0)\n\nprint(\"Combined images:\", X.shape)\nprint(\"Combined labels:\", y.shape)\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save combined dataset\n\nnp.save(\"/kaggle/working/X_combined.npy\", X)\nnp.save(\"/kaggle/working/y_combined.npy\", y)\n\n# print(\"Combined dataset saved successfully!\")\n# X = np.load(\"/kaggle/working/X_combined.npy\")\n# y = np.load(\"/kaggle/working/y_combined.npy\")\n\n# print(\"Combined images:\", X.shape)\n# print(\"Combined labels:\", y.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class_names = [\n    \"No DR\",\n    \"Mild\",\n    \"Moderate\",\n    \"Severe\",\n    \"Proliferative DR\"\n]\n\nprint(\"Number of classes:\", len(class_names))\n\nfor i, name in enumerate(class_names):\n    print(i, \"=\", name)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"unique, counts = np.unique(y, return_counts=True)\n\nprint(\"Class distribution:\")\nfor label, count in zip(unique, counts):\n    print(\n        f\"{label} = {class_names[label]} : {count} images\"\n    )","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# 80% temporary training data + 20% testing data\nX_train_full, X_test, y_train_full, y_test = train_test_split(\n    X,\n    y,\n    test_size=0.20,\n    random_state=42,\n    stratify=y\n)\n\n# Split the 80% into 80% training + 20% validation\nX_train, X_val, y_train, y_val = train_test_split(\n    X_train_full,\n    y_train_full,\n    test_size=0.20,\n    random_state=42,\n    stratify=y_train_full\n)\n\nprint(\"Training:\", X_train.shape)\nprint(\"Validation:\", X_val.shape)\nprint(\"Testing:\", X_test.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"TRAINING\")\nprint(np.bincount(y_train))\n\nprint(\"\\nVALIDATION\")\nprint(np.bincount(y_val))\n\nprint(\"\\nTESTING\")\nprint(np.bincount(y_test))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef create_cnn():\n\n    model = keras.Sequential([\n\n        layers.Input(shape=(128, 128, 3)),\n\n        layers.Conv2D(32, (3, 3), activation='relu'),\n        layers.MaxPooling2D((2, 2)),\n\n        layers.Conv2D(64, (3, 3), activation='relu'),\n        layers.MaxPooling2D((2, 2)),\n\n        layers.Conv2D(128, (3, 3), activation='relu'),\n        layers.MaxPooling2D((2, 2)),\n\n        layers.Flatten(),\n\n        layers.Dense(128, activation='relu'),\n\n        layers.Dense(5, activation='softmax')\n    ])\n\n    model.compile(\n        optimizer='adam',\n        loss='sparse_categorical_crossentropy',\n        metrics=['accuracy']\n    )\n\n    return model\n\n\nmodel = create_cnn()\n\nmodel.summary()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    X_train,\n    y_train,\n    epochs=10,\n    batch_size=32,\n    validation_data=(X_test, y_test)\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_loss, test_acc = model.evaluate(X_test, y_test)\n\nprint(f\"Test Loss: {test_loss:.4f}\")\nprint(f\"Test Accuracy: {test_acc:.4f}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(10, 6))\n\n# Accuracy\nplt.plot(history.history['accuracy'], label='Training Accuracy')\nplt.plot(history.history['val_accuracy'], label='Testing Accuracy')\n\n# Loss\nplt.plot(history.history['loss'], label='Training Loss')\nplt.plot(history.history['val_loss'], label='Testing Loss')\n\nplt.xlabel('Epochs')\nplt.ylabel('Value')\nplt.title('CNN Training and Testing Performance')\n\nplt.legend()\nplt.grid(True)\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, classification_report\nimport numpy as np\n\n# Predict classes\ny_pred_prob = model.predict(X_test)\n\n# Convert probabilities to class numbers\ny_pred = np.argmax(y_pred_prob, axis=1)\n\nprint(\"Predictions completed!\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\n# Predictions for training data\ny_train_prob = model.predict(X_train)\ny_train_pred = np.argmax(y_train_prob, axis=1)\n\n# Predictions for testing data\ny_test_prob = model.predict(X_test)\ny_test_pred = np.argmax(y_test_prob, axis=1)\n\n# Class names\nclass_names = [\n    \"No DR\",\n    \"Mild\",\n    \"Moderate\",\n    \"Severe\",\n    \"Proliferative DR\"\n]\n\n# Training confusion matrix\ncm_train = confusion_matrix(y_train, y_train_pred)\n\nfig, ax = plt.subplots(figsize=(8, 8))\n\ndisp_train = ConfusionMatrixDisplay(\n    confusion_matrix=cm_train,\n    display_labels=class_names\n)\n\ndisp_train.plot(ax=ax, cmap=\"Blues\", values_format=\"d\")\n\nplt.title(\"Confusion Matrix - Training Data\")\nplt.xlabel(\"Predicted Label\")\nplt.ylabel(\"True Label\")\nplt.show()\n\n\n# Testing confusion matrix\ncm_test = confusion_matrix(y_test, y_test_pred)\n\nfig, ax = plt.subplots(figsize=(8, 8))\n\ndisp_test = ConfusionMatrixDisplay(\n    confusion_matrix=cm_test,\n    display_labels=class_names\n)\n\ndisp_test.plot(ax=ax, cmap=\"Blues\", values_format=\"d\")\n\nplt.title(\"Confusion Matrix - Testing Data\")\nplt.xlabel(\"Predicted Label\")\nplt.ylabel(\"True Label\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# now for baseline checking \n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(\n    optimizer=tf.keras.optimizers.SGD(),\n    loss=\"sparse_categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)\n\nhistory = model.fit(\n    X_train,\n    y_train,\n    epochs=20,\n    batch_size=32,\n    validation_data=(X_test, y_test),\n    verbose=1\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_loss, train_accuracy = model.evaluate(\n    X_train,\n    y_train,\n    verbose=0\n)\n\ntest_loss, test_accuracy = model.evaluate(\n    X_test,\n    y_test,\n    verbose=0\n)\n\nprint(\"Training Accuracy:\", train_accuracy)\nprint(\"Testing Accuracy:\", test_accuracy)\n\nprint(\"Training Loss:\", train_loss)\nprint(\"Testing Loss:\", test_loss)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(8, 5))\n\nplt.plot(history.history[\"accuracy\"], label=\"Training Accuracy\")\nplt.plot(history.history[\"val_accuracy\"], label=\"Testing Accuracy\")\n\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.title(\"Training vs Testing Accuracy\")\n\nplt.legend()\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(8, 5))\n\nplt.plot(history.history[\"loss\"], label=\"Training Loss\")\nplt.plot(history.history[\"val_loss\"], label=\"Testing Loss\")\n\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.title(\"Training vs Testing Loss\")\n\nplt.legend()\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\ny_train_pred = np.argmax(\n    model.predict(X_train),\n    axis=1\n)\n\ny_test_pred = np.argmax(\n    model.predict(X_test),\n    axis=1\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\ncm_train = confusion_matrix(\n    y_train,\n    y_train_pred\n)\n\ndisp = ConfusionMatrixDisplay(\n    confusion_matrix=cm_train,\n    display_labels=[\n        \"No DR\",\n        \"Mild\",\n        \"Moderate\",\n        \"Severe\",\n        \"Proliferative DR\"\n    ]\n)\n\nfig, ax = plt.subplots(figsize=(8, 8))\n\ndisp.plot(\n    ax=ax,\n    cmap=\"Blues\",\n    xticks_rotation=45\n)\n\nplt.title(\"Training Confusion Matrix\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cm_test = confusion_matrix(\n    y_test,\n    y_test_pred\n)\n\ndisp = ConfusionMatrixDisplay(\n    confusion_matrix=cm_test,\n    display_labels=[\n        \"No DR\",\n        \"Mild\",\n        \"Moderate\",\n        \"Severe\",\n        \"Proliferative DR\"\n    ]\n)\n\nfig, ax = plt.subplots(figsize=(8, 8))\n\ndisp.plot(\n    ax=ax,\n    cmap=\"Blues\",\n    xticks_rotation=45\n)\n\nplt.title(\"Testing Confusion Matrix\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# now going to apply both alexnet and googlenet","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# First: separate testing data\nX_train_full, X_test, y_train_full, y_test = train_test_split(\n    X,\n    y,\n    test_size=0.20,\n    random_state=42,\n    stratify=y\n)\n\n# Second: separate validation data from training data\nX_train, X_val, y_train, y_val = train_test_split(\n    X_train_full,\n    y_train_full,\n    test_size=0.20,\n    random_state=42,\n    stratify=y_train_full\n)\n\nprint(\"Training:\", X_train.shape)\nprint(\"Validation:\", X_val.shape)\nprint(\"Testing:\", X_test.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# CLASS WEIGHTS\nfrom sklearn.utils.class_weight import compute_class_weight\n\nclasses = np.unique(y_train)\n\nclass_weights = compute_class_weight(\n    class_weight=\"balanced\",\n    classes=classes,\n    y=y_train\n)\n\nclass_weight_dict = dict(\n    zip(classes, class_weights)\n)\n\nprint(\"Class Weights\")\nprint(\"-------------------------\")\n\nfor cls in classes:\n    print(\n        f\"{cls} = {class_names[cls]} : \"\n        f\"{class_weight_dict[cls]:.4f}\"\n    )","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# alexnet \nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\n\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# AlexNet data augmentation\n\nalexnet_augmentation = tf.keras.Sequential([\n    layers.RandomFlip(\"horizontal\"),\n    layers.RandomRotation(0.10),\n    layers.RandomZoom(0.15)\n], name=\"AlexNet_Augmentation\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"alexnet = models.Sequential([\n    layers.Input(shape=(128, 128, 3)),\n\n    alexnet_augmentation,\n    layers.Rescaling(1.0 / 255),\n\n    layers.Conv2D(96, (11, 11), strides=4, padding=\"same\", activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.MaxPooling2D((3, 3), strides=2),\n\n    layers.Conv2D(256, (5, 5), padding=\"same\", activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.MaxPooling2D((3, 3), strides=2),\n\n    layers.Conv2D(384, (3, 3), padding=\"same\", activation=\"relu\"),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(384, (3, 3), padding=\"same\", activation=\"relu\"),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(256, (3, 3), padding=\"same\", activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.MaxPooling2D((3, 3), strides=2),\n\n    layers.Flatten(),\n\n    layers.Dense(512, activation=\"relu\"),\n    layers.BatchNormalization(),\n\n    layers.Dense(256, activation=\"relu\"),\n    layers.BatchNormalization(),\n\n    layers.Dense(5, activation=\"softmax\")\n])\n\nalexnet.summary()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# AlexNet hyperparameters\nALEXNET_LR = 0.0001\nALEXNET_BATCH_SIZE = 32\nALEXNET_EPOCHS = 50\n\nprint(\"========== AlexNet Hyperparameters ==========\")\nprint(\"Input Size:             128 x 128 x 3\")\nprint(\"Number of Classes:     5\")\nprint(\"Optimizer:              Adam\")\nprint(\"Learning Rate:          \", ALEXNET_LR)\nprint(\"Batch Size:             \", ALEXNET_BATCH_SIZE)\nprint(\"Maximum Epochs:         \", ALEXNET_EPOCHS)\nprint(\"Data Augmentation:      Yes\")\nprint(\"Batch Normalization:    Yes\")\nprint(\"Class Weights:          Yes\")\nprint(\"Pretrained Weights:     No\")\nprint(\"Transfer Learning:      No\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Compile AlexNet\nalexnet.compile(\n    optimizer=Adam(\n        learning_rate=ALEXNET_LR\n    ),\n\n    loss=\"sparse_categorical_crossentropy\",\n\n    metrics=[\n        \"accuracy\"\n    ]\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# AlexNet callbacks\nalexnet_early_stopping = EarlyStopping(\n    monitor=\"val_accuracy\",\n    patience=8,\n    mode=\"max\",\n    restore_best_weights=True,\n    verbose=1\n)\n\nalexnet_reduce_lr = ReduceLROnPlateau(\n    monitor=\"val_loss\",\n    factor=0.5,\n    patience=4,\n    min_lr=1e-6,\n    verbose=1\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train AlexNet\nalexnet_history = alexnet.fit(\n\n    X_train,\n    y_train,\n\n    validation_data=(\n        X_val,\n        y_val\n    ),\n\n    epochs=ALEXNET_EPOCHS,\n\n    batch_size=ALEXNET_BATCH_SIZE,\n\n    class_weight=class_weight_dict,\n\n    callbacks=[\n        alexnet_early_stopping,\n        alexnet_reduce_lr\n    ],\n\n    verbose=1\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, models\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\n\nalexnet_augmentation = tf.keras.Sequential([\n    layers.RandomFlip(\"horizontal\"),\n    layers.RandomRotation(0.05),\n    layers.RandomZoom(0.05)\n], name=\"AlexNet_Augmentation\")\n\n\nalexnet = models.Sequential([\n\n    layers.Input(shape=(128, 128, 3)),\n\n    alexnet_augmentation,\n    layers.Rescaling(1.0 / 255),\n\n    # Block 1\n    layers.Conv2D(\n        64, (5, 5),\n        strides=1,\n        padding=\"same\",\n        activation=\"relu\"\n    ),\n    layers.BatchNormalization(),\n    layers.MaxPooling2D(\n        pool_size=(3, 3),\n        strides=2\n    ),\n\n    # Block 2\n    layers.Conv2D(\n        128, (3, 3),\n        padding=\"same\",\n        activation=\"relu\"\n    ),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(\n        128, (3, 3),\n        padding=\"same\",\n        activation=\"relu\"\n    ),\n    layers.BatchNormalization(),\n\n    layers.MaxPooling2D(\n        pool_size=(3, 3),\n        strides=2\n    ),\n\n    # Block 3\n    layers.Conv2D(\n        256, (3, 3),\n        padding=\"same\",\n        activation=\"relu\"\n    ),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(\n        256, (3, 3),\n        padding=\"same\",\n        activation=\"relu\"\n    ),\n    layers.BatchNormalization(),\n\n    layers.MaxPooling2D(\n        pool_size=(3, 3),\n        strides=2\n    ),\n\n    # Classification\n    layers.GlobalAveragePooling2D(),\n\n    layers.Dense(256, activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.Dropout(0.3),\n\n    layers.Dense(128, activation=\"relu\"),\n    layers.BatchNormalization(),\n    layers.Dropout(0.3),\n\n    layers.Dense(5, activation=\"softmax\")\n])\n\nalexnet.summary()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ALEXNET_LR = 0.0001\n\nalexnet_optimizer = Adam(\n    learning_rate=ALEXNET_LR\n)\n\nprint(\n    \"Initial learning rate:\",\n    alexnet_optimizer.learning_rate.numpy()\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"alexnet.compile(\n    optimizer=alexnet_optimizer,\n    loss=\"sparse_categorical_crossentropy\",\n    metrics=[\"accuracy\"]\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"alexnet_early_stopping = EarlyStopping(\n    monitor=\"val_accuracy\",\n    patience=12,\n    mode=\"max\",\n    restore_best_weights=False,\n    verbose=1\n)\n\nalexnet_reduce_lr = ReduceLROnPlateau(\n    monitor=\"val_loss\",\n    factor=0.5,\n    patience=5,\n    min_lr=1e-5,\n    verbose=1\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"alexnet_history = alexnet.fit(\n    X_train,\n    y_train,\n    validation_data=(X_val, y_val),\n    epochs=50,\n    batch_size=32,\n    callbacks=[\n        alexnet_early_stopping,\n        alexnet_reduce_lr\n    ],\n    verbose=1\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}