{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":"gpu","dataSources":[{"sourceType":"competition","sourceId":131587,"databundleVersionId":15786880,"isSourceIdPinned":false}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"5130cb3b","cell_type":"code","source":"import os\nimport random\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:15.022755Z","iopub.execute_input":"2026-04-19T13:00:15.023338Z","iopub.status.idle":"2026-04-19T13:00:15.027130Z","shell.execute_reply.started":"2026-04-19T13:00:15.023308Z","shell.execute_reply":"2026-04-19T13:00:15.026425Z"}},"outputs":[],"execution_count":null},{"id":"2ba0c818","cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras import layers, models","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:15.872930Z","iopub.execute_input":"2026-04-19T13:00:15.873859Z","iopub.status.idle":"2026-04-19T13:00:15.877423Z","shell.execute_reply.started":"2026-04-19T13:00:15.873812Z","shell.execute_reply":"2026-04-19T13:00:15.876765Z"}},"outputs":[],"execution_count":null},{"id":"11973eb3","cell_type":"code","source":"train_dir = '/kaggle/input/competitions/cs-460-muffin-vs-chihuahua-classification-challenge/train'\ntest_dir = '/kaggle/input/competitions/cs-460-muffin-vs-chihuahua-classification-challenge/kaggle_test_final'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:16.861652Z","iopub.execute_input":"2026-04-19T13:00:16.861982Z","iopub.status.idle":"2026-04-19T13:00:16.865559Z","shell.execute_reply.started":"2026-04-19T13:00:16.861954Z","shell.execute_reply":"2026-04-19T13:00:16.864844Z"}},"outputs":[],"execution_count":null},{"id":"e63e53b7","cell_type":"code","source":"muffin_count = len(os.listdir(os.path.join(train_dir, \"muffin\")))\nchihuahua_count = len(os.listdir(os.path.join(train_dir, \"chihuahua\")))\n\ntotal = muffin_count + chihuahua_count\n\nprint(\"Muffin images:\", muffin_count)\nprint(\"Chihuahua images:\", chihuahua_count)\nprint(\"Total images:\", total)\n\nprint(\"\\nClass distribution:\")\nprint(\"Muffin:\", muffin_count/total*100, \"%\")\nprint(\"Chihuahua:\", chihuahua_count/total*100, \"%\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:18.018532Z","iopub.execute_input":"2026-04-19T13:00:18.019154Z","iopub.status.idle":"2026-04-19T13:00:18.041444Z","shell.execute_reply.started":"2026-04-19T13:00:18.019123Z","shell.execute_reply":"2026-04-19T13:00:18.040815Z"}},"outputs":[],"execution_count":null},{"id":"c5dd33f4","cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    \n    rescale=1./255,\n    rotation_range=25,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    zoom_range=0.2,\n    shear_range=0.1,\n    horizontal_flip=True,\n    brightness_range=[0.8,1.2],\n    validation_split=0.2\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:20.233117Z","iopub.execute_input":"2026-04-19T13:00:20.233650Z","iopub.status.idle":"2026-04-19T13:00:20.237662Z","shell.execute_reply.started":"2026-04-19T13:00:20.233625Z","shell.execute_reply":"2026-04-19T13:00:20.236860Z"}},"outputs":[],"execution_count":null},{"id":"e3327c3c","cell_type":"code","source":"validation_datagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:21.021599Z","iopub.execute_input":"2026-04-19T13:00:21.022397Z","iopub.status.idle":"2026-04-19T13:00:21.025831Z","shell.execute_reply.started":"2026-04-19T13:00:21.022362Z","shell.execute_reply":"2026-04-19T13:00:21.025115Z"}},"outputs":[],"execution_count":null},{"id":"505f3968","cell_type":"code","source":"train_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(256,256),\n    batch_size=32,\n    class_mode='binary',\n    subset='training'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:22.806060Z","iopub.execute_input":"2026-04-19T13:00:22.806329Z","iopub.status.idle":"2026-04-19T13:00:23.877219Z","shell.execute_reply.started":"2026-04-19T13:00:22.806306Z","shell.execute_reply":"2026-04-19T13:00:23.876642Z"}},"outputs":[],"execution_count":null},{"id":"788f45bb","cell_type":"code","source":"validation_generator = validation_datagen.flow_from_directory(\n    train_dir,\n    target_size=(256,256),\n    batch_size=32,\n    class_mode='binary',\n    subset='validation'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:00:23.878294Z","iopub.execute_input":"2026-04-19T13:00:23.878517Z","iopub.status.idle":"2026-04-19T13:00:23.923806Z","shell.execute_reply.started":"2026-04-19T13:00:23.878494Z","shell.execute_reply":"2026-04-19T13:00:23.923269Z"}},"outputs":[],"execution_count":null},{"id":"be642180-629e-485f-bd93-c743bfcb7fbf","cell_type":"markdown","source":"# CNN","metadata":{}},{"id":"cf8d7341","cell_type":"code","source":"model = models.Sequential([\n\n    layers.Conv2D(32, (3,3), padding='same', input_shape=(256,256,3)),\n    layers.Activation('relu'),\n    layers.MaxPooling2D((2,2)),\n\n    layers.Conv2D(64, (3,3), padding='same'),\n    layers.Activation('relu'),\n    layers.MaxPooling2D((2,2)),\n    \n    layers.Conv2D(128, (3,3), padding='same'),\n    layers.Activation('relu'),\n    layers.MaxPooling2D((2,2)),\n\n    layers.Flatten(),\n\n    layers.Dense(128),\n    layers.Activation('relu'),\n    layers.Dropout(0.5),\n\n    layers.Dense(1, activation='sigmoid')\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:04:52.580528Z","iopub.execute_input":"2026-04-19T06:04:52.581358Z","iopub.status.idle":"2026-04-19T06:04:54.810665Z","shell.execute_reply.started":"2026-04-19T06:04:52.581327Z","shell.execute_reply":"2026-04-19T06:04:54.809736Z"}},"outputs":[],"execution_count":null},{"id":"f587e4f6","cell_type":"code","source":"optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)\nmodel.compile(\n    optimizer=optimizer,\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:04:59.165310Z","iopub.execute_input":"2026-04-19T06:04:59.166212Z","iopub.status.idle":"2026-04-19T06:04:59.182116Z","shell.execute_reply.started":"2026-04-19T06:04:59.166177Z","shell.execute_reply":"2026-04-19T06:04:59.181277Z"}},"outputs":[],"execution_count":null},{"id":"dc43afbe","cell_type":"code","source":"model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:05:00.340752Z","iopub.execute_input":"2026-04-19T06:05:00.341442Z","iopub.status.idle":"2026-04-19T06:05:00.364733Z","shell.execute_reply.started":"2026-04-19T06:05:00.341412Z","shell.execute_reply":"2026-04-19T06:05:00.363855Z"}},"outputs":[],"execution_count":null},{"id":"105dacd0","cell_type":"code","source":"%%time\nhistory = model.fit(\n    train_generator,\n    validation_data=validation_generator,\n    epochs=5\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:05:07.865375Z","iopub.execute_input":"2026-04-19T06:05:07.866019Z","iopub.status.idle":"2026-04-19T06:12:43.106795Z","shell.execute_reply.started":"2026-04-19T06:05:07.865988Z","shell.execute_reply":"2026-04-19T06:12:43.106177Z"}},"outputs":[],"execution_count":null},{"id":"86e5757b","cell_type":"code","source":"# Accuracy\ntrain_acc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\n\n# Loss\ntrain_loss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs = range(1, len(train_acc) + 1)\n\nplt.figure(figsize=(12,5))\n\n# Accuracy plot\nplt.subplot(1,2,1)\nplt.plot(epochs, train_acc, marker='o', label='Training Accuracy')\nplt.plot(epochs, val_acc, marker='o', label='Validation Accuracy')\nplt.title(\"Training vs Validation Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.grid(True)\n\n# Loss plot\nplt.subplot(1,2,2)\nplt.plot(epochs, train_loss, marker='o', label='Training Loss')\nplt.plot(epochs, val_loss, marker='o', label='Validation Loss')\nplt.title(\"Training vs Validation Loss\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.legend()\nplt.grid(True)\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:12:58.045295Z","iopub.execute_input":"2026-04-19T06:12:58.046007Z","iopub.status.idle":"2026-04-19T06:12:58.333965Z","shell.execute_reply.started":"2026-04-19T06:12:58.045974Z","shell.execute_reply":"2026-04-19T06:12:58.333271Z"}},"outputs":[],"execution_count":null},{"id":"f481792f-e6ad-498c-8add-0c4794516f56","cell_type":"code","source":"v_loss, v_acc = model.evaluate(validation_generator)\nprint(\"Accuracy:\", v_acc)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:19:11.366786Z","iopub.execute_input":"2026-04-19T06:19:11.367303Z","iopub.status.idle":"2026-04-19T06:19:17.204287Z","shell.execute_reply.started":"2026-04-19T06:19:11.367271Z","shell.execute_reply":"2026-04-19T06:19:17.203655Z"}},"outputs":[],"execution_count":null},{"id":"0893c7f7-0c55-4bb9-9157-7ef515077520","cell_type":"markdown","source":"# ResNet50","metadata":{}},{"id":"f9e218cd-7ade-4604-81ef-8c88f0ed9fc4","cell_type":"code","source":"from tensorflow.keras.applications import ResNet50, MobileNetV2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T08:38:48.391128Z","iopub.execute_input":"2026-04-19T08:38:48.391546Z","iopub.status.idle":"2026-04-19T08:38:48.395216Z","shell.execute_reply.started":"2026-04-19T08:38:48.391519Z","shell.execute_reply":"2026-04-19T08:38:48.394485Z"}},"outputs":[],"execution_count":null},{"id":"d716aac7-ed17-4c68-b798-392a0488cbe1","cell_type":"code","source":"base_resnet = ResNet50(weights='imagenet', include_top=False, input_shape=(256, 256, 3))\nbase_resnet.trainable = False  # freeze pretrained layers\n\nresnet_model = models.Sequential([\n    base_resnet,\n    layers.GlobalAveragePooling2D(),\n    layers.Dense(128, activation='relu'),\n    layers.Dropout(0.5),\n    layers.Dense(1, activation='sigmoid')\n], name='ResNet50')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T08:38:49.998050Z","iopub.execute_input":"2026-04-19T08:38:49.998740Z","iopub.status.idle":"2026-04-19T08:38:51.007346Z","shell.execute_reply.started":"2026-04-19T08:38:49.998701Z","shell.execute_reply":"2026-04-19T08:38:51.006475Z"}},"outputs":[],"execution_count":null},{"id":"dcf390eb-01bb-4764-8d4a-27cf6d5ed9ce","cell_type":"code","source":"resnet_model.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)\n\nresnet_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T08:38:57.734663Z","iopub.execute_input":"2026-04-19T08:38:57.735562Z","iopub.status.idle":"2026-04-19T08:38:57.767256Z","shell.execute_reply.started":"2026-04-19T08:38:57.735532Z","shell.execute_reply":"2026-04-19T08:38:57.766569Z"}},"outputs":[],"execution_count":null},{"id":"5aebfe45-3eaf-4b9e-85e8-8303fb7b7045","cell_type":"code","source":"history_resnet = resnet_model.fit(\n    train_generator,\n    validation_data=validation_generator,\n    epochs=10\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:34:47.848620Z","iopub.execute_input":"2026-04-19T06:34:47.849513Z","iopub.status.idle":"2026-04-19T06:48:03.092567Z","shell.execute_reply.started":"2026-04-19T06:34:47.849481Z","shell.execute_reply":"2026-04-19T06:48:03.091692Z"}},"outputs":[],"execution_count":null},{"id":"3ae88629-f5c1-4b31-b31c-572d804a19e9","cell_type":"code","source":"v_loss, v_acc = resnet_model.evaluate(validation_generator)\nprint(\"Accuracy:\", v_acc)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:48:09.119880Z","iopub.execute_input":"2026-04-19T06:48:09.120602Z","iopub.status.idle":"2026-04-19T06:48:15.044009Z","shell.execute_reply.started":"2026-04-19T06:48:09.120573Z","shell.execute_reply":"2026-04-19T06:48:15.042990Z"}},"outputs":[],"execution_count":null},{"id":"4e593b5e-22ba-4e46-b5e2-172fc0de9676","cell_type":"code","source":"# Accuracy\ntrain_acc = history_resnet.history['accuracy']\nval_acc = history_resnet.history['val_accuracy']\n\n# Loss\ntrain_loss = history_resnet.history['loss']\nval_loss = history_resnet.history['val_loss']\n\nepochs = range(1, len(train_acc) + 1)\n\nplt.figure(figsize=(12,5))\n\n# Accuracy plot\nplt.subplot(1,2,1)\nplt.plot(epochs, train_acc, marker='o', label='Training Accuracy')\nplt.plot(epochs, val_acc, marker='o', label='Validation Accuracy')\nplt.title(\"Training vs Validation Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.grid(True)\n\n# Loss plot\nplt.subplot(1,2,2)\nplt.plot(epochs, train_loss, marker='o', label='Training Loss')\nplt.plot(epochs, val_loss, marker='o', label='Validation Loss')\nplt.title(\"Training vs Validation Loss\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.legend()\nplt.grid(True)\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:54:48.808716Z","iopub.execute_input":"2026-04-19T06:54:48.809405Z","iopub.status.idle":"2026-04-19T06:54:49.052461Z","shell.execute_reply.started":"2026-04-19T06:54:48.809376Z","shell.execute_reply":"2026-04-19T06:54:49.051701Z"}},"outputs":[],"execution_count":null},{"id":"6cb95c86-8c55-4d41-9938-e55056e1331b","cell_type":"markdown","source":"# MobileNetV2","metadata":{}},{"id":"a1b3eac9-2352-4f88-b256-67732f4501c4","cell_type":"code","source":"base_mobilenet = MobileNetV2(weights='imagenet', include_top=False, input_shape=(256, 256, 3))\nbase_mobilenet.trainable = False\n\nmobilenet_model = models.Sequential([\n    base_mobilenet,\n    layers.GlobalAveragePooling2D(),\n    layers.Dense(128, activation='relu'),\n    layers.Dropout(0.5),\n    layers.Dense(1, activation='sigmoid')\n], name='MobileNetV2')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:59:11.538143Z","iopub.execute_input":"2026-04-19T06:59:11.538785Z","iopub.status.idle":"2026-04-19T06:59:14.883048Z","shell.execute_reply.started":"2026-04-19T06:59:11.538755Z","shell.execute_reply":"2026-04-19T06:59:14.882462Z"}},"outputs":[],"execution_count":null},{"id":"66cbf74c-8345-4a05-ab93-2694e67c5937","cell_type":"code","source":"mobilenet_model.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)\n\nmobilenet_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T06:59:24.765638Z","iopub.execute_input":"2026-04-19T06:59:24.765952Z","iopub.status.idle":"2026-04-19T06:59:24.789214Z","shell.execute_reply.started":"2026-04-19T06:59:24.765873Z","shell.execute_reply":"2026-04-19T06:59:24.788460Z"}},"outputs":[],"execution_count":null},{"id":"77723f91-8bdd-42cb-b8b9-a0f31d9a3bf5","cell_type":"code","source":"history_mobilenet = mobilenet_model.fit(\n    train_generator,\n    validation_data=validation_generator,\n    epochs=5\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T07:05:08.131530Z","iopub.execute_input":"2026-04-19T07:05:08.132192Z","iopub.status.idle":"2026-04-19T07:11:32.420507Z","shell.execute_reply.started":"2026-04-19T07:05:08.132160Z","shell.execute_reply":"2026-04-19T07:11:32.419846Z"}},"outputs":[],"execution_count":null},{"id":"53f24819-4a6d-4e52-a6df-dd0f92e38780","cell_type":"code","source":"v_loss, v_acc = mobilenet_model.evaluate(validation_generator)\nprint(\"Accuracy:\", v_acc)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T07:12:49.067320Z","iopub.execute_input":"2026-04-19T07:12:49.067968Z","iopub.status.idle":"2026-04-19T07:12:54.813773Z","shell.execute_reply.started":"2026-04-19T07:12:49.067926Z","shell.execute_reply":"2026-04-19T07:12:54.812962Z"}},"outputs":[],"execution_count":null},{"id":"0e886961-59e1-4b9d-b982-38d42a137e06","cell_type":"code","source":"# Accuracy\ntrain_acc = history_mobilenet.history['accuracy']\nval_acc = history_mobilenet.history['val_accuracy']\n\n# Loss\ntrain_loss = history_mobilenet.history['loss']\nval_loss = history_mobilenet.history['val_loss']\n\nepochs = range(1, len(train_acc) + 1)\n\nplt.figure(figsize=(12,5))\n\n# Accuracy plot\nplt.subplot(1,2,1)\nplt.plot(epochs, train_acc, marker='o', label='Training Accuracy')\nplt.plot(epochs, val_acc, marker='o', label='Validation Accuracy')\nplt.title(\"Training vs Validation Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.grid(True)\n\n# Loss plot\nplt.subplot(1,2,2)\nplt.plot(epochs, train_loss, marker='o', label='Training Loss')\nplt.plot(epochs, val_loss, marker='o', label='Validation Loss')\nplt.title(\"Training vs Validation Loss\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.legend()\nplt.grid(True)\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T07:13:49.893561Z","iopub.execute_input":"2026-04-19T07:13:49.894205Z","iopub.status.idle":"2026-04-19T07:13:50.170641Z","shell.execute_reply.started":"2026-04-19T07:13:49.894174Z","shell.execute_reply":"2026-04-19T07:13:50.170060Z"}},"outputs":[],"execution_count":null},{"id":"1ed45719-a929-4f45-aba7-05f33594d884","cell_type":"markdown","source":"# EfficientNet","metadata":{}},{"id":"587b814e-9095-4be9-9266-362b6402c60a","cell_type":"code","source":"from tensorflow.keras.applications import EfficientNetV2S\nbase = EfficientNetV2S(weights='imagenet', include_top=False, input_shape=(256,256, 3))\nbase.trainable = False\n\nefficientnet_model = models.Sequential([\n    base,\n    layers.GlobalAveragePooling2D(),\n    #layers.Dense(128, activation='relu'),\n    layers.Dropout(0.3),\n    layers.Dense(1, activation='sigmoid')\n], name= \"EfficientNetV2S\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:10:31.720164Z","iopub.execute_input":"2026-04-19T13:10:31.720723Z","iopub.status.idle":"2026-04-19T13:10:33.851604Z","shell.execute_reply.started":"2026-04-19T13:10:31.720688Z","shell.execute_reply":"2026-04-19T13:10:33.851003Z"}},"outputs":[],"execution_count":null},{"id":"f33e0ceb-02cf-420f-8d24-a57f808de85a","cell_type":"code","source":"efficientnet_model.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)\n\nefficientnet_model.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:10:33.852853Z","iopub.execute_input":"2026-04-19T13:10:33.853087Z","iopub.status.idle":"2026-04-19T13:10:33.885272Z","shell.execute_reply.started":"2026-04-19T13:10:33.853065Z","shell.execute_reply":"2026-04-19T13:10:33.884735Z"}},"outputs":[],"execution_count":null},{"id":"a63a982a-dde2-4ba0-90cb-4cb140aad24e","cell_type":"code","source":"history_efficientnet = efficientnet_model.fit(\n    train_generator,\n    validation_data=validation_generator,\n    epochs=10\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:10:37.634459Z","iopub.execute_input":"2026-04-19T13:10:37.635116Z","iopub.status.idle":"2026-04-19T13:25:00.696617Z","shell.execute_reply.started":"2026-04-19T13:10:37.635083Z","shell.execute_reply":"2026-04-19T13:25:00.696046Z"}},"outputs":[],"execution_count":null},{"id":"1b18d01d-709c-4d1e-bbad-8a1b07869ae9","cell_type":"code","source":"v_loss, v_acc = efficientnet_model.evaluate(validation_generator)\nprint(\"Accuracy:\", v_acc)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:25:05.035932Z","iopub.execute_input":"2026-04-19T13:25:05.036247Z","iopub.status.idle":"2026-04-19T13:25:11.238583Z","shell.execute_reply.started":"2026-04-19T13:25:05.036221Z","shell.execute_reply":"2026-04-19T13:25:11.237929Z"}},"outputs":[],"execution_count":null},{"id":"821bc1e5-c40e-4868-9610-a7e13bfb46a8","cell_type":"code","source":"# Accuracy\ntrain_acc = history_efficientnet.history['accuracy']\nval_acc = history_efficientnet.history['val_accuracy']\n\n# Loss\ntrain_loss = history_efficientnet.history['loss']\nval_loss = history_efficientnet.history['val_loss']\n\nepochs = range(1, len(train_acc) + 1)\n\nplt.figure(figsize=(12,5))\n\n# Accuracy plot\nplt.subplot(1,2,1)\nplt.plot(epochs, train_acc, marker='o', label='Training Accuracy')\nplt.plot(epochs, val_acc, marker='o', label='Validation Accuracy')\nplt.title(\"Training vs Validation Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.grid(True)\n\n# Loss plot\nplt.subplot(1,2,2)\nplt.plot(epochs, train_loss, marker='o', label='Training Loss')\nplt.plot(epochs, val_loss, marker='o', label='Validation Loss')\nplt.title(\"Training vs Validation Loss\")\nplt.xlabel(\"Epoch\")\nplt.ylabel(\"Loss\")\nplt.legend()\nplt.grid(True)\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T13:25:14.527220Z","iopub.execute_input":"2026-04-19T13:25:14.527572Z","iopub.status.idle":"2026-04-19T13:25:14.818988Z","shell.execute_reply.started":"2026-04-19T13:25:14.527548Z","shell.execute_reply":"2026-04-19T13:25:14.818219Z"}},"outputs":[],"execution_count":null},{"id":"201efd91-3b57-41b0-abb5-e2f37b971093","cell_type":"code","source":"import os\n\n# Get all image filenames directly from test_dir\ntest_images = os.listdir(test_dir)\n\ntest_df = pd.DataFrame({'filename': test_images})\n\ntest_gen = ImageDataGenerator(rescale=1./255).flow_from_dataframe(\n    test_df,\n    directory=test_dir,\n    x_col='filename',\n    y_col=None,\n    target_size=(256,256),\n    batch_size=32,\n    class_mode=None,\n    shuffle=False\n)\n\npreds = (selected_model.predict(test_gen) > 0.5).astype(int).flatten()\nidx_to_class = {v: k for k, v in train_generator.class_indices.items()}\n\nsubmission = pd.DataFrame({\n    'ID':    test_df['filename'],\n    'Label': [idx_to_class[p] for p in preds]\n})\n\nprint(submission.head(10))\nsubmission.to_csv('submission.csv', index=False)\nprint(\"submission.csv saved!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T08:02:17.726545Z","iopub.execute_input":"2026-04-19T08:02:17.727339Z","iopub.status.idle":"2026-04-19T08:02:26.193077Z","shell.execute_reply.started":"2026-04-19T08:02:17.727308Z","shell.execute_reply":"2026-04-19T08:02:26.192411Z"}},"outputs":[],"execution_count":null},{"id":"d11f49b7-6990-4d57-b77d-b880da6208e9","cell_type":"code","source":"import random\nfrom tensorflow.keras.preprocessing import image\n\n# Pick a random image from test_dir\nrandom_img = random.choice(test_images)\nimg_path = os.path.join(test_dir, random_img)\n\n# Load and preprocess\nimg = image.load_img(img_path, target_size=(256,256))\nimg_array = image.img_to_array(img) / 255.0\nimg_array = np.expand_dims(img_array, axis=0)\n\n# Predict\npred = selected_model.predict(img_array)[0][0]\nlabel = idx_to_class[int(pred > 0.5)]\nconfidence = pred if pred > 0.5 else 1 - pred\n\n# Show\nplt.imshow(img)\nplt.title(f\"Prediction: {label} ({confidence*100:.2f}%)\")\nplt.axis('off')\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}