{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.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"}],"dockerImageVersionId":31193,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import EfficientNetB0\nfrom tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.optimizers import Adam","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:22:10.257157Z","iopub.execute_input":"2025-12-06T19:22:10.257614Z","iopub.status.idle":"2025-12-06T19:22:10.261643Z","shell.execute_reply.started":"2025-12-06T19:22:10.257589Z","shell.execute_reply":"2025-12-06T19:22:10.260945Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"GPU Available:\", tf.config.list_physical_devices('GPU'))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:22:20.372471Z","iopub.execute_input":"2025-12-06T19:22:20.373049Z","iopub.status.idle":"2025-12-06T19:22:20.908588Z","shell.execute_reply.started":"2025-12-06T19:22:20.373023Z","shell.execute_reply":"2025-12-06T19:22:20.907848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"root_dir = '/kaggle/input/aptos2019-blindness-detection'\n\ntrain_img_dir = os.path.join(root_dir, 'train_images')\ntest_img_dir  = os.path.join(root_dir, 'test_images')\n\ntrain_df = pd.read_csv(os.path.join(root_dir, 'train.csv'))\ntest_df  = pd.read_csv(os.path.join(root_dir, 'test.csv'))\n\ntrain_df['file_path'] = train_df['id_code'].apply(lambda x: os.path.join(train_img_dir, f\"{x}.png\"))\ntest_df['file_path']  = test_df['id_code'].apply(lambda x: os.path.join(test_img_dir, f\"{x}.png\"))\n\ntrain_df['diagnosis'] = train_df['diagnosis'].astype(str)\n\ntrain_df.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:22:32.952035Z","iopub.execute_input":"2025-12-06T19:22:32.952733Z","iopub.status.idle":"2025-12-06T19:22:33.005853Z","shell.execute_reply.started":"2025-12-06T19:22:32.952706Z","shell.execute_reply":"2025-12-06T19:22:33.005122Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    preprocessing_function=tf.keras.applications.resnet.preprocess_input,\n    validation_split=0.2\n)\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    x_col='file_path',\n    y_col='diagnosis',\n    target_size=(224,224),\n    batch_size=32,\n    class_mode='categorical',\n    subset='training'\n)\n\nval_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    x_col='file_path',\n    y_col='diagnosis',\n    target_size=(224,224),\n    batch_size=32,\n    class_mode='categorical',\n    subset='validation'\n)\n\ntest_datagen = ImageDataGenerator(\n    preprocessing_function=tf.keras.applications.resnet.preprocess_input\n)\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe=test_df,\n    x_col='file_path',\n    class_mode=None,\n    target_size=(224,224),\n    batch_size=32,\n    shuffle=False\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:22:44.79297Z","iopub.execute_input":"2025-12-06T19:22:44.793473Z","iopub.status.idle":"2025-12-06T19:22:50.149206Z","shell.execute_reply.started":"2025-12-06T19:22:44.793448Z","shell.execute_reply":"2025-12-06T19:22:50.148389Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def show_images(generator, title):\n    images = next(generator)\n    plt.figure(figsize=(10,6))\n    for i in range(6):\n        plt.subplot(2,3,i+1)\n        plt.imshow(images[0][i].astype('uint8'))\n        plt.axis('off')\n    plt.suptitle(title)\n    plt.show()\n\nshow_images(train_generator, \"Training Images\")\nshow_images(test_generator, \"Test Images\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:23:16.272419Z","iopub.execute_input":"2025-12-06T19:23:16.272998Z","iopub.status.idle":"2025-12-06T19:23:21.415102Z","shell.execute_reply.started":"2025-12-06T19:23:16.272964Z","shell.execute_reply":"2025-12-06T19:23:21.414318Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_model = EfficientNetB0(weights='imagenet', include_top=False, input_shape=(224,224,3))\n\nfor layer in base_model.layers[:-20]:\n    layer.trainable = False\n\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\nx = Dropout(0.5)(x)\nx = Dense(256, activation='relu')(x)\noutput = Dense(5, activation='softmax')(x)\n\nmodel = Model(inputs=base_model.input, outputs=output)\n\nmodel.compile(\n    optimizer=Adam(learning_rate=1e-4),\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)\n\nmodel.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:23:43.853124Z","iopub.execute_input":"2025-12-06T19:23:43.853903Z","iopub.status.idle":"2025-12-06T19:23:48.93576Z","shell.execute_reply.started":"2025-12-06T19:23:43.853875Z","shell.execute_reply":"2025-12-06T19:23:48.935163Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=10\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T19:24:38.07288Z","iopub.execute_input":"2025-12-06T19:24:38.073623Z","iopub.status.idle":"2025-12-06T20:23:15.257421Z","shell.execute_reply.started":"2025-12-06T19:24:38.073598Z","shell.execute_reply":"2025-12-06T20:23:15.256814Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.legend()\nplt.title(\"Accuracy Curve\")\nplt.show()\n\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.legend()\nplt.title(\"Loss Curve\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T20:24:19.396045Z","iopub.execute_input":"2025-12-06T20:24:19.396346Z","iopub.status.idle":"2025-12-06T20:24:19.697185Z","shell.execute_reply.started":"2025-12-06T20:24:19.396326Z","shell.execute_reply":"2025-12-06T20:24:19.69658Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = model.predict(test_generator)\npredicted_classes = np.argmax(predictions, axis=1)\n\nsubmission = pd.DataFrame({\n    'id_code': test_df['id_code'],\n    'diagnosis': predicted_classes\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)\nsubmission.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-06T20:24:43.375875Z","iopub.execute_input":"2025-12-06T20:24:43.37615Z","iopub.status.idle":"2025-12-06T20:26:22.20739Z","shell.execute_reply.started":"2025-12-06T20:24:43.376129Z","shell.execute_reply":"2025-12-06T20:26:22.20666Z"}},"outputs":[],"execution_count":null}]}