{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.13"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"accelerator":"GPU","colab":{"gpuType":"T4","provenance":[]}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **Import Packages**","metadata":{"id":"2XdfIhTG4Udx"}},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, BatchNormalization, Dropout\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tensorflow.keras.applications import VGG16\nfrom tensorflow.keras.applications.vgg16 import preprocess_input\n\nimport pandas as pd\nimport numpy as np\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport seaborn as sns\n\nimport os\nimport shutil\nimport random\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2025-11-13T07:33:31.039968Z","iopub.execute_input":"2025-11-13T07:33:31.040448Z","iopub.status.idle":"2025-11-13T07:33:31.045893Z","shell.execute_reply.started":"2025-11-13T07:33:31.040422Z","shell.execute_reply":"2025-11-13T07:33:31.044972Z"},"id":"N6Sf2b5C41R5","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Unzipping Data**","metadata":{"execution":{"iopub.status.busy":"2025-11-13T07:29:12.711718Z","iopub.execute_input":"2025-11-13T07:29:12.71256Z","iopub.status.idle":"2025-11-13T07:29:12.715796Z","shell.execute_reply.started":"2025-11-13T07:29:12.712534Z","shell.execute_reply":"2025-11-13T07:29:12.714999Z"}}},{"cell_type":"code","source":"_ = !unzip /kaggle/input/dogs-vs-cats/train.zip\nprint(\"Done!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T07:33:35.046911Z","iopub.execute_input":"2025-11-13T07:33:35.047424Z","iopub.status.idle":"2025-11-13T07:33:44.957242Z","shell.execute_reply.started":"2025-11-13T07:33:35.0474Z","shell.execute_reply":"2025-11-13T07:33:44.956478Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"_ = !unzip /kaggle/input/dogs-vs-cats/test1.zip\nprint(\"Done!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T07:33:48.143909Z","iopub.execute_input":"2025-11-13T07:33:48.144566Z","iopub.status.idle":"2025-11-13T07:33:52.51559Z","shell.execute_reply.started":"2025-11-13T07:33:48.144541Z","shell.execute_reply":"2025-11-13T07:33:52.514909Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Data Visualization**","metadata":{}},{"cell_type":"code","source":"train_dir = '/kaggle/working/train'\n\nall_images = os.listdir(train_dir)\n\nrandom_images = random.sample(all_images, 6)\n\nplt.figure(figsize=(10, 7))\nfor i, img_name in enumerate(random_images):\n    img_path = os.path.join(train_dir, img_name)\n    img = mpimg.imread(img_path)\n    plt.subplot(2, 3, i + 1)\n    plt.imshow(img)\n    plt.axis(\"off\")\n\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-13T07:33:53.985736Z","iopub.execute_input":"2025-11-13T07:33:53.986498Z","iopub.status.idle":"2025-11-13T07:33:54.55502Z","shell.execute_reply.started":"2025-11-13T07:33:53.986472Z","shell.execute_reply":"2025-11-13T07:33:54.554204Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Data Organization**","metadata":{"id":"vR54VRSL6H14"}},{"cell_type":"code","source":"## File Naming\nparent_dir = '/kaggle/working/dogs-vs-cats'\nos.makedirs(parent_dir)","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:05:19.686675Z","iopub.status.busy":"2025-11-13T07:05:19.686121Z","iopub.status.idle":"2025-11-13T07:05:19.690482Z","shell.execute_reply":"2025-11-13T07:05:19.689827Z","shell.execute_reply.started":"2025-11-13T07:05:19.68665Z"},"id":"IJqP2LkW31Nd","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for dir in ['train', 'validation']:\n  os.makedirs(os.path.join(parent_dir, dir))\n  for category in ['dog', 'cat']:\n    os.makedirs(os.path.join(parent_dir, dir, category))","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:05:34.514824Z","iopub.status.busy":"2025-11-13T07:05:34.514547Z","iopub.status.idle":"2025-11-13T07:05:34.519665Z","shell.execute_reply":"2025-11-13T07:05:34.518869Z","shell.execute_reply.started":"2025-11-13T07:05:34.514804Z"},"id":"72RGO_tr4ESy","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## Each Class Images\ncat_images = list(filter(lambda x: x.startswith('cat'), os.listdir('train')))\ndog_images = list(filter(lambda x: x.startswith('dog'), os.listdir('train')))","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:14:32.737668Z","iopub.status.busy":"2025-11-13T07:14:32.737025Z","iopub.status.idle":"2025-11-13T07:14:32.773445Z","shell.execute_reply":"2025-11-13T07:14:32.772562Z","shell.execute_reply.started":"2025-11-13T07:14:32.737637Z"},"id":"SBiWo3VX4Y5X","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## Validation Data\ncat_val = random.sample(cat_images, int(len(cat_images)*0.1))\ndog_val = random.sample(dog_images, int(len(dog_images)*0.1))","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:14:34.090117Z","iopub.status.busy":"2025-11-13T07:14:34.089381Z","iopub.status.idle":"2025-11-13T07:14:34.094943Z","shell.execute_reply":"2025-11-13T07:14:34.094352Z","shell.execute_reply.started":"2025-11-13T07:14:34.090093Z"},"id":"6QjewzcY5LYJ","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"## Copying Data\nfor image in os.listdir('train'):\n  if image.startswith('cat'):\n    if image in cat_val:\n      shutil.copy(os.path.join('train', image), os.path.join(parent_dir, 'validation', 'cat', image))\n    else:\n      shutil.copy(os.path.join('train', image), os.path.join(parent_dir, 'train', 'cat', image))\n  else:\n    if image in dog_val:\n      shutil.copy(os.path.join('train', image), os.path.join(parent_dir, 'validation', 'dog', image))\n    else:\n      shutil.copy(os.path.join('train', image), os.path.join(parent_dir, 'train', 'dog', image))","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:14:36.132703Z","iopub.status.busy":"2025-11-13T07:14:36.13194Z","iopub.status.idle":"2025-11-13T07:14:39.755708Z","shell.execute_reply":"2025-11-13T07:14:39.755112Z","shell.execute_reply.started":"2025-11-13T07:14:36.13268Z"},"id":"0NrR-AeJ5PyU","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('Total Training Cat Images:', len(os.listdir('dogs-vs-cats/train/cat')))\nprint('Total Training Dog Images:', len(os.listdir('dogs-vs-cats/train/dog')))\nprint('Total Validation Cat Images:', len(os.listdir('dogs-vs-cats/validation/cat')))\nprint('Total Validation Dog Images:', len(os.listdir('dogs-vs-cats/validation/dog')))","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:16:26.909933Z","iopub.status.busy":"2025-11-13T07:16:26.909283Z","iopub.status.idle":"2025-11-13T07:16:26.926979Z","shell.execute_reply":"2025-11-13T07:16:26.926207Z","shell.execute_reply.started":"2025-11-13T07:16:26.909906Z"},"id":"R823ALn-51QP","outputId":"b9ee4e96-ecdf-48ed-aa39-b610e7033aae","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **ImageDataGenerator**","metadata":{"id":"A7zLRV7D67kC"}},{"cell_type":"code","source":"image_datagen = ImageDataGenerator(rescale=1/255)\n\ntrain_dategen = image_datagen.flow_from_directory(\n    'dogs-vs-cats/train',\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary'\n)\n\nvalidation_dategen = image_datagen.flow_from_directory(\n    'dogs-vs-cats/validation',\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary'\n)","metadata":{"execution":{"iopub.execute_input":"2025-11-13T07:16:38.2605Z","iopub.status.busy":"2025-11-13T07:16:38.259836Z","iopub.status.idle":"2025-11-13T07:16:39.144444Z","shell.execute_reply":"2025-11-13T07:16:39.143777Z","shell.execute_reply.started":"2025-11-13T07:16:38.260477Z"},"id":"nxkYXTLE6rYF","outputId":"e1fa7b7c-d7a0-45a0-cb3a-f9079132a02e","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Base Model**","metadata":{"id":"2Ve48vFo7HIO"}},{"cell_type":"markdown","source":"## Model Building & Training","metadata":{"id":"S52Xt3U9_xWP"}},{"cell_type":"code","source":"model = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    MaxPooling2D(2, 2),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D(2, 2),\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D(2, 2),\n    Flatten(),\n    Dense(512, activation='relu'),\n    Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer='adamax', loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"id":"223fagxO6-e4","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(train_dategen, epochs=5, validation_data=validation_dategen)","metadata":{"id":"jkWao-zs7K7u","outputId":"e7aee4cc-a0ce-45e2-f000-0273ead1435c","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Base Model Visualization","metadata":{"id":"5NBVDAik7RaN"}},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)\nhistory_df.head()","metadata":{"id":"Xr_fglAH7UKF","outputId":"74af5366-dc89-4378-e8c7-6ef1493a6165","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"### Accuracy Visualization\nsns.lineplot(history_df[['accuracy', 'val_accuracy']])","metadata":{"id":"vfHtQx2W7UMH","outputId":"fa141d94-4d1e-4e2d-8e5f-2d9e7053c5d6","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"### Loss Visualization\nsns.lineplot(history_df[['loss', 'val_loss']])","metadata":{"id":"KKsJ1_KE7UPm","outputId":"f33ec85e-4066-4406-f5cf-e5a708dfa7b9","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train & Validation Evaluation","metadata":{"id":"-qgZc9EIAI7h"}},{"cell_type":"code","source":"print(model.evaluate(train_dategen)[1])\nprint(model.evaluate(validation_dategen)[1])","metadata":{"id":"FRUH7m91AI7i","outputId":"bc66a2ff-08be-4ed6-b9ce-6e67a2d8459b","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Data Augmentation**","metadata":{"id":"f02yTWnL75AM"}},{"cell_type":"code","source":"train_image_datagen = ImageDataGenerator(\n    rescale=1/255,\n    rotation_range=5,\n    width_shift_range=0.02,\n    height_shift_range=0.02,\n    zoom_range=0.02,\n    horizontal_flip=True,\n    fill_mode='nearest'\n)\n\ntrain_dategen = train_image_datagen.flow_from_directory(\n    'dogs-vs-cats/train',\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary'\n)\n\nvalidation_dategen = image_datagen.flow_from_directory(\n    'dogs-vs-cats/validation',\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary'\n)","metadata":{"id":"HEVJdEwZ7V0Y","outputId":"d775c46a-e71a-4544-ea17-ca027d1f3165","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **More Complex Model**","metadata":{"id":"vDlyryLo8QIq"}},{"cell_type":"markdown","source":"## Model Building & Training","metadata":{"id":"pV6jIygB_sz8"}},{"cell_type":"code","source":"early_stopping = EarlyStopping(monitor='val_loss', patience=5, min_delta=0.001, restore_best_weights=True)\nmodel_checkpoint = ModelCheckpoint('best_model.best.h5', monitor='val_loss', save_best_only=True)\n\nmodel = Sequential([\n    Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    MaxPooling2D(2, 2),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D(2, 2),\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D(2, 2),\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D(2, 2),\n    Flatten(),\n    BatchNormalization(),\n\n    Dense(512, activation='relu'),\n    Dropout(0.5),\n    Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer='adamax', loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"id":"SMSGsE1J9FRl","outputId":"c4885d44-3cda-4040-fc2b-1cc7d714db32","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model.fit(train_dategen, epochs=30, validation_data=validation_dategen, callbacks=[early_stopping, model_checkpoint])","metadata":{"id":"fAlZf7WS90XX","outputId":"897eb1c1-b8e1-4783-f274-1162ed4cdcd7","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Model Visualization","metadata":{"id":"WbsZ_GaL8dK5"}},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)","metadata":{"id":"VBMl4oQy-klv","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"### Accuracy Visualization\nsns.lineplot(history_df[['accuracy', 'val_accuracy']])","metadata":{"id":"xSZdP7N2LOq4","outputId":"499a5ab9-c875-49b6-f5f7-61d198abcbdb","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"### Loss Visualization\nsns.lineplot(history_df[['loss', 'val_loss']])","metadata":{"id":"Yigqym2lLcQW","outputId":"51c22674-c56c-4346-ea01-26828d51fa54","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train & Validation Evaluation","metadata":{"id":"ji9XCUUN9Eu7"}},{"cell_type":"code","source":"print(model.evaluate(train_dategen)[1])\nprint(model.evaluate(validation_dategen)[1])","metadata":{"id":"kbuV9hJEMK2Y","outputId":"9db1a7bf-d6ee-4657-bbf4-a85753fa18fe","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Transfer Learning `(VGG16)`**","metadata":{"id":"5ZMQudsN9HXb"}},{"cell_type":"markdown","source":"## ImageDataGenerator","metadata":{"id":"sSvP7Xyb9rZE"}},{"cell_type":"code","source":"image_datagen = ImageDataGenerator(\n    preprocessing_function=preprocess_input,\n    rescale=1/255,\n)\n\ntrain_dategen = image_datagen.flow_from_directory(\n    'dogs-vs-cats/train',\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='binary'\n)\n\n\nvalidation_dategen = image_datagen.flow_from_directory(\n    'dogs-vs-cats/validation',\n    target_size=(224, 224),\n    batch_size=32,\n    class_mode='binary'\n)\n","metadata":{"id":"jqd2XHH6w8Pl","outputId":"59c1a199-9d4c-478c-ded5-870e0c63ca2f","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Feature Exctraction","metadata":{"id":"jOnoRTkf_LUo"}},{"cell_type":"code","source":"transfer_model = VGG16(include_top=False, input_shape=(224, 224, 3), weights='imagenet')\n\nfor layer in transfer_model.layers:\n  layer.trainable = False","metadata":{"id":"u3O-_lH71Fx-","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Model Building & Training","metadata":{"id":"0N3Hdz6h_jxH"}},{"cell_type":"code","source":"early_stopping = EarlyStopping(monitor='val_loss', patience=5, min_delta=0.001, restore_best_weights=True)\nmodel_checkpoint = ModelCheckpoint('best_transfer_model.best.h5', monitor='val_loss', save_best_only=True)\n\nmodel_transfer = Sequential([\n    transfer_model,\n    Flatten(),\n    BatchNormalization(),\n\n    Dense(512, activation='relu'),\n    Dropout(0.5),\n    Dense(1, activation='sigmoid')\n])\nmodel_transfer.compile(optimizer='adamax', loss='binary_crossentropy', metrics=['accuracy'])","metadata":{"id":"pRxXNfaa1Vno","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history = model_transfer.fit(train_dategen, epochs=30, validation_data=validation_dategen, callbacks=[early_stopping, model_checkpoint])","metadata":{"id":"gW1hiWuj2sic","outputId":"318a1d13-e336-4ad9-a5ce-e16879399948","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Model Visualization","metadata":{"id":"GJ5dDayMAblo"}},{"cell_type":"code","source":"history_df = pd.DataFrame(history.history)","metadata":{"id":"n-tsEy9UAblo","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"### Accuracy Visualization\nsns.lineplot(history_df[['accuracy', 'val_accuracy']])","metadata":{"id":"J_y6QMXaAblp","outputId":"499a5ab9-c875-49b6-f5f7-61d198abcbdb","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"### Loss Visualization\nsns.lineplot(history_df[['loss', 'val_loss']])","metadata":{"id":"sF8V7OJtAblp","outputId":"51c22674-c56c-4346-ea01-26828d51fa54","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train & Validation Evaluation","metadata":{"id":"WZmfLwVRAblp"}},{"cell_type":"code","source":"print(model_transfer.evaluate(train_dategen)[1])\nprint(model_transfer.evaluate(validation_dategen)[1])","metadata":{"id":"aNrRfn6YAblp","outputId":"05b86d56-23ef-48fb-c93a-e8d4345d26f0","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Test Prediction**","metadata":{"id":"d1c4TWNW7jYK"}},{"cell_type":"code","source":"# Get sorted image filenames\nimage_files = sorted([f for f in os.listdir('test1')])\n\n# Prepare list for predictions\npredictions = []\n\n# Loop through images\nfor idx, img_name in enumerate(image_files, start=1):\n    img_path = os.path.join('test1', img_name)\n\n    # Load and preprocess image\n    img = load_img(img_path, target_size=(224, 224))\n    img_array = img_to_array(img)\n    img_array = np.expand_dims(img_array, axis=0)\n    img_array = preprocess_input(img_array)\n\n    # Predict\n    pred = model_transfer.predict(img_array, verbose=0)\n    label = int(pred[0][0] > 0.5)\n\n    # Store (id, label)\n    predictions.append({'id': idx, 'label': label})\n\n\n# Save as submission file\ndf = pd.DataFrame(predictions)\ndf.to_csv('submission.csv', index=False)\n\nprint(\"✅ submission.csv created successfully!\")\nprint(df.head())","metadata":{"id":"Gzp3RSCdDx51","outputId":"ff63603e-47c8-4bcd-d35e-27e707287aee","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **Thanks**","metadata":{"id":"ZdBy0J23EmsY"}}]}