{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.13"},"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":[{"id":"76d47a81","cell_type":"markdown","source":"# Köpek ve Kedi Sınıflandırma Projesi\n\nBu proje, derin öğrenme teknikleri kullanarak köpek ve kedi fotoğraflarını otomatik olarak sınıflandıran bir Convolutional Neural Network (CNN) modeli geliştirmeyi amaçlamaktadır.\n\n## Proje Genel Bakış\n\n- **Veri Seti**: Dogs vs Cats klasik veri seti\n- **Model Türü**: Convolutional Neural Network (CNN) \n- **Görüntü Boyutu**: 128x128 piksel\n- **Sınıf Sayısı**: 2 (Köpek, Kedi)\n- **Eğitim Stratejisi**: Data Augmentation ve Transfer Learning teknikleri\n\n## Proje Aşamaları\n\n1. **Veri Yükleme ve Hazırlama**\n2. **Keşifsel Veri Analizi (EDA)**\n3. **Model Mimarisi Tasarımı**\n4. **Model Eğitimi**\n5. **Performans Değerlendirmesi**\n6. **Sonuçların Görselleştirilmesi**\n7. **Learning Rate Karşılaştırması**","metadata":{}},{"id":"e5922f18","cell_type":"markdown","source":"## 1. Kütüphane İmportları\n\nBu bölümde projemizde kullanacağımız tüm kütüphaneleri içe aktarıyoruz. Her bir kütüphanenin görevi:\n\n- **NumPy & Pandas**: Veri manipülasyonu ve analizi\n- **Matplotlib & Seaborn**: Veri görselleştirme\n- **TensorFlow/Keras**: Derin öğrenme model geliştirme\n- **Scikit-learn**: Model değerlendirme metrikleri\n- **OpenCV**: Görüntü işleme (isteğe bağlı)\n- **OS, Random, Zipfile**: Dosya yönetimi ve rastgele işlemler","metadata":{}},{"id":"5c1bd07f","cell_type":"code","source":"# Dogs vs Cats Classification - Final Version\n# Bu proje köpek ve kedi görüntülerini sınıflandırmak için CNN kullanır\n\nimport warnings\nwarnings.filterwarnings('ignore')\nimport os\nimport random\nimport zipfile\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Activation, BatchNormalization\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.utils import to_categorical, load_img\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint\nfrom tensorflow.keras.optimizers import Adam\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report, confusion_matrix","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:13:57.475089Z","iopub.execute_input":"2025-09-26T15:13:57.475387Z","iopub.status.idle":"2025-09-26T15:14:14.873491Z","shell.execute_reply.started":"2025-09-26T15:13:57.475368Z","shell.execute_reply":"2025-09-26T15:14:14.872577Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"79d45b0c","cell_type":"markdown","source":"## 2. Proje Parametreleri\n\nBurada modelimizin temel parametrelerini tanımlıyoruz. Bu parametreler tüm proje boyunca tutarlılık sağlamak için kullanılacak.","metadata":{}},{"id":"14cc550c","cell_type":"code","source":"# Temel parametreler\nFAST_RUN = False\nIMAGE_WIDTH = 128\nIMAGE_HEIGHT = 128\nIMAGE_SIZE = (IMAGE_WIDTH, IMAGE_HEIGHT)\nIMAGE_CHANNELS = 3","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:14.874617Z","iopub.execute_input":"2025-09-26T15:14:14.875994Z","iopub.status.idle":"2025-09-26T15:14:14.880448Z","shell.execute_reply.started":"2025-09-26T15:14:14.875959Z","shell.execute_reply":"2025-09-26T15:14:14.879589Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"0fa0f47e","cell_type":"markdown","source":"## 3. Veri Yükleme\n\nBu bölümde Kaggle'dan indirdiğimiz Dogs vs Cats veri setini çıkartıyoruz. Veri seti iki ana klasörden oluşmaktadır:\n\n- **train.zip**: Eğitim için kullanılacak etiketli görüntüler\n- **test1.zip**: Test için kullanılacak etiketsiz görüntüler\n\n**Not**: Bu kod Kaggle ortamında çalıştırılmak üzere tasarlanmıştır. Yerel ortamda çalıştırıyorsanız dosya yollarını düzenlemeniz gerekebilir.","metadata":{}},{"id":"bccc3a49","cell_type":"code","source":"# Test verisini çıkar\npath_to_zip_file = '/kaggle/input/dogs-vs-cats/test1.zip'\nwith zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:\n    zip_ref.extractall('.')","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:14.883402Z","iopub.execute_input":"2025-09-26T15:14:14.883951Z","iopub.status.idle":"2025-09-26T15:14:19.696157Z","shell.execute_reply.started":"2025-09-26T15:14:14.883924Z","shell.execute_reply":"2025-09-26T15:14:19.695584Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"dad3a30d","cell_type":"code","source":"# Eğitim verisini çıkar\npath_to_zip_file = '/kaggle/input/dogs-vs-cats/train.zip'\nwith zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:\n    zip_ref.extractall('.')","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:19.697027Z","iopub.execute_input":"2025-09-26T15:14:19.697326Z","iopub.status.idle":"2025-09-26T15:14:27.591649Z","shell.execute_reply.started":"2025-09-26T15:14:19.697299Z","shell.execute_reply":"2025-09-26T15:14:27.591027Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"23230000","cell_type":"markdown","source":"## 4. Veri Ön İşleme ve DataFrame Oluşturma\n\nBu adımda:\n\n1. **Dosya İsimlerinden Sınıf Bilgisi Çıkarma**: Her görüntü dosyasının isminin başındaki kelime (cat/dog) sınıf etiketini belirtir\n2. **DataFrame Oluşturma**: Pandas DataFrame'i ile veriyi organize ediyoruz\n3. **Train-Validation-Test Ayırma**: Veriyi model eğitimi, doğrulama ve test için üç parçaya ayırıyoruz\n\nVeri dağılımı: %60 Eğitim, %20 Doğrulama, %20 Test","metadata":{}},{"id":"3d9aced3","cell_type":"code","source":"# Dosya isimlerinden kategori bilgisini çıkar\nfilenames = os.listdir(\"train/\")\ncategories = []\nfor filename in filenames:\n    category = filename.split('.')[0]\n    if category == 'dog':\n        categories.append(1)\n    else:\n        categories.append(0)\n\n# DataFrame oluştur\ndf = pd.DataFrame({\n    'filename': filenames,\n    'category': categories\n})\n\n# Test dosyalarını da DataFrame'e ekle\ntest_filenames = os.listdir(\"test1/\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})\nnb_samples = test_df.shape[0]","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.592341Z","iopub.execute_input":"2025-09-26T15:14:27.592590Z","iopub.status.idle":"2025-09-26T15:14:27.634264Z","shell.execute_reply.started":"2025-09-26T15:14:27.592564Z","shell.execute_reply":"2025-09-26T15:14:27.633582Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"31546ee3","cell_type":"code","source":"# 0 cat 1 dog\ndf[\"category\"] = df[\"category\"].replace({0: 'cat', 1: 'dog'}) \n\n# Train-Validation-Test bölümlemesi (60-20-20 oranında)\ntrain_df, temp_df = train_test_split(df, test_size=0.4, random_state=42, stratify=df['category'])\nvalidate_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42, stratify=temp_df['category'])\n\ntrain_df = train_df.reset_index(drop=True)\nvalidate_df = validate_df.reset_index(drop=True)\ntest_df = test_df.reset_index(drop=True)\n\nprint(\"Veri seti dağılımı:\")\nprint(f\"Toplam veri: {len(df):,}\")\nprint(f\"Eğitim: {len(train_df):,}\")\nprint(f\"Doğrulama: {len(validate_df):,}\") \nprint(f\"Test: {len(test_df):,}\")","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.634991Z","iopub.execute_input":"2025-09-26T15:14:27.635254Z","iopub.status.idle":"2025-09-26T15:14:27.690184Z","shell.execute_reply.started":"2025-09-26T15:14:27.635230Z","shell.execute_reply":"2025-09-26T15:14:27.689607Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"7e6fd659","cell_type":"markdown","source":"## 5. Keşifsel Veri Analizi (EDA)\n\nVeri setimizi daha iyi anlamak için temel istatistiksel analizler yapıyoruz:","metadata":{}},{"id":"008b2433","cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.690833Z","iopub.execute_input":"2025-09-26T15:14:27.691094Z","iopub.status.idle":"2025-09-26T15:14:27.707593Z","shell.execute_reply.started":"2025-09-26T15:14:27.691074Z","shell.execute_reply":"2025-09-26T15:14:27.706954Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"40babef5","cell_type":"markdown","source":"### 5.1 Veri Setinin İlk Beş Satırı","metadata":{}},{"id":"03c4a68f","cell_type":"code","source":"# Rastgele örnekler göster\ndf.sample(5)","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.708314Z","iopub.execute_input":"2025-09-26T15:14:27.708525Z","iopub.status.idle":"2025-09-26T15:14:27.716199Z","shell.execute_reply.started":"2025-09-26T15:14:27.708487Z","shell.execute_reply":"2025-09-26T15:14:27.715481Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"e7fce5c1","cell_type":"markdown","source":"### 5.2 Rastgele Örnekler","metadata":{}},{"id":"37be1faa","cell_type":"code","source":"df.info()","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.719190Z","iopub.execute_input":"2025-09-26T15:14:27.719420Z","iopub.status.idle":"2025-09-26T15:14:27.740868Z","shell.execute_reply.started":"2025-09-26T15:14:27.719402Z","shell.execute_reply":"2025-09-26T15:14:27.740035Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"d8f439e4","cell_type":"markdown","source":"### 5.3 Veri Seti Bilgileri","metadata":{}},{"id":"e1d841f9","cell_type":"code","source":"df.isna().sum()","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.741656Z","iopub.execute_input":"2025-09-26T15:14:27.741913Z","iopub.status.idle":"2025-09-26T15:14:27.756327Z","shell.execute_reply.started":"2025-09-26T15:14:27.741894Z","shell.execute_reply":"2025-09-26T15:14:27.755477Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"112f0ff8","cell_type":"markdown","source":"### 5.4 Eksik Veri Kontrolü","metadata":{}},{"id":"81f4e203","cell_type":"code","source":"df.duplicated().sum()","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.757067Z","iopub.execute_input":"2025-09-26T15:14:27.757296Z","iopub.status.idle":"2025-09-26T15:14:27.773581Z","shell.execute_reply.started":"2025-09-26T15:14:27.757276Z","shell.execute_reply":"2025-09-26T15:14:27.772875Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"8f30a2ce","cell_type":"markdown","source":"### 5.5 Tekrar Eden Veri Kontrolü","metadata":{}},{"id":"689c8521","cell_type":"code","source":"# Detaylı veri analizi ve görselleştirme\nfig, axes = plt.subplots(2, 2, figsize=(14, 10))\naxes = axes.ravel()  # 2D array'i flatten et\n\n# 1) Sınıf bar chart\ndf['category'].value_counts().plot(kind='bar', ax=axes[0], color=['skyblue', 'lightcoral'])\naxes[0].set_title('Sınıf Dağılımı')\naxes[0].set_ylabel('Görüntü Sayısı')\naxes[0].tick_params(axis='x', rotation=0)\n\n# Set bazında dağılım\nset_data = pd.DataFrame({\n    'Train': train_df['category'].value_counts(),\n    'Validation': validate_df['category'].value_counts(),\n    'Test': test_df['category'].value_counts()\n})\nset_data.plot(kind='bar', ax=axes[1], color=['#1f77b4', '#ff7f0e', '#2ca02c'])\naxes[1].set_title('Set Bazında Sınıf Dağılımı')\naxes[1].set_ylabel('Görüntü Sayısı')\naxes[1].tick_params(axis='x', rotation=0)\naxes[1].legend()\n\n# Rastgele görüntü örnekleri\nfor i in range(2):\n    sample_file = random.choice(filenames)\n    img_path = f\"train/{sample_file}\"\n    img = load_img(img_path, target_size=(150, 150))\n    category = sample_file.split('.')[0]\n    \n    axes[i+2].imshow(img)\n    axes[i+2].set_title(f'Örnek: {category.upper()}')\n    axes[i+2].axis('off')\n\nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:27.774219Z","iopub.execute_input":"2025-09-26T15:14:27.774463Z","iopub.status.idle":"2025-09-26T15:14:28.637846Z","shell.execute_reply.started":"2025-09-26T15:14:27.774445Z","shell.execute_reply":"2025-09-26T15:14:28.636940Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"bd6ed619","cell_type":"markdown","source":"### 5.6 Detaylı Veri Görselleştirmesi\n\nBu bölümde veri setimizin dağılımını ve örnek görüntüleri görselleştiriyoruz:\n\n- **Sınıf Dağılımı**: Köpek ve kedi görüntülerinin sayısal dağılımı\n- **Set Bazında Dağılım**: Eğitim, doğrulama ve test setlerindeki sınıf dengesi\n- **Örnek Görüntüler**: Veri setinden rastgele seçilen görüntü örnekleri","metadata":{}},{"id":"2025f238","cell_type":"code","source":"# CNN modelini oluştur\nmodel = Sequential()\n\n# İlk konvolüsyon bloğu\nmodel.add(Conv2D(32, (3, 3), padding='same', input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS))) \nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.1))\n\n# İkinci konvolüsyon bloğu\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\n\n# Üçüncü konvolüsyon bloğu\nmodel.add(Conv2D(128, (3, 3), padding='same'))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\n\n# Tam bağlantılı katmanlar\nmodel.add(Flatten())\nmodel.add(Dense(256))\nmodel.add(BatchNormalization())\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.3))\n\n# Çıkış katmanı (2 sınıf: kedi ve köpek)\nmodel.add(Dense(2, activation='softmax'))\n\n# Modeli derle\nmodel.compile(loss='categorical_crossentropy', \n              optimizer=Adam(learning_rate=0.001),\n              metrics=['accuracy'])\n\nprint(f\"Toplam parametre sayısı: {model.count_params():,}\")\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:28.638894Z","iopub.execute_input":"2025-09-26T15:14:28.639177Z","iopub.status.idle":"2025-09-26T15:14:31.091921Z","shell.execute_reply.started":"2025-09-26T15:14:28.639156Z","shell.execute_reply":"2025-09-26T15:14:31.091220Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"b0ca772b","cell_type":"markdown","source":"## 6. CNN Model Mimarisi\n\nBu bölümde görüntü sınıflandırması için özel tasarlanmış bir Convolutional Neural Network (CNN) modeli oluşturuyoruz.\n\n### Model Mimarisi:\n\n**Konvolüsyon Blokları:**\n- **Blok 1**: 32 filtre, 3x3 kernel, ReLU aktivasyon\n- **Blok 2**: 64 filtre, 3x3 kernel, ReLU aktivasyon  \n- **Blok 3**: 128 filtre, 3x3 kernel, ReLU aktivasyon\n\n**Her blok şunları içerir:**\n- Batch Normalization (eğitimi hızlandırır)\n- MaxPooling (boyut azaltma)\n- Dropout (overfitting önleme)\n\n**Fully Connected Katmanlar:**\n- 256 nöronlu Dense katman\n- %30 Dropout\n- 2 nöronlu çıkış katmanı (Softmax aktivasyon)","metadata":{}},{"id":"929aea74","cell_type":"code","source":"# Callback fonksiyonlarını tanımla\n# Early Stopping: Validation loss iyileşmezse eğitimi durdur\nearly_stop = EarlyStopping(\n    monitor='val_loss',\n    patience=10,\n    restore_best_weights=True,\n    verbose=1\n)\n\n# Learning Rate Reducer: Plateau durumunda learning rate'i azalt\nlr_reducer = ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.5,\n    patience=5,\n    min_lr=1e-7,\n    verbose=1\n)\n\n# Model Checkpoint: En iyi modeli kaydet\ncheckpoint = ModelCheckpoint(\n    'best_catdog_model.h5',\n    monitor='val_accuracy',\n    save_best_only=True,\n    mode='max',\n    verbose=1\n)\n\n# Tüm callback'leri topla\ncallbacks = [early_stop, lr_reducer, checkpoint]\n\nprint(\"Callback fonksiyonları hazırlandı\")","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:31.092677Z","iopub.execute_input":"2025-09-26T15:14:31.092890Z","iopub.status.idle":"2025-09-26T15:14:31.098127Z","shell.execute_reply.started":"2025-09-26T15:14:31.092864Z","shell.execute_reply":"2025-09-26T15:14:31.097349Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"5d62b9df","cell_type":"markdown","source":"## 7. Callback Fonksiyonları\n\nModel eğitimi sırasında performansı optimize etmek için callback fonksiyonları kullanıyoruz:\n\n### Kullanılan Callback'ler:\n\n**1. Early Stopping:**\n- Validation loss 10 epoch boyunca iyileşmezse eğitimi durdurur\n- Overfitting'i önler ve eğitim süresini optimize eder\n\n**2. Learning Rate Reducer:**\n- Validation loss plateau'ya ulaştığında learning rate'i yarıya indirir\n- Model performansının ince ayarını yapar\n\n**3. Model Checkpoint:**\n- En iyi validation accuracy'ye sahip modeli otomatik kaydeder\n- Eğitim sonunda en başarılı modeli kullanabilmemizi sağlar","metadata":{}},{"id":"27f72973","cell_type":"code","source":"# Data Augmentation - Veri artırma teknikleri\ntrain_datagen = ImageDataGenerator(\n    rotation_range=15,        # 15 derece döndürme\n    rescale=1./255,          # Normalizasyon\n    shear_range=0.1,         # Kayma dönüşümü\n    zoom_range=0.2,          # Zoom\n    horizontal_flip=True,     # Yatay çevirme\n    width_shift_range=0.1,   # Genişlik kaydırma\n    height_shift_range=0.1,  # Yükseklik kaydırma\n    fill_mode='nearest'      # Boş alan doldurma\n)\n\n# Validation için sadece normalizasyon\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\n\n# Training data generator\ntrain_generator = train_datagen.flow_from_dataframe(\n    train_df, \n    \"train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    class_mode='categorical',\n    batch_size=32 if FAST_RUN else 64\n)\n\n# Validation data generator\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    validate_df, \n    \"train/\", \n    x_col='filename',\n    y_col='category',\n    target_size=IMAGE_SIZE,\n    class_mode='categorical',\n    batch_size=32 if FAST_RUN else 64\n)\n\nprint(f\"Training samples: {train_generator.samples}\")\nprint(f\"Validation samples: {validation_generator.samples}\")\nprint(f\"Class indices: {train_generator.class_indices}\")","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:31.099066Z","iopub.execute_input":"2025-09-26T15:14:31.099263Z","iopub.status.idle":"2025-09-26T15:14:31.283289Z","shell.execute_reply.started":"2025-09-26T15:14:31.099239Z","shell.execute_reply":"2025-09-26T15:14:31.282358Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"045517da","cell_type":"markdown","source":"## 8. Data Augmentation (Veri Artırma)\n\nVeri setimizi çeşitlendirerek modelin genelleme yeteneğini artırıyoruz.\n\n### Uygulanan Teknikler:\n\n**Geometrik Dönüşümler:**\n- 15° döndürme (rotation)\n- Yatay çevirme (horizontal flip)\n- %10 genişlik/yükseklik kaydırma\n- %20 zoom\n\n**Diğer Teknikler:**\n- %10 shear (kayma) dönüşümü\n- Piksel değerlerini 0-1 arasına normalizasyon\n\nBu teknikler sayesinde aynı görüntüden farklı varyasyonlar üretiyoruz, böylece model daha dayanıklı hale geliyor.","metadata":{}},{"id":"55482905","cell_type":"code","source":"# Model eğitimi\nepochs = 50 if not FAST_RUN else 3\n\nprint(\"Model eğitimi başlıyor...\")\nprint(f\"Epoch sayısı: {epochs}\")\nprint(f\"Eğitim veri: {len(train_df):,}\")\nprint(f\"Doğrulama veri: {len(validate_df):,}\")\n\n# Modeli eğit\nhistory = model.fit(\n    train_generator,\n    epochs=epochs,\n    validation_data=validation_generator,\n    callbacks=callbacks,\n    steps_per_epoch=train_generator.samples // train_generator.batch_size,\n    validation_steps=validation_generator.samples // validation_generator.batch_size,\n    verbose=1\n)\n\nprint(f\"En iyi validation accuracy: {max(history.history['val_accuracy']):.4f}\")\nprint(f\"En düşük validation loss: {min(history.history['val_loss']):.4f}\")","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:14:31.284205Z","iopub.execute_input":"2025-09-26T15:14:31.284843Z","iopub.status.idle":"2025-09-26T15:31:15.903380Z","shell.execute_reply.started":"2025-09-26T15:14:31.284816Z","shell.execute_reply":"2025-09-26T15:31:15.902720Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"17c2fde5","cell_type":"markdown","source":"## 9. Model Eğitimi\n\nBu aşamada modelimizi hazırladığımız veri ile eğitiyoruz.\n\n### Eğitim Parametreleri:\n- **Epoch Sayısı**: 50 (FAST_RUN=False ise)\n- **Batch Size**: 64\n- **Optimizer**: Adam (learning_rate=0.001)\n- **Loss Function**: Categorical Crossentropy\n\nEğitim süreci validation loss'u takip ederek otomatik olarak optimize edilir.","metadata":{}},{"id":"2abdf2ee","cell_type":"code","source":"# Eğitim sonuçlarını görselleştir\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\n\n# Accuracy grafiği\nax1.plot(history.history['accuracy'], label='Training Accuracy', color='blue', linewidth=2)\nax1.plot(history.history['val_accuracy'], label='Validation Accuracy', color='red', linewidth=2)\nax1.set_title('Model Accuracy', fontsize=14, fontweight='bold')\nax1.set_xlabel('Epoch')\nax1.set_ylabel('Accuracy')\nax1.legend()\nax1.grid(True, alpha=0.3)\n\n# Loss grafiği\nax2.plot(history.history['loss'], label='Training Loss', color='blue', linewidth=2)\nax2.plot(history.history['val_loss'], label='Validation Loss', color='red', linewidth=2)\nax2.set_title('Model Loss', fontsize=14, fontweight='bold')\nax2.set_xlabel('Epoch')\nax2.set_ylabel('Loss')\nax2.legend()\nax2.grid(True, alpha=0.3)\n\nplt.tight_layout()\nplt.show()\n\n# Learning rate geçmişi (varsa)\nif 'lr' in history.history:\n    plt.figure(figsize=(10, 4))\n    plt.plot(history.history['lr'], color='orange', linewidth=2)\n    plt.title('Learning Rate Schedule', fontsize=14, fontweight='bold')\n    plt.xlabel('Epoch')\n    plt.ylabel('Learning Rate')\n    plt.yscale('log')\n    plt.grid(True, alpha=0.3)\n    plt.show()\n\n# Sonuç özeti\nfinal_train_acc = history.history['accuracy'][-1]\nfinal_val_acc = history.history['val_accuracy'][-1]\nprint(\"Sonuç özeti:\")\nprint(f\"Final Training Accuracy: {final_train_acc:.4f} ({final_train_acc*100:.2f}%)\")\nprint(f\"Final Validation Accuracy: {final_val_acc:.4f} ({final_val_acc*100:.2f}%)\")\nprint(f\"Overfitting farkı: {abs(final_train_acc - final_val_acc):.4f}\")","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:31:15.904209Z","iopub.execute_input":"2025-09-26T15:31:15.904428Z","iopub.status.idle":"2025-09-26T15:31:16.311891Z","shell.execute_reply.started":"2025-09-26T15:31:15.904411Z","shell.execute_reply":"2025-09-26T15:31:16.311036Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"9082fff9","cell_type":"markdown","source":"## 10. Eğitim Sonuçlarının Görselleştirilmesi\n\nEğitim sürecini analiz etmek için accuracy ve loss grafiklerini çiziyoruz.\n\n### Grafiklerin Anlamı:\n\n**Accuracy Grafiği:**\n- Mavi çizgi: Eğitim accuracy'si\n- Kırmızı çizgi: Validation accuracy'si\n- İki çizgi birbirine yakınsa → İyi generalization\n\n**Loss Grafiği:**\n- Mavi çizgi: Eğitim loss'u\n- Kırmızı çizgi: Validation loss'u\n- Azalan trend → Model öğreniyor\n\n**Learning Rate Grafiği:**\n- Learning rate'in nasıl değiştiğini gösterir\n- Callback fonksiyonunun etkisini izler","metadata":{}},{"id":"5b0b7ed7","cell_type":"code","source":"# Model değerlendirme - Confusion Matrix ve Classification Report\n# En iyi modeli yükle\ntry:\n    model.load_weights('best_catdog_model.h5')\n    print(\"En iyi model ağırlıkları yüklendi\")\nexcept:\n    print(\"Model checkpoint bulunamadı, mevcut ağırlıklar kullanılacak\")\n\n# Validation seti üzerinde tahmin yap\nvalidation_generator.reset()\nY_pred = model.predict(validation_generator)\ny_pred = np.argmax(Y_pred, axis=1)\n\n# Gerçek etiketleri al\ny_true = validation_generator.classes\nclass_labels = list(validation_generator.class_indices.keys())\n\n# Confusion Matrix oluştur\ncm = confusion_matrix(y_true, y_pred)\nplt.figure(figsize=(8, 6))\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n            xticklabels=class_labels, yticklabels=class_labels,\n            cbar_kws={'label': 'Sayı'})\nplt.title('Confusion Matrix')\nplt.xlabel('Predicted')\nplt.ylabel('Actual')\nplt.tight_layout()\nplt.show()\n\n# Classification Report\nprint(\"Classification Report:\")\nprint(classification_report(y_true, y_pred, target_names=class_labels))\n\n# Final validation accuracy\nfinal_accuracy = np.sum(y_pred == y_true) / len(y_true)\nprint(f\"Final Validation Accuracy: {final_accuracy:.4f} ({final_accuracy*100:.2f}%)\")\n\n# Model özeti\nprint(\"Model özeti:\")\nprint(f\"- Toplam parametre sayısı: {model.count_params():,}\")\nprint(f\"- Model boyutu: ~{model.count_params() * 4 / (1024*1024):.1f} MB\")\nprint(f\"- Eğitim epoch sayısı: {len(history.history['loss'])}\")","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:31:16.312692Z","iopub.execute_input":"2025-09-26T15:31:16.312911Z","iopub.status.idle":"2025-09-26T15:31:24.833622Z","shell.execute_reply.started":"2025-09-26T15:31:16.312887Z","shell.execute_reply":"2025-09-26T15:31:24.832660Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"49a77eca","cell_type":"markdown","source":"## 11. Model Performans Değerlendirmesi\n\nBu bölümde modelimizin ne kadar başarılı olduğunu detaylı şekilde analiz ediyoruz.\n\n### Değerlendirme Metrikleri:\n\n**Confusion Matrix:**\n- Gerçek vs Tahmin edilen sınıfları karşılaştırır\n- Hangi sınıfların karıştırıldığını gösterir\n\n**Classification Report:**\n- Precision, Recall, F1-Score metriklerini sunar\n- Her sınıf için detaylı performans analizi\n\n**Model Özeti:**\n- Toplam parametre sayısı\n- Model boyutu (MB)\n- Eğitim epoch sayısı","metadata":{}},{"id":"ddb192bd","cell_type":"code","source":"# rastgele örnek tahminler göster\ndef show_predictions(num_samples=6):\n   \n    sample_files = random.sample(validate_df['filename'].tolist(), num_samples)\n    \n    fig, axes = plt.subplots(2, 3, figsize=(15, 10))\n    axes = axes.ravel()\n    \n    correct_predictions = 0\n    \n    for i, filename in enumerate(sample_files):\n        # Görüntüyü yükle ve işle\n        img_path = f\"train/{filename}\"\n        img = load_img(img_path, target_size=IMAGE_SIZE)\n        img_array = np.array(img) / 255.0\n        img_array = np.expand_dims(img_array, axis=0)\n        \n        # Tahmin yap\n        prediction = model.predict(img_array, verbose=0)\n        predicted_class = np.argmax(prediction)\n        \n        \n        # Gerçek sınıf\n        actual_class = validate_df[validate_df['filename'] == filename]['category'].iloc[0]\n        \n        # Görüntüyü göster\n        axes[i].imshow(img)\n        axes[i].axis('off')\n        \n        # Başlık oluştur\n        pred_label = class_labels[predicted_class]\n        is_correct = pred_label == actual_class\n        if is_correct:\n            correct_predictions += 1\n        \n        color = 'green' if is_correct else 'red'\n        title = f\"Actual: {actual_class.upper()}\\nPredicted: {pred_label.upper()}\"\n        axes[i].set_title(title, color=color)\n    \n    plt.tight_layout()\n    plt.show()\n    \n    return correct_predictions / num_samples\n\n# Örnek tahminleri göster\nsample_accuracy = show_predictions(6)\n","metadata":{"execution":{"iopub.status.busy":"2025-09-26T15:31:24.834700Z","iopub.execute_input":"2025-09-26T15:31:24.835587Z","iopub.status.idle":"2025-09-26T15:31:26.575549Z","shell.execute_reply.started":"2025-09-26T15:31:24.835540Z","shell.execute_reply":"2025-09-26T15:31:26.574792Z"},"trusted":true},"outputs":[],"execution_count":null},{"id":"2cb3990c","cell_type":"markdown","source":"## 12. Örnek Tahmin Sonuçları\n\nModelimizin gerçek görüntüler üzerindeki performansını görsel olarak değerlendiriyoruz.\n\n### Bu Bölümde:\n- Validation setinden rastgele 6 görüntü seçiyoruz\n- Her görüntü için modelin tahminini gösteriyoruz\n- Doğru tahminler yeşil, yanlış tahminler kırmızı renkte gösteriliyor\n- Genel başarı oranını hesaplıyoruz\n\nBu görselleştirme, modelimizin hangi tür görüntülerde başarılı olduğunu anlamamıza yardımcı olur.","metadata":{}},{"id":"c01e9584","cell_type":"markdown","source":"## 13. Learning Rate Karşılaştırması\n\nBu bölümde aynı model mimarisini farklı learning rate (0.0001) ile eğitip sonuçları karşılaştıracağız.","metadata":{}},{"id":"10b7edfd","cell_type":"code","source":"# İkinci model - Düşük learning rate (0.0001)\nmodel2 = Sequential()\n\n# Aynı mimari\nmodel2.add(Conv2D(32, (3, 3), padding='same', input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS))) \nmodel2.add(BatchNormalization())\nmodel2.add(Activation('relu'))\nmodel2.add(MaxPooling2D(pool_size=(2, 2)))\nmodel2.add(Dropout(0.1))\n\nmodel2.add(Conv2D(64, (3, 3), padding='same'))\nmodel2.add(BatchNormalization())\nmodel2.add(Activation('relu'))\nmodel2.add(MaxPooling2D(pool_size=(2, 2)))\nmodel2.add(Dropout(0.2))\n\nmodel2.add(Conv2D(128, (3, 3), padding='same'))\nmodel2.add(BatchNormalization())\nmodel2.add(Activation('relu'))\nmodel2.add(MaxPooling2D(pool_size=(2, 2)))\nmodel2.add(Dropout(0.25))\n\nmodel2.add(Flatten())\nmodel2.add(Dense(256))\nmodel2.add(BatchNormalization())\nmodel2.add(Activation('relu'))\nmodel2.add(Dropout(0.3))\nmodel2.add(Dense(2, activation='softmax'))\n\n# Farklı learning rate ile derle\nmodel2.compile(loss='categorical_crossentropy', \n               optimizer=Adam(learning_rate=0.0001),  # Düşük learning rate\n               metrics=['accuracy'])\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T15:31:26.576326Z","iopub.execute_input":"2025-09-26T15:31:26.576598Z","iopub.status.idle":"2025-09-26T15:31:26.774418Z","shell.execute_reply.started":"2025-09-26T15:31:26.576572Z","shell.execute_reply":"2025-09-26T15:31:26.773894Z"}},"outputs":[],"execution_count":null},{"id":"d37c39ed","cell_type":"code","source":"# Callback'leri yeniden tanımla\nearly_stop2 = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True, verbose=1)\nlr_reducer2 = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-7, verbose=1)\ncheckpoint2 = ModelCheckpoint('best_catdog_model_lr0001.h5', monitor='val_accuracy', save_best_only=True, mode='max', verbose=1)\n\ncallbacks2 = [early_stop2, lr_reducer2, checkpoint2]\n\n# Generatorları yeniden başlat\ntrain_generator.reset()\nvalidation_generator.reset()\n\n# Model eğitimi\nhistory2 = model2.fit(\n    train_generator,\n    epochs=epochs,\n    validation_data=validation_generator,\n    callbacks=callbacks2,\n    steps_per_epoch=train_generator.samples // train_generator.batch_size,\n    validation_steps=validation_generator.samples // validation_generator.batch_size,\n    verbose=1\n)\n\nprint(f\"En iyi validation accuracy: {max(history2.history['val_accuracy']):.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T15:31:26.775056Z","iopub.execute_input":"2025-09-26T15:31:26.775251Z","iopub.status.idle":"2025-09-26T15:46:38.261401Z","shell.execute_reply.started":"2025-09-26T15:31:26.775236Z","shell.execute_reply":"2025-09-26T15:46:38.260594Z"}},"outputs":[],"execution_count":null},{"id":"51e1755c","cell_type":"code","source":"# İki modelin karşılaştırması\nfig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 10))\n\n# Model 1 (LR=0.001) - Accuracy\nax1.plot(history.history['accuracy'], label='Training', color='blue', linewidth=2)\nax1.plot(history.history['val_accuracy'], label='Validation', color='red', linewidth=2)\nax1.set_title('Model 1 - Accuracy (LR=0.001)')\nax1.set_xlabel('Epoch')\nax1.set_ylabel('Accuracy')\nax1.legend()\nax1.grid(True, alpha=0.3)\n\n# Model 1 (LR=0.001) - Loss\nax2.plot(history.history['loss'], label='Training', color='blue', linewidth=2)\nax2.plot(history.history['val_loss'], label='Validation', color='red', linewidth=2)\nax2.set_title('Model 1 - Loss (LR=0.001)')\nax2.set_xlabel('Epoch')\nax2.set_ylabel('Loss')\nax2.legend()\nax2.grid(True, alpha=0.3)\n\n# Model 2 (LR=0.0001) - Accuracy\nax3.plot(history2.history['accuracy'], label='Training', color='green', linewidth=2)\nax3.plot(history2.history['val_accuracy'], label='Validation', color='orange', linewidth=2)\nax3.set_title('Model 2 - Accuracy (LR=0.0001)')\nax3.set_xlabel('Epoch')\nax3.set_ylabel('Accuracy')\nax3.legend()\nax3.grid(True, alpha=0.3)\n\n# Model 2 (LR=0.0001) - Loss\nax4.plot(history2.history['loss'], label='Training', color='green', linewidth=2)\nax4.plot(history2.history['val_loss'], label='Validation', color='orange', linewidth=2)\nax4.set_title('Model 2 - Loss (LR=0.0001)')\nax4.set_xlabel('Epoch')\nax4.set_ylabel('Loss')\nax4.legend()\nax4.grid(True, alpha=0.3)\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T15:46:38.262595Z","iopub.execute_input":"2025-09-26T15:46:38.262876Z","iopub.status.idle":"2025-09-26T15:46:39.094978Z","shell.execute_reply.started":"2025-09-26T15:46:38.262856Z","shell.execute_reply":"2025-09-26T15:46:39.094081Z"}},"outputs":[],"execution_count":null},{"id":"4e5deabf","cell_type":"code","source":"# Performans karşılaştırması\nprint(\"LEARNING RATE KARŞILAŞTIRMASI\")\nprint(\"=\"*50)\n\n# Model 1 sonuçları\nfinal_train_acc1 = history.history['accuracy'][-1]\nfinal_val_acc1 = history.history['val_accuracy'][-1]\nbest_val_acc1 = max(history.history['val_accuracy'])\nfinal_loss1 = history.history['val_loss'][-1]\n\n# Model 2 sonuçları  \nfinal_train_acc2 = history2.history['accuracy'][-1]\nfinal_val_acc2 = history2.history['val_accuracy'][-1]\nbest_val_acc2 = max(history2.history['val_accuracy'])\nfinal_loss2 = history2.history['val_loss'][-1]\n\nprint(f\"\\nMODEL 1 (LR=0.001):\")\nprint(f\"  Final Training Accuracy: {final_train_acc1:.4f} ({final_train_acc1*100:.2f}%)\")\nprint(f\"  Final Validation Accuracy: {final_val_acc1:.4f} ({final_val_acc1*100:.2f}%)\")\nprint(f\"  Best Validation Accuracy: {best_val_acc1:.4f} ({best_val_acc1*100:.2f}%)\")\nprint(f\"  Final Validation Loss: {final_loss1:.4f}\")\nprint(f\"  Epoch Sayısı: {len(history.history['loss'])}\")\n\nprint(f\"\\nMODEL 2 (LR=0.0001):\")\nprint(f\"  Final Training Accuracy: {final_train_acc2:.4f} ({final_train_acc2*100:.2f}%)\")\nprint(f\"  Final Validation Accuracy: {final_val_acc2:.4f} ({final_val_acc2*100:.2f}%)\")\nprint(f\"  Best Validation Accuracy: {best_val_acc2:.4f} ({best_val_acc2*100:.2f}%)\")\nprint(f\"  Final Validation Loss: {final_loss2:.4f}\")\nprint(f\"  Epoch Sayısı: {len(history2.history['loss'])}\")\n\nprint(f\"\\nSonuç:\")\nif best_val_acc1 > best_val_acc2:\n    print(f\"Model 1 (LR=0.001) daha başarılı: {best_val_acc1*100:.2f}% vs {best_val_acc2*100:.2f}%\")\n    print(f\"Fark: {(best_val_acc1-best_val_acc2)*100:.2f} puan\")\nelse:\n    print(f\"Model 2 (LR=0.0001) daha başarılı: {best_val_acc2*100:.2f}% vs {best_val_acc1*100:.2f}%\")\n    print(f\"Fark: {(best_val_acc2-best_val_acc1)*100:.2f} puan\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T15:46:39.095696Z","iopub.execute_input":"2025-09-26T15:46:39.095923Z","iopub.status.idle":"2025-09-26T15:46:39.104718Z","shell.execute_reply.started":"2025-09-26T15:46:39.095906Z","shell.execute_reply":"2025-09-26T15:46:39.103991Z"}},"outputs":[],"execution_count":null},{"id":"8f3d0949","cell_type":"code","source":"# Her iki modelin validation seti üzerinde performansı\nvalidation_generator.reset()\n\n# Model 1 tahminleri\nY_pred1 = model.predict(validation_generator)\ny_pred1 = np.argmax(Y_pred1, axis=1)\n\nvalidation_generator.reset()\n\n# Model 2 tahminleri  \nY_pred2 = model2.predict(validation_generator)\ny_pred2 = np.argmax(Y_pred2, axis=1)\n\n# Gerçek etiketler\ny_true = validation_generator.classes\n\n# Accuracy hesaplama\nacc1 = np.sum(y_pred1 == y_true) / len(y_true)\nacc2 = np.sum(y_pred2 == y_true) / len(y_true)\n\nprint(\"VALIDATION SETİ FINAL PERFORMANSI\")\nprint(\"=\"*40)\nprint(f\"Model 1 (LR=0.001): {acc1:.4f} ({acc1*100:.2f}%)\")\nprint(f\"Model 2 (LR=0.0001): {acc2:.4f} ({acc2*100:.2f}%)\")\n\nif acc1 > acc2:\n    print(f\"\\nKazanan: Model 1 (Yüksek Learning Rate)\")\n    print(f\"Performans farkı: +{(acc1-acc2)*100:.2f} puan\")\nelse:\n    print(f\"\\nKazanan: Model 2 (Düşük Learning Rate)\")\n    print(f\"Performans farkı: +{(acc2-acc1)*100:.2f} puan\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-26T15:46:39.105363Z","iopub.execute_input":"2025-09-26T15:46:39.105583Z","iopub.status.idle":"2025-09-26T15:46:53.598498Z","shell.execute_reply.started":"2025-09-26T15:46:39.105560Z","shell.execute_reply":"2025-09-26T15:46:53.597753Z"}},"outputs":[],"execution_count":null},{"id":"e718e0a8","cell_type":"markdown","source":"#### 14. Sonuç ve Değerlendirme\n\n### Proje Özeti\n\nBu projede başarılı bir şekilde köpek ve kedi görüntülerini sınıflandıran bir CNN modeli geliştirdik.\n\n### Elde Edilen Sonuçlar:\n\n**Model Mimarisi:**\n- 3 konvolüsyon bloğu + 2 fully connected katman\n- Toplam parametre sayısı: Yaklaşık 1.2M\n- Batch Normalization ve Dropout ile optimize edilmiş\n\n**Performans Metrikleri:**\n- Training Accuracy: Model eğitim sürecinde gösterilen performans\n- Validation Accuracy: Modelin genelleme yeteneği\n- Test Accuracy: Final performans metriği\n\n**Kullanılan Teknikler:**\n- Data Augmentation ile veri çeşitlendirme\n- Early Stopping ile overfitting önleme\n- Learning Rate Scheduling ile performans optimizasyonu\n\n**Model Performansı:**\n- Her iki model de yüksek doğruluk oranları elde etti\n- Learning rate seçimi eğitim hızı ve kararlılığı etkiledi\n- Validation seti üzerinde güvenilir performans gösterildi\n","metadata":{}}]}