{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":39272,"databundleVersionId":4629629,"sourceType":"competition"},{"sourceId":4639110,"sourceType":"datasetVersion","datasetId":2692826},{"sourceId":4675845,"sourceType":"datasetVersion","datasetId":2710646},{"sourceId":4696088,"sourceType":"datasetVersion","datasetId":2687741},{"sourceId":4698238,"sourceType":"datasetVersion","datasetId":2719281},{"sourceId":4709451,"sourceType":"datasetVersion","datasetId":2707371},{"sourceId":104036025,"sourceType":"kernelVersion"}],"dockerImageVersionId":30302,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Meme Kanseri Tespiti - RSNA Mammography\n## Kaggle Uzerinde Egitim Notebook'u\n\nBu notebook Kaggle uzerinde GPU ile calisir.\n\n**Gereksinimler:**\n- Kaggle hesabi\n- GPU accelerator (ucretsiz)\n- RSNA veri seti","metadata":{}},{"cell_type":"markdown","source":"## 1. Kurulum ve Import","metadata":{}},{"cell_type":"code","source":"!unzip -qo /kaggle/input/timm-with-dependencies/timm_all -d timm-with-dependencies\n!pip install --no-index --find-links timm-with-dependencies timm -q\n\n# Kontrol\nimport timm\nprint(f'Timm: {timm.__version__}')\nprint('Kurulum BASARILI!')\n\nimport os\nimport numpy as np\nimport pandas as pd\nimport cv2\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.optim import AdamW\nfrom torch.optim.lr_scheduler import CosineAnnealingLR\n\nimport timm\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import roc_auc_score\nfrom tqdm.notebook import tqdm\n\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# Cihaz kontrolu\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint(f'Cihaz: {device}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:25.83185Z","iopub.execute_input":"2025-12-26T11:21:25.832728Z","iopub.status.idle":"2025-12-26T11:21:46.925445Z","shell.execute_reply.started":"2025-12-26T11:21:25.832694Z","shell.execute_reply":"2025-12-26T11:21:46.924211Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Ayarlar (Config)\n\n**ONEMLI:** Bu ayarlari degistirerek farkli sonuclar alabilirsiniz!","metadata":{}},{"cell_type":"code","source":"class CFG:\n    # ========== VERI YOLLARI ==========\n    # Kaggle'da bu yollar otomatik gelir\n    DATA_PATH = '/kaggle/input/rsna-breast-cancer-detection'\n    IMAGE_PATH = '/kaggle/input/rsna-breast-cancer-512-pngs/images'  # onceden hazirlanmis PNG'ler\n    \n    # ========== MODEL AYARLARI ==========\n    # Model secenekleri:\n    # - 'tf_efficientnetv2_s' : Hizli, iyi sonuc (TAVSIYE)\n    # - 'convnext_small'      : Daha yeni, iyi sonuc\n    # - 'resnet50'            : Klasik, hizli\n    MODEL_NAME = 'tf_efficientnetv2_s'\n    \n    # ========== EGITIM AYARLARI ==========\n    EPOCHS = 5           # Kac tur egitim? (5-10 arasi iyi)\n    BATCH_SIZE = 16      # GPU bellegine gore ayarla (8, 16, 32)\n    IMG_SIZE = 512       # Goruntu boyutu (256, 384, 512)\n    \n    # ========== OGRENME HIZI ==========\n    LR = 1e-4            # 0.0001 - guvenli deger\n    MIN_LR = 1e-6        # Minimum ogrenme hizi\n    \n    # ========== CROSS VALIDATION ==========\n    N_FOLDS = 4          # Kac parcaya bolunecek\n    TRAIN_FOLDS = [0]    # Hangi fold'lar egitilecek (hizli test icin [0])\n    \n    # ========== DIGER ==========\n    SEED = 42\n    NUM_WORKERS = 2\n    \n    # ========== DENGESIZ VERI COZUMU ==========\n    POS_WEIGHT = 10.0    # Kanserli orneklere kac kat fazla agirlik? (5-20 arasi)\n\nprint('Ayarlar yuklendi!')\nprint(f'Model: {CFG.MODEL_NAME}')\nprint(f'Epochs: {CFG.EPOCHS}')\nprint(f'Batch Size: {CFG.BATCH_SIZE}')\nprint(f'Image Size: {CFG.IMG_SIZE}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:46.927896Z","iopub.execute_input":"2025-12-26T11:21:46.928339Z","iopub.status.idle":"2025-12-26T11:21:46.936022Z","shell.execute_reply.started":"2025-12-26T11:21:46.928293Z","shell.execute_reply":"2025-12-26T11:21:46.934919Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Ayarlarin Etkileri\n\n| Ayar | Artirirsan | Azaltirsan |\n|------|------------|------------|\n| EPOCHS | Daha iyi ogrenir ama ezber riski | Hizli ama az ogrenir |\n| BATCH_SIZE | Hizli ama fazla GPU lazim | Yavas ama az GPU yeter |\n| IMG_SIZE | Detayli ama yavas | Hizli ama detay kaybi |\n| LR | Hizli ogrenir ama karasiz | Yavas ama kararli |\n| POS_WEIGHT | Kanseri daha iyi yakalar ama yanlis alarm artar | Yanlis alarm az ama kanser kacirabilir |","metadata":{}},{"cell_type":"markdown","source":"## 3. Yardimci Fonksiyonlar","metadata":{}},{"cell_type":"code","source":"def set_seed(seed=42):\n    \"\"\"Tekrarlanabilirlik icin seed ayarla\"\"\"\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n\nset_seed(CFG.SEED)\n\ndef pfbeta(labels, predictions, beta=1):\n    \"\"\"\n    pF-beta skoru hesapla (RSNA yarisma metrigi)\n    Bu metrik kanser tespitinde onemli!\n    \"\"\"\n    y_true_count = labels.sum()\n    ctp = (predictions[labels == 1]).sum()\n    cfp = (predictions[labels == 0]).sum()\n    \n    beta_squared = beta * beta\n    \n    if ctp + cfp == 0:\n        return 0\n    \n    c_precision = ctp / (ctp + cfp)\n    c_recall = ctp / y_true_count if y_true_count > 0 else 0\n    \n    if c_precision + c_recall == 0:\n        return 0\n    \n    result = (1 + beta_squared) * (c_precision * c_recall) / (beta_squared * c_precision + c_recall)\n    return result\n\nprint('Yardimci fonksiyonlar yuklendi!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:46.937575Z","iopub.execute_input":"2025-12-26T11:21:46.938461Z","iopub.status.idle":"2025-12-26T11:21:46.953037Z","shell.execute_reply.started":"2025-12-26T11:21:46.93843Z","shell.execute_reply":"2025-12-26T11:21:46.952201Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Veriyi Yukle ve Hazirla","metadata":{}},{"cell_type":"code","source":"# CSV dosyasini oku\ntrain_df = pd.read_csv(f'{CFG.DATA_PATH}/train.csv')\n\nprint(f'Toplam goruntu sayisi: {len(train_df)}')\nprint(f'Kanserli goruntu sayisi: {train_df.cancer.sum()}')\nprint(f'Normal goruntu sayisi: {len(train_df) - train_df.cancer.sum()}')\nprint(f'Kanser orani: %{100*train_df.cancer.mean():.2f}')\n\n# Goruntu yolunu ekle\ntrain_df['image_path'] = train_df.apply(\n    lambda x: f\"{CFG.IMAGE_PATH}/{x['patient_id']}_{x['image_id']}.png\", axis=1\n)\n\ntrain_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:46.955482Z","iopub.execute_input":"2025-12-26T11:21:46.956124Z","iopub.status.idle":"2025-12-26T11:21:47.619819Z","shell.execute_reply.started":"2025-12-26T11:21:46.956085Z","shell.execute_reply":"2025-12-26T11:21:47.618879Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Hasta bazinda kanser durumu (ayni hastanin tum goruntulerini ayni fold'a koymak icin)\npatient_cancer = train_df.groupby('patient_id')['cancer'].max().reset_index()\n\n# Stratified K-Fold (kanser oranini koruyarak bolme)\nskf = StratifiedKFold(n_splits=CFG.N_FOLDS, shuffle=True, random_state=CFG.SEED)\n\npatient_cancer['fold'] = -1\nfor fold, (_, val_idx) in enumerate(skf.split(patient_cancer, patient_cancer['cancer'])):\n    patient_cancer.loc[val_idx, 'fold'] = fold\n\n# Ana dataframe'e fold bilgisini ekle\ntrain_df = train_df.merge(patient_cancer[['patient_id', 'fold']], on='patient_id')\n\nprint('Fold dagilimi:')\nprint(train_df.groupby('fold')['cancer'].agg(['count', 'sum', 'mean']))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:47.621213Z","iopub.execute_input":"2025-12-26T11:21:47.621577Z","iopub.status.idle":"2025-12-26T11:21:47.665821Z","shell.execute_reply.started":"2025-12-26T11:21:47.621542Z","shell.execute_reply":"2025-12-26T11:21:47.664883Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 5. Dataset ve DataLoader","metadata":{}},{"cell_type":"code","source":"class MammographyDataset(Dataset):\n    \"\"\"\n    Mamografi veri seti\n    \n    Bu sinif:\n    - Goruntuleri diskten okur\n    - Augmentation uygular (egitim icin)\n    - Tensore cevirir\n    \"\"\"\n    def __init__(self, df, transforms=None):\n        self.df = df.reset_index(drop=True)\n        self.transforms = transforms\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        \n        # Goruntuyu oku\n        img = cv2.imread(row['image_path'], cv2.IMREAD_GRAYSCALE)\n        \n        if img is None:\n            # Dosya bulunamazsa siyah goruntu\n            img = np.zeros((CFG.IMG_SIZE, CFG.IMG_SIZE), dtype=np.uint8)\n        \n        # 3 kanala cevir (model icin)\n        img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)\n        \n        # Augmentation\n        if self.transforms:\n            img = self.transforms(image=img)['image']\n        \n        # Label\n        label = torch.tensor(row['cancer'], dtype=torch.float32)\n        \n        return img, label\n\n# Egitim icin augmentation (veri cogaltma)\ntrain_transforms = A.Compose([\n    A.Resize(CFG.IMG_SIZE, CFG.IMG_SIZE),\n    A.HorizontalFlip(p=0.5),       # Yatay cevirme\n    A.VerticalFlip(p=0.5),         # Dikey cevirme\n    A.RandomBrightnessContrast(    # Parlaklik/kontrast\n        brightness_limit=0.2, \n        contrast_limit=0.2, \n        p=0.5\n    ),\n    A.ShiftScaleRotate(            # Kaydirma/olcekleme/dondurme\n        shift_limit=0.1, \n        scale_limit=0.1, \n        rotate_limit=15, \n        p=0.5\n    ),\n    A.Normalize(                   # Normalizasyon\n        mean=[0.485, 0.456, 0.406],\n        std=[0.229, 0.224, 0.225]\n    ),\n    ToTensorV2()                   # Tensore cevir\n])\n\n# Validation icin (augmentation yok, sadece resize)\nval_transforms = A.Compose([\n    A.Resize(CFG.IMG_SIZE, CFG.IMG_SIZE),\n    A.Normalize(\n        mean=[0.485, 0.456, 0.406],\n        std=[0.229, 0.224, 0.225]\n    ),\n    ToTensorV2()\n])\n\nprint('Dataset ve transforms hazirlandi!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:47.667079Z","iopub.execute_input":"2025-12-26T11:21:47.667385Z","iopub.status.idle":"2025-12-26T11:21:47.678559Z","shell.execute_reply.started":"2025-12-26T11:21:47.667358Z","shell.execute_reply":"2025-12-26T11:21:47.677443Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 6. Model","metadata":{}},{"cell_type":"code","source":"class MammographyModel(nn.Module):\n    \"\"\"\n    Mamografi siniflandirma modeli\n    \n    Pretrained model + ozel head\n    \"\"\"\n    def __init__(self, model_name, pretrained=True):\n        super().__init__()\n        \n        # Pretrained backbone\n        self.backbone = timm.create_model(\n            model_name, \n            pretrained=pretrained,\n            num_classes=0,  # Head'i kaldir\n            global_pool='avg'\n        )\n        \n        # Ozellik boyutu\n        self.num_features = self.backbone.num_features\n        \n        # Siniflandirma katmani\n        self.head = nn.Sequential(\n            nn.Dropout(0.3),\n            nn.Linear(self.num_features, 1)\n        )\n    \n    def forward(self, x):\n        features = self.backbone(x)\n        output = self.head(features)\n        return output.squeeze(-1)\n\n# Test\nmodel = MammographyModel(CFG.MODEL_NAME)\nprint(f'Model: {CFG.MODEL_NAME}')\nprint(f'Ozellik boyutu: {model.num_features}')\nprint(f'Toplam parametre: {sum(p.numel() for p in model.parameters()):,}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:47.67972Z","iopub.execute_input":"2025-12-26T11:21:47.679983Z","iopub.status.idle":"2025-12-26T11:21:58.315339Z","shell.execute_reply.started":"2025-12-26T11:21:47.679959Z","shell.execute_reply":"2025-12-26T11:21:58.314342Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 7. Egitim Fonksiyonlari","metadata":{}},{"cell_type":"code","source":"def train_one_epoch(model, loader, optimizer, criterion, device):\n    \"\"\"\n    Bir epoch egitim\n    \"\"\"\n    model.train()\n    total_loss = 0\n    \n    pbar = tqdm(loader, desc='Egitim')\n    for images, labels in pbar:\n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        \n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        \n        loss.backward()\n        optimizer.step()\n        \n        total_loss += loss.item()\n        pbar.set_postfix({'loss': f'{loss.item():.4f}'})\n    \n    return total_loss / len(loader)\n\n@torch.no_grad()\ndef validate(model, loader, criterion, device):\n    \"\"\"\n    Validation\n    \"\"\"\n    model.eval()\n    total_loss = 0\n    all_preds = []\n    all_labels = []\n    \n    pbar = tqdm(loader, desc='Validation')\n    for images, labels in pbar:\n        images = images.to(device)\n        labels = labels.to(device)\n        \n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        \n        total_loss += loss.item()\n        \n        preds = torch.sigmoid(outputs).cpu().numpy()\n        all_preds.extend(preds)\n        all_labels.extend(labels.cpu().numpy())\n    \n    all_preds = np.array(all_preds)\n    all_labels = np.array(all_labels)\n    \n    # Metrikleri hesapla\n    auc = roc_auc_score(all_labels, all_preds) if all_labels.sum() > 0 else 0\n    pf1 = pfbeta(all_labels, all_preds)\n    \n    return total_loss / len(loader), auc, pf1, all_preds, all_labels\n\nprint('Egitim fonksiyonlari hazirlandi!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:58.316853Z","iopub.execute_input":"2025-12-26T11:21:58.317302Z","iopub.status.idle":"2025-12-26T11:21:58.329526Z","shell.execute_reply.started":"2025-12-26T11:21:58.317263Z","shell.execute_reply":"2025-12-26T11:21:58.328441Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 8. Ana Egitim Dongusu","metadata":{}},{"cell_type":"code","source":"def train_fold(fold):\n    \"\"\"\n    Tek bir fold icin egitim\n    \"\"\"\n    print(f'\\n{\"=\"*50}')\n    print(f'FOLD {fold} EGITIMI BASLIYOR')\n    print(f'{\"=\"*50}')\n    \n    # Train/Val ayir\n    train_data = train_df[train_df['fold'] != fold]\n    val_data = train_df[train_df['fold'] == fold]\n    \n    print(f'Egitim: {len(train_data)} goruntu')\n    print(f'Validation: {len(val_data)} goruntu')\n    \n    # Dataset\n    train_dataset = MammographyDataset(train_data, train_transforms)\n    val_dataset = MammographyDataset(val_data, val_transforms)\n    \n    # DataLoader\n    train_loader = DataLoader(\n        train_dataset, \n        batch_size=CFG.BATCH_SIZE, \n        shuffle=True,\n        num_workers=CFG.NUM_WORKERS,\n        pin_memory=True,\n        drop_last=True\n    )\n    val_loader = DataLoader(\n        val_dataset, \n        batch_size=CFG.BATCH_SIZE * 2,\n        shuffle=False,\n        num_workers=CFG.NUM_WORKERS,\n        pin_memory=True\n    )\n    \n    # Model\n    model = MammographyModel(CFG.MODEL_NAME).to(device)\n    \n    # Loss (pos_weight ile dengesiz veri cozumu)\n    pos_weight = torch.tensor([CFG.POS_WEIGHT]).to(device)\n    criterion = nn.BCEWithLogitsLoss(pos_weight=pos_weight)\n    \n    # Optimizer\n    optimizer = AdamW(model.parameters(), lr=CFG.LR, weight_decay=1e-4)\n    \n    # Scheduler\n    scheduler = CosineAnnealingLR(optimizer, T_max=CFG.EPOCHS, eta_min=CFG.MIN_LR)\n    \n    # Egitim\n    best_auc = 0\n    best_pf1 = 0\n    history = []\n    \n    for epoch in range(CFG.EPOCHS):\n        print(f'\\nEpoch {epoch+1}/{CFG.EPOCHS}')\n        print(f'LR: {optimizer.param_groups[0][\"lr\"]:.2e}')\n        \n        # Egitim\n        train_loss = train_one_epoch(model, train_loader, optimizer, criterion, device)\n        \n        # Validation\n        val_loss, val_auc, val_pf1, preds, labels = validate(model, val_loader, criterion, device)\n        \n        scheduler.step()\n        \n        # Sonuclari kaydet\n        history.append({\n            'epoch': epoch + 1,\n            'train_loss': train_loss,\n            'val_loss': val_loss,\n            'val_auc': val_auc,\n            'val_pf1': val_pf1\n        })\n        \n        print(f'Train Loss: {train_loss:.4f}')\n        print(f'Val Loss: {val_loss:.4f}')\n        print(f'Val AUC: {val_auc:.4f}')\n        print(f'Val pF1: {val_pf1:.4f}')\n        \n        # En iyi modeli kaydet\n        if val_auc > best_auc:\n            best_auc = val_auc\n            best_pf1 = val_pf1\n            torch.save(model.state_dict(), f'best_model_fold{fold}.pt')\n            print(f'*** YENi EN IYI MODEL KAYDEDILDI! AUC: {best_auc:.4f} ***')\n    \n    print(f'\\nFold {fold} tamamlandi!')\n    print(f'En iyi AUC: {best_auc:.4f}')\n    print(f'En iyi pF1: {best_pf1:.4f}')\n    \n    return history, best_auc, best_pf1","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:58.330768Z","iopub.execute_input":"2025-12-26T11:21:58.331165Z","iopub.status.idle":"2025-12-26T11:21:58.349175Z","shell.execute_reply.started":"2025-12-26T11:21:58.331115Z","shell.execute_reply":"2025-12-26T11:21:58.348124Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# EGITIMI BASLAT!\nall_histories = []\nall_aucs = []\nall_pf1s = []\n\nfor fold in CFG.TRAIN_FOLDS:\n    history, best_auc, best_pf1 = train_fold(fold)\n    all_histories.append(history)\n    all_aucs.append(best_auc)\n    all_pf1s.append(best_pf1)\n\nprint('\\n' + '='*50)\nprint('EGITIM TAMAMLANDI!')\nprint('='*50)\nprint(f'Ortalama AUC: {np.mean(all_aucs):.4f}')\nprint(f'Ortalama pF1: {np.mean(all_pf1s):.4f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T11:21:58.353351Z","iopub.execute_input":"2025-12-26T11:21:58.354369Z","iopub.status.idle":"2025-12-26T13:42:00.178848Z","shell.execute_reply.started":"2025-12-26T11:21:58.354322Z","shell.execute_reply":"2025-12-26T13:42:00.177933Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 9. Sonuclari Gorsellestir","metadata":{}},{"cell_type":"code","source":"# Egitim grafiklerini ciz\nif all_histories:\n    history_df = pd.DataFrame(all_histories[0])\n    \n    fig, axes = plt.subplots(1, 3, figsize=(15, 4))\n    \n    # Loss\n    axes[0].plot(history_df['epoch'], history_df['train_loss'], label='Train')\n    axes[0].plot(history_df['epoch'], history_df['val_loss'], label='Val')\n    axes[0].set_xlabel('Epoch')\n    axes[0].set_ylabel('Loss')\n    axes[0].set_title('Loss Grafigi')\n    axes[0].legend()\n    axes[0].grid(True)\n    \n    # AUC\n    axes[1].plot(history_df['epoch'], history_df['val_auc'], 'g-o')\n    axes[1].set_xlabel('Epoch')\n    axes[1].set_ylabel('AUC')\n    axes[1].set_title('Validation AUC')\n    axes[1].grid(True)\n    \n    # pF1\n    axes[2].plot(history_df['epoch'], history_df['val_pf1'], 'r-o')\n    axes[2].set_xlabel('Epoch')\n    axes[2].set_ylabel('pF1')\n    axes[2].set_title('Validation pF1')\n    axes[2].grid(True)\n    \n    plt.tight_layout()\n    plt.savefig('training_results.png', dpi=150)\n    plt.show()\n    \n    # Sonuclari CSV'ye kaydet\n    history_df.to_csv('training_history.csv', index=False)\n    print('Sonuclar kaydedildi!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T13:42:00.180164Z","iopub.execute_input":"2025-12-26T13:42:00.180493Z","iopub.status.idle":"2025-12-26T13:42:01.159094Z","shell.execute_reply.started":"2025-12-26T13:42:00.180463Z","shell.execute_reply":"2025-12-26T13:42:01.158281Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 10. Sonuclar\n\nEgitim tamamlandiktan sonra:\n- `best_model_fold0.pt`: En iyi model agirliklari\n- `training_history.csv`: Tum metrikler\n- `training_results.png`: Grafikler\n\n### Metrik Aciklamalari:\n- **AUC**: 0.5 = sans, 0.7+ = iyi, 0.8+ = cok iyi\n- **pF1**: Yarisma metrigi, yuksek = iyi","metadata":{}},{"cell_type":"markdown","source":"---\n## Referanslar\n\n1. Chakraborty, D. (2023). Screening Mammography Breast Cancer Detection. arXiv:2307.11274\n2. RSNA Screening Mammography Breast Cancer Detection Competition. Kaggle.\n3. Tan, M., & Le, Q. V. (2021). EfficientNetV2: Smaller models and faster training.\n4. Liu, Z., et al. (2022). A ConvNet for the 2020s. CVPR.","metadata":{}}]}