{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","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":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Import libraries\nimport os\nimport zipfile\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Flatten, Dropout\nfrom tensorflow.keras.optimizers import Adam\nimport matplotlib.pyplot as plt\n\n# Unzipping train.zip\nwith zipfile.ZipFile(\"/kaggle/input/dogs-vs-cats/train.zip\", 'r') as zip_ref:\n    zip_ref.extractall(\"/kaggle/working/train\")\n\ntrain_path = \"/kaggle/working/train/train\"","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-06-18T10:15:59.891206Z","iopub.execute_input":"2025-06-18T10:15:59.891989Z","iopub.status.idle":"2025-06-18T10:16:27.793145Z","shell.execute_reply.started":"2025-06-18T10:15:59.891957Z","shell.execute_reply":"2025-06-18T10:16:27.792349Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Organize data into separate folders for ImageDataGenerator\nimport shutil\n\n# Create new directory structure\nbase_dir = \"/kaggle/working/dataset\"\nos.makedirs(base_dir, exist_ok=True)\nos.makedirs(base_dir + '/train/cats', exist_ok=True)\nos.makedirs(base_dir + '/train/dogs', exist_ok=True)\n\n# Split files into cats and dogs folders\nfor file in os.listdir(train_path):\n    if \"cat\" in file:\n        shutil.move(os.path.join(train_path, file), base_dir + '/train/cats/' + file)\n    else:\n        shutil.move(os.path.join(train_path, file), base_dir + '/train/dogs/' + file)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T10:16:27.794607Z","iopub.execute_input":"2025-06-18T10:16:27.795212Z","iopub.status.idle":"2025-06-18T10:16:28.485967Z","shell.execute_reply.started":"2025-06-18T10:16:27.795191Z","shell.execute_reply":"2025-06-18T10:16:28.485126Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Prepare the data generators\n\nIMG_SIZE = 224\nBATCH_SIZE = 32\n\n# Data augmentation and normalization\ndatagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2\n)\n\ntrain_generator = datagen.flow_from_directory(\n    base_dir + '/train',\n    target_size=(IMG_SIZE, IMG_SIZE),\n    batch_size=BATCH_SIZE,\n    class_mode='binary',\n    subset='training'\n)\n\nval_generator = datagen.flow_from_directory(\n    base_dir + '/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":"2025-06-18T10:16:28.486842Z","iopub.execute_input":"2025-06-18T10:16:28.487126Z","iopub.status.idle":"2025-06-18T10:16:28.774375Z","shell.execute_reply.started":"2025-06-18T10:16:28.487094Z","shell.execute_reply":"2025-06-18T10:16:28.773660Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Build ResNet50 model\n\n# Load pre-trained ResNet50 without top layers\nbase_model = ResNet50(weights='imagenet', include_top=False, input_shape=(IMG_SIZE, IMG_SIZE, 3))\nbase_model.trainable = False  # freeze base model\n\nmodel = Sequential([\n    base_model,\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dropout(0.3),\n    Dense(1, activation='sigmoid')  # Binary classification\n])\n\n# Compile model\nmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T10:16:28.775734Z","iopub.execute_input":"2025-06-18T10:16:28.775935Z","iopub.status.idle":"2025-06-18T10:16:35.310999Z","shell.execute_reply.started":"2025-06-18T10:16:28.775919Z","shell.execute_reply":"2025-06-18T10:16:35.310328Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train the model\nhistory = model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=5\n)\n\n# Fine-tuning (Optional)\n\n# Unfreeze some layers for fine-tuning\nbase_model.trainable = True\nfor layer in base_model.layers[:-20]:\n    layer.trainable = False\n\nmodel.compile(optimizer=Adam(1e-5), loss='binary_crossentropy', metrics=['accuracy'])\n\nfine_tune_history = model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=3\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T10:22:05.630272Z","iopub.execute_input":"2025-06-18T10:22:05.630968Z","iopub.status.idle":"2025-06-18T10:32:07.157249Z","shell.execute_reply.started":"2025-06-18T10:22:05.630941Z","shell.execute_reply":"2025-06-18T10:32:07.156621Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Evaluate model\nval_loss, val_accuracy = model.evaluate(val_generator)\nprint(f\"\\nValidation Accuracy: {val_accuracy*100:.2f}%\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T10:32:07.158693Z","iopub.execute_input":"2025-06-18T10:32:07.158905Z","iopub.status.idle":"2025-06-18T10:32:20.257436Z","shell.execute_reply.started":"2025-06-18T10:32:07.158888Z","shell.execute_reply":"2025-06-18T10:32:20.256866Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Plotting training results\nplt.figure(figsize=(8, 4))\nplt.plot(history.history['accuracy'] + fine_tune_history.history['accuracy'], label='Training Accuracy')\nplt.plot(history.history['val_accuracy'] + fine_tune_history.history['val_accuracy'], label='Validation Accuracy')\nplt.title(\"Accuracy over Epochs\")\nplt.xlabel(\"Epochs\")\nplt.ylabel(\"Accuracy\")\nplt.legend()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-18T10:32:20.258164Z","iopub.execute_input":"2025-06-18T10:32:20.258382Z","iopub.status.idle":"2025-06-18T10:32:20.670655Z","shell.execute_reply.started":"2025-06-18T10:32:20.258357Z","shell.execute_reply":"2025-06-18T10:32:20.669936Z"}},"outputs":[],"execution_count":null}]}