{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms, models\nfrom PIL import Image\nimport pandas as pd\nimport numpy as np\nimport pydicom\nimport torch.nn as nn\nfrom torchvision.models import ResNet18_Weights\n\nclass SpineDataset(Dataset):\n    def __init__(self, dataframe, img_dir, transform=None):\n        self.df = dataframe\n        self.img_dir = img_dir\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        study_id = self.df.iloc[idx]['study_id']\n        study_dir = os.path.join(self.img_dir, str(study_id))\n        \n        # Dizin yoksa veya DICOM dosyası yoksa None döndür\n        if not os.path.isdir(study_dir):\n            return None\n        \n        # DICOM dosyasını arama\n        dicom_file_found = False\n        dicom_file_path = None\n\n        for root, dirs, files in os.walk(study_dir):\n            dicom_files = [f for f in files if f.lower().endswith('.dcm')]\n            if dicom_files:\n                dicom_file_found = True\n                dicom_file_path = os.path.join(root, dicom_files[0])\n                break\n        \n        if not dicom_file_found:\n            return None\n        \n        # DICOM dosyasını yükle\n        dicom_data = pydicom.dcmread(dicom_file_path)\n        image = dicom_data.pixel_array\n\n        # Gri tonlamalı resmi RGB'ye dönüştür\n        image = Image.fromarray(image).convert('RGB')\n        \n        # Etiketleri al\n        labels = self.df.iloc[idx, 1:].values\n        labels = labels.astype(np.float32)\n        \n        if self.transform:\n            image = self.transform(image)\n\n        return image, torch.tensor(labels, dtype=torch.float32)\n\n\n# CSV Dosyasını Yükleme\ntrain_labels = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\ntrain_labels['study_id'] = train_labels['study_id'].astype(str)\n\n# Etiketleri binary sınıflara dönüştürme\nlabel_columns = train_labels.columns[1:]  # İlk sütun haricindeki tüm sütunlar etiket\ntrain_labels[label_columns] = train_labels[label_columns].apply(lambda col: col.map(lambda v: 1 if v == 'Severe' else 0))\n\n# DICOM Veri Seti\nimg_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images'\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n])\n\n# Geçerli satırlardan yeni bir dataframe oluştur\nvalid_rows = []\nfor idx in range(len(train_labels)):\n    study_id = train_labels.iloc[idx]['study_id']\n    study_dir = os.path.join(img_dir, str(study_id))\n    \n    # Dizin yoksa ya da DICOM dosyası yoksa bu satırı atla\n    dicom_file_found = False\n    for root, dirs, files in os.walk(study_dir):\n        dicom_files = [f for f in files if f.lower().endswith('.dcm')]\n        if dicom_files:\n            dicom_file_found = True\n            break\n    \n    if dicom_file_found:\n        valid_rows.append(idx)\n\n# Geçerli veri kümesi\nvalid_train_labels = train_labels.iloc[valid_rows]\n\n# Eğer geçerli veri yoksa, eğitime devam etme\nif len(valid_train_labels) == 0:\n    print(\"Geçerli veri bulunamadı. Eğitim yapılamaz.\")\nelse:\n    # Dataset ve DataLoader\n    dataset = SpineDataset(dataframe=valid_train_labels, img_dir=img_dir, transform=transform)\n    train_loader = DataLoader(dataset, batch_size=32, shuffle=True, collate_fn=lambda x: list(filter(None, x)))  # Boş batch'leri atla\n\n    # Model Tanımlaması\n    model = models.resnet18(weights=ResNet18_Weights.IMAGENET1K_V1)  # Güncellenmiş model yükleme\n    model.fc = nn.Linear(model.fc.in_features, len(label_columns))  # Son katmanı etiket sayısına göre ayarlayın\n\n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    model = model.to(device)\n\n    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)\n    criterion = nn.BCEWithLogitsLoss()\n\n    # Eğitim döngüsü\n    model.train()\n    all_epoch_models = {}  # Her epok için model ağırlıklarını saklamak için bir sözlük\n\n    for epoch in range(10):\n        train_loss = 0\n        for batch in train_loader:\n            if not batch:\n                continue  # Eğer batch boşsa, bir sonraki batch'e geç\n\n            images, labels = zip(*batch)  # Batch'i ayır\n            images = torch.stack(images).to(device)\n            labels = torch.stack(labels).to(device)\n\n            optimizer.zero_grad()\n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            loss.backward()\n            optimizer.step()\n\n            train_loss += loss.item()\n\n        print(f'Epoch {epoch+1}, Training Loss: {train_loss / len(train_loader)}')\n\n        # Her epokta modelin ağırlıklarını kaydetme\n        all_epoch_models[epoch] = model.state_dict()\n\n    # Sonunda tüm epokları kaydetme\n    model_save_path = '/kaggle/working/all_epoch_models.pth'  # Kaydedilecek dosyanın yolu\n    torch.save(all_epoch_models, model_save_path)  # Modelin her epoktaki ağırlıklarını kaydediyoruz\n    print(f\"Tüm epokların modelleri kaydedildi: {model_save_path}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-07T19:40:18.507964Z","iopub.execute_input":"2025-01-07T19:40:18.508261Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}