{"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":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":131587,"databundleVersionId":15786880}],"dockerImageVersionId":31329,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout, Conv2D, MaxPooling2D\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import MobileNetV2, ResNet50, EfficientNetB0\nimport pandas as pd\nimport numpy as np\nimport os","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:12:41.97162Z","iopub.execute_input":"2026-04-19T14:12:41.971907Z","iopub.status.idle":"2026-04-19T14:13:10.666829Z","shell.execute_reply.started":"2026-04-19T14:12:41.971883Z","shell.execute_reply":"2026-04-19T14:13:10.666123Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"strategy = tf.distribute.MirroredStrategy()\n\nprint(\"Number of GPUs:\", strategy.num_replicas_in_sync)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:14:59.011205Z","iopub.execute_input":"2026-04-19T14:14:59.011996Z","iopub.status.idle":"2026-04-19T14:15:00.632849Z","shell.execute_reply.started":"2026-04-19T14:14:59.011962Z","shell.execute_reply":"2026-04-19T14:15:00.632079Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2,\n    rotation_range=30,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True\n)\n\ntrain_data = train_datagen.flow_from_directory(\n    \"/kaggle/input/competitions/cs-460-muffin-vs-chihuahua-classification-challenge/train\",\n    target_size=(224,224),\n    batch_size=32,\n    class_mode='binary',\n    subset='training'\n)\n\nval_data = train_datagen.flow_from_directory(\n    \"/kaggle/input/competitions/cs-460-muffin-vs-chihuahua-classification-challenge/train\",\n    target_size=(224,224),\n    batch_size=32,\n    class_mode='binary',\n    subset='validation'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:18:03.62798Z","iopub.execute_input":"2026-04-19T14:18:03.628608Z","iopub.status.idle":"2026-04-19T14:18:04.711487Z","shell.execute_reply.started":"2026-04-19T14:18:03.628577Z","shell.execute_reply":"2026-04-19T14:18:04.710921Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, BatchNormalization\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.regularizers import l2\n\ndef build_cnn():\n    model = Sequential([\n        Conv2D(32, (3,3), activation='relu', input_shape=(224,224,3)),\n        BatchNormalization(),\n        MaxPooling2D(),\n\n        Conv2D(64, (3,3), activation='relu'),\n        BatchNormalization(),\n        MaxPooling2D(),\n\n        Flatten(),\n        Dense(128, activation='relu', kernel_regularizer=l2(0.01)),\n        Dropout(0.5),\n\n        Dense(1, activation='sigmoid')\n    ])\n    return model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:18:08.280304Z","iopub.execute_input":"2026-04-19T14:18:08.281072Z","iopub.status.idle":"2026-04-19T14:18:08.288927Z","shell.execute_reply.started":"2026-04-19T14:18:08.281043Z","shell.execute_reply":"2026-04-19T14:18:08.288177Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.applications import MobileNetV2\nfrom tensorflow.keras.layers import GlobalAveragePooling2D\n\ndef build_mobilenet():\n    base = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224,224,3))\n    base.trainable = False  # Freeze\n\n    x = GlobalAveragePooling2D()(base.output)\n    x = BatchNormalization()(x)\n    x = Dense(128, activation='relu', kernel_regularizer=l2(0.01))(x)\n    x = Dropout(0.5)(x)\n    out = Dense(1, activation='sigmoid')(x)\n\n    return Model(inputs=base.input, outputs=out)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:18:17.032901Z","iopub.execute_input":"2026-04-19T14:18:17.033766Z","iopub.status.idle":"2026-04-19T14:18:17.038706Z","shell.execute_reply.started":"2026-04-19T14:18:17.033732Z","shell.execute_reply":"2026-04-19T14:18:17.037894Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.applications import ResNet50\n\ndef build_resnet():\n    base = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224,3))\n    base.trainable = False\n\n    x = GlobalAveragePooling2D()(base.output)\n    x = BatchNormalization()(x)\n    x = Dense(128, activation='relu', kernel_regularizer=l2(0.01))(x)\n    x = Dropout(0.5)(x)\n    out = Dense(1, activation='sigmoid')(x)\n\n    return Model(inputs=base.input, outputs=out)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:19:31.791064Z","iopub.execute_input":"2026-04-19T14:19:31.791829Z","iopub.status.idle":"2026-04-19T14:19:31.797606Z","shell.execute_reply.started":"2026-04-19T14:19:31.791794Z","shell.execute_reply":"2026-04-19T14:19:31.796605Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.applications import EfficientNetB0\n\ndef build_efficientnet():\n    base = EfficientNetB0(weights='imagenet', include_top=False, input_shape=(224,224,3))\n    base.trainable = False\n\n    x = GlobalAveragePooling2D()(base.output)\n    x = BatchNormalization()(x)\n    x = Dense(128, activation='relu', kernel_regularizer=l2(0.01))(x)\n    x = Dropout(0.5)(x)\n    out = Dense(1, activation='sigmoid')(x)\n\n    return Model(inputs=base.input, outputs=out)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:19:37.76427Z","iopub.execute_input":"2026-04-19T14:19:37.764841Z","iopub.status.idle":"2026-04-19T14:19:37.769654Z","shell.execute_reply.started":"2026-04-19T14:19:37.764812Z","shell.execute_reply":"2026-04-19T14:19:37.768776Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tensorflow.keras.callbacks import EarlyStopping\n\nearly_stop = EarlyStopping(\n    monitor='val_loss',\n    patience=3,\n    restore_best_weights=True\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:19:43.972411Z","iopub.execute_input":"2026-04-19T14:19:43.972934Z","iopub.status.idle":"2026-04-19T14:19:43.979058Z","shell.execute_reply.started":"2026-04-19T14:19:43.972905Z","shell.execute_reply":"2026-04-19T14:19:43.978425Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_model(build_fn, name):\n    \n    with strategy.scope():\n        model = build_fn()\n\n        model.compile(\n            optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),\n            loss='binary_crossentropy',\n            metrics=['accuracy']\n        )\n\n    history = model.fit(\n        train_data,\n        validation_data=val_data,\n        epochs=8,\n        callbacks=[early_stop],\n        verbose=1\n    )\n\n    val_acc = max(history.history['val_accuracy'])\n    print(f\"{name} Best Val Accuracy:\", val_acc)\n\n    return model, val_acc ,history","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:20:26.018235Z","iopub.execute_input":"2026-04-19T14:20:26.018546Z","iopub.status.idle":"2026-04-19T14:20:26.023925Z","shell.execute_reply.started":"2026-04-19T14:20:26.018521Z","shell.execute_reply":"2026-04-19T14:20:26.023215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"results = {}\n\ncnn_model, acc_cnn, history_cnn = train_model(build_cnn, \"CNN\")\nresults[\"CNN\"] = (cnn_model, acc_cnn)\n\nmobilenet_model, acc_mob, history_mobilenet = train_model(build_mobilenet, \"MobileNet\")\nresults[\"MobileNet\"] = (mobilenet_model, acc_mob)\n\nresnet_model, acc_res, history_resnet = train_model(build_resnet, \"ResNet\")\nresults[\"ResNet\"] = (resnet_model, acc_res)\n\nefficient_model, acc_eff, history_efficientnet = train_model(build_efficientnet, \"EfficientNet\")\nresults[\"EfficientNet\"] = (efficient_model, acc_eff)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T14:36:28.666361Z","iopub.execute_input":"2026-04-19T14:36:28.6672Z","iopub.status.idle":"2026-04-19T15:17:15.688416Z","shell.execute_reply.started":"2026-04-19T14:36:28.667166Z","shell.execute_reply":"2026-04-19T15:17:15.687654Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"best_name = max(results, key=lambda x: results[x][1])\nbest_model = results[best_name][0]\n\nprint(\"Best Model:\", best_name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T15:38:13.887173Z","iopub.execute_input":"2026-04-19T15:38:13.887771Z","iopub.status.idle":"2026-04-19T15:38:13.892425Z","shell.execute_reply.started":"2026-04-19T15:38:13.887739Z","shell.execute_reply":"2026-04-19T15:38:13.891769Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nmodels = list(results.keys())\naccuracies = [results[m][1] for m in models]\n#Itz Ary99Pk\nplt.bar(models, accuracies)\nplt.ylabel(\"Validation Accuracy\")\nplt.title(\"Model Comparison\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T15:38:33.145927Z","iopub.execute_input":"2026-04-19T15:38:33.146224Z","iopub.status.idle":"2026-04-19T15:38:33.282403Z","shell.execute_reply.started":"2026-04-19T15:38:33.146199Z","shell.execute_reply":"2026-04-19T15:38:33.281471Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(8,5))\n\nplt.plot(history_cnn.history['val_accuracy'], label='CNN')\nplt.plot(history_mobilenet.history['val_accuracy'], label='MobileNet')\nplt.plot(history_efficientnet.history['val_accuracy'], label='EfficientNet')\n\nplt.title(\"Model Comparison (Validation Accuracy)\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Val Accuracy\")\nplt.legend()\nplt.grid()\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T15:39:25.925421Z","iopub.execute_input":"2026-04-19T15:39:25.926194Z","iopub.status.idle":"2026-04-19T15:39:26.096064Z","shell.execute_reply.started":"2026-04-19T15:39:25.926151Z","shell.execute_reply":"2026-04-19T15:39:26.095267Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport numpy as np\nfrom tensorflow.keras.preprocessing import image\n\ndf = pd.read_csv(\"/kaggle/input/competitions/cs-460-muffin-vs-chihuahua-classification-challenge/test_solution_01.csv\")\n\nids = df['ID'].tolist() ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:03:59.813412Z","iopub.execute_input":"2026-04-19T16:03:59.813933Z","iopub.status.idle":"2026-04-19T16:03:59.825159Z","shell.execute_reply.started":"2026-04-19T16:03:59.813901Z","shell.execute_reply":"2026-04-19T16:03:59.824279Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dir = \"/kaggle/input/competitions/cs-460-muffin-vs-chihuahua-classification-challenge/kaggle_test_final\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:04:20.965635Z","iopub.execute_input":"2026-04-19T16:04:20.966526Z","iopub.status.idle":"2026-04-19T16:04:20.970351Z","shell.execute_reply.started":"2026-04-19T16:04:20.966481Z","shell.execute_reply":"2026-04-19T16:04:20.969471Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\nimages = []\nvalid_ids = []\n\nfor img_name in ids:\n    img_path = os.path.join(test_dir, img_name)\n\n    img = image.load_img(img_path, target_size=(224,224))\n    img_array = image.img_to_array(img) / 255.0\n\n    images.append(img_array)\n    valid_ids.append(img_name)\n\n# Convert to array\nimages = np.array(images)\n\n# 🔥 SINGLE PREDICTION CALL\npreds = best_model.predict(images)\n\n# Convert to labels\npreds = (preds > 0.5).astype(int).reshape(-1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:06:37.238847Z","iopub.execute_input":"2026-04-19T16:06:37.239137Z","iopub.status.idle":"2026-04-19T16:06:53.072184Z","shell.execute_reply.started":"2026-04-19T16:06:37.239112Z","shell.execute_reply":"2026-04-19T16:06:53.071142Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_data.class_indices)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:16:05.364053Z","iopub.execute_input":"2026-04-19T16:16:05.364417Z","iopub.status.idle":"2026-04-19T16:16:05.368907Z","shell.execute_reply.started":"2026-04-19T16:16:05.364386Z","shell.execute_reply":"2026-04-19T16:16:05.368108Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# reverse mapping\nlabels_map = {0: 'chihuahua', 1: 'muffin'}\n\npreds = (preds > 0.5).astype(int).reshape(-1)\n\npred_labels = [labels_map[p] for p in preds]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:09:52.065671Z","iopub.execute_input":"2026-04-19T16:09:52.06641Z","iopub.status.idle":"2026-04-19T16:09:52.071171Z","shell.execute_reply.started":"2026-04-19T16:09:52.066377Z","shell.execute_reply":"2026-04-19T16:09:52.070296Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n    \"ID\": valid_ids,\n    \"Label\": pred_labels\n})\n\nsubmission.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:16:04.301139Z","iopub.execute_input":"2026-04-19T16:16:04.301628Z","iopub.status.idle":"2026-04-19T16:16:04.310229Z","shell.execute_reply.started":"2026-04-19T16:16:04.301597Z","shell.execute_reply":"2026-04-19T16:16:04.309511Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.head(20)\n#Itz Ary99Pk","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-19T16:18:33.210702Z","iopub.execute_input":"2026-04-19T16:18:33.211129Z","iopub.status.idle":"2026-04-19T16:18:33.219704Z","shell.execute_reply.started":"2026-04-19T16:18:33.211099Z","shell.execute_reply":"2026-04-19T16:18:33.219052Z"}},"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}]}