{"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":"gpu","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"},{"sourceId":113641250,"sourceType":"kernelVersion"}],"dockerImageVersionId":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Kütüphanelerin Yüklenmesi ve Ortamın Hazırlanması\n\nAçıklama:\nBu bölümde projede kullanılacak temel kütüphaneler yüklenir:\n\nNumPy: Sayısal işlemler ve diziler için kullanılır.\n\nMatplotlib ve Seaborn: Veri görselleştirmeleri için kullanılır.\n\nTensorFlow ve Keras: Derin öğrenme modeli oluşturmak ve eğitmek için kullanılır.\n\nScikit-learn: Modelin performansını değerlendirmek için (confusion matrix, classification report vb.) kullanılır.\n\nAyrıca, rastgelelik sabitlenir (seed = 42) ve böylece deneyler tekrarlanabilir sonuçlar verir.","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport random\nimport tensorflow as tf\n\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn.metrics import classification_report, confusion_matrix\n\n# Rastgeleliği sabitle (tekrarlanabilir sonuçlar için)\nnp.random.seed(42)\ntf.random.set_seed(42)\nrandom.seed(42)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-26T17:13:46.664633Z","iopub.execute_input":"2025-09-26T17:13:46.664819Z","iopub.status.idle":"2025-09-26T17:13:50.782911Z","shell.execute_reply.started":"2025-09-26T17:13:46.664802Z","shell.execute_reply":"2025-09-26T17:13:50.782089Z"}},"outputs":[{"name":"stderr","text":"2025-09-26 17:13:48.111101: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\nWARNING: All log messages before absl::InitializeLog() is called are written to STDERR\nE0000 00:00:1758906828.147384     121 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\nE0000 00:00:1758906828.158530     121 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n","output_type":"stream"}],"execution_count":1},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"Veri Dosyalarının Yolu\n\nAçıklama:\nBu bölümde eğitim ve test verilerinin zip dosyalarının yolları tanımlanır.\n\nzip_path: Eğitim verisinin bulunduğu zip dosyasının yolu.\n\ntest_zip_path: Test verisinin bulunduğu zip dosyasının yolu.","metadata":{}},{"cell_type":"code","source":"zip_path = '/kaggle/input/dogs-vs-cats/train.zip'\ntest_zip_path = '/kaggle/input/dogs-vs-cats/test1.zip'\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T17:13:50.783744Z","iopub.execute_input":"2025-09-26T17:13:50.784265Z","iopub.status.idle":"2025-09-26T17:13:50.788021Z","shell.execute_reply.started":"2025-09-26T17:13:50.784244Z","shell.execute_reply":"2025-09-26T17:13:50.787231Z"}},"outputs":[],"execution_count":2},{"cell_type":"markdown","source":"Zip Dosyalarının Çıkarılması\n\nAçıklama:\nBu bölümde, eğitim ve test verileri zip dosyalarından çıkarılır ve çalışma dizinine kaydedilir.\n\nextract_train_path: Eğitim verisinin çıkarılacağı klasör yolu.\n\nextract_test_path: Test verisinin çıkarılacağı klasör yolu.\n\nzipfile.ZipFile: Zip dosyalarını açmak ve içeriğini belirtilen klasöre çıkarmak için kullanılır.\n\nprint(\"Zip dosyaları açıldı.\"): İşlemin tamamlandığını kullanıcıya bildirir.","metadata":{}},{"cell_type":"code","source":"import zipfile\n\nextract_train_path = '/kaggle/working/train'\nextract_test_path = '/kaggle/working/test'\n\n# Train zip\nwith zipfile.ZipFile(zip_path, 'r') as zip_ref:\n    zip_ref.extractall(extract_train_path)\n\n# Test zip\nwith zipfile.ZipFile(test_zip_path, 'r') as zip_ref:\n    zip_ref.extractall(extract_test_path)\n\nprint(\"Zip dosyaları açıldı.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T17:13:50.789598Z","iopub.execute_input":"2025-09-26T17:13:50.789853Z","iopub.status.idle":"2025-09-26T17:14:02.492204Z","shell.execute_reply.started":"2025-09-26T17:13:50.789831Z","shell.execute_reply":"2025-09-26T17:14:02.491519Z"}},"outputs":[{"name":"stdout","text":"Zip dosyaları açıldı.\n","output_type":"stream"}],"execution_count":3},{"cell_type":"markdown","source":"Eğitim Verilerini Düzenleme ve Data Generator Oluşturma\n\nAçıklama:\nBu bölüm, zip dosyaları açıldıktan sonra eğitim verilerini model için kullanılabilir hâle getirir ve veri artırma (data augmentation) ile generator’ları hazırlar.\n\nAdımlar:\n\n1️⃣ Zip dosyalarını açma:\n\nEğitim ve test zip dosyaları belirtilen dizinlere çıkarılır.\n\nos.path.join ve zipfile.ZipFile ile alt klasör kontrolü yapılır.\n\n2️⃣ Alt klasör kontrolü:\n\nZip açıldığında bazı zip dosyalarında /train/train/ gibi ekstra klasörler bulunabilir.\n\nKod, doğru base path’i belirlemek için kontrol sağlar.\n\n3️⃣ Sınıf klasörlerini oluşturma:\n\ncat ve dog adında klasörler oluşturulur (os.makedirs ile).\n\n4️⃣ Görüntüleri sınıflara ayırma:\n\nDosya isimleri cat veya dog ile başlıyorsa ilgili klasöre taşınır (shutil.move).\n\n5️⃣ Gereksiz dosyaları temizleme:\n\ncat ve dog klasörleri dışında kalan dosya ve klasörler silinir (os.remove ve shutil.rmtree).\n\n6️⃣ Data Augmentation ve generator oluşturma:\n\nImageDataGenerator kullanılarak veri artırma uygulanır:\n\nÖlçekleme (rescale)\n\nDöndürme (rotation_range)\n\nYatay/dikey kaydırma (width_shift_range, height_shift_range)\n\nKesme, yakınlaştırma, yatay çevirme (shear_range, zoom_range, horizontal_flip)\n\nDoldurma modu (fill_mode)\n\nEğitim/validation split (validation_split)\n\nflow_from_directory ile eğitim ve validation generator’ları oluşturulur.\n\nBu adımlar, modelin daha çeşitli veri üzerinde eğitilmesini ve overfitting riskinin azaltılmasını sağlar.","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\nimport zipfile\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# 1️⃣ Zip dosyalarını aç\ntrain_zip = '/kaggle/input/dogs-vs-cats/train.zip'\ntest_zip = '/kaggle/input/dogs-vs-cats/test1.zip'\n\ntrain_extract = '/kaggle/working/train'\ntest_extract = '/kaggle/working/test'\n\nwith zipfile.ZipFile(train_zip, 'r') as zip_ref:\n    zip_ref.extractall(train_extract)\n\nwith zipfile.ZipFile(test_zip, 'r') as zip_ref:\n    zip_ref.extractall(test_extract)\n\nprint(\"Zip dosyaları açıldı.\")\n\n# 2️⃣ Zip açıldıktan sonra alt klasör kontrolü\n# Dogs vs Cats zip açıldığında genellikle /train/train/ içinde dosyalar olur\ntrain_base = os.path.join(train_extract, 'train')  # Alt klasör varsa\nif not os.path.exists(train_base):\n    train_base = train_extract  # yoksa direkt train_extract kullan\n\nprint(\"İlk 10 dosya:\", os.listdir(train_base)[:10])\n\n# 3️⃣ Sınıf klasörlerini oluştur\ncat_path = os.path.join(train_base, 'cat')\ndog_path = os.path.join(train_base, 'dog')\nos.makedirs(cat_path, exist_ok=True)\nos.makedirs(dog_path, exist_ok=True)\n\n# 4️⃣ Görüntüleri cat/dog klasörlerine ayır\nfor filename in os.listdir(train_base):\n    filepath = os.path.join(train_base, filename)\n    if filename.startswith('cat'):\n        shutil.move(filepath, cat_path)\n    elif filename.startswith('dog'):\n        shutil.move(filepath, dog_path)\n\n# 5️⃣ Gereksiz dosyaları temizle (sadece cat ve dog klasörü kalsın)\nfor item in os.listdir(train_base):\n    if item not in ['cat', 'dog']:\n        path_to_remove = os.path.join(train_base, item)\n        if os.path.isdir(path_to_remove):\n            shutil.rmtree(path_to_remove)\n        else:\n            os.remove(path_to_remove)\n\nprint(\"Görseller cat ve dog klasörlerine taşındı ve gereksiz dosyalar silindi.\")\n\n# 6️⃣ Data Augmentation ve generator’ları oluştur\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    validation_split=0.2\n)\n\ntrain_generator = train_datagen.flow_from_directory(\n    train_base,\n    target_size=(150,150),\n    batch_size=32,\n    class_mode='binary',\n    subset='training'\n)\n\nvalidation_generator = train_datagen.flow_from_directory(\n    train_base,\n    target_size=(150,150),\n    batch_size=32,\n    class_mode='binary',\n    subset='validation'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T17:14:02.492944Z","iopub.execute_input":"2025-09-26T17:14:02.493215Z","iopub.status.idle":"2025-09-26T17:14:12.844832Z","shell.execute_reply.started":"2025-09-26T17:14:02.493197Z","shell.execute_reply":"2025-09-26T17:14:12.844182Z"}},"outputs":[{"name":"stdout","text":"Zip dosyaları açıldı.\nİlk 10 dosya: ['cat.10211.jpg', 'cat.2388.jpg', 'cat.3854.jpg', 'cat.6890.jpg', 'cat.9806.jpg', 'dog.1536.jpg', 'cat.5568.jpg', 'dog.7563.jpg', 'dog.11425.jpg', 'cat.4706.jpg']\nGörseller cat ve dog klasörlerine taşındı ve gereksiz dosyalar silindi.\nFound 20000 images belonging to 2 classes.\nFound 5000 images belonging to 2 classes.\n","output_type":"stream"}],"execution_count":4},{"cell_type":"markdown","source":"Konvolüsyonel Sinir Ağı (CNN) Modeli Oluşturma ve Derleme\n\nAçıklama:\nBu bölümde, kedi ve köpek görüntülerini sınıflandıracak bir CNN modeli tanımlanır ve derlenir.\n\nAdımlar:\n\n1️⃣ Modeli Oluşturma:\n\nSequential API kullanılarak model katmanları ardışık şekilde eklenir.\n\nConvolution + MaxPooling katmanları:\n\nGörsellerden özellikleri (feature) çıkarır.\n\nHer Conv2D katmanı filtre sayısını artırarak daha karmaşık özellikleri öğrenir.\n\nMaxPooling2D boyutları küçülterek hesaplamayı hızlandırır ve overfitting riskini azaltır.\n\nFlatten katmanı: Çok boyutlu çıktıyı tek boyuta dönüştürür.\n\nDropout katmanı: 0.5 oranında rastgele nöronları devre dışı bırakarak overfitting’i önler.\n\nDense katmanları: Son katman binary classification (sigmoid) ile kedi/köpek tahmini yapar.\n\n2️⃣ Modeli Derleme:\n\nLoss function: binary_crossentropy (iki sınıflı sınıflandırma için uygun).\n\nOptimizer: Adam (öğrenme oranı 1e-4).\n\nMetric: accuracy ile model performansı izlenir.\n\n3️⃣ Model Özeti:\n\nmodel.summary() ile katman yapısı, parametre sayıları ve boyutlar görüntülenir.\n\nBu model, veri artırma ile oluşturulan eğitim seti üzerinde kedi ve köpek görsellerini öğrenmeye hazırdır.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras import layers, models\nfrom tensorflow.keras.optimizers import Adam\n\n# 1️⃣ Modeli oluştur\nmodel = models.Sequential([\n    layers.Conv2D(32, (3,3), activation='relu', input_shape=(150,150,3)),\n    layers.MaxPooling2D(2,2),\n    \n    layers.Conv2D(64, (3,3), activation='relu'),\n    layers.MaxPooling2D(2,2),\n    \n    layers.Conv2D(128, (3,3), activation='relu'),\n    layers.MaxPooling2D(2,2),\n    \n    layers.Conv2D(128, (3,3), activation='relu'),\n    layers.MaxPooling2D(2,2),\n    \n    layers.Flatten(),\n    layers.Dropout(0.5),\n    layers.Dense(512, activation='relu'),\n    layers.Dense(1, activation='sigmoid')  # binary classification\n])\n\n# 2️⃣ Modeli derle\nmodel.compile(\n    loss='binary_crossentropy',\n    optimizer=Adam(learning_rate=1e-4),\n    metrics=['accuracy']\n)\n\nmodel.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T17:14:12.845595Z","iopub.execute_input":"2025-09-26T17:14:12.845833Z","iopub.status.idle":"2025-09-26T17:14:13.83542Z","shell.execute_reply.started":"2025-09-26T17:14:12.845815Z","shell.execute_reply":"2025-09-26T17:14:13.834714Z"}},"outputs":[{"name":"stderr","text":"/usr/local/lib/python3.11/dist-packages/keras/src/layers/convolutional/base_conv.py:107: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\nI0000 00:00:1758906853.042141     121 gpu_device.cc:2022] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 15513 MB memory:  -> device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:04.0, compute capability: 6.0\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"\u001b[1mModel: \"sequential\"\u001b[0m\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ conv2d (\u001b[38;5;33mConv2D\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m148\u001b[0m, \u001b[38;5;34m148\u001b[0m, \u001b[38;5;34m32\u001b[0m)   │           \u001b[38;5;34m896\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m)    │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m74\u001b[0m, \u001b[38;5;34m74\u001b[0m, \u001b[38;5;34m32\u001b[0m)     │             \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m72\u001b[0m, \u001b[38;5;34m72\u001b[0m, \u001b[38;5;34m64\u001b[0m)     │        \u001b[38;5;34m18,496\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m36\u001b[0m, \u001b[38;5;34m36\u001b[0m, \u001b[38;5;34m64\u001b[0m)     │             \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m34\u001b[0m, \u001b[38;5;34m34\u001b[0m, \u001b[38;5;34m128\u001b[0m)    │        \u001b[38;5;34m73,856\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m17\u001b[0m, \u001b[38;5;34m17\u001b[0m, \u001b[38;5;34m128\u001b[0m)    │             \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m15\u001b[0m, \u001b[38;5;34m15\u001b[0m, \u001b[38;5;34m128\u001b[0m)    │       \u001b[38;5;34m147,584\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_3 (\u001b[38;5;33mMaxPooling2D\u001b[0m)  │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m128\u001b[0m)      │             \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ flatten (\u001b[38;5;33mFlatten\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m6272\u001b[0m)           │             \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout (\u001b[38;5;33mDropout\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m6272\u001b[0m)           │             \u001b[38;5;34m0\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense (\u001b[38;5;33mDense\u001b[0m)                   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m)            │     \u001b[38;5;34m3,211,776\u001b[0m │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)              │           \u001b[38;5;34m513\u001b[0m │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n│ conv2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">148</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">148</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>)   │           <span style=\"color: #00af00; text-decoration-color: #00af00\">896</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)    │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">74</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">74</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>)     │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">72</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">72</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)     │        <span style=\"color: #00af00; text-decoration-color: #00af00\">18,496</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">36</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">36</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)     │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">34</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">34</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)    │        <span style=\"color: #00af00; text-decoration-color: #00af00\">73,856</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">17</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">17</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)    │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ conv2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">15</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">15</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)    │       <span style=\"color: #00af00; text-decoration-color: #00af00\">147,584</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ max_pooling2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>)  │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">7</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>)      │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">6272</span>)           │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">6272</span>)           │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>)            │     <span style=\"color: #00af00; text-decoration-color: #00af00\">3,211,776</span> │\n├─────────────────────────────────┼────────────────────────┼───────────────┤\n│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)              │           <span style=\"color: #00af00; text-decoration-color: #00af00\">513</span> │\n└─────────────────────────────────┴────────────────────────┴───────────────┘\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m3,453,121\u001b[0m (13.17 MB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,453,121</span> (13.17 MB)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m3,453,121\u001b[0m (13.17 MB)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">3,453,121</span> (13.17 MB)\n</pre>\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n","text/html":"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n</pre>\n"},"metadata":{}}],"execution_count":5},{"cell_type":"markdown","source":"Modeli Eğitme\n\nAçıklama:\nBu bölümde, oluşturulan CNN modeli eğitim verisi üzerinde eğitilir ve doğrulama verisi ile performansı izlenir.\n\nAdımlar:\n\n1️⃣ Model Fit (Eğitim):\n\ntrain_generator ile model, kedi ve köpek görüntülerinden öğrenir.\n\nsteps_per_epoch: Her epoch başına eğitim adımı sayısını belirler (toplam örnek sayısı / batch boyutu).\n\nvalidation_data ve validation_steps: Modelin her epoch sonunda doğrulama verisi üzerindeki performansını değerlendirir.\n\n2️⃣ Epoch Sayısı:\n\nModel 20 epoch boyunca eğitilir, böylece modelin öğrenme süreci ve doğrulama performansı izlenebilir.\n\n3️⃣ Çıktı:\n\nhistory değişkeni, eğitim ve doğrulama kaybı ile doğruluk değerlerini içerir ve görselleştirme için kullanılabilir.","metadata":{}},{"cell_type":"code","source":"history = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // train_generator.batch_size,\n    validation_data=validation_generator,\n    validation_steps=validation_generator.samples // validation_generator.batch_size,\n    epochs=20\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T17:14:13.83625Z","iopub.execute_input":"2025-09-26T17:14:13.836638Z","execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[{"name":"stderr","text":"/usr/local/lib/python3.11/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:121: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n  self._warn_if_super_not_called()\n","output_type":"stream"},{"name":"stdout","text":"Epoch 1/20\n","output_type":"stream"},{"name":"stderr","text":"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\nI0000 00:00:1758906857.226819     181 service.cc:148] XLA service 0x7927e400d540 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:\nI0000 00:00:1758906857.227805     181 service.cc:156]   StreamExecutor device (0): Tesla P100-PCIE-16GB, Compute Capability 6.0\nI0000 00:00:1758906857.595184     181 cuda_dnn.cc:529] Loaded cuDNN version 90300\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m  1/625\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m1:08:58\u001b[0m 7s/step - accuracy: 0.5312 - loss: 0.6950","output_type":"stream"},{"name":"stderr","text":"I0000 00:00:1758906860.898341     181 device_compiler.h:188] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.\n","output_type":"stream"},{"name":"stdout","text":"\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m143s\u001b[0m 218ms/step - accuracy: 0.5523 - loss: 0.6760 - val_accuracy: 0.6835 - val_loss: 0.6011\nEpoch 2/20\n\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m137s\u001b[0m 219ms/step - accuracy: 0.6836 - loss: 0.5905 - val_accuracy: 0.7087 - val_loss: 0.5578\nEpoch 3/20\n\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m134s\u001b[0m 215ms/step - accuracy: 0.7072 - loss: 0.5586 - val_accuracy: 0.7472 - val_loss: 0.5179\nEpoch 4/20\n\u001b[1m 28/625\u001b[0m \u001b[37m━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[1m1:42\u001b[0m 171ms/step - accuracy: 0.7480 - loss: 0.5201","output_type":"stream"}],"execution_count":null},{"cell_type":"markdown","source":"Model Performansını Değerlendirme\n\nAçıklama:\nBu bölümde, eğitim sonrası modelin doğrulama verisi üzerindeki performansı görselleştirilir ve ölçülür.\n\nAdımlar:\n\n1️⃣ Tahminler:\n\nModel, tüm doğrulama seti üzerinde tahminler yapar (predict).\n\nÇıktılar 0.5 eşik değeri kullanılarak sınıflandırılır (y_pred_class).\n\n2️⃣ Gerçek Etiketler:\n\nValidation generator'dan gerçek etiketler (y_true) alınır.\n\n3️⃣ Confusion Matrix (Karışıklık Matrisi):\n\nTahmin edilen ve gerçek sınıfları karşılaştırarak hangi sınıfların doğru/yanlış sınıflandığını gösterir.\n\nMatris, seaborn ile görselleştirilir ve eksenler “Cat” ve “Dog” olarak etiketlenir.\n\n4️⃣ Classification Report (Sınıflandırma Raporu):\n\nPrecision, Recall, F1-score ve destek (support) değerlerini içerir.\n\nDengesiz veri setlerinde modelin hangi sınıfta daha başarılı olduğunu anlamamıza yardımcı olur.\n\nBu adım sonunda, modelin kedi ve köpek sınıflarını ne kadar doğru tahmin ettiği sayısal ve görsel olarak analiz edilmiş olur.","metadata":{}},{"cell_type":"code","source":"import numpy as np\nfrom sklearn.metrics import classification_report, confusion_matrix\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n# 1️⃣ Tüm validation setini tahmin et\nvalidation_generator.reset()\ny_pred = model.predict(validation_generator, steps=validation_generator.samples // validation_generator.batch_size + 1)\ny_pred_class = (y_pred > 0.5).astype(int).flatten()\n\n# 2️⃣ Gerçek etiketleri al\ny_true = validation_generator.classes\n\n# 3️⃣ Confusion Matrix\ncm = confusion_matrix(y_true, y_pred_class)\nplt.figure(figsize=(6,6))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Cat','Dog'], yticklabels=['Cat','Dog'])\nplt.xlabel('Predicted')\nplt.ylabel('Actual')\nplt.title('Confusion Matrix')\nplt.show()\n\n# 4️⃣ Classification Report\nprint(classification_report(y_true, y_pred_class, target_names=['Cat','Dog']))\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Grad-CAM ile Modelin Görsel Açıklamasını İnceleme\n\nAçıklama:\nBu bölümde, modelin bir tahmini yaparken görüntüde hangi bölgelere odaklandığını görselleştirmek için Grad-CAM yöntemi kullanılır. Grad-CAM, özellikle CNN tabanlı sınıflandırma modellerinde, karar verme sürecini yorumlamamıza yardımcı olur.\n\nAdımlar:\n\n1️⃣ Örnek Görüntü Seçimi:\n\nValidation setinden örnek bir görüntü alınır ve modelin beklediği boyuta (150x150) ölçeklenir.\n\nGörüntü array’e dönüştürülür ve normalize edilir.\n\n2️⃣ Modeli Çağırma:\n\nModel bir kez çalıştırılarak input-output yapılandırılır.\n\n3️⃣ Son Conv2D Katmanı Seçimi:\n\nGrad-CAM için son Conv2D katmanı (conv2d_3) hedef alınır.\n\n4️⃣ Grad-CAM Modeli Oluşturma:\n\nOrijinal modelin input’u ile son conv layer ve output’u alan yeni bir model tanımlanır.\n\n5️⃣ Grad-CAM Hesaplama:\n\nSeçilen katmandaki feature map’lerin ağırlıklı ortalaması alınarak heatmap oluşturulur.\n\nHeatmap normalize edilerek 0-1 aralığına getirilir.\n\n6️⃣ Heatmap’i Orijinal Görüntüye Uygulama:\n\nHeatmap, orijinal görüntü boyutuna ölçeklenir.\n\nGörüntü ile heatmap birleştirilir (addWeighted) ve renkli olarak görselleştirilir.\n\n7️⃣ Görselleştirme:\n\nSonuç, matplotlib ile gösterilir.\n\nBu sayede modelin hangi bölgeleri dikkate alarak “cat” veya “dog” sınıfını tahmin ettiğini gözlemleyebiliriz.","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport cv2\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n# 1️⃣ Örnek bir validation görüntüsü al\ntest_img_path = validation_generator.filepaths[0]  # ilk validation görüntüsü\nimg = tf.keras.preprocessing.image.load_img(test_img_path, target_size=(150,150))\nimg_array = tf.keras.preprocessing.image.img_to_array(img)\nimg_array = np.expand_dims(img_array, axis=0)/255.0\n\n# 2️⃣ Modeli bir kere çağır (input/output oluşturmak için)\n_ = model(img_array)\n\n# 3️⃣ Son Conv2D layer'i seç\nlast_conv_layer = model.get_layer('conv2d_3')\n\n# 4️⃣ Grad-CAM modeli oluştur\ngrad_model = tf.keras.models.Model(\n    inputs=model.layers[0].input,        # İlk layer input\n    outputs=[last_conv_layer.output, model.layers[-1].output]  # Conv layer ve final output\n)\n\n# 5️⃣ Grad-CAM hesapla\nwith tf.GradientTape() as tape:\n    conv_outputs, predictions = grad_model(img_array)\n    loss = predictions[:,0]\n\ngrads = tape.gradient(loss, conv_outputs)\npooled_grads = tf.reduce_mean(grads, axis=(0,1,2))\nconv_outputs = conv_outputs[0]\n\nheatmap = tf.reduce_sum(tf.multiply(pooled_grads, conv_outputs), axis=-1)\nheatmap = np.maximum(heatmap, 0)\nheatmap /= tf.reduce_max(heatmap)\nheatmap = heatmap.numpy()\n\n# 6️⃣ Orijinal görüntü üzerine uygula\nimg = cv2.imread(test_img_path)\nimg = cv2.resize(img, (150,150))\nheatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))\nheatmap = np.uint8(255*heatmap)\nheatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)\nsuperimposed_img = cv2.addWeighted(img, 0.6, heatmap, 0.4, 0)\n\n# 7️⃣ Görselleştir\nplt.figure(figsize=(6,6))\nplt.imshow(cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB))\nplt.axis('off')\nplt.title('Grad-CAM')\nplt.show()\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Validation Set Üzerinde Performans Değerlendirmesi\n\nAçıklama:\nBu bölümde, eğitilmiş modelin validation (doğrulama) seti üzerindeki performansı ölçülür. Performans ölçümleri, sınıflandırma problemlerinde yaygın olarak kullanılan confusion matrix ve classification report ile yapılır.\n\nAdımlar:\n\n1️⃣ Tahmin Yapma:\n\nValidation generator’dan bir batch görüntü ve etiket alınır.\n\nModel bu görüntüler için tahminler üretir ve 0.5 eşik değeri ile sınıf etiketine dönüştürülür.\n\n2️⃣ Confusion Matrix Oluşturma ve Görselleştirme:\n\nconfusion_matrix fonksiyonu ile gerçek ve tahmin edilen etiketler karşılaştırılır.\n\nSeaborn ile ısı haritası şeklinde görselleştirilir.\n\nBu sayede modelin hangi sınıfları doğru veya yanlış tahmin ettiği kolayca gözlemlenir.\n\n3️⃣ Classification Report:\n\nclassification_report ile precision, recall, f1-score ve accuracy gibi metrikler hesaplanır ve sınıflar bazında raporlanır.\n\nModelin doğruluk ve dengeli tahmin yeteneği değerlendirilir.","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import classification_report, confusion_matrix\nimport seaborn as sns\n\n# 1️⃣ Validation set üzerinde tahmin yap\nval_images, val_labels = next(validation_generator)\npreds = model.predict(val_images)\npred_labels = (preds > 0.5).astype(int)\n\n# 2️⃣ Confusion Matrix\ncm = confusion_matrix(val_labels, pred_labels)\nplt.figure(figsize=(6,5))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Cat','Dog'], yticklabels=['Cat','Dog'])\nplt.xlabel('Tahmin')\nplt.ylabel('Gerçek')\nplt.title('Confusion Matrix')\nplt.show()\n\n# 3️⃣ Classification Report\nprint(classification_report(val_labels, pred_labels, target_names=['Cat','Dog']))\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Modelin Öğrenme Hızını Değiştirerek Yeniden Eğitilmesi\n\nAçıklama:\nBu bölümde, modelin eğitim sürecinde learning rate (öğrenme hızı) değiştirilerek modelin performansını iyileştirme amaçlanır. Learning rate, modelin ağırlık güncellemelerinin büyüklüğünü belirler; çok yüksek veya çok düşük olması öğrenmeyi olumsuz etkileyebilir.\n\nAdımlar:\n\n1️⃣ Modelin Yeniden Derlenmesi:\n\nAdam optimizasyon algoritması kullanılır ve learning rate 5e-5 olarak ayarlanır.\n\nKayıp fonksiyonu olarak binary_crossentropy, performans metriği olarak accuracy seçilir.\n\n2️⃣ Modelin Yeniden Eğitilmesi:\n\nfit fonksiyonu ile model tekrar eğitilir.\n\nTraining ve validation generator’ları kullanılır, batch sayısı ve epoch sayısı ayarlanır.\n\nBu sayede model daha düşük bir öğrenme hızıyla daha dengeli bir şekilde optimize edilir.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.optimizers import Adam\n\n# Yeni model ile learning_rate değişikliği\nmodel.compile(\n    loss='binary_crossentropy',\n    optimizer=Adam(learning_rate=5e-5),\n    metrics=['accuracy']\n)\n\n# Yeniden eğit\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // train_generator.batch_size,\n    validation_data=validation_generator,\n    validation_steps=validation_generator.samples // validation_generator.batch_size,\n    epochs=10\n)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**OPSİYONEL İŞLEMLER**","metadata":{}},{"cell_type":"markdown","source":"**TensorBoard ile eğitim izleme**\n\nAçıklama:\nBu bölümde, modelin eğitim sürecini TensorBoard kullanarak görselleştirmek amaçlanır. TensorBoard, loss, accuracy ve diğer metriklerin eğitim sırasında nasıl değiştiğini takip etmeye olanak sağlar.\n\nAdımlar:\n\n1️⃣ TensorBoard Callback Oluşturma:\n\nTensorBoard callback’i için log dizini, tarih ve saat ile benzersiz bir şekilde oluşturulur.\n\nhistogram_freq=1 parametresi, her epoch sonunda ağırlık histogramlarını kaydeder.\n\n2️⃣ Modeli Callback ile Eğitme:\n\nfit fonksiyonu çağrılırken callbacks parametresine TensorBoard callback’i eklenir.\n\nBu sayede eğitim sırasında metrikler ve ağırlık değişimleri TensorBoard üzerinden görselleştirilebilir.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.callbacks import TensorBoard\nimport datetime\n\nlog_dir = \"logs/fit/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\ntensorboard_callback = TensorBoard(log_dir=log_dir, histogram_freq=1)\n\n# Modeli tekrar eğitirken callback ekle\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=train_generator.samples // train_generator.batch_size,\n    validation_data=validation_generator,\n    validation_steps=validation_generator.samples // validation_generator.batch_size,\n    epochs=20,\n    callbacks=[tensorboard_callback]\n)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Test seti üzerinden değerlendirme**\n\nAçıklama:\nBu bölümde, önceden eğitilmiş model test veri seti üzerinde değerlendirilir. Test seti model tarafından daha önce görülmemiş verileri içerir ve modelin genelleme performansını ölçmek için kullanılır.\n\nAdımlar:\n\n1️⃣ Test Verisi İçin Data Generator Oluşturma:\n\nImageDataGenerator ile test görüntüleri normalize edilir (rescale=1./255).\n\nflow_from_directory fonksiyonu ile test klasörü okunur, shuffle kapatılır (shuffle=False) çünkü sıralamayı korumak önemlidir.\n\n2️⃣ Model ile Tahmin Yapma:\n\npredict fonksiyonu kullanılarak test görüntüleri için olasılık tahminleri (y_pred_prob) alınır.\n\nOlasılıklar 0.5 eşik değeri ile binary sınıflara (y_pred) dönüştürülür.\n\n3️⃣ Performans Değerlendirmesi:\n\nconfusion_matrix ve classification_report ile modelin precision, recall, f1-score ve accuracy değerleri hesaplanır ve sınıflar bazında değerlendirilir.","metadata":{}},{"cell_type":"code","source":"# Test generator\ntest_datagen = ImageDataGenerator(rescale=1./255)\ntest_dir = '/kaggle/working/test'  \ntest_generator = test_datagen.flow_from_directory(\n    test_dir,\n    target_size=(150, 150),\n    batch_size=32,\n    class_mode='binary',\n    shuffle=False\n)\n\n# Tahmin\ny_pred_prob = model.predict(test_generator)\ny_pred = (y_pred_prob > 0.5).astype(int)\n\n# Confusion Matrix ve Classification Report\nprint(confusion_matrix(test_generator.classes, y_pred))\nprint(classification_report(test_generator.classes, y_pred))\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Ek veri augmentasyonu**\n\nAçıklama:\nBu kod bloğunda, eğitim veri seti için gelişmiş veri artırma (data augmentation) uygulanır. Veri artırma, modelin genelleme yeteneğini artırmak ve overfitting’i azaltmak için kullanılır.\n\nAdımlar ve Parametreler:\n\nrescale=1./255: Piksel değerlerini 0–1 aralığına normalize eder.\n\nrotation_range=40: Görseller rastgele ±40 derece döndürülür.\n\nwidth_shift_range=0.2, height_shift_range=0.2: Görseller yatay ve dikey olarak %20 kaydırılır.\n\nshear_range=0.2: Shear transformasyonu uygulanır.\n\nzoom_range=0.2: Görseller %20 oranında yakınlaştırılır veya uzaklaştırılır.\n\nhorizontal_flip=True: Görseller yatay olarak rastgele çevrilir.\n\nbrightness_range=[0.8,1.2]: Görsellerin parlaklığı rastgele ayarlanır (opsiyonel ekleme).\n\nfill_mode='nearest': Transformasyon sonucu oluşan boş pikseller en yakın komşu piksellerle doldurulur.\n\nvalidation_split=0.2: Eğitim setinin %20’si doğrulama (validation) için ayrılır.","metadata":{}},{"cell_type":"code","source":"train_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    brightness_range=[0.8,1.2],  # opsiyonel ekleme\n    fill_mode='nearest',\n    validation_split=0.2\n)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Hiperparametre optimizasyonu**\n\nAçıklama:\nBu kod bloğunda, modelin performansını artırmak için hiperparametre optimizasyonu yapılır. Keras Tuner kullanılarak, farklı konvolüsyon filtre sayıları ve öğrenme oranları denenebilir.\n\nAdımlar ve Açıklamalar:\n\nhp.Int('conv_1_filter', 32, 128, step=32): İlk Conv2D katmanındaki filtre sayısını 32’den 128’e kadar adım adım denemek için hiperparametre tanımlanır.\n\nhp.Choice('learning_rate', [1e-2, 1e-3, 1e-4]): Farklı öğrenme oranları (learning rate) için seçim yapılır.\n\nSequential model: Standart CNN yapısı oluşturulur.\n\nFlatten + Dense(512, activation='relu') + Dense(1, activation='sigmoid'): Binary sınıflandırma için tam bağlantılı katmanlar eklenir.\n\ncompile: Model, seçilen hiperparametrelerle derlenir (optimizer, loss, metrics).","metadata":{}},{"cell_type":"code","source":"from kerastuner.tuners import RandomSearch\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras import layers, models\n\ndef build_model(hp):\n    model = models.Sequential()\n    model.add(layers.Conv2D(\n        filters=hp.Int('conv_1_filter', 32, 128, step=32),\n        kernel_size=(3,3),\n        activation='relu',\n        input_shape=(150,150,3)\n    ))\n    # Diğer katmanlar benzer şekilde hp ile\n    model.add(layers.Flatten())\n    model.add(layers.Dense(512, activation='relu'))\n    model.add(layers.Dense(1, activation='sigmoid'))\n    model.compile(\n        optimizer=Adam(hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),\n        loss='binary_crossentropy',\n        metrics=['accuracy']\n    )\n    return model\n\n# RandomSearch veya GridSearch ile tuner tanımlanabilir\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def build_model(hp):\n    model = models.Sequential()\n    \n    # Conv Layer 1\n    model.add(layers.Conv2D(\n        filters=hp.Int('conv_1_filter', 32, 64, step=32),\n        kernel_size=(3,3),\n        activation='relu',\n        input_shape=(150,150,3)\n    ))\n    model.add(layers.MaxPooling2D(2,2))\n    \n    # Conv Layer 2\n    model.add(layers.Conv2D(\n        filters=hp.Int('conv_2_filter', 32, 128, step=32),\n        kernel_size=(3,3),\n        activation='relu'\n    ))\n    model.add(layers.MaxPooling2D(2,2))\n    \n    # Conv Layer 3\n    model.add(layers.Conv2D(\n        filters=hp.Int('conv_3_filter', 64, 128, step=32),\n        kernel_size=(3,3),\n        activation='relu'\n    ))\n    model.add(layers.MaxPooling2D(2,2))\n    \n    # Flatten ve Dropout\n    model.add(layers.Flatten())\n    model.add(layers.Dropout(0.5))\n    \n    # Daha küçük Dense katmanı\n    model.add(layers.Dense(hp.Int('dense_units', 128, 256, step=64), activation='relu'))\n    \n    model.add(layers.Dense(1, activation='sigmoid'))\n    \n    model.compile(\n        optimizer=Adam(hp.Choice('learning_rate', [1e-3, 5e-4, 1e-4])),\n        loss='binary_crossentropy',\n        metrics=['accuracy']\n    )\n    \n    return model\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tuner = RandomSearch(\n    build_model,\n    objective='val_accuracy',\n    max_trials=5,            # Hafif denemeler\n    executions_per_trial=1,  # Her trial için 1 kez çalıştır\n    directory='ktuner',\n    project_name='dogs_vs_cats'\n)\n\ntuner.search(\n    train_generator,\n    validation_data=validation_generator,\n    epochs=5                  # Kısa epoch ile test\n)\n","metadata":{"trusted":true,"execution":{"execution_failed":"2025-09-26T17:21:13.255Z"}},"outputs":[],"execution_count":null}]}