{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","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":5441,"databundleVersionId":38425},{"sourceType":"datasetVersion","sourceId":8593268,"datasetId":5139940,"databundleVersionId":8739786}],"dockerImageVersionId":31401,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# -----------------------------------------------------\n#    **Dogs vs Cats Classification using AlexNet**\n# -----------------------------------------------------","metadata":{}},{"cell_type":"markdown","source":"**Import Libraries**","metadata":{}},{"cell_type":"code","source":"import os\nimport zipfile\nimport random\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models, callbacks\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:56:15.563588Z","iopub.execute_input":"2026-05-31T17:56:15.564152Z","iopub.status.idle":"2026-05-31T17:56:15.568523Z","shell.execute_reply.started":"2026-05-31T17:56:15.564124Z","shell.execute_reply":"2026-05-31T17:56:15.567826Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Check Dataset Path**","metadata":{}},{"cell_type":"code","source":"!find /kaggle/input -type f | head -20","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:56:17.902024Z","iopub.execute_input":"2026-05-31T17:56:17.902686Z","iopub.status.idle":"2026-05-31T17:56:18.083544Z","shell.execute_reply.started":"2026-05-31T17:56:17.902656Z","shell.execute_reply":"2026-05-31T17:56:18.082790Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Extract Dataset**","metadata":{}},{"cell_type":"code","source":"import zipfile\nimport os\n\ntrain_zip = \"/kaggle/input/competitions/dogs-vs-cats-redux-kernels-edition/train.zip\"\ntest_zip = \"/kaggle/input/competitions/dogs-vs-cats-redux-kernels-edition/test.zip\"\n\nextract_path = \"/kaggle/working/dogs_vs_cats\"\n\nos.makedirs(extract_path, exist_ok=True)\n\nwith zipfile.ZipFile(train_zip, 'r') as zip_ref:\n    zip_ref.extractall(extract_path)\n\nprint(\"Dataset Extracted Successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:57:32.792490Z","iopub.execute_input":"2026-05-31T17:57:32.793272Z","iopub.status.idle":"2026-05-31T17:57:37.905968Z","shell.execute_reply.started":"2026-05-31T17:57:32.793242Z","shell.execute_reply":"2026-05-31T17:57:37.905044Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Show Dataset Images**","metadata":{}},{"cell_type":"code","source":"\ndef show_images(image_paths, labels, n=8):\n    plt.figure(figsize=(15, 8))\n    for i in range(n):\n        plt.subplot(2, n//2, i+1)\n        img = plt.imread(image_paths[i])\n        plt.imshow(img)\n        plt.title(labels[i])\n        plt.axis('off')\n    plt.show()\n\nsample_files = random.sample(train_files, 8)\nsample_paths = [os.path.join(train_dir, fname) for fname in sample_files]\nsample_labels = ['dog' if 'dog' in fname else 'cat' for fname in sample_files]\n\nshow_images(sample_paths, sample_labels)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:57:44.521516Z","iopub.execute_input":"2026-05-31T17:57:44.522518Z","iopub.status.idle":"2026-05-31T17:57:45.129313Z","shell.execute_reply.started":"2026-05-31T17:57:44.522473Z","shell.execute_reply":"2026-05-31T17:57:45.128453Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Show Cat Images**","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport os\n\ntrain_dir = \"/kaggle/working/dogs_vs_cats/train\"\n\ncat_images = [img for img in os.listdir(train_dir) if img.startswith(\"cat\")]\n\nplt.figure(figsize=(12,8))\n\nfor i in range(6):\n    plt.subplot(2,3,i+1)\n    img = plt.imread(os.path.join(train_dir, cat_images[i]))\n    plt.imshow(img)\n    plt.axis(\"off\")\n    plt.title(\"Cat\")\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:58:09.670955Z","iopub.execute_input":"2026-05-31T17:58:09.671496Z","iopub.status.idle":"2026-05-31T17:58:10.680224Z","shell.execute_reply.started":"2026-05-31T17:58:09.671466Z","shell.execute_reply":"2026-05-31T17:58:10.679073Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Show Dog Images**","metadata":{}},{"cell_type":"code","source":"dog_images = [img for img in os.listdir(train_dir) if img.startswith(\"dog\")]\n\nplt.figure(figsize=(12,8))\n\nfor i in range(6):\n    plt.subplot(2,3,i+1)\n    img = plt.imread(os.path.join(train_dir, dog_images[i]))\n    plt.imshow(img)\n    plt.axis(\"off\")\n    plt.title(\"Dog\")\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:58:22.511285Z","iopub.execute_input":"2026-05-31T17:58:22.511955Z","iopub.status.idle":"2026-05-31T17:58:23.040517Z","shell.execute_reply.started":"2026-05-31T17:58:22.511926Z","shell.execute_reply":"2026-05-31T17:58:23.039557Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import shutil\n\ntrain_cats_dir = 'dataset/train/cats'\ntrain_dogs_dir = 'dataset/train/dogs'\n\nos.makedirs(train_cats_dir, exist_ok=True)\nos.makedirs(train_dogs_dir, exist_ok=True)\n\nfor fname in train_files:\n    if 'dog' in fname:\n        shutil.move(os.path.join(train_dir, fname), os.path.join(train_dogs_dir, fname))\n    else:\n        shutil.move(os.path.join(train_dir, fname), os.path.join(train_cats_dir, fname))\n\nprint(f\"Dog images: {len(os.listdir(train_dogs_dir))}\")\nprint(f\"Cat images: {len(os.listdir(train_cats_dir))}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:58:35.614288Z","iopub.execute_input":"2026-05-31T17:58:35.614892Z","iopub.status.idle":"2026-05-31T17:58:36.537325Z","shell.execute_reply.started":"2026-05-31T17:58:35.614861Z","shell.execute_reply":"2026-05-31T17:58:36.536595Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Image Preprocessing And Augmentation**","metadata":{}},{"cell_type":"code","source":"IMG_SIZE = 227\nBATCH_SIZE = 32\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    horizontal_flip=True,\n    validation_split=0.2\n)\n\nvalid_datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)\n\ntrain_generator = train_datagen.flow_from_directory(\n    'dataset/train',\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode='binary',\n    subset='training'\n)\n\nvalidation_generator = valid_datagen.flow_from_directory(\n    'dataset/train',\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode='binary',\n    subset='validation'\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:58:38.648161Z","iopub.execute_input":"2026-05-31T17:58:38.648946Z","iopub.status.idle":"2026-05-31T17:58:40.264399Z","shell.execute_reply.started":"2026-05-31T17:58:38.648912Z","shell.execute_reply":"2026-05-31T17:58:40.263777Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Build AlexNet Architecture**","metadata":{}},{"cell_type":"code","source":"def build_alexnet(input_shape=(227, 227, 3)):\n    model = tf.keras.Sequential([\n        layers.Conv2D(96, kernel_size=11, strides=4, activation='relu', input_shape=input_shape),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D(pool_size=3, strides=2),\n        layers.Conv2D(256, kernel_size=5, padding='same', activation='relu'),\n        layers.BatchNormalization(),\n        layers.MaxPooling2D(pool_size=3, strides=2),\n        layers.Conv2D(384, kernel_size=3, padding='same', activation='relu'),\n        layers.Conv2D(384, kernel_size=3, padding='same', activation='relu'),\n        layers.Conv2D(256, kernel_size=3, padding='same', activation='relu'),\n        layers.MaxPooling2D(pool_size=3, strides=2),\n        layers.Flatten(),\n        layers.Dense(4096, activation='relu'),\n        layers.Dropout(0.5),\n        layers.Dense(4096, activation='relu'),\n        layers.Dropout(0.5),\n        layers.Dense(1, activation='sigmoid')\n    ])\n    return model\n\nmodel = build_alexnet()\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:58:45.416643Z","iopub.execute_input":"2026-05-31T17:58:45.417258Z","iopub.status.idle":"2026-05-31T17:58:45.524790Z","shell.execute_reply.started":"2026-05-31T17:58:45.417227Z","shell.execute_reply":"2026-05-31T17:58:45.523817Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Train 3 Times**","metadata":{}},{"cell_type":"code","source":"model.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n    loss='binary_crossentropy',\n    metrics=['accuracy']\n)\n\n\ncallbacks_list = [\n    callbacks.ModelCheckpoint('alexnet_best.h5', save_best_only=True),\n    callbacks.EarlyStopping(patience=10, restore_best_weights=True),\n    callbacks.ReduceLROnPlateau(factor=0.2, patience=5)\n]\n\n\nfor i in range(2):\n    print(f\"\\nTraining Run {i+1}\")\n    history = model.fit(\n        train_generator,\n        epochs=3,\n        validation_data=validation_generator,\n        callbacks=callbacks_list\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T18:54:32.097976Z","iopub.execute_input":"2026-05-31T18:54:32.098726Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Plot Training Curves**","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12,4))\nplt.subplot(1,2,1)\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.legend()\nplt.title('Accuracy over Epochs')\n\nplt.subplot(1,2,2)\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.legend()\nplt.title('Loss over Epochs')\n\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:47:42.573983Z","iopub.status.idle":"2026-05-31T17:47:42.574436Z","shell.execute_reply.started":"2026-05-31T17:47:42.574232Z","shell.execute_reply":"2026-05-31T17:47:42.574257Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" **Evaluate on Test Set & Visualize Predictions**","metadata":{}},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_directory(\n    'dataset/test',\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode=None,\n    shuffle=False\n)\n\nmodel.load_weights('alexnet_best.h5')\n\npreds = model.predict(test_generator)\nlabels = ['dog' if pred > 0.5 else 'cat' for pred in preds]\n\nfor i in range(10):\n    img_path = test_generator.filepaths[i]\n    img = plt.imread(img_path)\n    plt.imshow(img)\n    plt.title(f\"Predicted: {labels[i]}\")\n    plt.axis('off')\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T17:47:42.576260Z","iopub.status.idle":"2026-05-31T17:47:42.576637Z","shell.execute_reply.started":"2026-05-31T17:47:42.576403Z","shell.execute_reply":"2026-05-31T17:47:42.576418Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# ---------------------------------------------------------------\n# **Image Spam Detection using LeNet Deep Learning**\n# ---------------------------------------------------------------","metadata":{}},{"cell_type":"markdown","source":"**Import Libraries**","metadata":{}},{"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report\nfrom sklearn.metrics import confusion_matrix\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D\nfrom tensorflow.keras.layers import AveragePooling2D\nfrom tensorflow.keras.layers import Flatten\nfrom tensorflow.keras.layers import Dense\nfrom tensorflow.keras.layers import Dropout","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-31T18:51:15.562231Z","iopub.status.idle":"2026-05-31T18:51:15.562629Z","shell.execute_reply.started":"2026-05-31T18:51:15.562481Z","shell.execute_reply":"2026-05-31T18:51:15.562500Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}