{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport matplotlib.pyplot as plt\nimport shutil\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-24T19:52:57.421182Z","iopub.execute_input":"2024-05-24T19:52:57.421553Z","iopub.status.idle":"2024-05-24T19:52:58.058526Z","shell.execute_reply.started":"2024-05-24T19:52:57.421523Z","shell.execute_reply":"2024-05-24T19:52:58.057712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import zipfile\nimport os\n\n# Define paths to the zip files\ntrain_zip_path = '/kaggle/input/c/dogs-vs-cats/train.zip'\ntest_zip_path = '/kaggle/input/c/dogs-vs-cats/test1.zip'\n\n# Define directories to extract the data\ntrain_extract_dir = '/kaggle/working/train'\ntest_extract_dir = '/kaggle/working/test'\n\n# Create directories if they don't exist\nos.makedirs(train_extract_dir, exist_ok=True)\nos.makedirs(test_extract_dir, exist_ok=True)\n\n# Unzip train data\nwith zipfile.ZipFile(train_zip_path, 'r') as zip_ref:\n    zip_ref.extractall(train_extract_dir)\n\n# Unzip test data\nwith zipfile.ZipFile(test_zip_path, 'r') as zip_ref:\n    zip_ref.extractall(test_extract_dir)\n\n# List extracted files\nprint(\"Train data extracted to:\", os.listdir(train_extract_dir))\nprint(\"Test data extracted to:\", os.listdir(test_extract_dir))\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T19:52:58.060368Z","iopub.execute_input":"2024-05-24T19:52:58.060659Z","iopub.status.idle":"2024-05-24T19:53:12.377650Z","shell.execute_reply.started":"2024-05-24T19:52:58.060635Z","shell.execute_reply":"2024-05-24T19:53:12.376746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# Create directories for training and validation splits\nbase_dir = '/kaggle/working/cats_and_dogs_small'\ntrain_dir = os.path.join(base_dir, 'train')\nvalidation_dir = os.path.join(base_dir, 'validation')\nos.makedirs(train_dir, exist_ok=True)\nos.makedirs(validation_dir, exist_ok=True)\n\n# Create subdirectories for train and validation\ntrain_cats_dir = os.path.join(train_dir, 'cats')\ntrain_dogs_dir = os.path.join(train_dir, 'dogs')\nvalidation_cats_dir = os.path.join(validation_dir, 'cats')\nvalidation_dogs_dir = os.path.join(validation_dir, 'dogs')\nos.makedirs(train_cats_dir, exist_ok=True)\nos.makedirs(train_dogs_dir, exist_ok=True)\nos.makedirs(validation_cats_dir, exist_ok=True)\nos.makedirs(validation_dogs_dir, exist_ok=True)\n\n# Define the paths to the original training data\noriginal_train_dir = '/kaggle/working/train/train'\n# print(os.listdir('/kaggle/working/train'))\n# Split the dataset into training and validation sets\nall_cats = [os.path.join(original_train_dir, f) for f in os.listdir(original_train_dir) if 'cat' in f]\nall_dogs = [os.path.join(original_train_dir, f) for f in os.listdir(original_train_dir) if 'dog' in f]\n\nprint (len(all_cats))\ntrain_cats, val_cats = train_test_split(all_cats, test_size=0.2, random_state=42)\ntrain_dogs, val_dogs = train_test_split(all_dogs, test_size=0.2, random_state=42)\n\n# # Copy images to corresponding directories\nfor file in train_cats:\n    shutil.copy(file, train_cats_dir)\nfor file in val_cats:\n    shutil.copy(file, validation_cats_dir)\nfor file in train_dogs:\n    shutil.copy(file, train_dogs_dir)\nfor file in val_dogs:\n    shutil.copy(file, validation_dogs_dir)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T19:53:12.378649Z","iopub.execute_input":"2024-05-24T19:53:12.378921Z","iopub.status.idle":"2024-05-24T19:53:15.540115Z","shell.execute_reply.started":"2024-05-24T19:53:12.378898Z","shell.execute_reply":"2024-05-24T19:53:15.539140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model 1 ** with out any on small dataset ","metadata":{}},{"cell_type":"code","source":"\n\n# Image generators for train and validation datasets\ntrain_datagen = ImageDataGenerator(rescale=1./255)\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(150, 150),\n    batch_size=20,\n    class_mode='binary'\n)\n\nvalidation_generator = validation_datagen.flow_from_directory(\n    validation_dir,\n    target_size=(150, 150),\n    batch_size=20,\n    class_mode='binary'\n)\n\n# Build the baseline model\nbaseline_model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nbaseline_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\n# Train the baseline model\nhistory_baseline = baseline_model.fit(\n    train_generator,\n    steps_per_epoch=100,\n    epochs=30,\n    validation_data=validation_generator,\n    validation_steps=50\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T19:53:15.542166Z","iopub.execute_input":"2024-05-24T19:53:15.542471Z","iopub.status.idle":"2024-05-24T19:55:17.669010Z","shell.execute_reply.started":"2024-05-24T19:53:15.542447Z","shell.execute_reply":"2024-05-24T19:55:17.668231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model 2** with augmentation ","metadata":{}},{"cell_type":"code","source":"# Data augmentation\ntrain_datagen_augmented = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=40,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode='nearest'\n)\n\ntrain_generator_augmented = train_datagen_augmented.flow_from_directory(\n    train_dir,\n    target_size=(150, 150),\n    batch_size=20,\n    class_mode='binary'\n)\n\n# Build the augmented model (same architecture)\naugmented_model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\naugmented_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\n# Train the augmented model\nhistory_augmented = augmented_model.fit(\n    train_generator_augmented,\n    steps_per_epoch=100,\n    epochs=30,\n    validation_data=validation_generator,\n    validation_steps=50\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T19:56:26.497417Z","iopub.execute_input":"2024-05-24T19:56:26.498580Z","iopub.status.idle":"2024-05-24T20:02:45.759444Z","shell.execute_reply.started":"2024-05-24T19:56:26.498533Z","shell.execute_reply":"2024-05-24T20:02:45.758613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model 3** with augmentation and regularization","metadata":{}},{"cell_type":"code","source":"# Build the regularized model (with Dropout)\nregularized_model = tf.keras.models.Sequential([\n    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),\n    tf.keras.layers.MaxPooling2D((2, 2)),\n    tf.keras.layers.Flatten(),\n    tf.keras.layers.Dense(512, activation='relu'),\n    tf.keras.layers.Dropout(0.5),\n    tf.keras.layers.Dense(1, activation='sigmoid')\n])\n\nregularized_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\n# Train the regularized model\nhistory_regularized = regularized_model.fit(\n    train_generator_augmented,\n    steps_per_epoch=100,\n    epochs=30,\n    validation_data=validation_generator,\n    validation_steps=50\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T20:03:53.670464Z","iopub.execute_input":"2024-05-24T20:03:53.670868Z","iopub.status.idle":"2024-05-24T20:10:05.758685Z","shell.execute_reply.started":"2024-05-24T20:03:53.670822Z","shell.execute_reply":"2024-05-24T20:10:05.757726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Competetion between the 3 models**","metadata":{}},{"cell_type":"code","source":"# Plot training and validation accuracy\ndef plot_history(histories, title):\n    plt.figure(figsize=(14, 7))\n    \n    for name, history in histories:\n        val = plt.plot(history.epoch, history.history['val_accuracy'], '--', label=name.title()+' Val')\n        plt.plot(history.epoch, history.history['accuracy'], color=val[0].get_color(), label=name.title()+' Train')\n    \n    plt.xlabel('Epochs')\n    plt.ylabel('Accuracy')\n    plt.title(title)\n    plt.legend()\n    plt.xlim([0, max(history.epoch)])\n    plt.show()\n\nplot_history([('Baseline', history_baseline), ('Augmented', history_augmented), ('Regularized', history_regularized)], 'Model Accuracy')\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T20:10:10.724684Z","iopub.execute_input":"2024-05-24T20:10:10.725088Z","iopub.status.idle":"2024-05-24T20:10:11.088888Z","shell.execute_reply.started":"2024-05-24T20:10:10.725038Z","shell.execute_reply":"2024-05-24T20:10:11.088011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_history(histories, titles):\n    for i, (name, history) in enumerate(histories):\n        plt.figure(figsize=(14, 7))\n        plt.plot(history.epoch, history.history['val_accuracy'], '--', label=name.title()+' Val')\n        plt.plot(history.epoch, history.history['accuracy'], label=name.title()+' Train')\n        plt.xlabel('Epochs')\n        plt.ylabel('Accuracy')\n        plt.title(titles[i])\n        plt.legend()\n        plt.xlim([0, max(history.epoch)])\n        plt.show()\n\n# Example usage\nplot_history([('Baseline', history_baseline), ('Augmented', history_augmented), ('Regularized', history_regularized)], \n             ['Baseline Model Accuracy', 'Augmented Model Accuracy', 'Regularized Model Accuracy'])","metadata":{"execution":{"iopub.status.busy":"2024-05-24T20:15:49.646728Z","iopub.execute_input":"2024-05-24T20:15:49.647125Z","iopub.status.idle":"2024-05-24T20:15:50.653866Z","shell.execute_reply.started":"2024-05-24T20:15:49.647088Z","shell.execute_reply":"2024-05-24T20:15:50.652940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\ndef plot_history(histories, titles):\n    for i, (name, history) in enumerate(histories):\n        plt.figure(figsize=(14, 7))\n        plt.plot(history.epoch, history.history['accuracy'], label=name.title()+' Train Accuracy')\n        plt.plot(history.epoch, history.history['val_accuracy'], '--', label=name.title()+' Validation Accuracy')\n        plt.xlabel('Epochs')\n        plt.ylabel('Accuracy')\n        plt.title(titles[i])\n        plt.legend()\n        plt.xlim([0, max(history.epoch)])\n        plt.ylim([0, 1])  # Set y-axis limit to [0, 1] for accuracy\n        plt.grid(True)  # Add grid lines\n        plt.show()\n\n# Example usage\nplot_history([('Baseline', history_baseline), ('Augmented', history_augmented), ('Regularized', history_regularized)], \n             ['Baseline Model', 'Augmented Model', 'Regularized Model'])\n","metadata":{"execution":{"iopub.status.busy":"2024-05-24T20:21:04.214165Z","iopub.execute_input":"2024-05-24T20:21:04.214872Z","iopub.status.idle":"2024-05-24T20:21:05.229263Z","shell.execute_reply.started":"2024-05-24T20:21:04.214841Z","shell.execute_reply":"2024-05-24T20:21:05.228399Z"},"trusted":true},"execution_count":null,"outputs":[]}]}