{"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":"code","source":"# Gerekli kütüphaneleri içe aktarıyoruz\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport zipfile\n\n# TensorFlow ve Keras kütüphaneleri\nimport tensorflow as tf\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report, confusion_matrix\n\nprint(\"Kütüphaneler başarıyla yüklendi.\")\n\n# Kaggle'daki veri seti yolları\n# Veri seti genellikle bir zip dosyası olarak gelir, önce onu açalım.\n# Eğer dosyalar zaten açıksa bu adımı atlayabilirsiniz.\n\n# train.zip ve test1.zip dosyalarını açma\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as z:\n    z.extractall('.')\n\nwith zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as z:\n    z.extractall('.')\n\n# Dosya yollarını ve etiketleri hazırlama\nTRAIN_DIR = 'train/'\nfilenames = os.listdir(TRAIN_DIR)\nlabels = []\nfor filename in filenames:\n    label = filename.split('.')[0] # Dosya adı 'cat.1.jpg' veya 'dog.1.jpg' şeklindedir\n    if label == 'cat':\n        labels.append('cat')\n    else:\n        labels.append('dog')\n\n# Dosya adları ve etiketlerden bir DataFrame oluşturuyoruz.\n# Bu yapı, veriyi yönetmeyi çok kolaylaştırır.\ndf = pd.DataFrame({\n    'filename': filenames,\n    'label': labels\n})\n\n# Oluşturduğumuz DataFrame'in ilk 5 satırına bakalım\nprint(df.head())\nprint(\"\\nVeri setindeki toplam resim sayısı:\", len(df))\nprint(\"\\nSınıflara göre resim sayıları:\\n\", df['label'].value_counts())","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-09-23T17:10:36.071390Z","iopub.execute_input":"2025-09-23T17:10:36.071692Z","iopub.status.idle":"2025-09-23T17:10:45.449331Z","shell.execute_reply.started":"2025-09-23T17:10:36.071667Z","shell.execute_reply":"2025-09-23T17:10:45.448664Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# DataFrame'i eğitim (%80) ve doğrulama (%20) olarak ikiye ayırıyoruz\ntrain_df, validation_df = train_test_split(df, test_size=0.20, random_state=42)\n\n# Eğitim setindeki veriyi yeniden dengelemek (eğer dengesiz ise) ve\n# boyutunu kontrol etmek için boyutlarını yeniden ayarlıyoruz\ntrain_df = train_df.reset_index(drop=True)\nvalidation_df = validation_df.reset_index(drop=True)\n\n# Görüntü boyutları ve diğer parametreler\nIMG_WIDTH = 150\nIMG_HEIGHT = 150\nIMG_CHANNELS = 3 # Renkli resimler için 3 (RGB)\nIMAGE_SIZE = (IMG_WIDTH, IMG_HEIGHT)\nBATCH_SIZE = 32\n\n# Veri Çoğaltma (Data Augmentation) ile ImageDataGenerator oluşturma\n# Bu işlem, eğitim verilerini yapay olarak artırarak modelin genelleme yeteneğini geliştirir.\ntrain_datagen = ImageDataGenerator(\n    rescale=1./255,             # Piksel değerlerini 0-1 arasına ölçekle\n    rotation_range=40,          # Resmi rastgele 40 dereceye kadar döndür\n    width_shift_range=0.2,      # Resmi yatayda %20'ye kadar kaydır\n    height_shift_range=0.2,     # Resmi dikeyde %20'ye kadar kaydır\n    shear_range=0.2,            # Resmi eğ/bük\n    zoom_range=0.2,             # Resme %20'ye kadar zoom yap\n    horizontal_flip=True,       # Resmi yatayda rastgele çevir\n    fill_mode='nearest'         # Oluşan boş pikselleri en yakın pikselle doldur\n)\n\n# Doğrulama verisi için çoğaltma yapmıyoruz, sadece ölçekleme yapıyoruz!\n# Çünkü modelin performansını orijinal resimler üzerinde ölçmek isteriz.\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\n\n# DataFrame'den akan veri üreteçleri oluşturuyoruz\ntrain_generator = train_datagen.flow_from_dataframe(\n    dataframe=train_df,\n    directory=TRAIN_DIR,\n    x_col='filename',\n    y_col='label',\n    target_size=IMAGE_SIZE,\n    class_mode='binary', # İki sınıfımız var: kedi ve köpek\n    batch_size=BATCH_SIZE\n)\n\nvalidation_generator = validation_datagen.flow_from_dataframe(\n    dataframe=validation_df,\n    directory=TRAIN_DIR,\n    x_col='filename',\n    y_col='label',\n    target_size=IMAGE_SIZE,\n    class_mode='binary',\n    batch_size=BATCH_SIZE\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T17:10:45.450640Z","iopub.execute_input":"2025-09-23T17:10:45.450886Z","iopub.status.idle":"2025-09-23T17:10:45.628186Z","shell.execute_reply.started":"2025-09-23T17:10:45.450868Z","shell.execute_reply":"2025-09-23T17:10:45.627404Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Model mimarisini oluşturuyoruz\nmodel = Sequential([\n    # 1. Evrişim ve Havuzlama Bloğu\n    Conv2D(32, (3, 3), activation='relu', input_shape=(IMG_WIDTH, IMG_HEIGHT, IMG_CHANNELS)),\n    MaxPooling2D((2, 2)),\n    \n    # 2. Evrişim ve Havuzlama Bloğu\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    \n    # 3. Evrişim ve Havuzlama Bloğu\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    \n    # Özellik haritalarını tek boyutlu bir vektöre düzleştirme\n    Flatten(),\n    \n    # Sınıflandırma için tam bağlantılı katman\n    Dense(512, activation='relu'),\n    \n    # Overfitting'i önlemek için Dropout katmanı\n    Dropout(0.5),\n    \n    # Çıkış katmanı (1 nöron, çünkü kedi mi değil mi diye soruyoruz - binary)\n    # Sigmoid aktivasyonu, sonucu 0 ile 1 arasında bir olasılık değerine dönüştürür.\n    Dense(1, activation='sigmoid')\n])\n\n# Modeli derliyoruz\nmodel.compile(optimizer='adam',\n              loss='binary_crossentropy', # İkili sınıflandırma için en uygun kayıp fonksiyonu\n              metrics=['accuracy'])\n\n# Modelin mimarisini özet olarak görelim\nmodel.summary()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T17:10:45.628949Z","iopub.execute_input":"2025-09-23T17:10:45.629178Z","iopub.status.idle":"2025-09-23T17:10:45.693197Z","shell.execute_reply.started":"2025-09-23T17:10:45.629158Z","shell.execute_reply":"2025-09-23T17:10:45.692622Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Modeli eğitiyoruz\n# Bu işlem GPU'nuzun hızına bağlı olarak zaman alabilir. Kaggle'da GPU'yu aktif etmeyi unutmayın!\nEPOCHS = 15 # Veri setinin tamamının üzerinden kaç kez geçileceği\n\nhistory = model.fit(\n    train_generator,\n    steps_per_epoch=train_df.shape[0] // BATCH_SIZE, # Bir epoch'ta kaç adım atılacağı\n    epochs=EPOCHS,\n    validation_data=validation_generator,\n    validation_steps=validation_df.shape[0] // BATCH_SIZE # Doğrulama için kaç adım atılacağı\n)\n\n# Eğitilen modeli daha sonra kullanmak üzere kaydedebilirsiniz\n# model.save('cat_dog_classifier.h5')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T17:10:45.694311Z","iopub.execute_input":"2025-09-23T17:10:45.694509Z","iopub.status.idle":"2025-09-23T17:41:41.897718Z","shell.execute_reply.started":"2025-09-23T17:10:45.694493Z","shell.execute_reply":"2025-09-23T17:41:41.897162Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Eğitim ve Doğrulama Doğruluk/Kayıp grafiklerini çizdirme\nacc = history.history['accuracy']\nval_acc = history.history['val_accuracy']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\n\nepochs_range = range(EPOCHS)\n\nplt.figure(figsize=(12, 6))\nplt.subplot(1, 2, 1)\nplt.plot(epochs_range, acc, label='Eğitim Doğruluğu')\nplt.plot(epochs_range, val_acc, label='Doğrulama Doğruluğu')\nplt.legend(loc='lower right')\nplt.title('Eğitim ve Doğrulama Doğruluğu')\n\nplt.subplot(1, 2, 2)\nplt.plot(epochs_range, loss, label='Eğitim Kaybı')\nplt.plot(epochs_range, val_loss, label='Doğrulama Kaybı')\nplt.legend(loc='upper right')\nplt.title('Eğitim ve Doğrulama Kaybı')\nplt.show()\n\n# Karmaşıklık Matrisi (Confusion Matrix) ve Sınıflandırma Raporu\n# Modelin doğrulama seti üzerindeki tahminlerini alalım\npredictions = model.predict(validation_generator)\n# Sigmoid çıktısını (0-1 arası olasılık) 0 veya 1 sınıfına dönüştürelim\npredicted_classes = np.where(predictions > 0.5, 1, 0) \ntrue_classes = validation_generator.classes\n\nprint(\"\\nSınıflandırma Raporu:\")\nprint(classification_report(true_classes, predicted_classes, target_names=['Cat', 'Dog']))\n\nprint(\"\\nKarmaşıklık Matrisi:\")\ncm = confusion_matrix(true_classes, predicted_classes)\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues')\nplt.xlabel('Tahmin Edilen')\nplt.ylabel('Gerçek')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-23T17:41:41.898720Z","iopub.execute_input":"2025-09-23T17:41:41.898924Z","iopub.status.idle":"2025-09-23T17:41:49.701468Z","shell.execute_reply.started":"2025-09-23T17:41:41.898907Z","shell.execute_reply":"2025-09-23T17:41:49.700730Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}