{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":14774,"databundleVersionId":875431}],"dockerImageVersionId":31286,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:25:32.504416Z","iopub.execute_input":"2026-03-07T02:25:32.504739Z","iopub.status.idle":"2026-03-07T02:25:39.334873Z","shell.execute_reply.started":"2026-03-07T02:25:32.504704Z","shell.execute_reply":"2026-03-07T02:25:39.333371Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, AveragePooling2D\nfrom tensorflow.keras.layers import Flatten, Dense, Dropout\nfrom tensorflow.keras.utils import to_categorical","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:28:26.652331Z","iopub.execute_input":"2026-03-07T02:28:26.652699Z","iopub.status.idle":"2026-03-07T02:28:26.659303Z","shell.execute_reply.started":"2026-03-07T02:28:26.652668Z","shell.execute_reply":"2026-03-07T02:28:26.658072Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:29:28.197631Z","iopub.execute_input":"2026-03-07T02:29:28.197980Z","iopub.status.idle":"2026-03-07T02:29:30.580617Z","shell.execute_reply.started":"2026-03-07T02:29:28.197951Z","shell.execute_reply":"2026-03-07T02:29:30.579666Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/competitions/aptos2019-blindness-detection/train.csv')\n\nprint(train_df.head())\nprint(\"Total samples:\", len(train_df))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:31:21.928804Z","iopub.execute_input":"2026-03-07T02:31:21.929185Z","iopub.status.idle":"2026-03-07T02:31:21.966601Z","shell.execute_reply.started":"2026-03-07T02:31:21.929154Z","shell.execute_reply":"2026-03-07T02:31:21.965404Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"IMG_SIZE = 128\n\nimages = []\nlabels = []\n\nfor index, row in train_df.iterrows():\n    \n    img_path = f\"/kaggle/input/competitions/aptos2019-blindness-detection/train_images/{row['id_code']}.png\"\n    \n    img = cv2.imread(img_path)\n    img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))\n    \n    images.append(img)\n    labels.append(row['diagnosis'])\n\nX = np.array(images)\ny = np.array(labels)\n\nprint(\"Dataset shape:\", X.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:33:26.526192Z","iopub.execute_input":"2026-03-07T02:33:26.526526Z","iopub.status.idle":"2026-03-07T02:41:49.257922Z","shell.execute_reply.started":"2026-03-07T02:33:26.526498Z","shell.execute_reply":"2026-03-07T02:41:49.256834Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = X / 255.0","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:41:49.259790Z","iopub.execute_input":"2026-03-07T02:41:49.260169Z","iopub.status.idle":"2026-03-07T02:41:49.927814Z","shell.execute_reply.started":"2026-03-07T02:41:49.260139Z","shell.execute_reply":"2026-03-07T02:41:49.926797Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom tensorflow.keras.utils import to_categorical\n\nX_train, X_test, y_train, y_test = train_test_split(\n    X, y,\n    test_size=0.2,\n    random_state=42\n)\n\ny_train = to_categorical(y_train, 5)\ny_test = to_categorical(y_test, 5)\n\nprint(\"Train size:\", X_train.shape)\nprint(\"Test size:\", X_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:41:49.929041Z","iopub.execute_input":"2026-03-07T02:41:49.929362Z","iopub.status.idle":"2026-03-07T02:41:50.501602Z","shell.execute_reply.started":"2026-03-07T02:41:49.929335Z","shell.execute_reply":"2026-03-07T02:41:50.500670Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_A = Sequential()\n\nmodel_A.add(Conv2D(32, (3,3), activation='relu', input_shape=(128,128,3)))\nmodel_A.add(MaxPooling2D((2,2)))\n\nmodel_A.add(Conv2D(64, (3,3), activation='relu'))\nmodel_A.add(MaxPooling2D((2,2)))\n\nmodel_A.add(Flatten())\nmodel_A.add(Dense(128, activation='relu'))\nmodel_A.add(Dense(5, activation='softmax'))\n\nmodel_A.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)\n\nmodel_A.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:41:50.503809Z","iopub.execute_input":"2026-03-07T02:41:50.504145Z","iopub.status.idle":"2026-03-07T02:41:50.740850Z","shell.execute_reply.started":"2026-03-07T02:41:50.504117Z","shell.execute_reply":"2026-03-07T02:41:50.740053Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history_A = model_A.fit(\n    X_train,\n    y_train,\n    epochs=5,\n    validation_data=(X_test, y_test),\n    batch_size=32\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:41:50.741711Z","iopub.execute_input":"2026-03-07T02:41:50.742053Z","iopub.status.idle":"2026-03-07T02:45:38.182912Z","shell.execute_reply.started":"2026-03-07T02:41:50.742021Z","shell.execute_reply":"2026-03-07T02:45:38.180838Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_B = Sequential()\n\nmodel_B.add(Conv2D(32, (5,5), activation='relu', input_shape=(128,128,3)))\nmodel_B.add(MaxPooling2D((2,2)))\n\nmodel_B.add(Conv2D(64, (5,5), activation='relu'))\nmodel_B.add(MaxPooling2D((2,2)))\n\nmodel_B.add(Flatten())\nmodel_B.add(Dense(128, activation='relu'))\nmodel_B.add(Dense(5, activation='softmax'))\n\nmodel_B.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:45:38.186167Z","iopub.execute_input":"2026-03-07T02:45:38.186607Z","iopub.status.idle":"2026-03-07T02:45:38.300326Z","shell.execute_reply.started":"2026-03-07T02:45:38.186565Z","shell.execute_reply":"2026-03-07T02:45:38.299323Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history_B = model_B.fit(\n    X_train,\n    y_train,\n    epochs=5,\n    validation_data=(X_test, y_test),\n    batch_size=32\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:45:38.301520Z","iopub.execute_input":"2026-03-07T02:45:38.301838Z","iopub.status.idle":"2026-03-07T02:51:22.033961Z","shell.execute_reply.started":"2026-03-07T02:45:38.301809Z","shell.execute_reply":"2026-03-07T02:51:22.032311Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model_C = Sequential()\n\nmodel_C.add(Conv2D(32, (3,3), activation='relu', input_shape=(128,128,3)))\nmodel_C.add(AveragePooling2D((2,2)))\n\nmodel_C.add(Conv2D(64, (3,3), activation='relu'))\nmodel_C.add(AveragePooling2D((2,2)))\n\nmodel_C.add(Flatten())\nmodel_C.add(Dense(128, activation='relu'))\nmodel_C.add(Dense(5, activation='softmax'))\n\nmodel_C.compile(\n    optimizer='adam',\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:51:22.036184Z","iopub.execute_input":"2026-03-07T02:51:22.036733Z","iopub.status.idle":"2026-03-07T02:51:22.146177Z","shell.execute_reply.started":"2026-03-07T02:51:22.036690Z","shell.execute_reply":"2026-03-07T02:51:22.145028Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history_C = model_C.fit(\n    X_train,\n    y_train,\n    epochs=5,\n    validation_data=(X_test, y_test),\n    batch_size=32\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:51:22.147508Z","iopub.execute_input":"2026-03-07T02:51:22.148338Z","iopub.status.idle":"2026-03-07T02:54:59.632652Z","shell.execute_reply.started":"2026-03-07T02:51:22.148297Z","shell.execute_reply":"2026-03-07T02:54:59.631206Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"acc_A = model_A.evaluate(X_test, y_test)[1]\nacc_B = model_B.evaluate(X_test, y_test)[1]\nacc_C = model_C.evaluate(X_test, y_test)[1]\n\nresults = pd.DataFrame({\n    \"Model\": [\"A (3x3 + MaxPool)\", \"B (5x5 + MaxPool)\", \"C (3x3 + AvgPool)\"],\n    \"Accuracy\": [acc_A, acc_B, acc_C]\n})\n\nprint(results)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-07T02:54:59.636234Z","iopub.execute_input":"2026-03-07T02:54:59.636586Z","iopub.status.idle":"2026-03-07T02:55:11.486116Z","shell.execute_reply.started":"2026-03-07T02:54:59.636558Z","shell.execute_reply":"2026-03-07T02:55:11.484982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}