{"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.10.12"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":11279674,"sourceType":"datasetVersion","datasetId":7051988},{"sourceId":992,"sourceType":"modelInstanceVersion","modelInstanceId":846,"modelId":101}],"dockerImageVersionId":30919,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":12200.23886,"end_time":"2025-01-12T20:11:59.761367","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-01-12T16:48:39.522507","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"https://www.kaggle.com/code/borabingol/fork-of-fixed-train-with-severe-focused-augmentati/notebook with confusion matrix. \nUsing old .pt method. ","metadata":{"papermill":{"duration":0.00787,"end_time":"2025-01-12T16:48:41.742911","exception":false,"start_time":"2025-01-12T16:48:41.735041","status":"completed"},"tags":[]}},{"cell_type":"code","source":"import seaborn as sns\nimport cv2 \n\nimport matplotlib.pyplot as plt\nimport os\nimport time\nimport numpy as np\nimport glob\nimport json\nimport collections\nimport torch\nimport torch.nn as nn\n\nimport pydicom as dicom\nimport matplotlib.patches as patches\n\nfrom matplotlib import animation, rc\nimport pandas as pd\n\nimport pydicom as dicom # dicom\nimport pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut","metadata":{"papermill":{"duration":5.864682,"end_time":"2025-01-12T16:48:47.614887","exception":false,"start_time":"2025-01-12T16:48:41.750205","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.437259Z","iopub.execute_input":"2025-04-06T14:48:44.437691Z","iopub.status.idle":"2025-04-06T14:48:44.442437Z","shell.execute_reply.started":"2025-04-06T14:48:44.437647Z","shell.execute_reply":"2025-04-06T14:48:44.441603Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"csv_path = '/kaggle/input/cropped-image/cropped_labels.csv'\nimage_dir = '/kaggle/input/cropped-image/cropped_pngs'\n\ndataframe = pd.read_csv(csv_path)\ndataframe['image_path'] = dataframe['filename'].apply(lambda x: os.path.join(image_dir, x))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.443456Z","iopub.execute_input":"2025-04-06T14:48:44.443745Z","iopub.status.idle":"2025-04-06T14:48:44.658739Z","shell.execute_reply.started":"2025-04-06T14:48:44.443714Z","shell.execute_reply":"2025-04-06T14:48:44.658077Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# read data\ntrain_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/'\n\ntrain  = pd.read_csv(train_path + 'train.csv')\nlabel = pd.read_csv(train_path + 'train_label_coordinates.csv')\ntrain_desc  = pd.read_csv(train_path + 'train_series_descriptions.csv')\ntest_desc   = pd.read_csv(train_path + 'test_series_descriptions.csv')\nsub         = pd.read_csv(train_path + 'sample_submission.csv')\nlen(test_desc) #number of test_description.csv rows ","metadata":{"papermill":{"duration":0.161797,"end_time":"2025-01-12T16:48:47.784294","exception":false,"start_time":"2025-01-12T16:48:47.622497","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.660379Z","iopub.execute_input":"2025-04-06T14:48:44.660713Z","iopub.status.idle":"2025-04-06T14:48:44.738547Z","shell.execute_reply.started":"2025-04-06T14:48:44.660679Z","shell.execute_reply":"2025-04-06T14:48:44.737661Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataframe[dataframe[\"severity\"] == \"normal_mild\"].value_counts().sum()","metadata":{"papermill":{"duration":0.12279,"end_time":"2025-01-12T16:49:45.28503","exception":false,"start_time":"2025-01-12T16:49:45.16224","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.739965Z","iopub.execute_input":"2025-04-06T14:48:44.740307Z","iopub.status.idle":"2025-04-06T14:48:44.875294Z","shell.execute_reply.started":"2025-04-06T14:48:44.74028Z","shell.execute_reply":"2025-04-06T14:48:44.874527Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataframe[dataframe[\"severity\"] == \"moderate\"].value_counts().sum()\n","metadata":{"papermill":{"duration":0.045177,"end_time":"2025-01-12T16:49:45.338859","exception":false,"start_time":"2025-01-12T16:49:45.293682","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.876017Z","iopub.execute_input":"2025-04-06T14:48:44.87624Z","iopub.status.idle":"2025-04-06T14:48:44.914227Z","shell.execute_reply.started":"2025-04-06T14:48:44.876209Z","shell.execute_reply":"2025-04-06T14:48:44.9135Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataframe[dataframe[\"severity\"] == \"severe\"].value_counts().sum()\n","metadata":{"papermill":{"duration":0.032783,"end_time":"2025-01-12T16:49:45.380567","exception":false,"start_time":"2025-01-12T16:49:45.347784","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.914996Z","iopub.execute_input":"2025-04-06T14:48:44.915196Z","iopub.status.idle":"2025-04-06T14:48:44.938731Z","shell.execute_reply.started":"2025-04-06T14:48:44.915179Z","shell.execute_reply":"2025-04-06T14:48:44.938096Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#changed the name of dataframe to prevent conflict, you have to pay attention of using post underscores\ntrain_df = dataframe","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.940943Z","iopub.execute_input":"2025-04-06T14:48:44.941171Z","iopub.status.idle":"2025-04-06T14:48:44.944339Z","shell.execute_reply.started":"2025-04-06T14:48:44.941151Z","shell.execute_reply":"2025-04-06T14:48:44.943479Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.945648Z","iopub.execute_input":"2025-04-06T14:48:44.945953Z","iopub.status.idle":"2025-04-06T14:48:44.966311Z","shell.execute_reply.started":"2025-04-06T14:48:44.945924Z","shell.execute_reply":"2025-04-06T14:48:44.965518Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the base path for test images\nbase_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images/'\n\n# Function to get image paths for a series\ndef get_image_paths(row):\n    series_path = os.path.join(base_path, str(row['study_id']), str(row['series_id']))\n    if os.path.exists(series_path):\n        return [os.path.join(series_path, f) for f in os.listdir(series_path) if os.path.isfile(os.path.join(series_path, f))]\n    return []\n\n# Mapping of series_description to conditions\ncondition_mapping = {\n    'Sagittal T1': {'left': 'left_neural_foraminal_narrowing', 'right': 'right_neural_foraminal_narrowing'},\n    'Axial T2': {'left': 'left_subarticular_stenosis', 'right': 'right_subarticular_stenosis'},\n    'Sagittal T2/STIR': 'spinal_canal_stenosis'\n}\n\n# Create a list to store the expanded rows\nexpanded_rows = []\n\n# Expand the dataframe by adding new rows for each file path\nfor index, row in test_desc.iterrows():\n    image_paths = get_image_paths(row)\n    conditions = condition_mapping.get(row['series_description'], {})\n    if isinstance(conditions, str):  # Single condition\n        conditions = {'left': conditions, 'right': conditions}\n    for side, condition in conditions.items():\n        for image_path in image_paths:\n            expanded_rows.append({\n                'study_id': row['study_id'],\n                'series_id': row['series_id'],\n                'series_description': row['series_description'],\n                'image_path': image_path,\n                'condition': condition,\n                'row_id': f\"{row['study_id']}_{condition}\"\n            })\n\n# Create a new dataframe from the expanded rows\nexpanded_test_desc = pd.DataFrame(expanded_rows)\n\n# Display the resulting dataframe\nexpanded_test_desc.head(5)","metadata":{"papermill":{"duration":0.103537,"end_time":"2025-01-12T16:49:45.732825","exception":false,"start_time":"2025-01-12T16:49:45.629288","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:44.967124Z","iopub.execute_input":"2025-04-06T14:48:44.967399Z","iopub.status.idle":"2025-04-06T14:48:45.152301Z","shell.execute_reply.started":"2025-04-06T14:48:44.967371Z","shell.execute_reply":"2025-04-06T14:48:45.151616Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data = expanded_test_desc\ntrain_data = train_df\n# Tüm veriyi kullanmak için bu satırı yorum satırı yapabilirsin\n#train_data = train_data.sample(n=1000, random_state=42).reset_index(drop=True)  # 🔹 Eğitim süresini kısaltmak için sadece 1000 örnek kullan\n###############################################################################################################################################","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.153028Z","iopub.execute_input":"2025-04-06T14:48:45.153244Z","iopub.status.idle":"2025-04-06T14:48:45.159527Z","shell.execute_reply.started":"2025-04-06T14:48:45.15322Z","shell.execute_reply":"2025-04-06T14:48:45.158884Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.head(5)","metadata":{"papermill":{"duration":0.021519,"end_time":"2025-01-12T16:49:45.814029","exception":false,"start_time":"2025-01-12T16:49:45.79251","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.160223Z","iopub.execute_input":"2025-04-06T14:48:45.160442Z","iopub.status.idle":"2025-04-06T14:48:45.184407Z","shell.execute_reply.started":"2025-04-06T14:48:45.160423Z","shell.execute_reply":"2025-04-06T14:48:45.183711Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data['series_description'].value_counts()","metadata":{"papermill":{"duration":0.020255,"end_time":"2025-01-12T16:49:45.843565","exception":false,"start_time":"2025-01-12T16:49:45.82331","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.185127Z","iopub.execute_input":"2025-04-06T14:48:45.185378Z","iopub.status.idle":"2025-04-06T14:48:45.199445Z","shell.execute_reply.started":"2025-04-06T14:48:45.185346Z","shell.execute_reply":"2025-04-06T14:48:45.19877Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Yeni pipiline'dan dolayı artık load_dicom yerine load_png kullanıyoruz.\ndef load_png(path):\n    # PNG görüntüsünü oku (gri tonlamalı olarak)\n    image = cv2.imread(path, cv2.IMREAD_GRAYSCALE)\n    \n    # Görüntüyü normalize et\n    image = image - np.min(image)\n    if np.max(image) != 0:\n        image = image / np.max(image)\n    \n    # Görüntüyü 0-255 aralığına dönüştür\n    image = (image * 255).astype(np.uint8)\n    \n    return image","metadata":{"papermill":{"duration":0.014599,"end_time":"2025-01-12T16:49:45.867348","exception":false,"start_time":"2025-01-12T16:49:45.852749","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.200204Z","iopub.execute_input":"2025-04-06T14:48:45.200459Z","iopub.status.idle":"2025-04-06T14:48:45.212484Z","shell.execute_reply.started":"2025-04-06T14:48:45.200432Z","shell.execute_reply":"2025-04-06T14:48:45.211598Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\nimport matplotlib.pyplot as plt\n\n# Yeni sıfırlanmış indekslerle rastgele seçim yapalım\ntrain_data_reset = train_data.reset_index(drop=True)\n\n# Rastgele iki indeks seçelim\nselected_indices = random.sample(range(len(train_data_reset)), 2)\n\nimages = []\nrow_ids = []\n\n# Seçilen indekslerle görselleri yükleyelim\nfor i in selected_indices:\n    image = load_png(train_data_reset['image_path'][i])  # Yeni sıfırlanmış indeksi kullan\n    images.append(image)\n    row_ids.append(train_data_reset['row_id'][i])  # Yeni sıfırlanmış indeksi kullan\n\n# Görselleri çizdirelim\nfig, ax = plt.subplots(1, 2, figsize=(8, 4))\nfor i in range(2):\n    ax[i].imshow(images[i], cmap='gray')\n    ax[i].set_title(f'Row ID: {row_ids[i]}', fontsize=8)\n    ax[i].axis('off')\nplt.tight_layout()\nplt.show()","metadata":{"papermill":{"duration":0.42275,"end_time":"2025-01-12T16:49:46.299109","exception":false,"start_time":"2025-01-12T16:49:45.876359","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.213371Z","iopub.execute_input":"2025-04-06T14:48:45.213617Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data ","metadata":{"papermill":{"duration":0.02905,"end_time":"2025-01-12T16:49:46.342874","exception":false,"start_time":"2025-01-12T16:49:46.313824","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.463717Z","iopub.execute_input":"2025-04-06T14:48:45.463963Z","iopub.status.idle":"2025-04-06T14:48:45.478062Z","shell.execute_reply.started":"2025-04-06T14:48:45.463941Z","shell.execute_reply":"2025-04-06T14:48:45.477233Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = train_data.dropna()","metadata":{"papermill":{"duration":0.039801,"end_time":"2025-01-12T16:49:46.396529","exception":false,"start_time":"2025-01-12T16:49:46.356728","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.478924Z","iopub.execute_input":"2025-04-06T14:48:45.479182Z","iopub.status.idle":"2025-04-06T14:48:45.4913Z","shell.execute_reply.started":"2025-04-06T14:48:45.479153Z","shell.execute_reply":"2025-04-06T14:48:45.490499Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport numpy as np\nimport cv2\nimport pydicom\nimport os\nimport glob\nimport matplotlib.pyplot as plt\nfrom torch.utils.data import DataLoader, Dataset\nfrom torchvision import transforms","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.492131Z","iopub.execute_input":"2025-04-06T14:48:45.492407Z","iopub.status.idle":"2025-04-06T14:48:45.502891Z","shell.execute_reply.started":"2025-04-06T14:48:45.492379Z","shell.execute_reply":"2025-04-06T14:48:45.502176Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class LumbarSpinePNGDataset(Dataset):\n    def __init__(self, dataframe, transform=None):\n        self.dataframe = dataframe.reset_index(drop=True)\n        self.transform = transform\n\n        self.class_labels = {\n            f\"{condition}_{severity}\": idx\n            for idx, (condition, severity) in enumerate(\n                sorted(dataframe[['condition', 'severity']].drop_duplicates().values.tolist())\n            )\n        }\n\n    def __len__(self):\n        return len(self.dataframe)\n\n    def __getitem__(self, idx):\n        row = self.dataframe.iloc[idx]\n        image_path = row['image_path']\n\n        image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)\n        image = cv2.resize(image, (128, 128))\n        image = image.astype(np.float32)\n        image = (image - image.min()) / (image.max() - image.min())  # normalize [0,1]\n        image = image * 2 - 1  # normalize [-1,1] for Tanh\n        image = np.expand_dims(image, axis=0)\n\n        label_key = f\"{row['condition']}_{row['severity']}\"\n        label = self.class_labels[label_key]\n\n        return torch.tensor(image, dtype=torch.float32), label\n\n\n# 🔹 Veri Yükleme\ndataset = LumbarSpinePNGDataset(train_data)\ndataloader = DataLoader(dataset, batch_size=16, shuffle=True)\n\ndataloader = DataLoader(dataset, batch_size=16, shuffle=True)\nprint(f\"Toplam {len(dataset)} adet DICOM görüntüsü yüklendi.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.503761Z","iopub.execute_input":"2025-04-06T14:48:45.504049Z","iopub.status.idle":"2025-04-06T14:48:45.523794Z","shell.execute_reply.started":"2025-04-06T14:48:45.504023Z","shell.execute_reply":"2025-04-06T14:48:45.52324Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 🔹 Generator\nclass Generator(nn.Module):\n    def __init__(self, latent_dim):\n        super(Generator, self).__init__()\n        self.init_size = 8\n        self.l1 = nn.Sequential(nn.Linear(latent_dim, 128 * self.init_size ** 2))\n\n        self.conv_blocks = nn.Sequential(\n            nn.BatchNorm2d(128),\n            nn.Upsample(scale_factor=2),  # 8 -> 16\n            nn.Conv2d(128, 128, 3, stride=1, padding=1),\n            nn.BatchNorm2d(128, 0.8),\n            nn.ReLU(),\n\n            nn.Upsample(scale_factor=2),  # 16 -> 32\n            nn.Conv2d(128, 64, 3, stride=1, padding=1),\n            nn.BatchNorm2d(64, 0.8),\n            nn.ReLU(),\n\n            nn.Upsample(scale_factor=2),  # 32 -> 64\n            nn.Conv2d(64, 32, 3, stride=1, padding=1),\n            nn.BatchNorm2d(32, 0.8),\n            nn.ReLU(),\n\n            nn.Upsample(scale_factor=2),  # 64 -> 128\n            nn.Conv2d(32, 1, 3, stride=1, padding=1),\n            nn.Tanh(),\n        )\n\n    def forward(self, z):\n        out = self.l1(z)\n        out = out.view(out.shape[0], 128, self.init_size, self.init_size)\n        img = self.conv_blocks(out)\n        return img\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.526643Z","iopub.execute_input":"2025-04-06T14:48:45.526861Z","iopub.status.idle":"2025-04-06T14:48:45.537632Z","shell.execute_reply.started":"2025-04-06T14:48:45.526843Z","shell.execute_reply":"2025-04-06T14:48:45.536957Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 🔹 Discriminator\nclass Discriminator(nn.Module):\n    def __init__(self):\n        super(Discriminator, self).__init__()\n        self.model = nn.Sequential(\n            nn.Conv2d(1, 32, 3, 2, 1),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout2d(0.25),\n\n            nn.Conv2d(32, 64, 3, 2, 1),\n            nn.ZeroPad2d((0, 1, 0, 1)),\n            nn.BatchNorm2d(64, 0.8),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout2d(0.25),\n\n            nn.Conv2d(64, 128, 3, 2, 1),\n            nn.BatchNorm2d(128, 0.8),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout2d(0.25),\n\n            nn.Conv2d(128, 256, 3, 2, 1),\n            nn.BatchNorm2d(256, 0.8),\n            nn.LeakyReLU(0.2, inplace=True),\n            nn.Dropout2d(0.25),\n        )\n        self.final_feat_size = None  # doğru girintilendi\n\n    def forward(self, img):\n        out = self.model(img)\n        out = out.view(out.shape[0], -1)\n\n        # Lazy init of linear layer (ilk forward'da boyuta göre inşa edilir)\n        if self.final_feat_size is None:\n            self.final_feat_size = out.shape[1]\n            self.adv_layer = nn.Sequential(nn.Linear(self.final_feat_size, 1), nn.Sigmoid())\n            self.adv_layer.to(out.device)\n\n        validity = self.adv_layer(out)\n        return validity\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:48:45.538804Z","iopub.execute_input":"2025-04-06T14:48:45.539119Z","iopub.status.idle":"2025-04-06T14:48:45.557595Z","shell.execute_reply.started":"2025-04-06T14:48:45.539099Z","shell.execute_reply":"2025-04-06T14:48:45.556757Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#!rm -rf /kaggle/working/*","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T15:00:28.551909Z","iopub.execute_input":"2025-04-06T15:00:28.552212Z","iopub.status.idle":"2025-04-06T15:00:28.811765Z","shell.execute_reply.started":"2025-04-06T15:00:28.55219Z","shell.execute_reply":"2025-04-06T15:00:28.810843Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nfrom torchvision.utils import save_image\nfrom tqdm import tqdm  # <-- tqdm'i import et\n\n# 🔹 Model, Loss, Optimizer\nlatent_dim = 100\ngenerator = Generator(latent_dim)\ndiscriminator = Discriminator()\nloss_function = nn.BCELoss()\noptimizer_G = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))\noptimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))\n\nsave_dir = \"/kaggle/working/generated_images\"\nos.makedirs(save_dir, exist_ok=True)\n\ngenerated_data = []\nbest_g_loss = float(\"inf\")  # Başlangıçta en iyi loss sonsuz\n\n# 🔹 Eğitim\nnum_epochs = 10\nfor epoch in range(num_epochs):\n    epoch_generated = []\n    epoch_g_loss = 0.0\n\n    progress_bar = tqdm(dataloader, desc=f\"Epoch {epoch+1}/{num_epochs}\")  # tqdm ile ilerleme çubuğu\n\n    for i, (real_images, labels) in enumerate(progress_bar):\n        batch_size = real_images.size(0)\n        real_labels = torch.ones(batch_size, 1)\n        fake_labels = torch.zeros(batch_size, 1)\n\n        # Discriminator\n        optimizer_D.zero_grad()\n        real_outputs = discriminator(real_images)\n        real_outputs = torch.sigmoid(real_outputs)  # Sigmoid ekledik\n        d_real_loss = loss_function(real_outputs, real_labels)\n\n        z = torch.randn(batch_size, latent_dim)\n        fake_images = generator(z)\n        fake_outputs = discriminator(fake_images.detach())\n        fake_outputs = torch.sigmoid(fake_outputs)  # Sigmoid ekledik\n        d_fake_loss = loss_function(fake_outputs, fake_labels)\n\n        d_loss = d_real_loss + d_fake_loss\n        d_loss.backward()\n        optimizer_D.step()\n\n        # Generator\n        optimizer_G.zero_grad()\n        gen_outputs = discriminator(fake_images)\n        gen_outputs = torch.sigmoid(gen_outputs)  # Sigmoid ekledik\n        g_loss = loss_function(gen_outputs, real_labels)\n        g_loss.backward()\n        optimizer_G.step()\n\n        epoch_g_loss += g_loss.item()\n\n        # Görselleri ve bilgileri kaydet\n        for j in range(batch_size):\n            filename = f\"epoch{epoch+1}_batch{i+1}_img{j+1}.png\"\n            save_path = os.path.join(save_dir, filename)\n            save_image((fake_images[j] + 1) / 2, save_path)\n\n            # Gerekli bilgileri ekle\n            condition = list(dataset.class_labels.keys())[labels[j].item()].split('_')[0]  # Hastalık tipi\n            severity = list(dataset.class_labels.keys())[labels[j].item()].split('_')[1]  # Severity (seviye)\n            epoch_generated.append({\n                \"filename\": filename,\n                \"row_id\": f\"{train_data['study_id'][j]}_{condition}_{severity}\",\n                \"condition\": condition,\n                \"severity\": severity,\n                \"image_path\": save_path\n            })\n\n    avg_g_loss = epoch_g_loss / len(dataloader)\n\n    print(f\"Epoch [{epoch+1}/{num_epochs}] | D Loss: {d_loss.item():.4f} | G Loss: {avg_g_loss:.4f}\")\n\n    # Sadece en iyi epoch’un görsellerini kaydet\n    if avg_g_loss < best_g_loss:\n        best_g_loss = avg_g_loss\n        generated_data = epoch_generated.copy()\n        print(f\"✔ Yeni en iyi epoch: {epoch+1} | G Loss: {best_g_loss:.4f}\")\n    else:\n        print(f\"⏩ Epoch {epoch+1} görselleri atlandı (G Loss daha yüksek)\")\n\n# 🔹 CSV oluştur\ngenerated_df = pd.DataFrame(generated_data)\ngenerated_df.to_csv(\"/kaggle/working/generated_data.csv\", index=False)\nprint(\"✔ En iyi epoch görselleri ve CSV kaydedildi.\")\n\n# 🔹 Örnek görselleri göster (en iyi epoch'tan)\nn_samples = 6  # Kaç görsel gösterilsin\n\nprint(f\"\\n📸 En iyi epoch’tan örnek {n_samples} görsel gösteriliyor:\")\nplt.figure(figsize=(15, 5))\nfor idx, row in enumerate(generated_data[:n_samples]):\n    img_path = os.path.join(save_dir, row[\"filename\"])\n    img = mpimg.imread(img_path)\n    plt.subplot(1, n_samples, idx + 1)\n    plt.imshow(img)\n    plt.axis(\"off\")\n    plt.title(row[\"condition\"] + \" - \" + row[\"severity\"])\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T15:49:36.371055Z","iopub.execute_input":"2025-04-06T15:49:36.371376Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"generated_df = generated_df.drop('image_path', axis=1)\ngenerated_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T15:03:11.246111Z","iopub.execute_input":"2025-04-06T15:03:11.246417Z","iopub.status.idle":"2025-04-06T15:03:11.256109Z","shell.execute_reply.started":"2025-04-06T15:03:11.246395Z","shell.execute_reply":"2025-04-06T15:03:11.255252Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\n\n# Condition mapping için örnek veriler\ncondition_mapping = {\n    'Spinal Canal Stenosis': 'Sagittal T2/STIR',\n    'Left Neural Foraminal Narrowing': 'Sagittal T1',\n    'Right Neural Foraminal Narrowing': 'Sagittal T1',\n    'Left Subarticular Stenosis': 'Axial T2',\n    'Right Subarticular Stenosis': 'Axial T2'\n}\n\n# `generated_df` üzerinde işlem yapıyoruz, çünkü zaten bu veri üzerinde değişiklik yapmayı hedefliyorsunuz\nfor index, row in generated_df.iterrows():\n    condition = row['condition']\n    severity = row['severity']\n    \n    # severity normalse, \"normal_mild\" olarak güncelle\n    if severity == 'normal':\n        severity = 'normal_mild'\n    \n    # MRI Türünü mapping üzerinden al\n    series_desc = condition_mapping.get(condition, 'Unknown MRI Type')\n\n    # `generated_df` üzerinde her bir satırda güncellemeler yapıyoruz\n    generated_df.at[index, 'study_id'] = 0  # `study_id`'yi 0 yap\n    generated_df.at[index, 'level'] = 0  # `level`'i 0 yap\n    generated_df.at[index, 'severity'] = severity  # Yeni severity değerini at\n    generated_df.at[index, 'series_id'] = 0  # `series_id`'yi 0 yap\n    generated_df.at[index, 'instance_number'] = 0  # `instance_number`'ı 0 yap\n    generated_df.at[index, 'crop_x'] = 0  # `crop_x`'ı 0 yap\n    generated_df.at[index, 'crop_y'] = 0  # `crop_y`'ı 0 yap\n    generated_df.at[index, 'series_description'] = series_desc  # Yeni `series_description` değerini at\n\n# Sütun sıralamasını istediğiniz şekilde yapalım\ncolumn_order = [\n    'row_id', 'study_id', 'condition', 'level', 'severity', \n    'series_id', 'instance_number', 'crop_x', 'crop_y', \n    'filename', 'series_description'\n]\n\ngenerated_df = generated_df[column_order]\n\n# Güncellenmiş `generated_df`'yi kaydet\ngenerated_df.to_csv(\"/kaggle/working/generated.csv\", index=False)\n\nprint(\"✔ Yeni veriler başarıyla kaydedildi.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T15:08:45.89736Z","iopub.execute_input":"2025-04-06T15:08:45.897694Z","iopub.status.idle":"2025-04-06T15:08:46.082229Z","shell.execute_reply.started":"2025-04-06T15:08:45.897669Z","shell.execute_reply":"2025-04-06T15:08:46.081312Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#!rm -rf /kaggle/working/*","metadata":{"papermill":{"duration":0.039389,"end_time":"2025-01-12T16:49:54.211417","exception":false,"start_time":"2025-01-12T16:49:54.172028","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:49:21.904581Z","iopub.status.idle":"2025-04-06T14:49:21.904899Z","shell.execute_reply":"2025-04-06T14:49:21.904729Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data['level'].unique()","metadata":{"papermill":{"duration":6.794871,"end_time":"2025-01-12T20:11:50.445555","exception":false,"start_time":"2025-01-12T20:11:43.650684","status":"completed"},"tags":[],"trusted":true,"execution":{"iopub.status.busy":"2025-04-06T14:49:21.905439Z","iopub.status.idle":"2025-04-06T14:49:21.905743Z","shell.execute_reply":"2025-04-06T14:49:21.905617Z"}},"outputs":[],"execution_count":null}]}