{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:29:50.949576Z","iopub.execute_input":"2025-09-26T18:29:50.949829Z","iopub.status.idle":"2025-09-26T18:29:50.956290Z","shell.execute_reply.started":"2025-09-26T18:29:50.949811Z","shell.execute_reply":"2025-09-26T18:29:50.955617Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Veri Seti Dosyaları\n\nKaggle ortamında bulunan **Dogs vs Cats** veri seti dosyaları:\n\nSonuç:\n\n- `/kaggle/input/dogs-vs-cats/test1.zip`\n- `/kaggle/input/dogs-vs-cats/train.zip`\n- `/kaggle/input/dogs-vs-cats/sampleSubmission.csv`\n","metadata":{}},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')  # Uyarıları görmezden gel\n\nimport zipfile\n\n# Train ve test zip dosyalarını çıkar\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/train_data')\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as zip_ref:\n    zip_ref.extractall('/kaggle/working/test_data')\n\nprint(\"Train ve test veri setleri çıkarıldı!\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:29:53.498639Z","iopub.execute_input":"2025-09-26T18:29:53.499078Z","iopub.status.idle":"2025-09-26T18:30:01.944560Z","shell.execute_reply.started":"2025-09-26T18:29:53.499055Z","shell.execute_reply":"2025-09-26T18:30:01.943836Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Veri Setlerinin Açılması\nBu adımda, Kaggle ortamındaki **Dogs vs Cats** veri setindeki `train` ve `test` zip dosyaları açılmaktadır.  \n`zipfile` kütüphanesi kullanılarak dosyalar belirtilen çalışma dizinine çıkarılır.  \nKod çalıştırıldığında, hem eğitim hem test verileri kullanılabilir hale gelir.\n\nSonuç:\n\n* Train ve test veri setleri çıkarıldı!","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\nfrom sklearn.model_selection import train_test_split\n\n# Ana klasör\ntrain_dir = \"/kaggle/working/train_data/train\"\n\n# Kedi ve köpek dosyaları\ncats = [os.path.join(train_dir, f) for f in os.listdir(train_dir) if 'cat' in f]\ndogs = [os.path.join(train_dir, f) for f in os.listdir(train_dir) if 'dog' in f]\n\n# Eğitim ve doğrulama böl\ntrain_cats, val_cats = train_test_split(cats, test_size=0.2, random_state=42)\ntrain_dogs, val_dogs = train_test_split(dogs, test_size=0.2, random_state=42)\n\nprint(f\"Eğitim: {len(train_cats) + len(train_dogs)}, Doğrulama: {len(val_cats) + len(val_dogs)}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:07.429225Z","iopub.execute_input":"2025-09-26T18:30:07.429840Z","iopub.status.idle":"2025-09-26T18:30:07.481672Z","shell.execute_reply.started":"2025-09-26T18:30:07.429816Z","shell.execute_reply":"2025-09-26T18:30:07.481058Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Eğitim ve Doğrulama Veri Setlerinin Oluşturulması\n\nBu adımda, açılan eğitim verileri **kedi ve köpek görüntüleri** olarak ayrılmaktadır.  \n- `os.listdir()` ile klasördeki tüm dosyalar listelenir.  \n- Dosya isimlerinde `'cat'` veya `'dog'` geçenler ayrı listelere eklenir.  \n- `train_test_split` fonksiyonu kullanılarak veriler **eğitim ve doğrulama** setlerine bölünür (`test_size=0.2` ile %20 doğrulama).  \n\nSonuç:  \n- Eğitim seti: 20.000 görüntü  \n- Doğrulama seti: 5.000 görüntü\n","metadata":{}},{"cell_type":"code","source":"import os\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.preprocessing import image\nimport random\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:14.397929Z","iopub.execute_input":"2025-09-26T18:30:14.398168Z","iopub.status.idle":"2025-09-26T18:30:14.401899Z","shell.execute_reply.started":"2025-09-26T18:30:14.398152Z","shell.execute_reply":"2025-09-26T18:30:14.401238Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Gerekli Kütüphanelerin Yüklenmesi\n\nBu adımda, **veri görselleştirme ve derin öğrenme için gerekli kütüphaneler** import edilmektedir:\n\n- `os`: Dosya ve klasör işlemleri için kullanılır (örn. veri yollarını yönetmek).  \n- `matplotlib.pyplot`: Grafik ve görselleştirmeler oluşturmak için kullanılır.  \n- `seaborn`: İstatistiksel veri görselleştirme için kullanılır, `matplotlib` üzerine geliştirilmiş.  \n- `tensorflow.keras.preprocessing.image.ImageDataGenerator`: Görüntü verilerini **ön işleme ve veri artırma (data augmentation)** için kullanılır.  \n- `tensorflow.keras.preprocessing.image`: Tek tek görüntüleri yüklemek ve işlemek için yardımcı fonksiyonlar içerir.  \n- `random`: Rastgele seçimler ve örnekleme yapmak için kullanılır (örn. örnek görüntüleri rastgele seçmek).  \n","metadata":{}},{"cell_type":"code","source":"train_dir = '/kaggle/working/train_data/train'  # klasör yolunu kendine göre ayarla\n\ncats = [f for f in os.listdir(train_dir) if 'cat' in f]\ndogs = [f for f in os.listdir(train_dir) if 'dog' in f]\n\nprint(f\"Toplam kedi sayısı: {len(cats)}\")\nprint(f\"Toplam köpek sayısı: {len(dogs)}\")\n\n# Rastgele birkaç görsel göster\nfig, axes = plt.subplots(2, 5, figsize=(15,6))\nfor i, ax in enumerate(axes.flatten()):\n    if i < 5:\n        img_path = os.path.join(train_dir, random.choice(cats))\n    else:\n        img_path = os.path.join(train_dir, random.choice(dogs))\n    img = image.load_img(img_path, target_size=(150,150))\n    ax.imshow(img)\n    ax.axis('off')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:18.254472Z","iopub.execute_input":"2025-09-26T18:30:18.254744Z","iopub.status.idle":"2025-09-26T18:30:18.731181Z","shell.execute_reply.started":"2025-09-26T18:30:18.254725Z","shell.execute_reply":"2025-09-26T18:30:18.730519Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Eğitim Verilerinin İncelenmesi ve Örnek Görseller\n\nBu adımda, eğitim klasöründeki kedi ve köpek görüntüleri sayılmakta ve rastgele birkaç örnek görsel gösterilmektedir.  \n\n- `os.listdir()` ile klasördeki dosyalar listelenir.  \n- Dosya isimlerinde `'cat'` veya `'dog'` geçenler ayrı listelere eklenir.  \n- `matplotlib` kullanılarak 2x5 boyutunda rastgele seçilmiş görseller görselleştirilir.  \n\n**Toplam Görüntü Sayıları:**  \n- Kedi sayısı: 12.500  \n- Köpek sayısı: 12.500  \n\n**Örnek Görseller:**  \nKod çalıştırıldığında, ilk 5 görsel rastgele kedi, sonraki 5 görsel rastgele köpek olarak gösterilir.\n","metadata":{}},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=30,       # 0-30 derece döndürme\n    width_shift_range=0.2,   # yatay kaydırma\n    height_shift_range=0.2,  # dikey kaydırma\n    shear_range=0.2,         # kesme (shear)\n    zoom_range=0.2,          # yakınlaştırma\n    horizontal_flip=True,    # yatay çevirme\n    brightness_range=[0.8,1.2],  # renk/brightness jitter\n    validation_split=0.2     # train-validation ayrımı\n)\n\nval_datagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:24.059438Z","iopub.execute_input":"2025-09-26T18:30:24.060005Z","iopub.status.idle":"2025-09-26T18:30:24.063854Z","shell.execute_reply.started":"2025-09-26T18:30:24.059981Z","shell.execute_reply":"2025-09-26T18:30:24.063151Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Veri Ön İşleme ve Artırma (Data Augmentation)\n\nBu adımda, eğitim ve doğrulama verileri için **görüntü ön işleme ve veri artırma** işlemleri tanımlanmaktadır.  \n\n- `ImageDataGenerator` kullanılarak **veri artırma (data augmentation)** yapılır, bu sayede model daha fazla çeşitlilikle eğitilir ve overfitting riski azalır.  \n\n**Eğitim veri artırma parametreleri (`train_datagen`):**  \n- `rescale=1./255`: Piksel değerlerini 0-1 aralığına ölçeklendirir.  \n- `rotation_range=30`: Görselleri rastgele 0-30 derece döndürür.  \n- `width_shift_range=0.2`, `height_shift_range=0.2`: Görselleri yatay ve dikey kaydırır.  \n- `shear_range=0.2`: Görselleri kesme (shear) uygular.  \n- `zoom_range=0.2`: Rastgele yakınlaştırma yapar.  \n- `horizontal_flip=True`: Yatay çevirme uygular.  \n- `brightness_range=[0.8,1.2]`: Görsellerin parlaklığını rastgele değiştirir.  \n- `validation_split=0.2`: Eğitim ve doğrulama seti ayrımı için %20 doğrulama.  \n\n**Doğrulama veri ön işleme (`val_datagen`):**  \n- `rescale=1./255`: Piksel değerlerini ölçeklendirir.  \n- `validation_split=0.2`: Eğitim/validation ayrımıyla uyumlu olacak şekilde doğrulama verisi seçilir.\n","metadata":{}},{"cell_type":"code","source":"import os\nimport shutil\n\nbase_dir = '/kaggle/working/train_data/train'\ncat_dir = os.path.join(base_dir, 'cats')\ndog_dir = os.path.join(base_dir, 'dogs')\n\nos.makedirs(cat_dir, exist_ok=True)\nos.makedirs(dog_dir, exist_ok=True)\n\nfor fname in os.listdir(base_dir):\n    src_path = os.path.join(base_dir, fname)\n\n    # Sadece dosyaları taşı, klasörleri atla\n    if not os.path.isfile(src_path):\n        continue\n\n    if fname.startswith('cat'):\n        dst_path = os.path.join(cat_dir, fname)\n    elif fname.startswith('dog'):\n        dst_path = os.path.join(dog_dir, fname)\n    else:\n        continue\n\n    # Eğer hedefte aynı dosya varsa isim değiştir\n    if os.path.exists(dst_path):\n        name, ext = os.path.splitext(fname)\n        counter = 1\n        while True:\n            new_name = f\"{name}_{counter}{ext}\"\n            new_dst_path = os.path.join(os.path.dirname(dst_path), new_name)\n            if not os.path.exists(new_dst_path):\n                dst_path = new_dst_path\n                break\n            counter += 1\n\n    shutil.move(src_path, dst_path)\n    print(f\"Taşındı: {src_path} -> {dst_path}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:30.002767Z","iopub.execute_input":"2025-09-26T18:30:30.003043Z","iopub.status.idle":"2025-09-26T18:30:31.194694Z","shell.execute_reply.started":"2025-09-26T18:30:30.003021Z","shell.execute_reply":"2025-09-26T18:30:31.193888Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Kedi ve Köpek Görsellerinin Ayrılması\n\nBu adımda, eğitim klasöründeki tüm görüntüler **kedi ve köpek olarak ayrı klasörlere** taşınmaktadır.  \n\n- `os.makedirs()` ile `cats` ve `dogs` adlı klasörler oluşturulur (varsa tekrar oluşturulmaz).  \n- `os.listdir()` ile klasördeki tüm dosyalar listelenir.  \n- Dosya isimleri `'cat'` veya `'dog'` ile başlıyorsa ilgili klasöre taşınır.  \n- Eğer taşınacak dosya hedef klasörde zaten varsa, dosya adı numaralandırılarak tekrar taşınır (`filename_1.ext`, `filename_2.ext`...).  \n- `shutil.move()` ile dosya taşınır ve işlem ekrana yazdırılır.  \n\nBu sayede model eğitimi için **kedi ve köpek görüntüleri düzenli klasör yapısına** kavuşur.\n\n**Örnek Çıktı:**  \n\nTaşındı: /kaggle/working/train_data/train/cat.298.jpg -> /kaggle/working/train_data/train/cats/cat.298.jpg\n","metadata":{}},{"cell_type":"code","source":"print(\"Base dizinindeki dosyalar:\")\nfor f in os.listdir(base_dir):\n    print(f)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:52.705420Z","iopub.execute_input":"2025-09-26T18:30:52.706095Z","iopub.status.idle":"2025-09-26T18:30:52.709728Z","shell.execute_reply.started":"2025-09-26T18:30:52.706074Z","shell.execute_reply":"2025-09-26T18:30:52.708992Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Base Dizinindeki Dosyaların Kontrolü\n\nBu adımda, **ana klasörde (base_dir) hangi dosya veya klasörlerin bulunduğu** listelenmektedir.  \n\n- `os.listdir(base_dir)` ile belirtilen klasördeki tüm dosya ve klasörler alınır.  \n- `for` döngüsü ile her bir öğe ekrana yazdırılır.  \n\nBu sayede, kedi ve köpek görüntülerinin doğru klasörlere taşınıp taşınmadığı hızlıca kontrol edilebilir.\n\n*Sonuç:\n\nBase dizinindeki dosyalar:\ndogs\ncats\n","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Data augmentation ve normalizasyon\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.15,\n    zoom_range=0.15,\n    horizontal_flip=True,\n    fill_mode='nearest',\n    validation_split=0.2  # Eğitim/validation ayırmak için\n)\n\nval_datagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:30:55.914499Z","iopub.execute_input":"2025-09-26T18:30:55.915103Z","iopub.status.idle":"2025-09-26T18:30:55.919064Z","shell.execute_reply.started":"2025-09-26T18:30:55.915079Z","shell.execute_reply":"2025-09-26T18:30:55.918291Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Eğitim ve Doğrulama Verileri için Ön İşleme ve Veri Artırma\n\nBu adımda, eğitim ve doğrulama verileri için **görüntü ön işleme ve veri artırma (data augmentation)** işlemleri tanımlanmaktadır.  \n\n- `ImageDataGenerator` kullanılarak eğitim verileri çeşitlendirilir ve normalizasyon uygulanır.  \n- `train_datagen` parametreleri:  \n  - `rescale=1./255`: Piksel değerlerini 0-1 aralığına ölçeklendirir.  \n  - `rotation_range=20`: Görselleri rastgele ±20 derece döndürür.  \n  - `width_shift_range=0.2`, `height_shift_range=0.2`: Görselleri yatay ve dikey kaydırır.  \n  - `shear_range=0.15`: Görselleri kesme (shear) uygular.  \n  - `zoom_range=0.15`: Rastgele yakınlaştırma yapar.  \n  - `horizontal_flip=True`: Görselleri yatay olarak çevirir.  \n  - `fill_mode='nearest'`: Kaydırma ve döndürme sonrası boş kalan pikselleri doldurur.  \n  - `validation_split=0.2`: Eğitim ve doğrulama seti ayrımı için %20 doğrulama.  \n\n- `val_datagen`: Sadece normalizasyon ve validation split uygulanır.\n","metadata":{}},{"cell_type":"code","source":"import os\nimport random\nfrom tensorflow.keras.preprocessing import image\nimport matplotlib.pyplot as plt\n\n# Klasör yolları\ncat_dir = '/kaggle/working/train_data/train/cats'\ndog_dir = '/kaggle/working/train_data/train/dogs'\n\n# Klasördeki dosyaları listele\ncats = [f for f in os.listdir(cat_dir) if os.path.isfile(os.path.join(cat_dir, f))]\ndogs = [f for f in os.listdir(dog_dir) if os.path.isfile(os.path.join(dog_dir, f))]\n\n# Dosyaların boş olup olmadığını kontrol et\nif len(cats) == 0 or len(dogs) == 0:\n    raise ValueError(\"Cat veya dog klasörü boş! Dosyaları doğru şekilde yüklediğinizden emin olun.\")\n\n# Örnek olarak kedi veya köpek resmini random seç\nlabel_choice = random.choice(['cat', 'dog'])\nif label_choice == 'cat':\n    sample_img_path = os.path.join(cat_dir, random.choice(cats))\nelse:\n    sample_img_path = os.path.join(dog_dir, random.choice(dogs))\n\nprint(f\"Seçilen sınıf: {label_choice}, dosya: {sample_img_path}\")\n\n# Resmi yükle ve boyutlandır\nimg_size = (224, 224)\nimg = image.load_img(sample_img_path, target_size=img_size)\nx = image.img_to_array(img)\nx = x.reshape((1,) + x.shape)\n\n# Augmentation ve görselleştirme\ni = 0\nfig, axes = plt.subplots(1, 5, figsize=(15,5))\nfor batch in train_datagen.flow(x, batch_size=1):\n    ax = axes[i]\n    # 0-1 float değerler ile imshow doğrudan çalışır, uint8 yapmaya gerek yok\n    ax.imshow(batch[0])\n    ax.axis('off')\n    i += 1\n    if i % 5 == 0:\n        break\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:31:00.088744Z","iopub.execute_input":"2025-09-26T18:31:00.089303Z","iopub.status.idle":"2025-09-26T18:31:00.640827Z","shell.execute_reply.started":"2025-09-26T18:31:00.089283Z","shell.execute_reply":"2025-09-26T18:31:00.640274Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Örnek Görüntü Üzerinde Veri Artırma (Data Augmentation) Görselleştirmesi\n\nBu adımda, eğitim verilerinden **rastgele seçilen bir kedi veya köpek görüntüsü** üzerinde veri artırma uygulanmakta ve sonuç görselleştirilmektedir.\n\n- `os.listdir()` ile kedi ve köpek klasörlerindeki dosyalar listelenir.  \n- Dosya boş ise hata mesajı verilir.  \n- `random.choice()` ile rastgele bir sınıf (`cat` veya `dog`) ve ilgili görüntü seçilir.  \n- `image.load_img()` ve `image.img_to_array()` ile resim yüklenir ve array’e dönüştürülür.  \n- `train_datagen.flow()` ile veri artırma uygulanır (daha önce tanımlanan `rotation`, `shift`, `flip`, `zoom`, vb.).  \n- `matplotlib` kullanılarak artırılmış 5 farklı görüntü yan yana gösterilir.  \n\nBu yöntem, modelin **farklı açılardan ve varyasyonlardan öğrenmesini** sağlar ve overfitting riskini azaltır.\n","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, Input\n\nimg_size = (150, 150, 3)\n\nmodel = Sequential([\n    Input(shape=img_size),  # input_shape yerine Input katmanı\n    Conv2D(32, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    \n    Conv2D(64, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    \n    Conv2D(128, (3,3), activation='relu'),\n    MaxPooling2D(2,2),\n    \n    Flatten(),\n    Dense(512, activation='relu'),\n    Dropout(0.5),\n    Dense(1, activation='sigmoid')\n])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:31:06.101811Z","iopub.execute_input":"2025-09-26T18:31:06.102392Z","iopub.status.idle":"2025-09-26T18:31:06.145391Z","shell.execute_reply.started":"2025-09-26T18:31:06.102352Z","shell.execute_reply":"2025-09-26T18:31:06.144839Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Konvolüsyonel Sinir Ağı (CNN) Modelinin Oluşturulması\n\nBu adımda, **kedi ve köpek sınıflandırması için CNN tabanlı bir model** tanımlanmaktadır.\n\n- `Sequential` modeli ile katmanlar ardışık olarak eklenir.  \n- `Input(shape=img_size)`: Modelin giriş boyutu (150x150 piksel, 3 kanal RGB) belirlenir.  \n- `Conv2D` katmanları: Görüntüden özellikleri çıkarır (32, 64, 128 filtre ile, 3x3 kernel).  \n- `MaxPooling2D` katmanları: Özellik haritalarını boyut küçültme ile özetler ve işlem maliyetini azaltır.  \n- `Flatten()`: Konvolüsyon ve pooling çıktısını tek boyutlu vektöre çevirir.  \n- `Dense(512, activation='relu')`: Tam bağlı gizli katman, modelin öğrenmesini sağlar.  \n- `Dropout(0.5)`: Overfitting’i azaltmak için %50 nöronları rastgele devre dışı bırakır.  \n- `Dense(1, activation='sigmoid')`: Çıkış katmanı, 0 veya 1 değerini tahmin ederek sınıflandırma yapar (kedi veya köpek).\n\n**Not:** TensorFlow, sistemdeki GPU’ları tespit etti ve her birine bellek atadı. \n","metadata":{}},{"cell_type":"code","source":"model.compile(\n    optimizer='adam',\n    loss='binary_crossentropy',  # Çünkü binary classification: cat vs dog\n    metrics=['accuracy']\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:31:10.000948Z","iopub.execute_input":"2025-09-26T18:31:10.001528Z","iopub.status.idle":"2025-09-26T18:31:10.008882Z","shell.execute_reply.started":"2025-09-26T18:31:10.001506Z","shell.execute_reply":"2025-09-26T18:31:10.008382Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Modelin Derlenmesi (Compile)\n\nBu adımda, CNN modeli **eğitim için derlenir**.\n\n- `optimizer='adam'`: Model ağırlıklarını güncellemek için Adam optimizasyon algoritması kullanılır.  \n- `loss='binary_crossentropy'`: Çünkü kedi vs köpek sınıflandırması **iki sınıflı (binary) bir problem**dir.  \n- `metrics=['accuracy']`: Eğitim ve doğrulama sırasında modelin başarımı **doğruluk (accuracy)** metriği ile izlenir.\n","metadata":{}},{"cell_type":"code","source":"model.summary()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:31:16.190309Z","iopub.execute_input":"2025-09-26T18:31:16.190587Z","iopub.status.idle":"2025-09-26T18:31:16.206736Z","shell.execute_reply.started":"2025-09-26T18:31:16.190569Z","shell.execute_reply":"2025-09-26T18:31:16.206192Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Model Özeti\n\nAşağıda CNN modelinin katmanları, çıkış boyutları ve parametre sayıları gösterilmektedir:\n\n| Layer (Type)                    | Output Shape           | Param #      |\n|---------------------------------|----------------------|-------------|\n| conv2d_12 (Conv2D)              | (None, 148, 148, 32)  | 896         |\n| max_pooling2d_12 (MaxPooling2D) | (None, 74, 74, 32)    | 0           |\n| conv2d_13 (Conv2D)              | (None, 72, 72, 64)    | 18,496      |\n| max_pooling2d_13 (MaxPooling2D) | (None, 36, 36, 64)    | 0           |\n| conv2d_14 (Conv2D)              | (None, 34, 34, 128)   | 73,856      |\n| max_pooling2d_14 (MaxPooling2D) | (None, 17, 17, 128)   | 0           |\n| flatten_4 (Flatten)             | (None, 36992)         | 0           |\n| dense_8 (Dense)                 | (None, 512)           | 18,940,416  |\n| dropout_4 (Dropout)             | (None, 512)           | 0           |\n| dense_9 (Dense)                 | (None, 1)             | 513         |\n\n**Toplam parametre sayısı:** 19,034,177 (~72.61 MB)  \n**Trainable parametreler:** 19,034,177  \n**Non-trainable parametreler:** 0  \n\nBu tablo, modelin katmanlarını, her bir katmanın çıktısını ve öğrenilebilecek parametre sayılarını gösteriyor. Böylece modelin yapısını ve büyüklüğünü anlayabiliyoruz.\n","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\n# Data augmentation ve normalizasyon\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    shear_range=0.15,\n    zoom_range=0.15,\n    horizontal_flip=True,\n    fill_mode='nearest',\n    validation_split=0.2\n)\n\nval_datagen = ImageDataGenerator(\n    rescale=1./255,\n    validation_split=0.2\n)\n\n# Jeneratörleri oluştur\nimg_size = (150, 150)\nbatch_size = 32\nbase_dir = '/kaggle/working/train_data/train'\n\ntrain_generator = train_datagen.flow_from_directory(\n    base_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='training'\n)\n\nval_generator = val_datagen.flow_from_directory(\n    base_dir,\n    target_size=img_size,\n    batch_size=batch_size,\n    class_mode='binary',\n    subset='validation'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:31:22.264677Z","iopub.execute_input":"2025-09-26T18:31:22.264945Z","iopub.status.idle":"2025-09-26T18:31:22.756245Z","shell.execute_reply.started":"2025-09-26T18:31:22.264924Z","shell.execute_reply":"2025-09-26T18:31:22.755562Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Eğitim ve Doğrulama Jeneratörlerinin Oluşturulması\n\nBu adımda, **görüntüleri modele uygun hale getirmek ve veri artırma uygulamak** için Keras `ImageDataGenerator` kullanılmıştır.  \n\n### Adımlar:\n\n1. **Veri Ön İşleme ve Artırma:**\n   - `train_datagen`: Eğitim verileri için rescale, döndürme, kaydırma, kesme, zoom, yatay çevirme ve fill_mode uygulandı.\n   - `val_datagen`: Doğrulama verileri için sadece rescale ve validation split uygulandı.\n   - `validation_split=0.2`: Eğitim ve doğrulama verilerini ayırmak için %20 doğrulama.\n\n2. **Jeneratörlerin Tanımlanması:**\n   - `flow_from_directory()` ile görüntüler klasör yapısına göre yüklenir.\n   - `target_size=(150,150)`: Tüm görüntüler 150x150 boyutuna ölçeklendirilir.\n   - `batch_size=32`: Modelin eğitim sırasında işleyeceği görüntü sayısı.\n   - `class_mode='binary'`: İki sınıflı sınıflandırma (kedi vs köpek).\n   - `subset='training'` ve `subset='validation'`: Eğitim ve doğrulama verilerini ayırır.\n\nBu yapı sayesinde model, **hem veri artırmadan yararlanarak daha çeşitli görüntülerle eğitilebilir** hem de eğitim ve doğrulama verileri otomatik olarak ayrılmış olur.\n\n*Sonuç:\n\nFound 20000 images belonging to 2 classes.\nFound 5000 images belonging to 2 classes.\n","metadata":{}},{"cell_type":"code","source":"epochs = 10  # CPU kullanıyorsan 5-10 epoch başlangıç için yeterli\nhistory = model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=epochs\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T18:31:29.973731Z","iopub.execute_input":"2025-09-26T18:31:29.974433Z","iopub.status.idle":"2025-09-26T19:10:21.059131Z","shell.execute_reply.started":"2025-09-26T18:31:29.974409Z","shell.execute_reply":"2025-09-26T19:10:21.058528Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Modelin Eğitilmesi\n\nBu adımda, oluşturduğumuz CNN modeli **eğitim verileri üzerinde eğitilir**.\n\n- `epochs = 10`: Modelin eğitim verileri üzerinden **10 kez** (tüm veri seti üzerinden 10 tur) geçmesi planlanmıştır.  \n- `train_generator`: Modelin eğitileceği **eğitim verilerini** sağlayan jeneratör.  \n- `validation_data=val_generator`: Her epoch sonunda modelin başarımını değerlendirmek için **doğrulama verileri** kullanılır.  \n- `model.fit(...)`: Modeli belirtilen eğitim ve doğrulama verileri ile eğitir ve eğitim sürecinde **kayıp ve doğruluk değerlerini** kaydeder.  \n- `history`: Eğitim süreci boyunca kaydedilen **kayıp (loss) ve doğruluk (accuracy) değerlerini** içerir, görselleştirme ve analiz için kullanılabilir.\n\n| Epoch | Train Accuracy | Train Loss | Validation Accuracy | Validation Loss |\n|-------|----------------|------------|-------------------|----------------|\n| 1     | 0.5985         | 0.6637     | 0.7512            | 0.5288         |\n| 2     | 0.7150         | 0.5557     | 0.7871            | 0.4653         |\n| 3     | 0.7618         | 0.4945     | 0.7983            | 0.4351         |\n| 4     | 0.7928         | 0.4459     | 0.8335            | 0.3821         |\n| 5     | 0.8128         | 0.4117     | 0.8045            | 0.4347         |\n| 6     | 0.8323         | 0.3775     | 0.8668            | 0.3095         |\n| 7     | 0.8445         | 0.3566     | 0.8829            | 0.2819         |\n| 8     | 0.8516         | 0.3392     | 0.8893            | 0.2624         |\n| 9     | 0.8653         | 0.3125     | 0.8899            | 0.2678         |\n| 10    | 0.8718         | 0.3059     | 0.8503            | 0.3342         |\n","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import f1_score\nimport numpy as np\n\n# Validation set üzerinden tahmin\ny_true = val_generator.classes                  # Gerçek etiketler\ny_pred = model.predict(val_generator)          # Tahminler\ny_pred = np.round(y_pred)                      # 0 veya 1'e yuvarla\n\nf1 = f1_score(y_true, y_pred)\nprint(\"Validation F1 Score:\", f1)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:13:21.817269Z","iopub.execute_input":"2025-09-26T19:13:21.817561Z","iopub.status.idle":"2025-09-26T19:13:35.722785Z","shell.execute_reply.started":"2025-09-26T19:13:21.817543Z","shell.execute_reply":"2025-09-26T19:13:35.721943Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Model Performansının F1 Skoru ile Değerlendirilmesi\n\nBu adımda, eğitim sonrası modelin **doğrulama (validation) verisi üzerindeki başarımı** F1 skoru ile ölçülmektedir.\n\n- `y_true = val_generator.classes`: Doğrulama verisinin gerçek etiketleri alınır.  \n- `y_pred = model.predict(val_generator)`: Model doğrulama verisi üzerinde tahmin yapar.  \n- `y_pred = np.round(y_pred)`: Tahminler 0 veya 1 olacak şekilde yuvarlanır (binary classification için).  \n- `f1_score(y_true, y_pred)`: F1 skoru hesaplanır; **precision ve recall değerlerinin harmonik ortalaması**dır.  \n- `print(\"Validation F1 Score:\", f1)`: Elde edilen F1 skoru ekrana yazdırılır.  \n\nF1 skoru, özellikle **dengesiz sınıf dağılımı** durumlarında doğruluk (accuracy) metriğinden daha anlamlı bir performans ölçütü sağlar.\n\n*Sonuç:\n\nValidation F1 Score: 0.5552056150454423\n  \n- Model, doğrulama veri seti üzerinde **313 batch** ile tahmin yaptı ve toplam süre yaklaşık **14 saniye**, batch başına **42 ms** olarak gerçekleşti.  \n- F1 skoru yaklaşık **0.555**, yani model orta seviyede performans gösteriyor.  \n- Düşük F1 skorları, sınıflar arasında dengesiz tahmin yapılabileceğine işaret eder; **hiperparametre optimizasyonu** veya **veri augmentasyonu** ile iyileştirilebilir.\n\n","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Accuracy grafiği\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Model Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.show()\n\n# Loss grafiği\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Model Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:15:27.519984Z","iopub.execute_input":"2025-09-26T19:15:27.520284Z","iopub.status.idle":"2025-09-26T19:15:27.861614Z","shell.execute_reply.started":"2025-09-26T19:15:27.520262Z","shell.execute_reply":"2025-09-26T19:15:27.860778Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Eğitim Sürecinin Görselleştirilmesi\n\nBu adımda, modelin eğitim ve doğrulama sürecinde **doğruluk (accuracy) ve kayıp (loss) değerleri** görselleştirilir.\n\n- **Accuracy Grafiği:**  \n  - `history.history['accuracy']`: Eğitim doğruluğu.  \n  - `history.history['val_accuracy']`: Doğrulama doğruluğu.  \n  - Grafikte epoch ilerledikçe modelin öğrenme başarımı izlenebilir.\n\n- **Loss Grafiği:**  \n  - `history.history['loss']`: Eğitim kaybı.  \n  - `history.history['val_loss']`: Doğrulama kaybı.  \n  - Grafikte kayıp değerlerinin düşüşü, modelin öğrenmesini gösterir.\n\nBu görselleştirmeler, **overfitting veya underfitting** durumlarını tespit etmek ve model performansını analiz etmek için kullanılır.\n","metadata":{}},{"cell_type":"code","source":"model.save('/kaggle/working/cat_dog_cnn_model.h5')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:16:53.598605Z","iopub.execute_input":"2025-09-26T19:16:53.598888Z","iopub.status.idle":"2025-09-26T19:16:54.222271Z","shell.execute_reply.started":"2025-09-26T19:16:53.598868Z","shell.execute_reply":"2025-09-26T19:16:54.221705Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Modelin Kaydedilmesi\n\nBu adımda, eğitilmiş CNN modeli **HDF5 formatında** kaydedilmektedir.  \n\n- `model.save('/kaggle/working/cat_dog_cnn_model.h5')`: Modelin yapısı, ağırlıkları ve eğitim konfigürasyonu tek bir dosyada saklanır.  \n- Kaydedilen model, ileride **yeniden yüklenerek tahmin yapmak veya eğitime devam etmek** için kullanılabilir.  \n","metadata":{}},{"cell_type":"code","source":"!pip install keras-tuner --quiet \n\nimport keras_tuner as kt\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom tensorflow.keras.optimizers import Adam\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:17:07.325149Z","iopub.execute_input":"2025-09-26T19:17:07.325474Z","iopub.status.idle":"2025-09-26T19:17:10.434793Z","shell.execute_reply.started":"2025-09-26T19:17:07.325441Z","shell.execute_reply":"2025-09-26T19:17:10.433796Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Keras Tuner ve Gerekli Kütüphanelerin İçe Aktarılması\n\nBu adımda, **hiperparametre optimizasyonu** için gerekli kütüphaneler yüklenip içe aktarılır:\n\n- `!pip install keras-tuner --quiet`: Eğer Keras Tuner yüklü değilse yükler.  \n- `import keras_tuner as kt`: Keras Tuner kütüphanesi, hiperparametre araması için kullanılır.  \n- `from tensorflow.keras.models import Sequential`: CNN modelimizi oluşturmak için kullanılır.  \n- `from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout`: Katmanları tanımlamak için gerekli modüller.  \n- `from tensorflow.keras.optimizers import Adam`: Modeli optimize etmek için Adam optimizatörü.\n","metadata":{}},{"cell_type":"code","source":"def build_model(hp):\n    model = Sequential()\n    \n    # Conv2D Katmanları\n    for i in range(hp.Int('conv_layers', 1, 3)):  # Katman sayısını 1-3 arasında dene\n        filters = hp.Choice(f'filters_{i}', values=[32, 64, 128])\n        kernel_size = hp.Choice(f'kernel_size_{i}', values=[3,5])\n        if i == 0:\n            model.add(Conv2D(filters, (kernel_size, kernel_size), activation='relu', input_shape=(150,150,3)))\n        else:\n            model.add(Conv2D(filters, (kernel_size, kernel_size), activation='relu'))\n        model.add(MaxPooling2D(2,2))\n    \n    model.add(Flatten())\n    \n    # Dense katmanı\n    dense_units = hp.Choice('dense_units', [128, 256, 512])\n    model.add(Dense(dense_units, activation='relu'))\n    \n    # Dropout\n    dropout_rate = hp.Float('dropout', 0.2, 0.5, step=0.1)\n    model.add(Dropout(dropout_rate))\n    \n    # Output\n    model.add(Dense(1, activation='sigmoid'))\n    \n    # Learning rate\n    learning_rate = hp.Float('learning_rate', 1e-4, 1e-2, sampling='log')\n    \n    model.compile(\n        optimizer=Adam(learning_rate=learning_rate),\n        loss='binary_crossentropy',\n        metrics=['accuracy']\n    )\n    \n    return model\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:17:27.975455Z","iopub.execute_input":"2025-09-26T19:17:27.976232Z","iopub.status.idle":"2025-09-26T19:17:27.983351Z","shell.execute_reply.started":"2025-09-26T19:17:27.976201Z","shell.execute_reply":"2025-09-26T19:17:27.982710Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Hiperparametreli Model Fonksiyonu (Keras Tuner)\n\nBu fonksiyon, **Keras Tuner** ile modelin farklı hiperparametre kombinasyonlarını denemek için kullanılır.\n\n- `hp.Int('conv_layers', 1, 3)`: 1 ila 3 arasında **Conv2D katmanı** sayısını denemek için.  \n- `hp.Choice(f'filters_{i}', values=[32, 64, 128])`: Her Conv2D katmanı için **filtre sayısı** seçenekleri.  \n- `hp.Choice(f'kernel_size_{i}', values=[3,5])`: **Kernel boyutu** seçenekleri (3x3 veya 5x5).  \n- `MaxPooling2D(2,2)`: Her Conv2D katmanından sonra **2x2 havuzlama** uygulanır.  \n- `Flatten()`: 2D feature map’leri **1D vektöre** çevirir.  \n- `hp.Choice('dense_units', [128, 256, 512])`: Dense katmanındaki **nöron sayısı** seçenekleri.  \n- `hp.Float('dropout', 0.2, 0.5, step=0.1)`: Dropout oranı, 0.2–0.5 arasında değişir.  \n- `Dense(1, activation='sigmoid')`: **Çıkış katmanı**, ikili sınıflandırma için sigmoid aktivasyon.  \n- `hp.Float('learning_rate', 1e-4, 1e-2, sampling='log')`: Adam optimizatörü için **learning rate** aralığı.  \n- `model.compile(...)`: Model, belirtilen loss ve optimizer ile derlenir ve `accuracy` metriği ile izlenir.\n\nFonksiyon, Keras Tuner’a modelin hiperparametre aramalarında kullanılabilecek bir **şablon** sağlar.\n","metadata":{}},{"cell_type":"code","source":"tuner = kt.RandomSearch(\n    build_model,\n    objective='val_accuracy',  # Maksimize edilecek değer\n    max_trials=10,              # Toplam deneme sayısı\n    executions_per_trial=1,     # Her deneme için tekrar sayısı\n    directory='tuner_dir',\n    project_name='cat_dog_cnn'\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:18:12.482023Z","iopub.execute_input":"2025-09-26T19:18:12.482301Z","iopub.status.idle":"2025-09-26T19:18:12.529208Z","shell.execute_reply.started":"2025-09-26T19:18:12.482280Z","shell.execute_reply":"2025-09-26T19:18:12.528692Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Hiperparametre Arama (Random Search)\n\nBu adımda, daha önce tanımladığımız `build_model` fonksiyonunu kullanarak **Keras Tuner** ile hiperparametre optimizasyonu yapılır.\n\n- `build_model`: Hangi hiperparametrelerin deneneceğini tanımlayan model fonksiyonu.  \n- `objective='val_accuracy'`: Hangi metriğin maksimize edileceğini belirtir (bu örnekte doğrulama doğruluğu).  \n- `max_trials=10`: Toplam **10 farklı hiperparametre kombinasyonu** denenir.  \n- `executions_per_trial=1`: Her deneme **1 kez** çalıştırılır.  \n- `directory='tuner_dir'`: Tuner sonuçlarının kaydedileceği **dizin**.  \n- `project_name='cat_dog_cnn'`: Bu proje için **alt klasör adı**, sonuçları düzenli saklamak için.\n\n**Açıklama:**  \nRandom Search, belirlenen hiperparametre aralıkları içinde rastgele kombinasyonlar deneyerek **en iyi doğrulama doğruluğunu** bulmayı amaçlar.\n","metadata":{}},{"cell_type":"code","source":"tuner.search(train_generator,\n             validation_data=val_generator,\n             epochs=10,\n             batch_size=32)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T19:18:53.733264Z","iopub.execute_input":"2025-09-26T19:18:53.733841Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Hiperparametre Optimizasyonu\n\nBu adımda, modelin performansını artırmak için farklı hiperparametre kombinasyonları test edildi.  \nAmaç, **en iyi doğruluk (accuracy) sağlayan model yapılandırmasını** bulmaktır.  \nHiperparametreler arasında katman sayısı, filtre sayısı, dropout oranı, learning rate ve optimizer seçimi gibi parametreler yer almaktadır.  \nBu sayede model, overfitting riskini azaltacak ve daha doğru sınıflandırma yapacak şekilde optimize edilmiş olur.\n","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"best_model = tuner.get_best_models(num_models=1)[0]\nbest_hyperparameters = tuner.get_best_hyperparameters(num_trials=1)[0]\n\nprint(\"En iyi hiperparametreler:\")\nprint(best_hyperparameters.values)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### En İyi Hiperparametrelerin Seçimi\n\nBu adımda, Keras Tuner ile yapılan hiperparametre aramasının ardından **en iyi performans gösteren model** ve **hiperparametre kombinasyonu** seçilmektedir.  \n\n- `best_model`: Denenen modeller arasından en yüksek doğruluk sağlayan model  \n- `best_hyperparameters`: Modelin en iyi performansı veren hiperparametre değerleri  \n\nBu sayede, model artık **optimum parametrelerle** eğitilmiş ve kullanılmaya hazırdır.  \nEn iyi hiperparametrelerin seçilmesi, modelin doğruluğunu artırmak ve overfitting riskini azaltmak için kritik bir adımdır.\n","metadata":{}},{"cell_type":"markdown","source":"# En iyi modeli ve hiperparametreleri alıyoruz\n\n","metadata":{}},{"cell_type":"code","source":"history = best_model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=10\n)\n\n# Grafikleri çiz (daha önceki bölümdeki gibi)\nplt.plot(history.history['accuracy'], label='Train Accuracy')\nplt.plot(history.history['val_accuracy'], label='Validation Accuracy')\nplt.title('Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.legend()\nplt.show()\n\nplt.plot(history.history['loss'], label='Train Loss')\nplt.plot(history.history['val_loss'], label='Validation Loss')\nplt.title('Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.legend()\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Modelin Eğitimi ve Performansının Görselleştirilmesi\n\nBu adımda, en iyi hiperparametrelerle seçilen model **eğitim verisi** üzerinde eğitilir ve **validation verisi** ile performansı takip edilir.  \n\nEğitim süreci boyunca, iki temel metriğe odaklanılır:  \n\n- **Accuracy (Doğruluk):** Modelin doğru sınıflandırma oranını gösterir.  \n- **Loss (Kayıp):** Modelin tahmin hatasının ölçüsüdür.  \n\nEpoch ilerledikçe **accuracy ve loss değerleri grafikte** izlenir.  \nBu görselleştirme ile:  \n- Modelin öğrenme süreci takip edilir  \n- Overfitting veya underfitting durumları kolayca gözlemlenir  \n- Eğitim ve doğrulama performansı karşılaştırılarak modelin genel başarısı değerlendirilir\n","metadata":{}},{"cell_type":"code","source":"# TensorBoard callback\nfrom tensorflow.keras.callbacks import TensorBoard\ntensorboard_cb = TensorBoard(log_dir='./logs', histogram_freq=1)\n\nhistory = best_model.fit(\n    train_generator,\n    validation_data=val_generator,\n    epochs=10,\n    callbacks=[tensorboard_cb]\n)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Model Eğitimi ve TensorBoard ile İzleme\n\nBu adımda, en iyi hiperparametrelerle seçilen model **eğitim verisi** üzerinde eğitilir ve **validation verisi** ile performansı takip edilir.  \n\nAyrıca, **TensorBoard callback** eklenerek eğitim süreci görselleştirilir ve detaylı izleme yapılır:  \n\n- **TensorBoard**, modelin **accuracy, loss** gibi metriklerini görselleştirmeye ve eğitim sürecini daha yakından takip etmeye olanak sağlar.  \n- Epoch ilerledikçe, modelin öğrenme davranışı ve overfitting/underfitting durumları kolayca gözlemlenebilir.  \n\nBu sayede modelin eğitim süreci hem sayısal hem görsel olarak analiz edilebilir.\n","metadata":{}}]}