{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\nimport os\nimport zipfile\nimport shutil\nimport random\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn.metrics import confusion_matrix, classification_report\n\n# --------------------------\n# 1️⃣ Veri Yükleme\n# --------------------------\n\ninput_dir = '/kaggle/input/dogs-vs-cats/'\ntrain_zip = os.path.join(input_dir, 'train.zip')\ntest_zip = os.path.join(input_dir, 'test1.zip')\n\n# Zipleri açma\nwith zipfile.ZipFile(train_zip, 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/train')\nwith zipfile.ZipFile(test_zip, 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/test')\n\noriginal_train_dir = '/kaggle/working/train/train/'\n\n# --------------------------\n# 2️⃣ Train / Validation Split\n# --------------------------\n\n# Split klasörü\nbase_dir = '/kaggle/working/train_split_clean/'\n\ntrain_cats_dir = os.path.join(base_dir, 'train/cats')\ntrain_dogs_dir = os.path.join(base_dir, 'train/dogs')\nval_cats_dir = os.path.join(base_dir, 'validation/cats')\nval_dogs_dir = os.path.join(base_dir, 'validation/dogs')\n\nfor d in [train_cats_dir, train_dogs_dir, val_cats_dir, val_dogs_dir]:\n    os.makedirs(d, exist_ok=True)\n\n# Dosyaları karıştır ve ayır\nall_cats = [f for f in os.listdir(original_train_dir) if f.startswith('cat')]\nall_dogs = [f for f in os.listdir(original_train_dir) if f.startswith('dog')]\nrandom.shuffle(all_cats)\nrandom.shuffle(all_dogs)\n\nsplit_ratio = 0.2\nsplit_cats = int(len(all_cats)*split_ratio)\nsplit_dogs = int(len(all_dogs)*split_ratio)\n\ntrain_cats_files = all_cats[split_cats:]\nval_cats_files = all_cats[:split_cats]\ntrain_dogs_files = all_dogs[split_dogs:]\nval_dogs_files = all_dogs[:split_dogs]\n\n# Dosyaları kopyala\nfor f in train_cats_files:\n    shutil.copy(os.path.join(original_train_dir,f), train_cats_dir)\nfor f in val_cats_files:\n    shutil.copy(os.path.join(original_train_dir,f), val_cats_dir)\nfor f in train_dogs_files:\n    shutil.copy(os.path.join(original_train_dir,f), train_dogs_dir)\nfor f in val_dogs_files:\n    shutil.copy(os.path.join(original_train_dir,f), val_dogs_dir)\n\nprint(\"✅ Train / Validation klasörleri hazır.\")\nprint(\"Train Cats:\", len(os.listdir(train_cats_dir)))\nprint(\"Train Dogs:\", len(os.listdir(train_dogs_dir)))\nprint(\"Val Cats:\", len(os.listdir(val_cats_dir)))\nprint(\"Val Dogs:\", len(os.listdir(val_dogs_dir)))\n\n# --------------------------\n# 3️⃣ Data Generators\n# --------------------------\n\ntrain_datagen = 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\nval_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(\n    os.path.join(base_dir,'train'),\n    target_size=(150,150),\n    batch_size=32,\n    class_mode='binary'\n)\n\nvalidation_generator = val_datagen.flow_from_directory(\n    os.path.join(base_dir,'validation'),\n    target_size=(150,150),\n    batch_size=32,\n    class_mode='binary'\n)\n\n# Örnek görseller\nsample_imgs, _ = next(train_generator)\nplt.figure(figsize=(12,6))\nfor i in range(6):\n    plt.subplot(2,3,i+1)\n    plt.imshow(sample_imgs[i])\n    plt.axis('off')\nplt.show()\n\n# --------------------------\n# 4️⃣ CNN Modeli\n# --------------------------\n\nmodel = Sequential([\n    Input(shape=(150,150,3)),\n    Conv2D(16,(3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    Conv2D(32,(3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    Conv2D(64,(3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dropout(0.5),\n    Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer=Adam(0.001), loss='binary_crossentropy', metrics=['accuracy'])\nmodel.summary()\n\n# --------------------------\n# 5️⃣ Modeli Eğit\n# --------------------------\n\nhistory = model.fit(\n    train_generator,\n    epochs=15,\n    validation_data=validation_generator\n)\n\n# --------------------------\n# 6️⃣ Değerlendirme\n# --------------------------\n\n# Confusion Matrix\ny_pred_val = (model.predict(validation_generator) > 0.5).astype(int).reshape(-1)\ntrue_labels = validation_generator.classes\nlabels = list(validation_generator.class_indices.keys())\n\ncm = confusion_matrix(true_labels, y_pred_val)\nplt.figure(figsize=(6,5))\nsns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\", xticklabels=labels, yticklabels=labels)\nplt.title(\"Confusion Matrix (Validation)\")\nplt.xlabel(\"Predicted\")\nplt.ylabel(\"True\")\nplt.show()\n\nprint(\"📌 Classification Report (Validation)\")\nprint(classification_report(true_labels, y_pred_val, target_names=labels))\n\n# Örnek tahminler\nsample_images, _ = next(validation_generator)\nplt.figure(figsize=(12,6))\nfor i in range(6):\n    plt.subplot(2,3,i+1)\n    plt.imshow(sample_images[i])\n    pred = \"Dog\" if model.predict(sample_images[i][np.newaxis,...])[0][0] > 0.5 else \"Cat\"\n    plt.title(f\"Tahmin: {pred}\")\n    plt.axis('off')\nplt.show()\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-26T09:53:51.297982Z","iopub.execute_input":"2025-09-26T09:53:51.298582Z","iopub.status.idle":"2025-09-26T10:30:04.171429Z","shell.execute_reply.started":"2025-09-26T09:53:51.298558Z","shell.execute_reply":"2025-09-26T10:30:04.170754Z"}},"outputs":[],"execution_count":null}]}