{"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":"none","dataSources":[{"sourceId":5441,"databundleVersionId":38425,"sourceType":"competition"}],"dockerImageVersionId":31192,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\n\n# Path check\ntrain_path = \"/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip\"\nprint(os.listdir(\"/kaggle/input/dogs-vs-cats-redux-kernels-edition\"))\n\nimport zipfile\n\n\n# File path\ntrain_zip = \"/kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip\"\nextract_dir = \"/kaggle/working/dogs-vs-cats-redux\"\n\n# Unzip\nwith zipfile.ZipFile(train_zip, 'r') as zip_ref:\n    zip_ref.extractall(extract_dir)\n\ntrain_dir = os.path.join(extract_dir, \"train\")\nprint(os.listdir(train_dir)[:10])  # Check first 10 images\n\n#testdata unzip\ntest_zip = \"/kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip\"\n\nwith zipfile.ZipFile(test_zip, 'r') as zip_ref:\n    zip_ref.extractall(extract_dir)\n\ntest_dir = os.path.join(extract_dir, \"test\")\nprint(os.listdir(test_dir)[:10])\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-28T14:27:21.877666Z","iopub.execute_input":"2025-11-28T14:27:21.877901Z","iopub.status.idle":"2025-11-28T14:27:33.916746Z","shell.execute_reply.started":"2025-11-28T14:27:21.87788Z","shell.execute_reply":"2025-11-28T14:27:33.915909Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Step 0: Import Libraries\n\nimport os\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport json\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models, callbacks\nfrom tensorflow.keras.preprocessing import image_dataset_from_directory\nfrom sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, accuracy_score\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nimport shutil\n\n# Step 1: Dataset Preparation\n\nbase_dir = \"/kaggle/working/dogs-vs-cats-redux/train\"  # Adjust path if needed\n\nos.makedirs(\"data/train/cat\", exist_ok=True)\nos.makedirs(\"data/train/dog\", exist_ok=True)\nos.makedirs(\"data/test/cat\", exist_ok=True)\nos.makedirs(\"data/test/dog\", exist_ok=True)\n\nall_files = os.listdir(base_dir)\ncats = [f for f in all_files if f.startswith(\"cat\")]\ndogs = [f for f in all_files if f.startswith(\"dog\")]\n\ntrain_cat, test_cat = train_test_split(cats, test_size=0.2, random_state=42)\ntrain_dog, test_dog = train_test_split(dogs, test_size=0.2, random_state=42)\n\nfor f in train_cat:\n shutil.copy(os.path.join(base_dir, f), \"data/train/cat\")\nfor f in train_dog:\n shutil.copy(os.path.join(base_dir, f), \"data/train/dog\")\nfor f in test_cat:\n shutil.copy(os.path.join(base_dir, f), \"data/test/cat\")\nfor f in test_dog:\n shutil.copy(os.path.join(base_dir, f), \"data/test/dog\")\n\nprint(\"Dataset prepared successfully!\")\n\n# Step 2: Create Train/Test Dataset\n\nIMAGE_SIZE = (128,128)\nBATCH_SIZE = 32\n\ntrain_ds = image_dataset_from_directory(\n\"data/train\",\nimage_size=IMAGE_SIZE,\nbatch_size=BATCH_SIZE,\nlabel_mode=\"binary\"\n)\n\ntest_ds = image_dataset_from_directory(\n\"data/test\",\nimage_size=IMAGE_SIZE,\nbatch_size=BATCH_SIZE,\nlabel_mode=\"binary\"\n)\n\nAUTOTUNE = tf.data.AUTOTUNE\ntrain_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)\ntest_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)\n\n# Step 3: Build CNN Model\n\nmodel = models.Sequential([\nlayers.Rescaling(1./255, input_shape=IMAGE_SIZE+(3,)),\nlayers.Conv2D(32, 3, activation='relu'),\nlayers.MaxPooling2D(),\nlayers.Conv2D(64, 3, activation='relu'),\nlayers.MaxPooling2D(),\nlayers.Conv2D(128, 3, activation='relu'),\nlayers.MaxPooling2D(),\nlayers.Flatten(),\nlayers.Dense(128, activation='relu'),\nlayers.Dropout(0.5),\nlayers.Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\nmodel.summary()\n\n# Step 4: Train Model\n\ncheckpoint_cb = callbacks.ModelCheckpoint(\"cnn_catdog_best.h5\", save_best_only=True)\nearlystop_cb = callbacks.EarlyStopping(patience=5, restore_best_weights=True)\n\nhistory = model.fit(\ntrain_ds,\nvalidation_data=test_ds,\nepochs=10,\ncallbacks=[checkpoint_cb, earlystop_cb]\n)\n\n# Step 5: Evaluate Model + Metrics\n\ny_true = []\ny_pred = []\n\nfor images, labels in test_ds:\n preds = model.predict(images)\n preds_bin = (preds >= 0.5).astype(int)\n y_true.extend(labels.numpy())\n y_pred.extend(preds_bin.flatten())\n\ny_true = np.array(y_true)\ny_pred = np.array(y_pred)\n\nacc = accuracy_score(y_true, y_pred)\nprec = precision_score(y_true, y_pred)\nrec = recall_score(y_true, y_pred)\nf1 = f1_score(y_true, y_pred)\ncm = confusion_matrix(y_true, y_pred)\n\nprint(f\"Accuracy: {acc:.4f}, Precision: {prec:.4f}, Recall: {rec:.4f}, F1-score: {f1:.4f}\")\n\n# Step 6: Plot Graphs\n\nplt.figure(figsize=(8,4))\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Train vs Validation Accuracy')\nplt.xlabel('Epochs')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.show()\n\nplt.figure(figsize=(5,4))\nsns.heatmap(cm, annot=True, fmt='d')\nplt.title(\"Confusion Matrix\")\nplt.show()\n\n# Step 7: Save Metrics + Model\n\nmetrics = {\n\"accuracy\": float(acc),\n\"precision\": float(prec),\n\"recall\": float(rec),\n\"f1_score\": float(f1),\n\"confusion_matrix\": cm.tolist()\n}\n\nwith open(\"cnn_catdog_metrics.json\", \"w\") as f:\n json.dump(metrics, f, indent=2)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-28T14:28:03.944581Z","iopub.execute_input":"2025-11-28T14:28:03.945445Z"}},"outputs":[],"execution_count":null}]}