{"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":992,"sourceType":"modelInstanceVersion","modelInstanceId":846,"modelId":101}],"dockerImageVersionId":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"papermill":{"default_parameters":{},"duration":4803.886214,"end_time":"2024-12-19T09:41:27.028593","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-12-19T08:21:23.142379","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"2803f883","cell_type":"code","source":"import seaborn as sns\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":{"execution":{"iopub.status.busy":"2024-12-19T14:26:17.662137Z","iopub.execute_input":"2024-12-19T14:26:17.662422Z","iopub.status.idle":"2024-12-19T14:26:22.272979Z","shell.execute_reply.started":"2024-12-19T14:26:17.662392Z","shell.execute_reply":"2024-12-19T14:26:22.272333Z"},"papermill":{"duration":5.168794,"end_time":"2024-12-19T08:21:30.531344","exception":false,"start_time":"2024-12-19T08:21:25.362550","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"2dd13f37","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":{"execution":{"iopub.status.busy":"2024-12-19T14:26:22.273801Z","iopub.execute_input":"2024-12-19T14:26:22.274160Z","iopub.status.idle":"2024-12-19T14:26:22.443452Z","shell.execute_reply.started":"2024-12-19T14:26:22.274137Z","shell.execute_reply":"2024-12-19T14:26:22.442702Z"},"papermill":{"duration":0.219203,"end_time":"2024-12-19T08:21:30.760306","exception":false,"start_time":"2024-12-19T08:21:30.541103","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"59a2f630","cell_type":"code","source":"test_desc.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:22.444333Z","iopub.execute_input":"2024-12-19T14:26:22.444657Z","iopub.status.idle":"2024-12-19T14:26:22.457385Z","shell.execute_reply.started":"2024-12-19T14:26:22.444624Z","shell.execute_reply":"2024-12-19T14:26:22.456639Z"},"papermill":{"duration":0.026578,"end_time":"2024-12-19T08:21:30.798211","exception":false,"start_time":"2024-12-19T08:21:30.771633","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"7155d4d6","cell_type":"code","source":"train_desc.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:22.459148Z","iopub.execute_input":"2024-12-19T14:26:22.459370Z","iopub.status.idle":"2024-12-19T14:26:22.471868Z","shell.execute_reply.started":"2024-12-19T14:26:22.459351Z","shell.execute_reply":"2024-12-19T14:26:22.471124Z"},"papermill":{"duration":0.014334,"end_time":"2024-12-19T08:21:30.819327","exception":false,"start_time":"2024-12-19T08:21:30.804993","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"17169738","cell_type":"code","source":"train.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:22.474843Z","iopub.execute_input":"2024-12-19T14:26:22.475154Z","iopub.status.idle":"2024-12-19T14:26:22.501960Z","shell.execute_reply.started":"2024-12-19T14:26:22.475128Z","shell.execute_reply":"2024-12-19T14:26:22.501141Z"},"papermill":{"duration":0.025424,"end_time":"2024-12-19T08:21:30.851358","exception":false,"start_time":"2024-12-19T08:21:30.825934","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"47e44033","cell_type":"code","source":"# Function to generate image paths based on directory structure\ndef generate_image_paths(df, data_dir):\n    image_paths = []\n    for study_id, series_id in zip(df['study_id'], df['series_id']):\n        study_dir = os.path.join(data_dir, str(study_id))\n        series_dir = os.path.join(study_dir, str(series_id))\n        images = os.listdir(series_dir)\n        image_paths.extend([os.path.join(series_dir, img) for img in images])\n    return image_paths\n\n# Generate image paths for train and test data\ntrain_image_paths = generate_image_paths(train_desc, f'{train_path}/train_images')\ntest_image_paths = generate_image_paths(test_desc, f'{train_path}/test_images')","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:22.502651Z","iopub.execute_input":"2024-12-19T14:26:22.502877Z","iopub.status.idle":"2024-12-19T14:26:55.616721Z","shell.execute_reply.started":"2024-12-19T14:26:22.502848Z","shell.execute_reply":"2024-12-19T14:26:55.616015Z"},"papermill":{"duration":54.266053,"end_time":"2024-12-19T08:22:25.124856","exception":false,"start_time":"2024-12-19T08:21:30.858803","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"712f27d1","cell_type":"code","source":"len(train_desc)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:55.617644Z","iopub.execute_input":"2024-12-19T14:26:55.617936Z","iopub.status.idle":"2024-12-19T14:26:55.622798Z","shell.execute_reply.started":"2024-12-19T14:26:55.617907Z","shell.execute_reply":"2024-12-19T14:26:55.621994Z"},"papermill":{"duration":0.013861,"end_time":"2024-12-19T08:22:25.146226","exception":false,"start_time":"2024-12-19T08:22:25.132365","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"71788bea","cell_type":"code","source":"len(train_image_paths)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:55.623624Z","iopub.execute_input":"2024-12-19T14:26:55.623911Z","iopub.status.idle":"2024-12-19T14:26:55.643372Z","shell.execute_reply.started":"2024-12-19T14:26:55.623879Z","shell.execute_reply":"2024-12-19T14:26:55.642602Z"},"papermill":{"duration":0.012892,"end_time":"2024-12-19T08:22:25.166122","exception":false,"start_time":"2024-12-19T08:22:25.153230","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"86ce836b","cell_type":"code","source":"# Define function to reshape a single row of the DataFrame\ndef reshape_row(row):\n    data = {'study_id': [], 'condition': [], 'level': [], 'severity': []}\n    \n    for column, value in row.items():\n        if column not in ['study_id', 'series_id', 'instance_number', 'x', 'y', 'series_description']:\n            parts = column.split('_')\n            condition = ' '.join([word.capitalize() for word in parts[:-2]])\n            level = parts[-2].capitalize() + '/' + parts[-1].capitalize()\n            data['study_id'].append(row['study_id'])\n            data['condition'].append(condition)\n            data['level'].append(level)\n            data['severity'].append(value)\n    \n    return pd.DataFrame(data)\n\n# Reshape the DataFrame for all rows\nnew_train_df = pd.concat([reshape_row(row) for _, row in train.iterrows()], ignore_index=True)\n\n# Display the first few rows of the reshaped dataframe\nnew_train_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:55.644197Z","iopub.execute_input":"2024-12-19T14:26:55.644520Z","iopub.status.idle":"2024-12-19T14:26:56.695741Z","shell.execute_reply.started":"2024-12-19T14:26:55.644500Z","shell.execute_reply":"2024-12-19T14:26:56.694787Z"},"papermill":{"duration":1.00106,"end_time":"2024-12-19T08:22:26.174364","exception":false,"start_time":"2024-12-19T08:22:25.173304","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"ea44d9de","cell_type":"code","source":"# Print columns in a neat way\nprint(\"\\nColumns in new_train_df:\")\nprint(\",\".join(new_train_df.columns))\n\nprint(\"\\nColumns in label:\")\nprint(\",\".join(label.columns))\n\nprint(\"\\nColumns in test_desc:\")\nprint(\",\".join(test_desc.columns))\n\nprint(\"\\nColumns in sub:\")\nprint(\",\".join(sub.columns))","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:56.696693Z","iopub.execute_input":"2024-12-19T14:26:56.696994Z","iopub.status.idle":"2024-12-19T14:26:56.704353Z","shell.execute_reply.started":"2024-12-19T14:26:56.696966Z","shell.execute_reply":"2024-12-19T14:26:56.703536Z"},"papermill":{"duration":0.014711,"end_time":"2024-12-19T08:22:26.196737","exception":false,"start_time":"2024-12-19T08:22:26.182026","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"f1b22686","cell_type":"code","source":"# Merge the dataframes on the common columns\nmerged_df = pd.merge(new_train_df, label, on=['study_id', 'condition', 'level'], how='inner')\n# Merge the dataframes on the common column 'series_id'\nfinal_merged_df = pd.merge(merged_df, train_desc, on='series_id', how='inner')","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:56.705239Z","iopub.execute_input":"2024-12-19T14:26:56.705548Z","iopub.status.idle":"2024-12-19T14:26:56.775807Z","shell.execute_reply.started":"2024-12-19T14:26:56.705519Z","shell.execute_reply":"2024-12-19T14:26:56.774944Z"},"papermill":{"duration":0.073041,"end_time":"2024-12-19T08:22:26.277074","exception":false,"start_time":"2024-12-19T08:22:26.204033","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"b45eb0b6","cell_type":"code","source":"# Merge the dataframes on the common column 'series_id'\nfinal_merged_df = pd.merge(merged_df, train_desc, on=['series_id','study_id'], how='inner')\n# Display the first few rows of the final merged dataframe\nfinal_merged_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:56.779319Z","iopub.execute_input":"2024-12-19T14:26:56.779553Z","iopub.status.idle":"2024-12-19T14:26:56.804016Z","shell.execute_reply.started":"2024-12-19T14:26:56.779533Z","shell.execute_reply":"2024-12-19T14:26:56.803215Z"},"papermill":{"duration":0.033498,"end_time":"2024-12-19T08:22:26.318347","exception":false,"start_time":"2024-12-19T08:22:26.284849","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"1c9cf53c","cell_type":"code","source":"import pandas as pd\n\n# Create the row_id column\nfinal_merged_df['row_id'] = (\n    final_merged_df['study_id'].astype(str) + '_' +\n    final_merged_df['condition'].str.lower().str.replace(' ', '_') + '_' +\n    final_merged_df['level'].str.lower().str.replace('/', '_')\n)\n\n# Create the image_path column\nfinal_merged_df['image_path'] = (\n    f'{train_path}/train_images/' + \n    final_merged_df['study_id'].astype(str) + '/' +\n    final_merged_df['series_id'].astype(str) + '/' +\n    final_merged_df['instance_number'].astype(str) + '.dcm'\n)\n\n# Note: Check image path, since there's 1 instance id, for 1 image, but there's many more images other than the ones labelled in the instance ID. \n\n# Display the updated dataframe\nfinal_merged_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:56.805736Z","iopub.execute_input":"2024-12-19T14:26:56.805961Z","iopub.status.idle":"2024-12-19T14:26:56.995936Z","shell.execute_reply.started":"2024-12-19T14:26:56.805941Z","shell.execute_reply":"2024-12-19T14:26:56.995041Z"},"papermill":{"duration":0.189213,"end_time":"2024-12-19T08:22:26.515367","exception":false,"start_time":"2024-12-19T08:22:26.326154","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"7fde9922","cell_type":"code","source":"final_merged_df[final_merged_df[\"severity\"] == \"Normal/Mild\"].value_counts().sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:56.996829Z","iopub.execute_input":"2024-12-19T14:26:56.997179Z","iopub.status.idle":"2024-12-19T14:26:57.106628Z","shell.execute_reply.started":"2024-12-19T14:26:56.997146Z","shell.execute_reply":"2024-12-19T14:26:57.105739Z"},"papermill":{"duration":0.112335,"end_time":"2024-12-19T08:22:26.635737","exception":false,"start_time":"2024-12-19T08:22:26.523402","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"1d52419a","cell_type":"code","source":"final_merged_df[final_merged_df[\"severity\"] == \"Moderate\"].value_counts().sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.107537Z","iopub.execute_input":"2024-12-19T14:26:57.107848Z","iopub.status.idle":"2024-12-19T14:26:57.145217Z","shell.execute_reply.started":"2024-12-19T14:26:57.107820Z","shell.execute_reply":"2024-12-19T14:26:57.144379Z"},"papermill":{"duration":0.042268,"end_time":"2024-12-19T08:22:26.686384","exception":false,"start_time":"2024-12-19T08:22:26.644116","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"1ad2fcdc","cell_type":"code","source":"final_merged_df[final_merged_df[\"severity\"] == \"Severe\"].value_counts().sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.146184Z","iopub.execute_input":"2024-12-19T14:26:57.146482Z","iopub.status.idle":"2024-12-19T14:26:57.175426Z","shell.execute_reply.started":"2024-12-19T14:26:57.146454Z","shell.execute_reply":"2024-12-19T14:26:57.174654Z"},"papermill":{"duration":0.028274,"end_time":"2024-12-19T08:22:26.722909","exception":false,"start_time":"2024-12-19T08:22:26.694635","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"b25b8e72","cell_type":"code","source":"\"\"\"\nimport pandas as pd\n\n# En düşük sınıf sayısını belirleyelim\nmin_class_count = 3081\n\n# Normal/Mild ve Moderate sınıflarını azaltalım\nnormal_mild_df = final_merged_df[final_merged_df[\"severity\"] == \"Normal/Mild\"].sample(n=min_class_count, random_state=42)\nmoderate_df = final_merged_df[final_merged_df[\"severity\"] == \"Moderate\"].sample(n=min_class_count, random_state=42)\nsevere_df = final_merged_df[final_merged_df[\"severity\"] == \"Severe\"]\n\n# İndeksleri sıfırlayalım\nnormal_mild_df = normal_mild_df.reset_index(drop=True)\nmoderate_df = moderate_df.reset_index(drop=True)\nsevere_df = severe_df.reset_index(drop=True)\n\n# Verileri birleştirelim ve final_merged_df'yi güncelleyelim\nfinal_merged_df = pd.concat([normal_mild_df, moderate_df, severe_df])\n\n# Sonuçları kontrol edelim\nprint(final_merged_df[\"severity\"].value_counts())\n\"\"\"","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.176479Z","iopub.execute_input":"2024-12-19T14:26:57.176750Z","iopub.status.idle":"2024-12-19T14:26:57.182820Z","shell.execute_reply.started":"2024-12-19T14:26:57.176725Z","shell.execute_reply":"2024-12-19T14:26:57.181987Z"},"papermill":{"duration":0.014331,"end_time":"2024-12-19T08:22:26.745151","exception":false,"start_time":"2024-12-19T08:22:26.730820","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"902eb4a7","cell_type":"code","source":"final_merged_df[final_merged_df[\"severity\"] == \"Normal/Mild\"].value_counts().sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.183710Z","iopub.execute_input":"2024-12-19T14:26:57.183984Z","iopub.status.idle":"2024-12-19T14:26:57.308579Z","shell.execute_reply.started":"2024-12-19T14:26:57.183957Z","shell.execute_reply":"2024-12-19T14:26:57.307704Z"},"papermill":{"duration":0.10494,"end_time":"2024-12-19T08:22:26.857939","exception":false,"start_time":"2024-12-19T08:22:26.752999","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"82e5624c","cell_type":"code","source":"final_merged_df[final_merged_df[\"severity\"] == \"Moderate\"].value_counts().sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.309464Z","iopub.execute_input":"2024-12-19T14:26:57.309785Z","iopub.status.idle":"2024-12-19T14:26:57.344071Z","shell.execute_reply.started":"2024-12-19T14:26:57.309754Z","shell.execute_reply":"2024-12-19T14:26:57.343248Z"},"papermill":{"duration":0.041113,"end_time":"2024-12-19T08:22:26.907360","exception":false,"start_time":"2024-12-19T08:22:26.866247","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"fed48f93","cell_type":"code","source":"final_merged_df[final_merged_df[\"severity\"] == \"Severe\"].value_counts().sum()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.344879Z","iopub.execute_input":"2024-12-19T14:26:57.345244Z","iopub.status.idle":"2024-12-19T14:26:57.367634Z","shell.execute_reply.started":"2024-12-19T14:26:57.345214Z","shell.execute_reply":"2024-12-19T14:26:57.366642Z"},"papermill":{"duration":0.028206,"end_time":"2024-12-19T08:22:26.943750","exception":false,"start_time":"2024-12-19T08:22:26.915544","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"5b225552","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":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.368503Z","iopub.execute_input":"2024-12-19T14:26:57.368892Z","iopub.status.idle":"2024-12-19T14:26:57.436661Z","shell.execute_reply.started":"2024-12-19T14:26:57.368860Z","shell.execute_reply":"2024-12-19T14:26:57.435852Z"},"papermill":{"duration":0.09278,"end_time":"2024-12-19T08:22:27.044659","exception":false,"start_time":"2024-12-19T08:22:26.951879","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"9c1cac63","cell_type":"code","source":"# change severity column labels\n#Normal/Mild': 'normal_mild', 'Moderate': 'moderate', 'Severe': 'severe'}\nfinal_merged_df['severity'] = final_merged_df['severity'].map({'Normal/Mild': 'normal_mild', 'Moderate': 'moderate', 'Severe': 'severe'})","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.437528Z","iopub.execute_input":"2024-12-19T14:26:57.437775Z","iopub.status.idle":"2024-12-19T14:26:57.445197Z","shell.execute_reply.started":"2024-12-19T14:26:57.437755Z","shell.execute_reply":"2024-12-19T14:26:57.444311Z"},"papermill":{"duration":0.016471,"end_time":"2024-12-19T08:22:27.069701","exception":false,"start_time":"2024-12-19T08:22:27.053230","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"a0ba58fe","cell_type":"code","source":"test_data = expanded_test_desc\ntrain_data = final_merged_df","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.445988Z","iopub.execute_input":"2024-12-19T14:26:57.446249Z","iopub.status.idle":"2024-12-19T14:26:57.463093Z","shell.execute_reply.started":"2024-12-19T14:26:57.446230Z","shell.execute_reply":"2024-12-19T14:26:57.462283Z"},"papermill":{"duration":0.01302,"end_time":"2024-12-19T08:22:27.090960","exception":false,"start_time":"2024-12-19T08:22:27.077940","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"9e02a993","cell_type":"code","source":"train_data.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.464002Z","iopub.execute_input":"2024-12-19T14:26:57.464378Z","iopub.status.idle":"2024-12-19T14:26:57.485793Z","shell.execute_reply.started":"2024-12-19T14:26:57.464349Z","shell.execute_reply":"2024-12-19T14:26:57.485002Z"},"papermill":{"duration":0.020882,"end_time":"2024-12-19T08:22:27.120037","exception":false,"start_time":"2024-12-19T08:22:27.099155","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"9c1c3541","cell_type":"code","source":"train_data['series_description'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.486681Z","iopub.execute_input":"2024-12-19T14:26:57.486943Z","iopub.status.idle":"2024-12-19T14:26:57.508289Z","shell.execute_reply.started":"2024-12-19T14:26:57.486918Z","shell.execute_reply":"2024-12-19T14:26:57.507497Z"},"papermill":{"duration":0.018806,"end_time":"2024-12-19T08:22:27.147451","exception":false,"start_time":"2024-12-19T08:22:27.128645","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"6dc782ec","cell_type":"code","source":"def load_dicom(path):\n    dicom = pydicom.dcmread(path)\n    data = dicom.pixel_array\n    data = data - np.min(data)\n    if np.max(data) != 0:\n        data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n    return data","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.509132Z","iopub.execute_input":"2024-12-19T14:26:57.509405Z","iopub.status.idle":"2024-12-19T14:26:57.522745Z","shell.execute_reply.started":"2024-12-19T14:26:57.509371Z","shell.execute_reply":"2024-12-19T14:26:57.521909Z"},"papermill":{"duration":0.01374,"end_time":"2024-12-19T08:22:27.169619","exception":false,"start_time":"2024-12-19T08:22:27.155879","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"468acb41","cell_type":"code","source":"import random\nimport matplotlib.pyplot as plt\n\n# Yeni sıfırlanmış indekslerle rastgele seçim yapalım\nfinal_merged_df_reset = final_merged_df.reset_index(drop=True)\n\n# Rastgele iki indeks seçelim\nselected_indices = random.sample(range(len(final_merged_df_reset)), 2)\n\nimages = []\nrow_ids = []\n\n# Seçilen indekslerle görselleri yükleyelim\nfor i in selected_indices:\n    image = load_dicom(final_merged_df_reset['image_path'][i])  # Yeni sıfırlanmış indeksi kullan\n    images.append(image)\n    row_ids.append(final_merged_df_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()\n","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.523559Z","iopub.execute_input":"2024-12-19T14:26:57.523785Z","iopub.status.idle":"2024-12-19T14:26:57.967651Z","shell.execute_reply.started":"2024-12-19T14:26:57.523766Z","shell.execute_reply":"2024-12-19T14:26:57.966564Z"},"papermill":{"duration":0.442994,"end_time":"2024-12-19T08:22:27.621156","exception":false,"start_time":"2024-12-19T08:22:27.178162","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"fd29ed1d","cell_type":"code","source":"train_data ","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.968656Z","iopub.execute_input":"2024-12-19T14:26:57.968931Z","iopub.status.idle":"2024-12-19T14:26:57.991163Z","shell.execute_reply.started":"2024-12-19T14:26:57.968908Z","shell.execute_reply":"2024-12-19T14:26:57.990251Z"},"papermill":{"duration":0.031085,"end_time":"2024-12-19T08:22:27.669111","exception":false,"start_time":"2024-12-19T08:22:27.638026","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"10d9dc16","cell_type":"code","source":"train_data = train_data.dropna()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:57.991774Z","iopub.execute_input":"2024-12-19T14:26:57.992515Z","iopub.status.idle":"2024-12-19T14:26:58.038913Z","shell.execute_reply.started":"2024-12-19T14:26:57.992483Z","shell.execute_reply":"2024-12-19T14:26:58.037870Z"},"papermill":{"duration":0.039261,"end_time":"2024-12-19T08:22:27.721294","exception":false,"start_time":"2024-12-19T08:22:27.682033","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"7d29fea2","cell_type":"code","source":"import pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data import Dataset, DataLoader\nimport torchvision.transforms as transforms\nimport torch\nimport torch.optim.lr_scheduler as lr_scheduler\nfrom tqdm import tqdm\nimport numpy as np\n\n# Augmentasyonları ve veriyi yükleme işini burada yapacağız\nclass CustomDataset(Dataset):\n    def __init__(self, dataframe, transform=None, augment_severe=False):\n        self.dataframe = dataframe\n        self.transform = transform\n        self.augment_severe = augment_severe  # Only augment severe class if True\n\n    def __len__(self):\n        return len(self.dataframe)\n\n    def __getitem__(self, index):\n        image_path = self.dataframe['image_path'][index]\n        image = load_dicom(image_path)  # DICOM dosyasını yükle\n        label = self.dataframe['severity'][index]\n        \n        # Sadece Severe sınıfına augmentasyon yap\n        if self.augment_severe and label == 'Severe':\n            image = self.apply_augmentation(image)  # Severe için augmentasyon uygula\n\n        # Veriye transformasyonu uygula\n        if self.transform:\n            image = self.transform(image)\n\n        return image, label\n    \n    # Severe sınıfına augmentasyon işlemleri\n    def apply_augmentation(self, image):\n        augmentations = [\n            lambda img: np.rot90(img, k=np.random.randint(1, 4)),  # Random rotation\n            lambda img: np.fliplr(img),  # Horizontal flip\n            lambda img: np.flipud(img),  # Vertical flip\n            lambda img: self.random_crop(img),  # Random crop\n            lambda img: self.random_zoom(img),  # Random zoom\n        ]\n        \n        augmentation = np.random.choice(augmentations)\n        return augmentation(image)\n\n    # Random crop\n    def random_crop(self, image, crop_size=(224, 224)):\n        h, w = image.shape\n        new_h, new_w = crop_size\n        top = np.random.randint(0, h - new_h)\n        left = np.random.randint(0, w - new_w)\n        return image[top:top+new_h, left:left+new_w]\n\n    # Random zoom\n    def random_zoom(self, image, zoom_range=(0.8, 1.2)):\n        h, w = image.shape\n        zoom_factor = np.random.uniform(zoom_range[0], zoom_range[1])\n        new_h, new_w = int(h * zoom_factor), int(w * zoom_factor)\n        return image  # Eğer zoom fonksiyonu gerekiyorsa burada yeni boyutlarda resmi döndürmelisiniz\n\n\"\"\"# Function to create datasets and dataloaders for each series description\ndef create_datasets_and_loaders(df, series_description, transform, batch_size=8):\n    filtered_df = df[df['series_description'] == series_description]\n    \n    train_df, val_df = train_test_split(filtered_df, test_size=0.2, random_state=42)\n    train_df = train_df.reset_index(drop=True)\n    val_df = val_df.reset_index(drop=True)\n\n    train_dataset = CustomDataset(train_df, transform)\n    val_dataset = CustomDataset(val_df, transform)\n\n    trainloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n    valloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)\n    \n    return trainloader, valloader, len(train_df), len(val_df)\"\"\"\n# Function to create datasets and dataloaders for each series description\ndef create_datasets_and_loaders(df, series_description, transform, batch_size=8, augment_severe=False):\n    filtered_df = df[df['series_description'] == series_description]\n    \n    # %5'ini al, frac değerini değiştirerek trainde verinin ne kadarını kullanacağınızı belirleyebilirsiniz\n    filtered_df = filtered_df.sample(frac=1.0, random_state=42)  \n    \n    train_df, val_df = train_test_split(filtered_df, test_size=0.2, random_state=42)\n    train_df = train_df.reset_index(drop=True)\n    val_df = val_df.reset_index(drop=True)\n\n    # CustomDataset'i oluştururken augment_severe parametresini True yapıyoruz\n    train_dataset = CustomDataset(train_df, transform=transform, augment_severe=augment_severe)\n    val_dataset = CustomDataset(val_df, transform=transform)\n\n    trainloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n    valloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)\n    \n    return trainloader, valloader, len(train_df), len(val_df)\n\n\n# Define the transforms\ntransform = transforms.Compose([\n    transforms.Lambda(lambda x: (x * 255).astype(np.uint8)),  # Convert back to uint8 for PIL\n    transforms.ToPILImage(),\n    transforms.Resize((224, 224)),\n    transforms.Grayscale(num_output_channels=3),\n    transforms.ToTensor(),\n])\n\n# Create dataloaders for each series description\ndataloaders = {}\nlengths = {}\n\n# Bu noktada augment_severe=True parametresi geçiyoruz\ntrainloader_t1, valloader_t1, len_train_t1, len_val_t1 = create_datasets_and_loaders(train_data, 'Sagittal T1', transform, augment_severe=True)\ntrainloader_t2, valloader_t2, len_train_t2, len_val_t2 = create_datasets_and_loaders(train_data, 'Axial T2', transform, augment_severe=True)\ntrainloader_t2stir, valloader_t2stir, len_train_t2stir, len_val_t2stir = create_datasets_and_loaders(train_data, 'Sagittal T2/STIR', transform, augment_severe=True)\n\ndataloaders['Sagittal T1'] = (trainloader_t1, valloader_t1)\ndataloaders['Axial T2'] = (trainloader_t2, valloader_t2)\ndataloaders['Sagittal T2/STIR'] = (trainloader_t2stir, valloader_t2stir)\n\nlengths['Sagittal T1'] = (len_train_t1, len_val_t1)\nlengths['Axial T2'] = (len_train_t2, len_val_t2)\nlengths['Sagittal T2/STIR'] = (len_train_t2stir, len_val_t2stir)\n\n\n# Dictionary mapping labels to indices\nlabel_map = {'Mild': 0, 'Moderate': 1, 'Severe': 2}","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:58.039954Z","iopub.execute_input":"2024-12-19T14:26:58.040260Z","iopub.status.idle":"2024-12-19T14:26:59.336472Z","shell.execute_reply.started":"2024-12-19T14:26:58.040230Z","shell.execute_reply":"2024-12-19T14:26:59.335584Z"},"papermill":{"duration":1.730095,"end_time":"2024-12-19T08:22:29.469451","exception":false,"start_time":"2024-12-19T08:22:27.739356","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"a21a78e0","cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Function to visualize a batch of images\ndef visualize_batch(dataloader):\n    images, labels = next(iter(dataloader))\n    fig, axes = plt.subplots(1, len(images), figsize=(20, 5))\n    for i, (img, lbl) in enumerate(zip(images, labels)):\n        ax = axes[i]\n        img = img.permute(1, 2, 0)  # Convert to HWC for visualization\n        ax.imshow(img)\n        ax.set_title(f\"Label: {lbl}\")\n        ax.axis('off')\n    plt.show()\n\n# Visualize samples from each dataloader\nprint(\"Visualizing Sagittal T1 samples\")\nvisualize_batch(trainloader_t1)\nprint(\"Visualizing Axial T2 samples\")\nvisualize_batch(trainloader_t2)\nprint(\"Visualizing Sagittal T2/STIR samples\")\nvisualize_batch(trainloader_t2stir)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:26:59.337397Z","iopub.execute_input":"2024-12-19T14:26:59.337922Z","iopub.status.idle":"2024-12-19T14:27:01.660793Z","shell.execute_reply.started":"2024-12-19T14:26:59.337892Z","shell.execute_reply":"2024-12-19T14:27:01.659852Z"},"papermill":{"duration":2.281515,"end_time":"2024-12-19T08:22:31.764108","exception":false,"start_time":"2024-12-19T08:22:29.482593","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"9de61518","cell_type":"code","source":"import matplotlib.pyplot as plt\n\nimage, label = next(iter(trainloader_t2))\nsample = image[1].permute(1, 2, 0)  #sample\n\n# Plot images\nplt.figsize=(8, 4)\nplt.imshow(images[0], cmap='gray')\nplt.title(label[0])\nplt.axis('off')\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:01.661690Z","iopub.execute_input":"2024-12-19T14:27:01.661969Z","iopub.status.idle":"2024-12-19T14:27:02.041714Z","shell.execute_reply.started":"2024-12-19T14:27:01.661943Z","shell.execute_reply":"2024-12-19T14:27:02.040822Z"},"papermill":{"duration":0.40912,"end_time":"2024-12-19T08:22:32.203648","exception":false,"start_time":"2024-12-19T08:22:31.794528","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"303d4cfe","cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.models as models\nfrom torchvision import transforms\nfrom torch.utils.data import DataLoader\nfrom sklearn.model_selection import train_test_split\nimport pandas as pd\nfrom tqdm import tqdm\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:02.042633Z","iopub.execute_input":"2024-12-19T14:27:02.042930Z","iopub.status.idle":"2024-12-19T14:27:02.096705Z","shell.execute_reply.started":"2024-12-19T14:27:02.042894Z","shell.execute_reply":"2024-12-19T14:27:02.095951Z"},"papermill":{"duration":0.081896,"end_time":"2024-12-19T08:22:32.318356","exception":false,"start_time":"2024-12-19T08:22:32.236460","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"d49f3e91","cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torchvision.models as models\nfrom torchvision.models import ResNet50_Weights  # ResNet50 ağırlıkları için enum'u import et\n\nimport torch\nimport torch.nn as nn\nimport torchvision.models as models\nfrom torchvision.models import ResNet50_Weights  # ResNet50 ağırlıkları için enum'u import et\n\nclass CustomResNet50(nn.Module):\n    def __init__(self, num_classes=3, pretrained_weights=None):\n        super(CustomResNet50, self).__init__()\n        \n        # pretrained=True yerine weights=ResNet50_Weights.IMAGENET1K_V1 kullanarak ağırlıkları yükleyin\n        self.model = models.resnet50(weights=ResNet50_Weights.IMAGENET1K_V1).to(device)\n        \n        # Eğer manuel ağırlık yolu verilmişse, bu ağırlıkları yükle\n        if pretrained_weights:\n            self.model.load_state_dict(torch.load(pretrained_weights))\n        \n        # Son katmanı 3 sınıf için değiştirme\n        num_ftrs = self.model.fc.in_features  # Son katmanın özellik sayısını al\n        self.model.fc = nn.Linear(num_ftrs, num_classes)  # Son katmanı değiştirme\n\n    def forward(self, x):\n        return self.model(x)\n\n    def unfreeze_middle_layers(self):\n        \"\"\"Orta katmanları çöz.\"\"\"\n        for name, param in self.model.named_parameters():\n            if 'layer3' in name or 'layer4' in name:  \n                param.requires_grad = True\n            else:\n                param.requires_grad = False\n\n# Modeli başlat\nsagittal_t1_model = CustomResNet50(num_classes=3).to(device)\naxial_t2_model = CustomResNet50(num_classes=3).to(device)\nsagittal_t2stir_model = CustomResNet50(num_classes=3).to(device)\n\n# Orta katmanları çözmek için\nfor model in [sagittal_t1_model, axial_t2_model, sagittal_t2stir_model]:\n    model.unfreeze_middle_layers()  # Orta katmanları çöz\n\n# Eğitim parametreleri\nweights = torch.tensor([1.0, 2.0, 4.0])\ncriterion = nn.CrossEntropyLoss(weight=weights.to(device))\n\n# Optimizer ayarları\noptimizer_sagittal_t1 = torch.optim.Adam(sagittal_t1_model.parameters(), lr=0.001)\noptimizer_axial_t2 = torch.optim.Adam(axial_t2_model.parameters(), lr=0.001)\noptimizer_sagittal_t2stir = torch.optim.Adam(sagittal_t2stir_model.parameters(), lr=0.001)\n\n# Modelleri ve optimizörleri saklamak için dictionary\nmodels_dict = {\n    'Sagittal T1': sagittal_t1_model,\n    'Axial T2': axial_t2_model,\n    'Sagittal T2/STIR': sagittal_t2stir_model,\n}\n\noptimizers_dict = {\n    'Sagittal T1': optimizer_sagittal_t1,\n    'Axial T2': optimizer_axial_t2,\n    'Sagittal T2/STIR': optimizer_sagittal_t2stir,\n}\n\n# Eğitim yapılabilir parametrelerin sayısını yazdır\nfor model_name, model in models_dict.items():\n    trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)\n    print(f\"Trainable parameters for {model_name}: {trainable_params}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:02.097479Z","iopub.execute_input":"2024-12-19T14:27:02.097682Z","iopub.status.idle":"2024-12-19T14:27:04.344872Z","shell.execute_reply.started":"2024-12-19T14:27:02.097665Z","shell.execute_reply":"2024-12-19T14:27:04.344152Z"},"papermill":{"duration":2.247888,"end_time":"2024-12-19T08:22:34.597291","exception":false,"start_time":"2024-12-19T08:22:32.349403","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"588ed801","cell_type":"code","source":"label_map = {'normal_mild': 0, 'moderate': 1, 'severe': 2}","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:04.345660Z","iopub.execute_input":"2024-12-19T14:27:04.345868Z","iopub.status.idle":"2024-12-19T14:27:04.349576Z","shell.execute_reply.started":"2024-12-19T14:27:04.345850Z","shell.execute_reply":"2024-12-19T14:27:04.348735Z"},"papermill":{"duration":0.03673,"end_time":"2024-12-19T08:22:34.665136","exception":false,"start_time":"2024-12-19T08:22:34.628406","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"f9fd7c6f","cell_type":"code","source":"for images, labels in trainloader_t2:\n    labels = torch.tensor([label_map[label] for label in labels])\n    labels = labels.to(device)\n    print(labels)\n    break","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:04.350530Z","iopub.execute_input":"2024-12-19T14:27:04.350810Z","iopub.status.idle":"2024-12-19T14:27:04.508148Z","shell.execute_reply.started":"2024-12-19T14:27:04.350781Z","shell.execute_reply":"2024-12-19T14:27:04.507434Z"},"papermill":{"duration":0.220802,"end_time":"2024-12-19T08:22:34.917714","exception":false,"start_time":"2024-12-19T08:22:34.696912","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"5b68a183","cell_type":"code","source":"import torch.optim.lr_scheduler as lr_scheduler\nfrom copy import deepcopy\nimport os\n\ndef train_model(model, trainloader, valloader, len_train, len_val, optimizer, num_epochs=10, patience=3, model_desc=\"default_model\"):\n    # Learning rate scheduler\n    scheduler = lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.1)\n    \n    best_val_acc = 0.0\n    best_val_loss = float('inf')  # Başlangıçta en iyi val_loss sonsuz olacak\n    best_model_wts = deepcopy(model.state_dict())\n    counter = 0\n    \n    for epoch in range(num_epochs):\n        model.train()\n        train_loss = 0\n        correct_train = 0\n        \n        with tqdm(trainloader, unit=\"batch\") as tepoch:\n            for images, labels in tepoch:\n                images, labels = images.to(device), torch.tensor([label_map[label] for label in labels]).to(device)\n                optimizer.zero_grad()\n                outputs = model(images)\n                loss = criterion(outputs, labels)\n                loss.backward()\n                optimizer.step()\n                train_loss += loss.item()\n                \n                probabilities = torch.softmax(outputs, dim=1)\n                _, predicted = torch.max(probabilities, 1)\n                correct_train += (predicted == labels).sum().item()\n                \n                tepoch.set_postfix(epoch=epoch+1)\n        \n        scheduler.step()\n        \n        train_loss /= len(trainloader)\n        train_acc = 100 * correct_train / len_train\n        \n        model.eval()\n        val_loss, correct_val = 0, 0\n        with torch.no_grad():\n            with tqdm(valloader, unit=\"batch\") as vepoch:\n                for images, labels in vepoch:\n                    images, labels = images.to(device), torch.tensor([label_map[label] for label in labels]).to(device)\n                    outputs = model(images)\n                    loss = criterion(outputs, labels)\n                    val_loss += loss.item()\n                    \n                    probabilities = torch.softmax(outputs, dim=1)\n                    \n                    # Eğer batch size 1 ise, dim=0 kullanarak doğru boyutta işlem yapabilirsiniz\n                    if probabilities.dim() == 1:\n                        _, predicted = torch.max(probabilities, 0)  # batch size 1 ise dim=0\n                    else:\n                        _, predicted = torch.max(probabilities, 1)  # normal durumda dim=1\n                    correct_val += (predicted == labels).sum().item()\n                    \n                    vepoch.set_postfix(epoch=epoch+1)\n        \n        val_loss /= len(valloader)\n        val_acc = 100 * correct_val / len_val\n        \n        print(f\"Epoch {epoch+1}, Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%, Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.2f}%\")\n        \n        # Save the best model and check for early stopping\n        if val_acc > best_val_acc or (val_acc == best_val_acc and val_loss < best_val_loss):\n            best_val_acc = val_acc\n            best_val_loss = val_loss\n            best_model_wts = deepcopy(model.state_dict())\n            counter = 0\n            \n            # Eski model dosyasını silmeden önce sadece en iyi model kaydedilmeli\n            model_path = f'best_model_{model_desc}.pth'\n\n            \n            # Eğer model gerçekten değiştiyse, önceki model dosyasını sil\n            if os.path.exists(model_path):\n                # Silinmesi gereken eski model dosyasını bulup sil\n                os.remove(model_path)\n            \n            # Yeni en iyi modeli kaydet\n            torch.save(best_model_wts, model_path)\n        else:\n            counter += 1\n        \n        # Early stopping\n        if counter >= patience:\n            print(f\"Early stopping triggered after {epoch+1} epochs\")\n            break\n    \n    # Load best model weights\n    model.load_state_dict(best_model_wts)\n    return model, best_val_acc\n","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:04.508950Z","iopub.execute_input":"2024-12-19T14:27:04.509220Z","iopub.status.idle":"2024-12-19T14:27:04.519643Z","shell.execute_reply.started":"2024-12-19T14:27:04.509187Z","shell.execute_reply":"2024-12-19T14:27:04.518758Z"},"papermill":{"duration":0.043162,"end_time":"2024-12-19T08:22:34.991970","exception":false,"start_time":"2024-12-19T08:22:34.948808","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"e53d599b","cell_type":"code","source":"#!rm -rf /kaggle/working/*","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:04.520404Z","iopub.execute_input":"2024-12-19T14:27:04.520628Z","iopub.status.idle":"2024-12-19T14:27:04.535823Z","shell.execute_reply.started":"2024-12-19T14:27:04.520609Z","shell.execute_reply":"2024-12-19T14:27:04.535229Z"},"papermill":{"duration":0.036578,"end_time":"2024-12-19T08:22:35.059315","exception":false,"start_time":"2024-12-19T08:22:35.022737","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"4697302c","cell_type":"code","source":"# Training all models\nfor desc, model in models_dict.items():  # models yerine models_dict kullanın\n    # desc değerindeki boşlukları kaldır ve güvenli hale getirmek için karakterleri değiştirme\n    safe_desc = desc.replace(\" \", \"_\").replace(\"/\", \"_\")  # Boşlukları ve / gibi karakterleri değiştir\n    \n    if desc == 'Sagittal T1':\n        trainloader, valloader, len_train, len_val = trainloader_t1, valloader_t1, len_train_t1, len_val_t1\n    elif desc == 'Axial T2':\n        trainloader, valloader, len_train, len_val = trainloader_t2, valloader_t2, len_train_t2, len_val_t2\n    elif desc == 'Sagittal T2/STIR':\n        trainloader, valloader, len_train, len_val = trainloader_t2stir, valloader_t2stir, len_train_t2stir, len_val_t2stir\n    \n    print(f\"Training model for {desc}\")\n    \n    # safe_desc değerini train_model'e geçir\n    train_model(model, trainloader, valloader, len_train, len_val, optimizers_dict[desc], model_desc=safe_desc)","metadata":{"execution":{"iopub.status.busy":"2024-12-19T14:27:04.539519Z","iopub.execute_input":"2024-12-19T14:27:04.539753Z"},"papermill":{"duration":4719.856575,"end_time":"2024-12-19T09:41:14.946226","exception":false,"start_time":"2024-12-19T08:22:35.089651","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"id":"77dba0a1","cell_type":"code","source":"train_data['level'].unique()","metadata":{"papermill":{"duration":3.414292,"end_time":"2024-12-19T09:41:21.732451","exception":false,"start_time":"2024-12-19T09:41:18.318159","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null}]}