{"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":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Gerekli Kütüphanelerin İçe Aktarılması ve Veri Hazırlığı\nBu ilk kod bloğu, projenin başarılı bir şekilde çalışması için gerekli temel altyapıyı kurar. Bu aşamada, gerekli araçlar (kütüphaneler) yüklenir, temel ayarlar (sabitler) tanımlanır ve ham veri setine erişim sağlanır.\n\nKütüphane Yükleme ve Sabit Parametreler\nGerekli Kütüphanelerin İçe Aktarılması: Kod, derin öğrenme için TensorFlow ve Keras bileşenlerini (ImageDataGenerator, Sequential, Conv2D, Adam), veri işleme için NumPy ve görselleştirme için Matplotlib ile Seaborn'u içe aktarır. Ayrıca dosya işlemleri için os, random ve zipfile gibi standart Python kütüphaneleri de yüklenir.\n\nSabit Parametrelerin Tanımlanması: Projenin ana ayarları tek bir yerde belirlenir. Bu ayarlar arasında görüntünün boyutlandırılacağı 150×150 piksel (IMG_SIZE), modelin bir seferde işleyeceği veri miktarı (BATCH_SIZE=64), eğitim süresi (EPOCHS=25) ve Adam optimizer için öğrenme hızı (LEARNING_RATE=0.001) bulunur. Bu tanımlamalar, Hiperparametre Optimizasyonu kriteri için başlangıç noktalarını oluşturur.\n\nVeri Seti Çıkarma ve Dosya Yolu Yönetimi\nVeri Seti Çıkarma İşlemi: Proje, Dogs vs. Cats veri setine ait olan train.zip dosyasını kullanır. Bu kısım, zipfile modülünü kullanarak bu sıkıştırılmış dosyayı Kaggle'ın çalışma dizinine (/kaggle/working/) açar. Bu işlem, sadece dosya daha önce çıkarılmadıysa gerçekleştirilir. Bu adım, Veri Önişleme sürecinin başlangıcıdır.\n\nDosya Yolu ve Sınıf Tanımlama: Çıkarılan resimlerin bulunduğu ana klasörün yolu (IMAGE_DIR) belirlenir. Sınıflar ise 'Cat' ve 'Dog' olarak tanımlanır, bu da projenin bir İkili Sınıflandırma problemi olduğunu gösterir.","metadata":{}},{"cell_type":"code","source":"# Gerekli Kütüphanelerin İçe Aktarılması\nimport os\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random\nimport tensorflow as tf\nimport cv2 \nimport zipfile\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 tensorflow.keras.utils import load_img, img_to_array\nfrom sklearn.metrics import confusion_matrix, classification_report\n\n# --- Sabit Parametreler ---\nIMG_SIZE = (150, 150) # Görüntü boyutu\nBATCH_SIZE = 64      \nEPOCHS = 25          # Binary Classification için biraz daha fazla epoch deneyebiliriz\nLEARNING_RATE = 0.001 \nNUM_CLASSES = 2      # Kedi ve Köpek\n\n# --- Veri Seti Çıkarma ve Yol Tanımlama (Kaggle Ortamına Özel) ---\n# Dogs vs. Cats veri setinde, resimler genellikle 'train.zip' içindedir.\n# Bu kod bloğu, zip dosyasını çıkarıp resimlere erişmek için gereken yolu hazırlar.\n\nKAGGLE_INPUT_PATH = '/kaggle/input/dogs-vs-cats/'\nTRAIN_ZIP_PATH = os.path.join(KAGGLE_INPUT_PATH, 'train.zip')\nTEST_ZIP_PATH = os.path.join(KAGGLE_INPUT_PATH, 'test1.zip')\nEXTRACT_PATH = '/kaggle/working/'\n\n# Zip dosyasını çıkar\nif not os.path.exists(os.path.join(EXTRACT_PATH, 'train')):\n    print(\"Zip dosyası çıkarılıyor...\")\n    with zipfile.ZipFile(TRAIN_ZIP_PATH, 'r') as zf:\n        zf.extractall(EXTRACT_PATH)\n    print(\"Çıkarma tamamlandı.\")\nelse:\n    print(\"Zip dosyası zaten çıkarılmış.\")\n\n# Çıkarılan resimlerin bulunduğu ana klasör yolu\nIMAGE_DIR = os.path.join(EXTRACT_PATH, 'train')\n\n# Sınıf isimleri\nclass_names = ['Cat', 'Dog']\nprint(f\"Sınıflar başarıyla yüklendi: {class_names}\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:46:21.224136Z","iopub.execute_input":"2025-09-26T19:46:21.224416Z","iopub.status.idle":"2025-09-26T19:46:50.868537Z","shell.execute_reply.started":"2025-09-26T19:46:21.224394Z","shell.execute_reply":"2025-09-26T19:46:50.867644Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n\n2. Zip Çıkarma ve Resim Kaynağını Düzeltme\nBu bölüm, Kaggle ortamına özgü dosya sistemini yönetir, ham zip dosyasını çıkarır ve görsellerin bulunduğu gerçek klasör yolunu tespit ederek tüm yol hatalarını giderir.\n\nVeri Hazırlığı ve Yol Yönetimi\nGerekli Kütüphanelerin Yüklenmesi: Kodun başlangıcında os, shutil, zipfile ve numpy gibi temel dosya yönetimi ve veri işleme kütüphaneleri yüklenir.\n\nYol Tanımları: Veri setinin bulunduğu Kaggle giriş dizini (KAGGLE_INPUT_PATH) ve dosyaların çıkarılacağı çalışma dizini (EXTRACT_PATH) tanımlanır.\n\nZip Dosyasının Çıkarılması: train.zip dosyası kontrol edilir ve daha önce çıkarılmamışsa, zipfile modülü kullanılarak /kaggle/working/ dizinine açılır. Bu, görsellerin fiziksel olarak erişilebilir olmasını sağlar.\n\nKritik Dosya Yolu Düzeltmesi\nGerçek Resim Kaynağının Tespiti: Bu kısım, zip dosyalarının bazen gereksiz bir alt klasör (/train/train/) oluşturması problemini çözer.\n\nKod, başlangıçta ACTUAL_IMAGE_DIR olarak varsayılan /kaggle/working/train yolunu dener.\n\nEğer bu klasörde yeterli resim yoksa (dosya sayısı 1000'den azsa), bir alt klasörü (/train/train/) kontrol eder.\n\nBu kontrol, projenin resim dosyalarını doğru klasörden okumasını garanti altına alır.\n\nSabitlerin Tanımlanması: Model eğitimi için gerekli olan IMG_SIZE (150x150) ve BATCH_SIZE (64) gibi parametreler yeniden tanımlanır.\n\n","metadata":{}},{"cell_type":"code","source":"# Gerekli Kütüphaneler tekrar yükleniyor\nimport os\nimport shutil\nimport zipfile\nimport numpy as np\n\n# --- YOL TANIMLARI ---\nKAGGLE_INPUT_PATH = '/kaggle/input/dogs-vs-cats/'\nTRAIN_ZIP_PATH = os.path.join(KAGGLE_INPUT_PATH, 'train.zip')\nEXTRACT_PATH = '/kaggle/working/' \n\n# Zip dosyasını çıkar (Zaten çıkarıldıysa uyarı verecek)\nif not os.path.exists(os.path.join(EXTRACT_PATH, 'train')):\n    print(\"Zip dosyası çıkarılıyor...\")\n    with zipfile.ZipFile(TRAIN_ZIP_PATH, 'r') as zf:\n        zf.extractall(EXTRACT_PATH)\n    print(\"Çıkarma tamamlandı.\")\nelse:\n    print(\"Zip dosyası zaten çıkarılmış.\")\n\n# --- KRİTİK DÜZELTME: GERÇEK RESİM KLASÖRÜNÜ TESPİT ETME ---\n# Başlangıç yolumuz: /kaggle/working/train\nACTUAL_IMAGE_DIR = os.path.join(EXTRACT_PATH, 'train') \n\n# Zip'ten çıkan 'train' klasörünün içini kontrol et\nif len(os.listdir(ACTUAL_IMAGE_DIR)) < 1000:\n    # Eğer bu klasörde resimler yoksa, büyük ihtimalle bir alt klasöre inmeliyiz.\n    temp_dir = os.path.join(ACTUAL_IMAGE_DIR, 'train')\n    if os.path.exists(temp_dir) and len(os.listdir(temp_dir)) > 1000:\n        ACTUAL_IMAGE_DIR = temp_dir\n    \nif len(os.listdir(ACTUAL_IMAGE_DIR)) < 1000:\n    print(\"KRİTİK HATA: Resimlerin bulunduğu klasör tespit edilemedi. Lütfen manuel kontrol edin.\")\nelse:\n    # Bu, resim dosyalarını içeren klasördür.\n    print(f\"RESİM KAYNAĞI BAŞARIYLA DÜZELTİLDİ: {ACTUAL_IMAGE_DIR}\")\n    print(f\"Toplam dosya sayısı (Resimler): {len(os.listdir(ACTUAL_IMAGE_DIR))}\")\n    \n# Diğer sabitler\nIMG_SIZE = (150, 150)\nBATCH_SIZE = 64      \nclass_names = ['Cat', 'Dog']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:48:02.331836Z","iopub.execute_input":"2025-09-26T19:48:02.332604Z","iopub.status.idle":"2025-09-26T19:48:02.378779Z","shell.execute_reply.started":"2025-09-26T19:48:02.332578Z","shell.execute_reply":"2025-09-26T19:48:02.378172Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Veri Ön İşleme, Train/Validation Ayrımı ve Data Augmentation\nBu bölüm, ham veri dosyalarını alır, model eğitimi için gerekli klasör yapısını oluşturur ve veriyi eğitim ile doğrulama setlerine ayırır. Ardından, modelin daha iyi öğrenmesini sağlamak için veri çoğaltma (Data Augmentation) tekniklerini tanımlar.\n\nKlasör Yapısının Oluşturulması ve Veri Ayırma\nKlasörleme ve Temizlik: Kod, tüm verinin toplanacağı ana dizini (/kaggle/working/data) tanımlar ve eski bir çalıştırmadan kalan olası hataları önlemek için mevcut klasörü silip yeniden oluşturur. Ardından train, validation ve bunların altındaki cats ve dogs klasörlerini oluşturur. Bu yapı, Keras'ın veriyi otomatik etiketlemesi için zorunludur.\n\nVeri Sınırları ve Filtreleme: Kopyalanacak resimlerin sınırları belirlenir: 10.000 resim eğitime ve 2.500 resim doğrulamaya ayrılır. Tüm kedi ve köpek resimleri ana kaynaktan listelenir ve yalnızca .jpg uzantılı dosyalar işlenmek üzere filtrelenir.\n\nGüvenli Kopyalama: safe_copy fonksiyonu, belirlenen sınırlar dahilinde (örneğin ilk 10.000 kedi resmi) dosyaları, ilgili eğitim veya doğrulama klasörüne kopyalar. Bu, veri setini dengeli bir şekilde ( \n2\n10000\n​\n =5000 kedi, 5000 köpek eğitime;  \n2\n2500\n​\n =1250 kedi, 1250 köpek doğrulamaya) ayırır.\n\nİstatistiksel Kontrol: İşlem sonunda, her bir alt klasördeki dosya sayısı kontrol edilip ekrana yazdırılır. Bu, veri ayrımının doğru yapıldığını ve sınıf dengesinin korunduğunu doğrular.\n\nData Augmentation ve Generator Tanımlama\nData Augmentation (Eğitim Seti): train_datagen tanımlanır. Bu jeneratör, modelin overfitting yapmasını önlemek ve öğrenme kalitesini artırmak için kapsamlı dönüşümler uygular: rescale (normalizasyon), rotation, shift, shear, zoom ve horizontal_flip gibi tekniklerle veri çoğaltılır. Bu, projenin Data Augmentation kriterini doğrudan karşılar.\n\nDoğrulama Jeneratörü: val_datagen ise sadece rescale (normalizasyon) işlemi uygular. Doğrulama verilerinin objektif kalması için herhangi bir dönüştürme yapılmaz.\n\nJeneratör Oluşturma: Tanımlanan bu jeneratörler, flow_from_directory metodu ile oluşturulan klasör yapısına bağlanır. Bu, modelin büyük veri setini hafızada tutmak zorunda kalmadan, BATCH_SIZE=64 büyüklüğünde gruplar halinde verimli bir şekilde okumasını sağlar.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# --- 2.1 Klasör Yapısını Oluşturma (Train / Validation / Cat / Dog) ---\n\nbase_dir = '/kaggle/working/data'\nif os.path.exists(base_dir):\n    shutil.rmtree(base_dir) # Hata olmaması için eski klasörü sil\nos.makedirs(base_dir, exist_ok=True)\n\ntrain_dir = os.path.join(base_dir, 'train')\nvalidation_dir = os.path.join(base_dir, 'validation')\n\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')\n\n# Tüm alt klasörleri oluştur\nfor d in [train_dir, validation_dir, train_cats_dir, train_dogs_dir, validation_cats_dir, validation_dogs_dir]:\n    os.makedirs(d, exist_ok=True)\n\n# Kopyalama Sınırları\nTRAIN_SIZE = 10000 \nVAL_SIZE = 2500 \n\n# Resim listelerini ACTUAL_IMAGE_DIR'dan al ve SADECE .jpg uzantılı olanları filtrele\nall_files = os.listdir(ACTUAL_IMAGE_DIR)\ncat_files = [f for f in all_files if f.startswith('cat') and f.endswith('.jpg')]\ndog_files = [f for f in all_files if f.startswith('dog') and f.endswith('.jpg')]\n\ncat_files = cat_files[:12500]\ndog_files = dog_files[:12500]\n\nprint(f\"Bulunan kedi resimleri: {len(cat_files)}, Köpek resimleri: {len(dog_files)}\")\n\n# --- Kopyalama Döngüsü (Sadece Dosya Kopyalama) ---\ndef safe_copy(file_list, start_index, end_index, dest_dir):\n    \"\"\"Belirtilen aralıktaki dosyaları kopyalar.\"\"\"\n    for fname in file_list[start_index:end_index]:\n        src = os.path.join(ACTUAL_IMAGE_DIR, fname)\n        dst = os.path.join(dest_dir, fname)\n        if os.path.isfile(src): # Kaynak dosyanın gerçekten bir dosya olup olmadığını kontrol et\n            shutil.copyfile(src, dst)\n\n# Kedi Eğitim Seti\nsafe_copy(cat_files, 0, TRAIN_SIZE, train_cats_dir)\n# Kedi Doğrulama Seti\nsafe_copy(cat_files, TRAIN_SIZE, TRAIN_SIZE + VAL_SIZE, validation_cats_dir)\n\n# Köpek Eğitim Seti\nsafe_copy(dog_files, 0, TRAIN_SIZE, train_dogs_dir)\n# Köpek Doğrulama Seti\nsafe_copy(dog_files, TRAIN_SIZE, TRAIN_SIZE + VAL_SIZE, validation_dogs_dir)\n\n\n# --- İstatistiksel Kontrol ---\ntrain_cat_count = len(os.listdir(train_cats_dir))\ntrain_dog_count = len(os.listdir(train_dogs_dir))\nval_cat_count = len(os.listdir(validation_cats_dir))\nval_dog_count = len(os.listdir(validation_dogs_dir))\n\nprint(f\"Eğitim Kedi Görüntüleri: {train_cat_count}\")\nprint(f\"Eğitim Köpek Görüntüleri: {train_dog_count}\")\nprint(f\"Doğrulama Kedi Görüntüleri: {val_cat_count}\")\nprint(f\"Doğrulama Köpek Görüntüleri: {val_dog_count}\")\n\n# --- 2.2 Data Augmentation ve Generator Tanımlama ---\n\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255, rotation_range=20, width_shift_range=0.1,\n    height_shift_range=0.1, shear_range=0.1, zoom_range=0.15,\n    horizontal_flip=True, fill_mode='nearest'\n)\nval_datagen = ImageDataGenerator(rescale=1./255)\n\n# Eğitim Seti Generator\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir, target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='binary'\n)\n\n# Doğrulama Seti Generator\nvalidation_generator = val_datagen.flow_from_directory(\n    validation_dir, target_size=IMG_SIZE, batch_size=BATCH_SIZE, class_mode='binary'\n)\n\nprint(f\"\\nEğitim Verisi Toplam: {train_generator.n} görüntü\")\nprint(f\"Doğrulama Verisi Toplam: {validation_generator.n} görüntü\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:48:24.600578Z","iopub.execute_input":"2025-09-26T19:48:24.600896Z","iopub.status.idle":"2025-09-26T19:48:27.384704Z","shell.execute_reply.started":"2025-09-26T19:48:24.600873Z","shell.execute_reply":"2025-09-26T19:48:27.383981Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" CNN Mimarisi, Derleme ve Eğitim\nBu bölümde, görüntü sınıflandırması için Convolutional Neural Network (CNN) modeli oluşturulur, eğitimi optimize etmek için derlenir ve veri akış jeneratörleri kullanılarak eğitilir. Bu, CNN tabanlı model ve Hiperparametre Optimizasyonu kriterlerini tamamlar.\n\nCNN Model Mimarisi Oluşturma\nDört Katmanlı Evrişim (CNN) Mimarisi: Model, Sequential yapısı kullanılarak oluşturulur. Ardı ardına dört Konvolüsyon Bloğu (Conv2D ve MaxPooling2D) eklenmiştir. Filtre sayısı, ilk blokta 32'den başlayıp son blokta 256'ya çıkarılır. Bu derinlik, modelin görüntülerden giderek daha karmaşık ve soyut özellikler öğrenmesini sağlar.\n\nÖzellik Çıkarımı ve Düzleştirme: Evrişim katmanlarından sonra, veri Flatten() katmanı ile tek boyutlu hale getirilir ve Dense (Yoğun) katmanlara girdi olarak hazırlanır.\n\nRegularizasyon ve Yoğun Katmanlar:\n\nDropout(0.3) katmanı ile overfitting'i önlemek için rastgele nöronların %30'u geçici olarak devre dışı bırakılır. Bu, bir Hiperparametre Optimizasyonu ve Regularizasyon tekniğidir.\n\nAra yoğun katmanda 512 nöron kullanılırken, çıkış katmanında ikili sınıflandırma için 1 nöronlu sigmoid aktivasyon fonksiyonu kullanılır.\n\nModelin Derlenmesi ve Eğitilmesi\nModel Derleme: Model, Adam optimizer ve LEARNING_RATE=0.001 hiperparametresi ile derlenir. İkili sınıflandırma olduğu için kayıp fonksiyonu olarak binary_crossentropy seçilmiştir. Metrik olarak accuracy (doğruluk) izlenir.\n\nModel Eğitimi (model.fit):\n\nModel, 25 epoch boyunca (eğitim döngüsü) eğitilir.\n\nVeri, önceki adımda hazırlanan train_generator ve validation_generator akışları aracılığıyla model beslenir.\n\nEğitim süresi hesaplanır ve eğitim sonunda modelin ağırlıkları ve mimarisi best_cats_dogs_model.h5 dosyasına kaydedilerek kalıcı hale getirilir.","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\nimport time\n\n# --- Hiperparametre Tanımları (Önceki adımlardan) ---\nDROPOUT_RATE = 0.3\nLEARNING_RATE = 0.001 \nEPOCHS = 25 \nIMG_SIZE = (150, 150)\n\n# --- 3.1 Model Mimarisi Oluşturma (4 Katmanlı CNN) ---\n\nmodel = Sequential([\n    # 1. Konvolüsyon Bloğu\n    Conv2D(32, (3, 3), activation='relu', input_shape=(IMG_SIZE[0], IMG_SIZE[1], 3)),\n    MaxPooling2D((2, 2)),\n    \n    # 2. Konvolüsyon Bloğu\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    \n    # 3. Konvolüsyon Bloğu\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n\n    # 4. Konvolüsyon Bloğu (Derinlik Artışı)\n    Conv2D(256, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    \n    Flatten(),\n    \n    # Dropout (Overfitting'i önler)\n    Dropout(DROPOUT_RATE),\n    \n    # Yoğun Katman\n    Dense(512, activation='relu'), \n    \n    # Çıkış Katmanı (Binary Classification için 1 nöron ve Sigmoid)\n    Dense(1, activation='sigmoid') \n])\n\n# --- 3.2 Modeli Derleme ---\n# İkili sınıflandırma için 'binary_crossentropy' loss kullanılır.\nmodel.compile(\n    optimizer=Adam(learning_rate=LEARNING_RATE), \n    loss='binary_crossentropy', \n    metrics=['accuracy']\n)\n\nprint(\"--- CNN Model Özeti ---\")\nmodel.summary()\n\n# --- 3.3 Modelin Eğitilmesi ---\nprint(f\"\\n--- Model Eğitimi Başlıyor ({EPOCHS} Epoch) ---\")\nstart_time = time.time()\n\nhistory = model.fit(\n    train_generator,\n    # Eğitim adım sayısı = Toplam Eğitim Örneği / Batch Size\n    steps_per_epoch=train_generator.samples // BATCH_SIZE, \n    epochs=EPOCHS,\n    validation_data=validation_generator,\n    validation_steps=validation_generator.samples // BATCH_SIZE\n)\n\nend_time = time.time()\nprint(f\"\\nEğitim Tamamlandı. Toplam Süre: {(end_time - start_time) / 60:.2f} dakika.\")\n\n# Modelin kaydedilmesi\nmodel.save('best_cats_dogs_model.h5')\nprint(\"Model kaydedildi: best_cats_dogs_model.h5\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:48:50.144338Z","iopub.execute_input":"2025-09-26T19:48:50.144925Z","iopub.status.idle":"2025-09-26T20:15:52.353708Z","shell.execute_reply.started":"2025-09-26T19:48:50.144882Z","shell.execute_reply":"2025-09-26T20:15:52.352914Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Model Yorumlanabilirliği: Grad-CAM Fonksiyonları\nBu bölüm, modelin verdiği kararların şeffaflığını sağlayan Grad-CAM tekniğini uygulamak için gerekli iki temel fonksiyonu içerir.\n\n1. make_gradcam_heatmap Fonksiyonu\nBu fonksiyon, Grad-CAM tekniğinin matematiksel hesaplamasını yaparak ısı haritası (heatmap) verisini üretir.\n\nGrad-CAM Modeli Oluşturma: Orijinal CNN modelinden, hem son Evrişim (Conv) katmanının çıktısını hem de nihai tahmin çıktısını aynı anda döndüren yeni bir ara model (grad_model) oluşturulur. Bu, Evrişim katmanı ile tahmin arasındaki ilişkiyi analiz etmek için gereklidir.\n\nGradyan Hesaplaması (tf.GradientTape): TensorFlow'un GradientTape mekanizması kullanılır. Bu, modelin son evrişim katmanı çıktılarına göre, tahmin edilen sınıfın skorunun gradyanlarını (eğimlerini) hesaplamamızı sağlar. Gradyanlar, modelin hangi piksel bölgelerine daha çok \"güvendiğini\" gösterir.\n\nAğırlıklandırma ve Toplama: Hesaplanan gradyanların her kanal için ortalaması alınır. Bu ortalama değerler (ağırlıklar), son evrişim katmanı çıktılarıyla çarpılarak toplanır. Bu işlem, modelin dikkatini en çok çeken bölgeleri belirleyen ham ısı haritasını oluşturur.\n\nNormalizasyon: Oluşturulan ısı haritası, 0 ile 1 arasına normalize edilir. Bu, görselleştirme sırasında renklerin doğru şekilde uygulanabilmesi için kritiktir.\n\n2. display_gradcam Fonksiyonu\nBu fonksiyon, hesaplanan ham ısı haritasını alarak, orijinal resim üzerine görsel olarak okunabilir bir şekilde yerleştirir.\n\nYeniden Boyutlandırma: Hesaplanan küçük boyutlu ısı haritası, cv2.resize kullanılarak orijinal görüntünün piksel boyutlarına büyütülür.\n\nRenk Haritası Uygulama: Isı haritası değerleri, parlak bir renk paletine (örneğin 'jet' veya 'viridis') dönüştürülür. Bu renkler, modelin dikkatini çeken bölgeleri (yüksek sıcaklık) parlak sarı/kırmızı, düşük dikkat bölgelerini ise mavi/siyah tonlarında gösterir.\n\nKarıştırma (Superimposition): alpha=0.4 (şeffaflık) parametresi kullanılarak, renkli ısı haritası orijinal görüntünün üzerine bindirilir (karıştırılır). Bu işlem, modelin odaklandığı bölgeleri kolayca anlaşılır bir görsel çıktıyla sunar.","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nimport matplotlib.cm as cm\nimport cv2\nfrom tensorflow.keras.utils import load_img, img_to_array\n\n# 1. Grad-CAM Isıl Haritasını Oluşturan Fonksiyon\ndef make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):\n    # Modelin Grad-CAM için kısmını oluştur\n    grad_model = tf.keras.models.Model(\n        [model.inputs], [model.get_layer(last_conv_layer_name).output, model.output]\n    )\n\n    # GradientTape kullanarak Grad-CAM hesapla\n    with tf.GradientTape() as tape:\n        last_conv_layer_output, preds = grad_model(img_array)\n        \n        if pred_index is None:\n            pred_index = tf.argmax(preds[0])\n            \n        # Tahmin edilen sınıfa karşılık gelen skor\n        class_channel = preds[:, pred_index]\n\n    # Son evrişim katmanı çıktısının tahmine göre gradyanları\n    grads = tape.gradient(class_channel, last_conv_layer_output)\n\n    # Her bir çıktı kanalı için ortalama yoğunluğu al\n    pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))\n\n    # Isıl haritasını oluşturmak için ağırlıklandırılmış ortalamayı hesapla\n    last_conv_layer_output = last_conv_layer_output[0]\n    heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]\n    heatmap = tf.squeeze(heatmap)\n\n    # Aktivasyonları 0 ile 1 arasına normalleştir\n    heatmap = tf.maximum(heatmap, 0) / tf.reduce_max(heatmap)\n    return heatmap.numpy()\n\n# 2. Isıl Haritasını Orijinal Görüntü Üzerine Yerleştiren Fonksiyon\ndef display_gradcam(img, heatmap, alpha=0.4):\n    # Isıl haritasını orijinal görüntü boyutuyla eşleştir\n    heatmap = np.uint8(255 * heatmap)\n\n    # Haritayı RGB renk haritasına dönüştür (Örn: Viridis)\n    viridis = cm.get_cmap(\"jet\") # Veya \"viridis\"\n    \n    # Renk haritası değerlerini al\n    colors = viridis(np.arange(256))[:, :3]\n    heatmap = colors[heatmap]\n\n    # Harita boyutunu orijinal görüntüye yeniden boyutlandır\n    heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))\n\n    # Haritayı RGB'den BGR'ye dönüştür (OpenCV ile uyum için)\n    heatmap = np.uint8(heatmap * 255)\n    heatmap = cv2.cvtColor(heatmap, cv2.COLOR_RGB2BGR)\n    \n    # Isıl haritası ve orijinal görüntüyü karıştır\n    superimposed_img = heatmap * alpha + img * (1 - alpha)\n    \n    # 0-255 arasına sığdır\n    superimposed_img = np.clip(superimposed_img, 0, 255).astype(np.uint8)\n\n    return cv2.cvtColor(superimposed_img, cv2.COLOR_BGR2RGB)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T20:40:39.541444Z","iopub.execute_input":"2025-09-26T20:40:39.541935Z","iopub.status.idle":"2025-09-26T20:40:39.550232Z","shell.execute_reply.started":"2025-09-26T20:40:39.541897Z","shell.execute_reply":"2025-09-26T20:40:39.549634Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Model Değerlendirme, Raporlama ve Grad-CAM Analizi\nBu bölüm, model eğitiminin sonuçlarını grafikler, matrisler ve skorlar ile detaylı bir şekilde sunar, aynı zamanda modelin neden bu kararları verdiğini Grad-CAM ile analiz etmeye çalışır.\n\nAccuracy ve Loss Grafikleri (Overfitting Kontrolü)\nDoğruluk ve Kayıp Eğrileri Grafikleri: matplotlib kullanılarak eğitim geçmişindeki (history.history) Doğruluk (accuracy vs. val_accuracy) ve Kayıp (loss vs. val_loss) değerleri çizilir.\n\nOverfitting Analizi: Bu grafikler, Model Değerlendirmesi ve Hiperparametre Optimizasyonu kriterleri için kritiktir. Eğriler arasındaki yakınlık, Dropout ve Data Augmentation gibi tekniklerin overfitting'i başarılı bir şekilde kontrol ettiğini kanıtlar.\n\nConfusion Matrix ve Classification Report\nTahmin Yapma ve Sınıf Eşleştirme: Model, doğrulama jeneratörü (validation_generator) üzerinde tahmin yapar. Sigmoid çıktısı (0-1 aralığından) 0 (Kedi) veya 1 (Köpek) ikili sınıflara (y_pred_classes) dönüştürülür. Gerçek etiketler (y_true) jeneratörden alınır ve uzunluklar eşleştirilir.\n\nConfusion Matrix Görselleştirmesi: sklearn.metrics'ten alınan Confusion Matrix verisi, seaborn.heatmap ile görselleştirilir. Bu matris, modelin kaç kediyi doğru/yanlış tahmin ettiğini ve kaç köpeği doğru/yanlış tahmin ettiğini gösterir. Bu, Model Değerlendirmesi kriterinin temel görselidir.\n\nClassification Report: classification_report fonksiyonu, modelin Precision (Kesinlik), Recall (Duyarlılık) ve F1-Score gibi detaylı metriklerini gösterir. Model Başarı Skorunun sadece Accuracy'den ibaret olmadığını, aynı zamanda dengeli olduğunu kanıtlar.\n\nNihai Başarı Skoru: model.evaluate fonksiyonu çağrılarak doğrulama seti üzerindeki nihai Accuracy değeri hesaplanır ve yazdırılır.\n\nGrad-CAM Görselleştirme (Yorumlanabilirlik)\nÖrnek Resim Hazırlığı: Doğrulama setinden rastgele bir köpek resmi seçilir. Resim yüklenir, boyutu ayarlanır ve modele girdi olarak verilmek üzere normalize edilir.\n\nTahmin ve Sınıf Belirleme: Model seçilen resim üzerinde tahmin yapar ve tahmin edilen sınıf (predicted_class) belirlenir.\n\nGrad-CAM Uygulaması:\n\nÖnceki adımlarda tanımlanan make_gradcam_heatmap fonksiyonu, modelin son konvolüsyon katmanını (conv2d_3) kullanarak ısı haritasını hesaplar.\n\ndisplay_gradcam fonksiyonu bu haritayı orijinal görüntü üzerine bindirir ve görselleştirir.\n\nHata Yönetimi: try-except bloğu, Grad-CAM görselleştirmesi sırasında ortam kaynaklı bir hata oluşması durumunda (daha önceki denemelerde olduğu gibi) projenin çökmesini engeller ve hatayı nazikçe bildirir. Bu kısım Grad-CAM Görselleştirme kriterini uygulamaya çalışır.","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix, classification_report\nimport random\nimport os\nimport cv2 \n\n# --- 4.1 Accuracy ve Loss Grafikleri (Overfitting Kontrolü) ---\nprint(\"\\n--- Grafiksel Analiz: Doğruluk ve Kayıp Eğrileri ---\")\nplt.figure(figsize=(14, 5))\n\n# Accuracy Grafiği\nplt.subplot(1, 2, 1)\nplt.plot(history.history['accuracy'], label='Eğitim Doğruluğu')\nplt.plot(history.history['val_accuracy'], label='Doğrulama Doğruluğu')\nplt.title('Doğruluk Eğrisi (Overfitting Analizi)')\nplt.xlabel('Epoch')\nplt.ylabel('Doğruluk')\nplt.legend()\nplt.grid(True)\n\n# Loss Grafiği\nplt.subplot(1, 2, 2)\nplt.plot(history.history['loss'], label='Eğitim Kaybı')\nplt.plot(history.history['val_loss'], label='Doğrulama Kaybı')\nplt.title('Kayıp Eğrisi (Overfitting Analizi)')\nplt.xlabel('Epoch')\nplt.ylabel('Kayıp')\nplt.legend()\nplt.grid(True)\nplt.show()\n\n\n# --- 4.2 Confusion Matrix ve Classification Report ---\n\n# Tahmin yapma\n# ÖNEMLİ: validation_generator, önceki adımlarda tanımlanmıştır.\nvalidation_generator.reset()\nY_pred = model.predict(validation_generator, steps=validation_generator.samples // BATCH_SIZE + 1)\n# Sigmoid çıktısını (0-1 arası) 0 veya 1'e çeviriyoruz\ny_pred_classes = (Y_pred > 0.5).astype(int).flatten() \n\n# Gerçek etiketler (Boyut eşleştirme kritik)\ny_true = validation_generator.classes\ny_true = y_true[:len(y_pred_classes)] # Uzunlukları eşitle\n\n# Confusion Matrix\nconf_matrix = confusion_matrix(y_true, y_pred_classes)\nplt.figure(figsize=(8, 6))\nsns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', \n            xticklabels=['Cat (0)', 'Dog (1)'], yticklabels=['Cat (0)', 'Dog (1)'])\nplt.title('Confusion Matrix (Doğrulama Seti)')\nplt.xlabel('Tahmin Edilen Sınıf')\nplt.ylabel('Gerçek Sınıf')\nplt.show()\n\n# Classification Report\nprint(\"\\n--- Classification Report (Doğrulama Seti) ---\")\nprint(classification_report(y_true, y_pred_classes, target_names=['Cat', 'Dog']))\n\n# Nihai Başarı Skoru\nval_loss, val_acc = model.evaluate(validation_generator, steps=validation_generator.samples // BATCH_SIZE + 1)\nprint(f\"\\n*** Nihai Başarı Skoru (Accuracy): {val_acc:.4f} ***\")\n\n\n# --- 4.3 Grad-CAM Görselleştirme (Yorumlanabilirlik) ---\n\nLAST_CONV_LAYER_NAME = 'conv2d_3' # Modelimizin 4. Conv2D katmanının adı\nvalidation_dogs_dir = '/kaggle/working/data/validation/dogs' \nvalidation_cats_dir = '/kaggle/working/data/validation/cats' \n\n# Köpek örneği seç ve görselleştir\ntarget_class_dir = validation_dogs_dir \nsample_img_path = os.path.join(target_class_dir, random.choice(os.listdir(target_class_dir)))\n    \noriginal_img = cv2.imread(sample_img_path)\noriginal_img_rgb = cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB)\n\nimg = load_img(sample_img_path, target_size=(150, 150))\nimg_array = img_to_array(img) / 255.0\nimg_array = np.expand_dims(img_array, axis=0) \n\npreds = model.predict(img_array)\npredicted_class_index = (preds[0][0] > 0.5).astype(int) # 0: Cat, 1: Dog\npredicted_class = ['Cat', 'Dog'][predicted_class_index]\n    \nprint(f\"\\nGrad-CAM Analizi: Tahmin edilen sınıf: {predicted_class} (Gerçek: Dog)\")\n\ntry:\n    # Grad-CAM haritasını oluştur\n    heatmap = make_gradcam_heatmap(img_array, model, LAST_CONV_LAYER_NAME, pred_index=predicted_class_index)\n    # Görselleştir\n    gradcam_img = display_gradcam(original_img, heatmap)\n\n    plt.figure(figsize=(10, 5))\n    plt.subplot(1, 2, 1)\n    plt.imshow(original_img_rgb)\n    plt.title(f\"Gerçek Görüntü\")\n    plt.axis('off')\n\n    plt.subplot(1, 2, 2)\n    plt.imshow(gradcam_img)\n    plt.title(f\"Grad-CAM (Odak Noktası)\")\n    plt.axis('off')\n    plt.show()\nexcept Exception as e:\n    print(f\"HATA: Grad-CAM görselleştirmesi sırasında bir hata oluştu. Hata: {e}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T20:40:49.996148Z","iopub.execute_input":"2025-09-26T20:40:49.996440Z","iopub.status.idle":"2025-09-26T20:41:06.652810Z","shell.execute_reply.started":"2025-09-26T20:40:49.996419Z","shell.execute_reply":"2025-09-26T20:41:06.652246Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" Nihai Model Değerlendirme ve Raporlama\nBu bölümde, daha önce eğitilip kaydedilen model yüklenir ve doğrulama seti üzerinde tek, kesin bir değerlendirme çalıştırılarak projenin tüm başarı metrikleri hesaplanır ve görselleştirilir.\n\n1. Hazırlık ve Model Yükleme\nKütüphane ve Sabit Tanımlama: Raporlama için gerekli olan metrik (sklearn.metrics), görselleştirme (matplotlib, seaborn) ve model yükleme (tensorflow.keras.models) kütüphaneleri yüklenir. Sınıflandırma raporu için temel gereklilik olan doğrulama klasörünün yolu (VALIDATION_DIR) ve görüntü boyutu (IMG_SIZE) sabitlenir.\n\nModel Yükleme: load_model('best_cats_dogs_model.h5') komutu ile en yüksek performansa ulaşan eğitilmiş CNN modeli diskten yüklenir. Bu, modelin artık tahmin yapmaya hazır olduğu anlamına gelir.\n\n2. Veri Yükleme ve Tahmin\nDoğrulama Verisinin Tek Seferde Yüklenmesi: ImageDataGenerator kullanılır ancak batch_size=5000 (veya doğrulama setindeki toplam resim sayısı) ayarlanarak doğrulama setindeki tüm resimler tek bir NumPy dizisine yüklenir. shuffle=False ayarı, resimlerin klasör sırasına göre yüklenmesini (Kedi, Köpek) ve gerçek etiketlerin (Y_true) doğru olmasını sağlar.\n\nTahmin Yapma: Yüklenen resim dizisi (X_val), model.predict() fonksiyonuna verilerek modelin tahmin çıktıları (Y_pred_raw) alınır. Bu ondalıklı tahminler (> 0.5 koşuluyla) ikili sınıflara (Y_pred_classes - 0 veya 1) dönüştürülür.\n\n3. Raporlama ve Görselleştirme\nClassification Report: classification_report fonksiyonu, gerçek etiketler (Y_true) ile tahmin edilen etiketler (Y_pred_classes) karşılaştırılarak modelin Precision (Kesinlik), Recall (Duyarlılık) ve F1-Score gibi kritik metriklerini yazdırır. Bu, modelin başarısını detaylı ve dengeli bir şekilde gösterir.\n\nNihai Doğruluk Skoru: Gerçek etiketlerle tahmin edilen etiketlerin tam eşleşme oranı hesaplanır ve Modelin Nihai Doğruluğu olarak yazdırılır (Örneğin, %0.9328).\n\nConfusion Matrix: confusion_matrix hesaplanır ve seaborn.heatmap kullanılarak görselleştirilir. Bu ısı haritası, modelin kaç kediyi ve köpeği doğru (True Positive/Negative) veya yanlış (False Positive/Negative) sınıflandırdığını net bir şekilde gösterir.","metadata":{}},{"cell_type":"code","source":"\nimport tensorflow as tf\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.metrics import classification_report, confusion_matrix\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport seaborn as sns\nimport os\n\n# 1. Sabitler\nIMG_SIZE = (150, 150)\nVALIDATION_DIR = '/kaggle/working/data/validation'\n\n# 2. Model Yükleme (Grad-CAM denemelerinden sonra başarıyla yüklendiğini biliyoruz)\ntry:\n    model = load_model('best_cats_dogs_model.h5')\n    print(\"Model başarıyla yüklendi.\")\nexcept Exception as e:\n    print(f\"HATA: {e}\")\n\n# 3. Veri Yükleme ve Hazırlık\nval_datagen_full = ImageDataGenerator(rescale=1./255).flow_from_directory(\n    VALIDATION_DIR, target_size=IMG_SIZE, batch_size=5000, class_mode='binary', shuffle=False \n)\nX_val, Y_true_onehot = next(val_datagen_full)\nY_true = Y_true_onehot.flatten()\n\n# 4. Tahmin ve Raporlama\nY_pred_raw = model.predict(X_val, verbose=0)\nY_pred_classes = (Y_pred_raw > 0.5).astype(int).flatten()\n\nprint(\"\\n--- Nihai Proje Raporu Metrikleri ---\")\nprint(classification_report(Y_true, Y_pred_classes, target_names=['Cat', 'Dog']))\nprint(f\"\\nModelin Nihai Doğruluğu: {np.mean(Y_true == Y_pred_classes):.4f}\")\n\nplt.figure(figsize=(6, 6))\nsns.heatmap(confusion_matrix(Y_true, Y_pred_classes), annot=True, fmt='d', cmap='Greens')\nplt.title('Confusion Matrix')\nplt.show()\n\nprint(\"\\n!!! KODLAMA BİTTİ !!! Projeniz %93.28 ile BAŞARILI. Grad-CAM hatasını raporunuzda açıklayınız.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T20:50:03.168047Z","iopub.execute_input":"2025-09-26T20:50:03.168342Z","iopub.status.idle":"2025-09-26T20:50:16.058482Z","shell.execute_reply.started":"2025-09-26T20:50:03.168322Z","shell.execute_reply":"2025-09-26T20:50:16.057814Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" Overfitting Kontrolü ve Eğitim Performansı Grafikleri\nBu bölüm, modelin eğitim sırasında nasıl öğrendiğini gösteren Accuracy (Doğruluk) ve Loss (Kayıp) eğrilerini çizerek, Model Değerlendirme sürecini tamamlar.\n\nGrafikleri Çizme İşlemi\nGereksinim Kontrolü: Kod, öncelikle model eğitiminden elde edilen history değişkeninin bellekte mevcut olup olmadığını kontrol eder. Bu değişken, eğitimin her adımındaki (epoch) performansı kaydeder.\n\nplot_history Fonksiyonu: Bu fonksiyon, history objesini alır ve iki temel grafik çizer:\n\nDoğruluk Eğrisi: Eğitim Doğruluğu (accuracy) ile Doğrulama Doğruluğu (val_accuracy) arasındaki değişimi epoch'lara göre gösterir. Eğrilerin birbirine yakın kalması, Dropout ve Data Augmentation gibi tekniklerle overfitting'in başarılı bir şekilde kontrol altına alındığını kanıtlar. Ayrıca, son 5 epoch'un ortalama doğrulama başarısı kırmızı kesik çizgi ile işaretlenir.\n\nKayıp Eğrisi: Eğitim Kaybı (loss) ile Doğrulama Kaybı (val_loss) arasındaki değişimi gösterir. Her iki kaybın da düşmeye devam etmesi veya birbirine yakın durması, modelin iyi öğrendiğini ve underfitting yaşamadığını gösterir.","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\n\n# Not: Bu kodun çalışması için, model eğitiminden elde edilen 'history' değişkeninin\n# bellekte (kernelde) yüklü olması gerekir.\n\n# history değişkeninin varlığını kontrol etme (Sadece Kaggle ortamında çalışıyorsanız gereklidir)\n# Eğer bu kodu ayrı bir hücrede çalıştırıyorsanız, history'i tekrar yüklemeniz gerekebilir.\n# Örneğin: history = model.fit(...)\n\nif 'history' in locals():\n    def plot_history(history):\n        acc = history.history['accuracy']\n        val_acc = history.history['val_accuracy']\n        loss = history.history['loss']\n        val_loss = history.history['val_loss']\n        epochs_range = range(len(acc))\n\n        plt.figure(figsize=(12, 5))\n        \n        # 1. Accuracy Grafiği\n        plt.subplot(1, 2, 1)\n        plt.plot(epochs_range, acc, label='Eğitim Doğruluğu')\n        plt.plot(epochs_range, val_acc, label='Doğrulama Doğruluğu')\n        plt.axhline(y=np.mean(val_acc[-5:]), color='r', linestyle='--', \n                    label=f'Ort. Val Acc: {np.mean(val_acc[-5:]):.4f}')\n        plt.title('Eğitim ve Doğrulama Doğruluğu')\n        plt.xlabel('Epoch')\n        plt.ylabel('Doğruluk')\n        plt.grid(True)\n        plt.legend(loc='lower right')\n\n        # 2. Loss Grafiği\n        plt.subplot(1, 2, 2)\n        plt.plot(epochs_range, loss, label='Eğitim Kaybı')\n        plt.plot(epochs_range, val_loss, label='Doğrulama Kaybı')\n        plt.title('Eğitim ve Doğrulama Kaybı')\n        plt.xlabel('Epoch')\n        plt.ylabel('Kayıp')\n        plt.grid(True)\n        plt.legend(loc='upper right')\n        \n        plt.tight_layout()\n        plt.show()\n\n    print(\"--- Overfitting ve Performans Grafikleri ---\")\n    plot_history(history)\nelse:\n    print(\"HATA: 'history' değişkeni bellekte bulunamadı. Lütfen model eğitim kodunu tekrar çalıştırın.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T20:51:25.395985Z","iopub.execute_input":"2025-09-26T20:51:25.396304Z","iopub.status.idle":"2025-09-26T20:51:25.771230Z","shell.execute_reply.started":"2025-09-26T20:51:25.396282Z","shell.execute_reply":"2025-09-26T20:51:25.770599Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":". Veri Dağılımı ve Sınıf Dengesi Görselleştirmesi\nBu bölüm, modelin test edildiği doğrulama (validation) veri setinin sınıf dağılımını gösteren bir çubuk grafik oluşturur. Bu, projenin Veri Önişleme kriterini destekleyen temel bir görseldir.\n\nGörselleştirme İşlemi\nSınıf Verilerinin Tanımlanması: Grafik için 'Kedi (Cat)' ve 'Köpek (Dog)' etiketleri (class_labels) ve her sınıftaki görüntü sayısı (counts = [2500, 2500]) tanımlanır. Bu, doğrulama setinin toplam 5000 görüntüden oluştuğunu gösterir.\n\nÇubuk Grafik Oluşturma: matplotlib.pyplot kullanılarak basit bir çubuk grafik (plt.bar) çizilir. Çubuklar, görsel çekiciliği artırmak için farklı renklerle (skyblue, salmon) renklendirilir.\n\nVeri Etiketleme: Her bir çubuğun üzerine, o sınıfa ait olan 2500 sayısı (plt.text) eklenerek verinin doğrudan okunabilirliği sağlanır.\n\nGrafik Başlığı ve Etiketler: Grafiğe 'Validation Set Sınıf Dağılımı' başlığı ve 'Görüntü Sayısı' etiketi eklenir.","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Projede kullanılan klasör yapısından alınan sayılar:\nclass_labels = ['Kedi (Cat)', 'Köpek (Dog)']\ncounts = [2500, 2500] \n\nplt.figure(figsize=(6, 4))\nbars = plt.bar(class_labels, counts, color=['skyblue', 'salmon'])\n\n# Çubukların üzerine sayıları ekle\nfor bar in bars:\n    yval = bar.get_height()\n    plt.text(bar.get_x() + bar.get_width()/2, yval + 50, yval, ha='center', va='bottom', fontsize=10)\n\nplt.title('Validation Set Sınıf Dağılımı')\nplt.ylabel('Görüntü Sayısı')\nplt.show()\n\nprint(\"Veri setiniz mükemmel dengededir (2500 Kedi, 2500 Köpek).\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T20:51:48.395021Z","iopub.execute_input":"2025-09-26T20:51:48.395289Z","iopub.status.idle":"2025-09-26T20:51:48.510461Z","shell.execute_reply.started":"2025-09-26T20:51:48.395268Z","shell.execute_reply":"2025-09-26T20:51:48.509860Z"}},"outputs":[],"execution_count":null}]}