{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"},{"sourceId":8949207,"sourceType":"datasetVersion","datasetId":5385444}],"dockerImageVersionId":30733,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\n\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models, Input, Model\nfrom tensorflow.keras.callbacks import ModelCheckpoint\nfrom sklearn.preprocessing import LabelBinarizer\nimport pydicom\nfrom tensorflow.keras.preprocessing.image import img_to_array\n\nfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:17:45.334768Z","iopub.execute_input":"2024-07-14T07:17:45.335398Z","iopub.status.idle":"2024-07-14T07:17:45.341161Z","shell.execute_reply.started":"2024-07-14T07:17:45.335370Z","shell.execute_reply":"2024-07-14T07:17:45.340156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the CSV file\nfile_path = '/kaggle/input/master-data/master_data.csv'\ndata = pd.read_csv(file_path)","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:17:47.341375Z","iopub.execute_input":"2024-07-14T07:17:47.341842Z","iopub.status.idle":"2024-07-14T07:17:47.477109Z","shell.execute_reply.started":"2024-07-14T07:17:47.341814Z","shell.execute_reply":"2024-07-14T07:17:47.476208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"study_ids = [4646740,4003253,8785691]\ndata = data[data[\"study_id\"].isin(study_ids)]\ndata","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:07.811604Z","iopub.execute_input":"2024-07-14T07:21:07.812318Z","iopub.status.idle":"2024-07-14T07:21:07.839830Z","shell.execute_reply.started":"2024-07-14T07:21:07.812287Z","shell.execute_reply":"2024-07-14T07:21:07.838913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = data[data[\"condition\"] == \"Left Subarticular Stenosis\"]\ndata.count()","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:14.519150Z","iopub.execute_input":"2024-07-14T07:21:14.520140Z","iopub.status.idle":"2024-07-14T07:21:14.530353Z","shell.execute_reply.started":"2024-07-14T07:21:14.520093Z","shell.execute_reply":"2024-07-14T07:21:14.529294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = data.dropna()","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.200401Z","iopub.execute_input":"2024-07-14T07:21:25.200855Z","iopub.status.idle":"2024-07-14T07:21:25.209196Z","shell.execute_reply.started":"2024-07-14T07:21:25.200820Z","shell.execute_reply":"2024-07-14T07:21:25.207911Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.columns","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.210938Z","iopub.execute_input":"2024-07-14T07:21:25.211260Z","iopub.status.idle":"2024-07-14T07:21:25.219732Z","shell.execute_reply.started":"2024-07-14T07:21:25.211216Z","shell.execute_reply":"2024-07-14T07:21:25.218778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.221438Z","iopub.execute_input":"2024-07-14T07:21:25.222063Z","iopub.status.idle":"2024-07-14T07:21:25.243261Z","shell.execute_reply.started":"2024-07-14T07:21:25.222031Z","shell.execute_reply":"2024-07-14T07:21:25.242068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"# Display basic information about the dataset\n# print(\"Basic Information:\")\nprint(data.info())","metadata":{}},{"cell_type":"raw","source":"# Display basic statistics of the dataset\nprint(\"\\nSummary Statistics:\")\nprint(data.describe())","metadata":{}},{"cell_type":"raw","source":"# Display the first few rows of the dataset\nprint(\"\\nFirst Few Rows:\")\nprint(data.head())","metadata":{}},{"cell_type":"raw","source":"# Convert string labels to numerical values using LabelEncoder\nlabel_encoder = LabelEncoder()\ndata['label_encoded'] = label_encoder.fit_transform(data['severity'])","metadata":{}},{"cell_type":"raw","source":"# Convert other categorical columns to numerical values using OneHotEncoder\ncategorical_columns = ['condition','level','series_description']\none_hot_encoder = OneHotEncoder()\none_hot_encoded = one_hot_encoder.fit_transform(data[categorical_columns]).toarray()","metadata":{}},{"cell_type":"raw","source":"# Create a DataFrame for the one-hot encoded columns and concatenate it with the original data\none_hot_encoded_df = pd.DataFrame(one_hot_encoded, columns=one_hot_encoder.get_feature_names_out(categorical_columns))\ndata = pd.concat([data, one_hot_encoded_df], axis=1)","metadata":{}},{"cell_type":"raw","source":"# Plot class distribution\nplt.figure(figsize=(8, 6))\nsns.countplot(x=data['label_encoded'], palette='viridis')\nplt.title('Class Distribution')\nplt.xlabel('Condition Severity')\nplt.ylabel('Count')\nplt.xticks(ticks=range(len(label_encoder.classes_)), labels=label_encoder.classes_, rotation=45)\nplt.show()","metadata":{}},{"cell_type":"raw","source":"# Analyze the distribution of coordinates\nplt.figure(figsize=(12, 6))\n\nplt.subplot(1, 2, 1)\nsns.histplot(data['x'], kde=True)  # Replace 'x' with the actual column name for the x coordinate\nplt.title('X Coordinate Distribution')\nplt.xlabel('X Coordinate')\nplt.ylabel('Count')\n\nplt.subplot(1, 2, 2)\nsns.histplot(data['y'], kde=True)  # Replace 'y' with the actual column name for the y coordinate\nplt.title('Y Coordinate Distribution')\nplt.xlabel('Y Coordinate')\nplt.ylabel('Count')\n\nplt.tight_layout()\nplt.show()","metadata":{}},{"cell_type":"raw","source":"# Joint plot of x and y coordinates\nplt.figure(figsize=(8, 6))\nsns.jointplot(x='x', y='y', data=data, kind='scatter')  # Replace 'x' and 'y' with actual column names\nplt.title('Joint Plot of Coordinates')\nplt.xlabel('X Coordinate')\nplt.ylabel('Y Coordinate')\nplt.show()","metadata":{}},{"cell_type":"raw","source":"# Correlation matrix with encoded values\nplt.figure(figsize=(14, 10))\nnumeric_columns = data.select_dtypes(include=[np.number]).columns\ncorr_matrix = data[numeric_columns].corr()\nsns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f')\nplt.title('Correlation Matrix')\nplt.show()","metadata":{}},{"cell_type":"raw","source":"# Check for missing values\nprint(\"\\nMissing Values:\")\nprint(data.isnull().sum())\n","metadata":{}},{"cell_type":"raw","source":"data =data.dropna()\ndata","metadata":{}},{"cell_type":"raw","source":"'''\n# Distribution of images across different folders\nfolder_counts = data.groupby(['study_id', 'series_id']).size().reset_index(name='count')\nplt.figure(figsize=(10, 6))\nsns.barplot(x='study_id', y='count', hue='series_id', data=folder_counts)\nplt.title('Distribution of Images Across Folders')\nplt.xlabel('study_id')\nplt.ylabel('Count')\nplt.show()\n'''","metadata":{}},{"cell_type":"code","source":"# Define image size\nimage_size = (512, 512)","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.244606Z","iopub.execute_input":"2024-07-14T07:21:25.245031Z","iopub.status.idle":"2024-07-14T07:21:25.250273Z","shell.execute_reply.started":"2024-07-14T07:21:25.244999Z","shell.execute_reply":"2024-07-14T07:21:25.249321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"\n# Function to load and preprocess DICOM images\ndef load_and_preprocess_dicom(image_path):\n    dicom = pydicom.dcmread(image_path)\n    image = dicom.pixel_array\n#     print(image.shape)\n    image = np.expand_dims(image, axis=-1)  # Add channel dimension\n    image = tf.image.resize(image, image_size)\n    # image = np.expand_dims(image, axis=-1)  # Add channel dimension\n    image = image / 255.0  # Normalize to [0, 1]\n    return image","metadata":{"execution":{"iopub.status.busy":"2024-07-14T06:21:07.766915Z","iopub.execute_input":"2024-07-14T06:21:07.767273Z","iopub.status.idle":"2024-07-14T06:21:07.778733Z","shell.execute_reply.started":"2024-07-14T06:21:07.767243Z","shell.execute_reply":"2024-07-14T06:21:07.777574Z"}}},{"cell_type":"code","source":"# imageTemp = load_and_preprocess_dicom(\"train_images/4003253/702807833/8.dcm\")","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.252655Z","iopub.execute_input":"2024-07-14T07:21:25.253007Z","iopub.status.idle":"2024-07-14T07:21:25.257987Z","shell.execute_reply.started":"2024-07-14T07:21:25.252975Z","shell.execute_reply":"2024-07-14T07:21:25.256986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# imageTemp","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.259207Z","iopub.execute_input":"2024-07-14T07:21:25.259563Z","iopub.status.idle":"2024-07-14T07:21:25.265745Z","shell.execute_reply.started":"2024-07-14T07:21:25.259531Z","shell.execute_reply":"2024-07-14T07:21:25.264824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"# Initialize lists to store images, coordinates, and severities\nimages = []\ncoordinates = []\nseverities = []\n\n# Process each row in the CSV file\nfor index, row in data.iterrows():\n    # Construct the full image path\n    image_path = os.path.join(f\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/{row['study_id']}\", f\"{row['series_id']}\", f\"{row['instance_number']}.dcm\")\n    # Check if the image file exists\n    if os.path.exists(image_path):\n#         print(f\"found {image_path}\")\n        # Load and preprocess the image\n        image = load_and_preprocess_dicom(image_path)\n        images.append(image)\n        \n        # Collect coordinates\n        coordinate = [row['x'], row['y']]\n        coordinates.append(coordinate)\n        \n        # Collect severities\n        severities.append(row['severity'])\n#     else: print(\"Path not found\")","metadata":{"execution":{"iopub.status.busy":"2024-07-14T06:21:07.804555Z","iopub.execute_input":"2024-07-14T06:21:07.804932Z","iopub.status.idle":"2024-07-14T06:24:29.189348Z","shell.execute_reply.started":"2024-07-14T06:21:07.804900Z","shell.execute_reply":"2024-07-14T06:24:29.188034Z"}}},{"cell_type":"code","source":"# This will install the required RAPIDS libraries\n# !pip install cucim cupy-cuda110","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.266927Z","iopub.execute_input":"2024-07-14T07:21:25.267415Z","iopub.status.idle":"2024-07-14T07:21:25.272527Z","shell.execute_reply.started":"2024-07-14T07:21:25.267386Z","shell.execute_reply":"2024-07-14T07:21:25.271497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cudf\nimport cupy as cp\nfrom cucim import CuImage\n\ndef load_and_preprocess_dicom(image_path):\n    # Load the DICOM image using cuCIM\n    dicom_image = CuImage(image_path)\n    # Convert the image to a cupy array and preprocess as needed\n    image_array = cp.asarray(dicom_image.read_region())\n    # Example preprocessing: resize, normalize, etc.\n    image_array = (image_array - cp.min(image_array)) / (cp.max(image_array) - cp.min(image_array))\n    return image_array\n","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:21:25.273857Z","iopub.execute_input":"2024-07-14T07:21:25.274560Z","iopub.status.idle":"2024-07-14T07:21:25.281364Z","shell.execute_reply.started":"2024-07-14T07:21:25.274527Z","shell.execute_reply":"2024-07-14T07:21:25.280507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"severity_mapping = {\n    'Normal/Mild': 0,\n    'Moderate': 1,\n    'Severe': 2\n}","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:36:26.969685Z","iopub.execute_input":"2024-07-14T07:36:26.970393Z","iopub.status.idle":"2024-07-14T07:36:26.974845Z","shell.execute_reply.started":"2024-07-14T07:36:26.970362Z","shell.execute_reply":"2024-07-14T07:36:26.973666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cudf\nimport cupy as cp\nfrom cucim import CuImage\n\ndef load_and_preprocess_dicom(image_path):\n    \n    # Load the DICOM image using pydicom\n    dicom_image = pydicom.dcmread(image_path)\n    \n    # Convert the pixel data to a numpy array\n    image_array = dicom_image.pixel_array\n    \n    image_array = np.expand_dims(image_array, axis=-1)  # Add channel dimension\n    image_array = tf.image.resize(image_array, image_size)\n    \n    image_array = cp.asarray(image_array)\n    \n    # Example preprocessing: resize, normalize, etc.\n    image_array = (image_array - cp.min(image_array)) / (cp.max(image_array) - cp.min(image_array))\n    return image_array\n\n# Load CSV file using cuDF\ncudata = cudf.from_pandas(data)\n\n# Initialize lists to store the processed data\nimages = []\ncoordinates = []\nseverities = []\n\n# Convert cuDF columns to lists\nstudy_ids = cudata['study_id'].to_arrow().to_pylist()\nseries_ids = cudata['series_id'].to_arrow().to_pylist()\ninstance_numbers = cudata['instance_number'].to_arrow().to_pylist()\nx_coords = cudata['x'].to_arrow().to_pylist()\ny_coords = cudata['y'].to_arrow().to_pylist()\nseverity_list = cudata['severity'].to_arrow().to_pylist()\n\n# Process each row in the data\nfor i in range(len(cudata)):\n    # Construct the full image path\n    image_path = os.path.join(\n        f\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/{study_ids[i]}\", \n        f\"{series_ids[i]}\", \n        f\"{instance_numbers[i]}.dcm\"\n    )\n    # Check if the image file exists\n    if os.path.exists(image_path):\n        # Load and preprocess the image\n        image = load_and_preprocess_dicom(image_path)\n        images.append(image)\n\n        # Collect coordinates\n        coordinate = [x_coords[i], y_coords[i]]\n        coordinates.append(coordinate)\n\n        # Collect severities\n        severities.append(severity_mapping[severity_list[i]])\n\n\n# Convert lists to cupy arrays for further GPU processing\nimages = cp.array(images)\ncoordinates = cp.array(coordinates)\nseverities = cp.array(severities)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:38:11.299089Z","iopub.execute_input":"2024-07-14T07:38:11.299457Z","iopub.status.idle":"2024-07-14T07:38:11.531216Z","shell.execute_reply.started":"2024-07-14T07:38:11.299432Z","shell.execute_reply":"2024-07-14T07:38:11.530328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Convert lists to cupy arrays for further GPU processing\nimages = cp.array(images)\ncoordinates = cp.array(coordinates)\nseverities = cp.array(severities)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:38:47.941118Z","iopub.execute_input":"2024-07-14T07:38:47.941485Z","iopub.status.idle":"2024-07-14T07:38:48.676495Z","shell.execute_reply.started":"2024-07-14T07:38:47.941457Z","shell.execute_reply":"2024-07-14T07:38:48.675452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"DONE!!!\")","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:38:50.556710Z","iopub.execute_input":"2024-07-14T07:38:50.557655Z","iopub.status.idle":"2024-07-14T07:38:50.566929Z","shell.execute_reply.started":"2024-07-14T07:38:50.557601Z","shell.execute_reply":"2024-07-14T07:38:50.565906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"# Convert lists to numpy arrays\nimages = np.array(images)\ncoordinates = np.array(coordinates)","metadata":{"execution":{"iopub.status.busy":"2024-07-14T06:24:29.190754Z","iopub.execute_input":"2024-07-14T06:24:29.191621Z","iopub.status.idle":"2024-07-14T06:24:33.401775Z","shell.execute_reply.started":"2024-07-14T06:24:29.191587Z","shell.execute_reply":"2024-07-14T06:24:33.400632Z"}}},{"cell_type":"raw","source":"\n# Handle missing coordinates by filling with a placeholder value (e.g., (0, 0))\ncoordinates = np.nan_to_num(coordinates, nan=0.0)\n","metadata":{"execution":{"iopub.status.busy":"2024-07-14T06:24:33.403858Z","iopub.execute_input":"2024-07-14T06:24:33.404332Z","iopub.status.idle":"2024-07-14T06:24:33.410383Z","shell.execute_reply.started":"2024-07-14T06:24:33.404286Z","shell.execute_reply":"2024-07-14T06:24:33.408982Z"}}},{"cell_type":"code","source":"\n# One-hot encode severities\n# serverities = [\"s\",\"m\",\"n\"]\n# serverities = [2,1,0]\n\nseverity_binarizer = LabelBinarizer()\nseverities = severity_binarizer.fit_transform(severities)\n\n# serverities = [[0,0,1],[0,1,0],[1,0,0]]","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:09.897249Z","iopub.execute_input":"2024-07-14T07:51:09.898447Z","iopub.status.idle":"2024-07-14T07:51:10.330785Z","shell.execute_reply.started":"2024-07-14T07:51:09.898406Z","shell.execute_reply":"2024-07-14T07:51:10.329343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Shuffle the dataset\nindices = np.arange(images.shape[0])\nnp.random.shuffle(indices)\nimages = images[indices]\ncoordinates = coordinates[indices]\nseverities = severities[indices]","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:10.349663Z","iopub.execute_input":"2024-07-14T07:51:10.349942Z","iopub.status.idle":"2024-07-14T07:51:10.357433Z","shell.execute_reply.started":"2024-07-14T07:51:10.349918Z","shell.execute_reply":"2024-07-14T07:51:10.356472Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Split the dataset into training and validation sets\nsplit_index = int(0.8 * images.shape[0])\ntrain_images, val_images = images[:split_index], images[split_index:]\ntrain_coordinates, val_coordinates = coordinates[:split_index], coordinates[split_index:]\ntrain_severities, val_severities = severities[:split_index], severities[split_index:]\n\n# Print shapes to verify\nprint(\"Training set shapes:\", train_images.shape, train_coordinates.shape, train_severities.shape)\nprint(\"Validation set shapes:\", val_images.shape, val_coordinates.shape, val_severities.shape)","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:10.751298Z","iopub.execute_input":"2024-07-14T07:51:10.751589Z","iopub.status.idle":"2024-07-14T07:51:10.758392Z","shell.execute_reply.started":"2024-07-14T07:51:10.751566Z","shell.execute_reply":"2024-07-14T07:51:10.757358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define the model\ndef create_model():\n    # CNN for image input\n    image_input = Input(shape=(512, 512, 1), name=\"image_input\")\n    x = layers.Conv2D(32, (3, 3), activation='relu')(image_input)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Conv2D(64, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((2, 2))(x)\n    x = layers.Conv2D(128, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Conv2D(256, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Conv2D(512, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Flatten()(x)\n    x = layers.Dense(128, activation='relu')(x)\n    image_output = layers.Dense(64, activation='relu')(x)\n\n    # Dense network for coordinate input\n    coordinate_input = Input(shape=(2,), name=\"coordinate_input\")\n    y = layers.Dense(32, activation='relu')(coordinate_input)\n    y = layers.Dense(64, activation='relu')(y)\n\n    # Concatenate outputs of both networks\n    concatenated = layers.concatenate([image_output, y])\n\n    # Final classification layer\n    z = layers.Dense(128, activation='relu')(concatenated)\n    z = layers.Dropout(0.5)(z)\n    z = layers.Dense(64, activation='relu')(z)\n    z = layers.Dense(3, activation='softmax')(z)\n\n    # Create the model\n    model = Model(inputs=[image_input, coordinate_input], outputs=z)\n    \n    # Compile the model\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    \n    return model\n\nmodel = create_model()","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:11.377161Z","iopub.execute_input":"2024-07-14T07:51:11.377884Z","iopub.status.idle":"2024-07-14T07:51:11.485136Z","shell.execute_reply.started":"2024-07-14T07:51:11.377855Z","shell.execute_reply":"2024-07-14T07:51:11.484341Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Set up the checkpoint callback\ncheckpoint_dir = './checkpoints'\nif not os.path.exists(checkpoint_dir):\n    os.makedirs(checkpoint_dir)\ncheckpoint_callback = ModelCheckpoint(filepath=checkpoint_dir + '/model-{epoch:02d}-{val_loss:.2f}.keras',\n                        save_weights_only=False,\n                        monitor='val_loss',\n                        mode='min',\n                        save_best_only=True,\n                        verbose=1)","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:11.811213Z","iopub.execute_input":"2024-07-14T07:51:11.811711Z","iopub.status.idle":"2024-07-14T07:51:11.816730Z","shell.execute_reply.started":"2024-07-14T07:51:11.811684Z","shell.execute_reply":"2024-07-14T07:51:11.815764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train the model with the checkpoint callback\nmodel.fit([train_images, train_coordinates], train_severities,\n    epochs=10, batch_size=32, \n    validation_data=([val_images, val_coordinates], val_severities),\n    callbacks=[checkpoint_callback])","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:12.528330Z","iopub.execute_input":"2024-07-14T07:51:12.529132Z","iopub.status.idle":"2024-07-14T07:51:12.639080Z","shell.execute_reply.started":"2024-07-14T07:51:12.529098Z","shell.execute_reply":"2024-07-14T07:51:12.637668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cupy as cp\nimport numpy as np\nfrom tensorflow.keras import layers, Model, Input\nfrom tensorflow.keras.callbacks import ModelCheckpoint\n\n# Define the model\ndef create_model():\n    # CNN for image input\n    image_input = Input(shape=(512, 512, 1), name=\"image_input\")\n    x = layers.Conv2D(32, (3, 3), activation='relu')(image_input)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Conv2D(64, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((2, 2))(x)\n    x = layers.Conv2D(128, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Conv2D(256, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Conv2D(512, (3, 3), activation='relu')(x)\n    x = layers.MaxPooling2D((3, 3))(x)\n    x = layers.Flatten()(x)\n    x = layers.Dense(128, activation='relu')(x)\n    image_output = layers.Dense(64, activation='relu')(x)\n\n    # Dense network for coordinate input\n    coordinate_input = Input(shape=(2,), name=\"coordinate_input\")\n    y = layers.Dense(32, activation='relu')(coordinate_input)\n    y = layers.Dense(64, activation='relu')(y)\n\n    # Concatenate outputs of both networks\n    concatenated = layers.concatenate([image_output, y])\n\n    # Final classification layer\n    z = layers.Dense(128, activation='relu')(concatenated)\n    z = layers.Dropout(0.5)(z)\n    z = layers.Dense(64, activation='relu')(z)\n    z = layers.Dense(3, activation='softmax')(z)\n\n    # Create the model\n    model = Model(inputs=[image_input, coordinate_input], outputs=z)\n    \n    # Compile the model\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    \n    return model\n\n# Assuming train_images, train_coordinates, train_severities, val_images, val_coordinates, and val_severities are cuPy arrays\ntrain_images = cp.asnumpy(train_images)\ntrain_coordinates = cp.asnumpy(train_coordinates)\ntrain_severities = cp.asnumpy(train_severities)\nval_images = cp.asnumpy(val_images)\nval_coordinates = cp.asnumpy(val_coordinates)\nval_severities = cp.asnumpy(val_severities)\n\nmodel = create_model()\n\n# Set up the checkpoint callback\ncheckpoint_dir = './checkpoints'\nif not os.path.exists(checkpoint_dir):\n    os.makedirs(checkpoint_dir)\ncheckpoint_callback = ModelCheckpoint(filepath=checkpoint_dir + '/model-{epoch:02d}-{val_loss:.2f}.keras',\n                        save_weights_only=False,\n                        monitor='val_loss',\n                        mode='min',\n                        save_best_only=True,\n                        verbose=1)\n\n# Train the model with the checkpoint callback\nmodel.fit([train_images, train_coordinates], train_severities,\n    epochs=10, batch_size=32, \n    validation_data=([val_images, val_coordinates], val_severities),\n    callbacks=[checkpoint_callback])\n","metadata":{"execution":{"iopub.status.busy":"2024-07-14T07:51:44.116216Z","iopub.execute_input":"2024-07-14T07:51:44.116830Z","iopub.status.idle":"2024-07-14T07:51:44.494363Z","shell.execute_reply.started":"2024-07-14T07:51:44.116799Z","shell.execute_reply":"2024-07-14T07:51:44.493032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_severite","metadata":{},"execution_count":null,"outputs":[]}]}