{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nfrom glob import glob\nfrom tqdm import tqdm\nfrom pathlib import Path\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport missingno as msno\nimport pydicom\nimport warnings\nimport seaborn as sns\n\ncompetition_dataset_directory = Path('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-08-29T11:22:05.949810Z","iopub.execute_input":"2024-08-29T11:22:05.950397Z","iopub.status.idle":"2024-08-29T11:22:05.959604Z","shell.execute_reply.started":"2024-08-29T11:22:05.950338Z","shell.execute_reply":"2024-08-29T11:22:05.958059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"---------------------------------------------------------------------------------------------------------------------------------","metadata":{}},{"cell_type":"markdown","source":"[Click here to go to my Previous Notepad](https://www.kaggle.com/code/thevindutvithanage/lumber-spine-classification)","metadata":{}},{"cell_type":"markdown","source":"RseNet Cnn Architecture","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport pydicom\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.applications import ResNet50\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Input, Dense, GlobalAveragePooling2D\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.preprocessing import LabelEncoder\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport pickle\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:05.962109Z","iopub.execute_input":"2024-08-29T11:22:05.962687Z","iopub.status.idle":"2024-08-29T11:22:05.977797Z","shell.execute_reply.started":"2024-08-29T11:22:05.962624Z","shell.execute_reply":"2024-08-29T11:22:05.976103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Paths to the image directory\nimage_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/'\n\n# Load the label coordinates CSV\ndf_train_label_coordinates = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')\ndf_train_label_coordinates['study_id'] = df_train_label_coordinates['study_id'].astype(int)  # Ensure study_id is int\n\n# Get the first 100 unique study_ids\nstudy_ids = df_train_label_coordinates['study_id'].unique()[:100]  # Get first 100 unique study_ids\n\n# Filter the DataFrame for these study_ids\nfiltered_df = df_train_label_coordinates[df_train_label_coordinates['study_id'].isin(study_ids)]\n\n# Load the training data CSV\ndf_train = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\n\n# Initialize lists to store the data\nimages = []\nseries_ids = []\nstudy_ids_labels = []\nconditions = []\nlevels = []\n\ntotal_images = len(filtered_df)\nprocessed_images = 0\n\nprint(\"Loading images...\")\n\nfor idx, row in filtered_df.iterrows():\n    study_id = str(row['study_id'])\n    series_id = str(row['series_id'])\n    instance_number = str(row['instance_number'])\n    condition = row['condition']\n    level = row['level']\n    \n    series_path = os.path.join(image_dir, study_id, series_id)\n    img_file = f\"{instance_number}.dcm\"\n    img_path = os.path.join(series_path, img_file)\n    \n    if os.path.exists(img_path):\n        # Load DICOM image\n        ds = pydicom.dcmread(img_path)\n        img = ds.pixel_array\n        if len(img.shape) == 2:\n            img = np.expand_dims(img, axis=-1)  # Add channel dimension\n        img = tf.image.resize(img, (128, 128))  # Resize image\n        img = img.numpy()  # Convert Tensor to numpy array\n        images.append(img)\n        series_ids.append(series_id)\n        study_ids_labels.append(study_id)\n        conditions.append(condition)\n        levels.append(level)\n        \n    processed_images += 1\n    \n    # Print progress every 100 images\n    if processed_images % 100 == 0:\n        print(f\"Processed {processed_images}/{total_images} images.\")\n\n# Convert lists to numpy arrays\nimages = np.array(images)\nseries_ids = np.array(series_ids)\nstudy_ids_labels = np.array(study_ids_labels)\nconditions = np.array(conditions)\nlevels = np.array(levels)\n\nprint(f\"Loaded {len(images)} images from {len(np.unique(study_ids_labels))} study IDs.\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:05.980449Z","iopub.execute_input":"2024-08-29T11:22:05.981123Z","iopub.status.idle":"2024-08-29T11:22:56.625025Z","shell.execute_reply.started":"2024-08-29T11:22:05.981063Z","shell.execute_reply":"2024-08-29T11:22:56.623734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Initialize label encoders\nle_series = LabelEncoder()\nle_study = LabelEncoder()\nle_condition = LabelEncoder()\nle_level = LabelEncoder()\n\n# Fit and transform labels\nseries_ids_encoded = le_series.fit_transform(series_ids)\nstudy_ids_encoded = le_study.fit_transform(study_ids_labels)\nconditions_encoded = le_condition.fit_transform(conditions)\nlevels_encoded = le_level.fit_transform(levels)\n\n# Convert to categorical\nseries_ids_categorical = to_categorical(series_ids_encoded)\nstudy_ids_categorical = to_categorical(study_ids_encoded)\nconditions_categorical = to_categorical(conditions_encoded)\nlevels_categorical = to_categorical(levels_encoded)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.627299Z","iopub.execute_input":"2024-08-29T11:22:56.627696Z","iopub.status.idle":"2024-08-29T11:22:56.640711Z","shell.execute_reply.started":"2024-08-29T11:22:56.627654Z","shell.execute_reply":"2024-08-29T11:22:56.639474Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Split the data into training and validation sets\nX_train, X_val, y_series_train, y_series_val, y_study_train, y_study_val, y_condition_train, y_condition_val, y_level_train, y_level_val = train_test_split(\n    images, series_ids_categorical, study_ids_categorical, conditions_categorical, levels_categorical, test_size=0.2, random_state=42)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.642460Z","iopub.execute_input":"2024-08-29T11:22:56.643022Z","iopub.status.idle":"2024-08-29T11:22:56.781592Z","shell.execute_reply.started":"2024-08-29T11:22:56.642969Z","shell.execute_reply":"2024-08-29T11:22:56.780445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_series_classes = series_ids_categorical.shape[1]\nnum_study_classes = study_ids_categorical.shape[1]\nnum_condition_classes = conditions_categorical.shape[1]\nnum_level_classes = levels_categorical.shape[1]\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.784822Z","iopub.execute_input":"2024-08-29T11:22:56.785242Z","iopub.status.idle":"2024-08-29T11:22:56.791029Z","shell.execute_reply.started":"2024-08-29T11:22:56.785178Z","shell.execute_reply":"2024-08-29T11:22:56.790004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_resnet_model(input_shape, num_series_classes, num_study_classes, num_condition_classes, num_level_classes):\n    base_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)\n    x = base_model.output\n    x = GlobalAveragePooling2D()(x)\n\n    # Output layers for each classification task\n    series_output = Dense(num_series_classes, activation='softmax', name='series_output')(x)\n    study_output = Dense(num_study_classes, activation='softmax', name='study_output')(x)\n    condition_output = Dense(num_condition_classes, activation='softmax', name='condition_output')(x)\n    level_output = Dense(num_level_classes, activation='softmax', name='level_output')(x)\n\n    # Build the model\n    model = Model(inputs=base_model.input, outputs=[series_output, study_output, condition_output, level_output])\n\n    return model\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.805720Z","iopub.execute_input":"2024-08-29T11:22:56.806238Z","iopub.status.idle":"2024-08-29T11:22:56.815934Z","shell.execute_reply.started":"2024-08-29T11:22:56.806158Z","shell.execute_reply":"2024-08-29T11:22:56.814682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Determine the number of classes for each label\n# num_series_classes = series_ids_categorical.shape[1]\n# num_study_classes = study_ids_categorical.shape[1]\n# num_condition_classes = conditions_categorical.shape[1]\n# num_level_classes = levels_categorical.shape[1]\n\n# # Build the model with the correct input shape and number of classes\n# model = build_resnet_model(input_shape, num_series_classes, num_study_classes, num_condition_classes, num_level_classes)\n\n# # Compile and train the model as before\n# model.compile(\n#     optimizer='adam',\n#     loss=['categorical_crossentropy', 'categorical_crossentropy', 'categorical_crossentropy', 'categorical_crossentropy'],\n#     metrics=['accuracy'] * 4\n# )\n\n# history = model.fit(\n#     X_train_3_channels, \n#     [y_series_train, y_study_train, y_condition_train, y_level_train], \n#     validation_data=(X_val_3_channels, [y_series_val, y_study_val, y_condition_val, y_level_val]), \n#     epochs=10, \n#     batch_size=32\n# )\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T12:19:48.677617Z","iopub.execute_input":"2024-08-29T12:19:48.678068Z","iopub.status.idle":"2024-08-29T12:19:48.684408Z","shell.execute_reply.started":"2024-08-29T12:19:48.678027Z","shell.execute_reply":"2024-08-29T12:19:48.683125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import numpy as np\n\n# # Function to convert grayscale images to 3 channels\n# def convert_to_3_channels(images):\n#     return np.repeat(images, 3, axis=-1)\n\n# # Convert the training and validation datasets\n# X_train_3_channels = convert_to_3_channels(X_train)\n# X_val_3_channels = convert_to_3_channels(X_val)\n\n# # Now your input shape should be (128, 128, 3)\n# input_shape = (128, 128, 3)\n\n# # Rebuild the model with the correct input shape\n# model = build_resnet_model(input_shape, num_series_classes, num_study_classes, num_condition_classes, num_level_classes)\n\n# # Compile the model with a list of metrics for each output\n# model.compile(\n#     optimizer='adam',\n#     loss=['categorical_crossentropy', 'categorical_crossentropy', 'categorical_crossentropy', 'categorical_crossentropy'],\n#     metrics=['accuracy'] * 4  # List of metrics, one for each output\n# )\n\n\n# # Train the model\n# history = model.fit(\n#     X_train_3_channels, \n#     [y_series_train, y_study_train, y_condition_train, y_level_train], \n#     validation_data=(X_val_3_channels, [y_series_val, y_study_val, y_condition_val, y_level_val]), \n#     epochs=10, \n#     batch_size=32\n# )\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.832399Z","iopub.execute_input":"2024-08-29T11:22:56.832805Z","iopub.status.idle":"2024-08-29T11:22:56.842673Z","shell.execute_reply.started":"2024-08-29T11:22:56.832763Z","shell.execute_reply":"2024-08-29T11:22:56.841453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Evaluate the model on the validation set\n# val_loss, val_series_acc, val_study_acc, val_condition_acc, val_level_acc = model.evaluate(\n#     X_val_3_channels, \n#     [y_series_val, y_study_val, y_condition_val, y_level_val]\n# )\n\n# print(f\"Validation Series Accuracy: {val_series_acc}\")\n# print(f\"Validation Study Accuracy: {val_study_acc}\")\n# print(f\"Validation Condition Accuracy: {val_condition_acc}\")\n# print(f\"Validation Level Accuracy: {val_level_acc}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.844298Z","iopub.execute_input":"2024-08-29T11:22:56.845015Z","iopub.status.idle":"2024-08-29T11:22:56.860339Z","shell.execute_reply.started":"2024-08-29T11:22:56.844951Z","shell.execute_reply":"2024-08-29T11:22:56.858961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import matplotlib.pyplot as plt\n\n# # Plot accuracy for each output\n# plt.figure(figsize=(12, 8))\n\n# # Series Accuracy\n# plt.subplot(2, 2, 1)\n# plt.plot(history.history['series_id_accuracy'], label='Train Series Accuracy')\n# plt.plot(history.history['val_series_id_accuracy'], label='Val Series Accuracy')\n# plt.title('Series ID Accuracy')\n# plt.legend()\n\n# # Study Accuracy\n# plt.subplot(2, 2, 2)\n# plt.plot(history.history['study_id_accuracy'], label='Train Study Accuracy')\n# plt.plot(history.history['val_study_id_accuracy'], label='Val Study Accuracy')\n# plt.title('Study ID Accuracy')\n# plt.legend()\n\n# # Condition Accuracy\n# plt.subplot(2, 2, 3)\n# plt.plot(history.history['condition_accuracy'], label='Train Condition Accuracy')\n# plt.plot(history.history['val_condition_accuracy'], label='Val Condition Accuracy')\n# plt.title('Condition Accuracy')\n# plt.legend()\n\n# # Level Accuracy\n# plt.subplot(2, 2, 4)\n# plt.plot(history.history['level_accuracy'], label='Train Level Accuracy')\n# plt.plot(history.history['val_level_accuracy'], label='Val Level Accuracy')\n# plt.title('Level Accuracy')\n# plt.legend()\n\n# plt.tight_layout()\n# plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.864697Z","iopub.execute_input":"2024-08-29T11:22:56.865148Z","iopub.status.idle":"2024-08-29T11:22:56.872588Z","shell.execute_reply.started":"2024-08-29T11:22:56.865101Z","shell.execute_reply":"2024-08-29T11:22:56.871463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"n\n","metadata":{}},{"cell_type":"code","source":"# # Save the entire model\n# model.save('resnet_multi_output_model.h5')\n\n# # Save the label encoders if needed\n# import pickle\n\n# with open('le_series.pkl', 'wb') as f:\n#     pickle.dump(le_series, f)\n# with open('le_study.pkl', 'wb') as f:\n#     pickle.dump(le_study, f)\n# with open('le_condition.pkl', 'wb') as f:\n#     pickle.dump(le_condition, f)\n# with open('le_level.pkl', 'wb') as f:\n#     pickle.dump(le_level, f)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.873999Z","iopub.execute_input":"2024-08-29T11:22:56.874441Z","iopub.status.idle":"2024-08-29T11:22:56.887307Z","shell.execute_reply.started":"2024-08-29T11:22:56.874387Z","shell.execute_reply":"2024-08-29T11:22:56.886133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import os\n# import pickle\n\n# # Define the folder path\n# folder_path = 'model_and_encoders_2024_ResNet'\n\n# # Create the folder if it does not exist\n# os.makedirs(folder_path, exist_ok=True)\n\n# # Save the model\n# model.save(os.path.join(folder_path, 'resnet_multi_output_model.h5'))\n\n# # Save the label encoders\n# with open(os.path.join(folder_path, 'le_series.pkl'), 'wb') as f:\n#     pickle.dump(le_series, f)\n# with open(os.path.join(folder_path, 'le_study.pkl'), 'wb') as f:\n#     pickle.dump(le_study, f)\n# with open(os.path.join(folder_path, 'le_condition.pkl'), 'wb') as f:\n#     pickle.dump(le_condition, f)\n# with open(os.path.join(folder_path, 'le_level.pkl'), 'wb') as f:\n#     pickle.dump(le_level, f)\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.888825Z","iopub.execute_input":"2024-08-29T11:22:56.889205Z","iopub.status.idle":"2024-08-29T11:22:56.898536Z","shell.execute_reply.started":"2024-08-29T11:22:56.889165Z","shell.execute_reply":"2024-08-29T11:22:56.897297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import pydicom\n# import cv2\n# import numpy as np\n# from tensorflow.keras.models import load_model\n# import pickle\n\n# # Path to the DICOM file\n# dcm_file_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images/1002894806/1252873726/1.dcm'\n\n# # Load the DICOM image\n# dcm_data = pydicom.dcmread(dcm_file_path)\n# image = dcm_data.pixel_array\n\n# # Preprocess the image: resize and convert to 3 channels\n# def preprocess_image(image, target_size=(128, 128)):\n#     image_resized = cv2.resize(image, target_size)\n#     image_3_channels = np.repeat(image_resized[:, :, np.newaxis], 3, axis=-1)  # Convert to 3 channels\n#     image_3_channels = image_3_channels.astype('float32') / 255.0  # Normalize to [0, 1]\n#     return np.expand_dims(image_3_channels, axis=0)  # Add batch dimension\n\n# # Preprocess the image\n# input_image = preprocess_image(image)\n\n# # Load the trained model\n# model = load_model('resnet_multi_output_model.h5')\n\n# # Load the label encoders\n# with open('le_series.pkl', 'rb') as f:\n#     le_series = pickle.load(f)\n# with open('le_study.pkl', 'rb') as f:\n#     le_study = pickle.load(f)\n# with open('le_condition.pkl', 'rb') as f:\n#     le_condition = pickle.load(f)\n# with open('le_level.pkl', 'rb') as f:\n#     le_level = pickle.load(f)\n\n# # Predict the output using the model\n# pred_series, pred_study, pred_condition, pred_level = model.predict(input_image)\n\n# # Decode the predictions\n# pred_series_decoded = le_series.inverse_transform(np.argmax(pred_series, axis=1))\n# pred_study_decoded = le_study.inverse_transform(np.argmax(pred_study, axis=1))\n# pred_condition_decoded = le_condition.inverse_transform(np.argmax(pred_condition, axis=1))\n# pred_level_decoded = le_level.inverse_transform(np.argmax(pred_level, axis=1))\n\n# # Print the predictions\n# print(f\"Predicted Series ID: {pred_series_decoded[0]}\")\n# print(f\"Predicted Study ID: {pred_study_decoded[0]}\")\n# print(f\"Predicted Condition: {pred_condition_decoded[0]}\")\n# print(f\"Predicted Level: {pred_level_decoded[0]}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.900190Z","iopub.execute_input":"2024-08-29T11:22:56.900638Z","iopub.status.idle":"2024-08-29T11:22:56.915872Z","shell.execute_reply.started":"2024-08-29T11:22:56.900595Z","shell.execute_reply":"2024-08-29T11:22:56.914666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Training a model using the NASNet architecture**","metadata":{}},{"cell_type":"code","source":"# import tensorflow as tf\n# from tensorflow.keras.applications import NASNetLarge, NASNetMobile\n# from tensorflow.keras.models import Model\n# from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Input\n# from tensorflow.keras.preprocessing.image import ImageDataGenerator\n# from tensorflow.keras.optimizers import Adam\n# import numpy as np\n# import pickle\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.918026Z","iopub.execute_input":"2024-08-29T11:22:56.918438Z","iopub.status.idle":"2024-08-29T11:22:56.930722Z","shell.execute_reply.started":"2024-08-29T11:22:56.918395Z","shell.execute_reply":"2024-08-29T11:22:56.929483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Function to convert grayscale images to 3 channels\n# def convert_to_3_channels(images):\n#     return np.repeat(images, 3, axis=-1)\n\n# # Convert the training and validation datasets\n# X_train_3_channels = convert_to_3_channels(X_train)\n# X_val_3_channels = convert_to_3_channels(X_val)\n\n# # Normalize the images\n# X_train_3_channels = X_train_3_channels.astype('float32') / 255.0\n# X_val_3_channels = X_val_3_channels.astype('float32') / 255.0\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.932100Z","iopub.execute_input":"2024-08-29T11:22:56.932508Z","iopub.status.idle":"2024-08-29T11:22:56.942620Z","shell.execute_reply.started":"2024-08-29T11:22:56.932462Z","shell.execute_reply":"2024-08-29T11:22:56.941485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def build_nasnet_model(input_shape, num_series_classes, num_study_classes, num_condition_classes, num_level_classes):\n#     # Load the NASNet model pre-trained on ImageNet\n#     base_model = NASNetMobile(weights='imagenet', include_top=False, input_shape=input_shape)\n    \n#     # Add global average pooling layer\n#     x = base_model.output\n#     x = GlobalAveragePooling2D()(x)\n    \n#     # Add a fully connected layer with ReLU activation\n#     x = Dense(128, activation='relu')(x)\n    \n#     # Output layers for each prediction\n#     series_output = Dense(num_series_classes, activation='softmax', name='series_id')(x)\n#     study_output = Dense(num_study_classes, activation='softmax', name='study_id')(x)\n#     condition_output = Dense(num_condition_classes, activation='softmax', name='condition')(x)\n#     level_output = Dense(num_level_classes, activation='softmax', name='level')(x)\n    \n#     # Define the model with multiple outputs\n#     model = Model(inputs=base_model.input, outputs=[series_output, study_output, condition_output, level_output])\n    \n#     return model\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.943958Z","iopub.execute_input":"2024-08-29T11:22:56.944352Z","iopub.status.idle":"2024-08-29T11:22:56.954594Z","shell.execute_reply.started":"2024-08-29T11:22:56.944311Z","shell.execute_reply":"2024-08-29T11:22:56.953282Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Define the input shape (must match your data)\n# input_shape = (128, 128, 3)\n\n# # Number of classes for each output\n# num_series_classes = len(le_series.classes_)\n# num_study_classes = len(le_study.classes_)\n# num_condition_classes = len(le_condition.classes_)\n# num_level_classes = len(le_level.classes_)\n\n# # Build the model\n# model = build_nasnet_model(input_shape, num_series_classes, num_study_classes, num_condition_classes, num_level_classes)\n\n# # Compile the model\n# model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy'])\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.956187Z","iopub.execute_input":"2024-08-29T11:22:56.956656Z","iopub.status.idle":"2024-08-29T11:22:56.970296Z","shell.execute_reply.started":"2024-08-29T11:22:56.956612Z","shell.execute_reply":"2024-08-29T11:22:56.968946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Define metrics for each output\n# metrics = {\n#     'series_id': 'accuracy',\n#     'study_id': 'accuracy',\n#     'condition': 'accuracy',\n#     'level': 'accuracy'\n# }\n\n# # Compile the model with metrics for each output\n# model.compile(optimizer=Adam(learning_rate=0.001), \n#               loss='categorical_crossentropy', \n#               metrics=metrics)\n\n# # Train the model\n# history = model.fit(\n#     X_train_3_channels, \n#     [y_series_train, y_study_train, y_condition_train, y_level_train], \n#     validation_data=(X_val_3_channels, [y_series_val, y_study_val, y_condition_val, y_level_val]), \n#     epochs=10, \n#     batch_size=32\n# )\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.972104Z","iopub.execute_input":"2024-08-29T11:22:56.972645Z","iopub.status.idle":"2024-08-29T11:22:56.981916Z","shell.execute_reply.started":"2024-08-29T11:22:56.972519Z","shell.execute_reply":"2024-08-29T11:22:56.980332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Evaluate the model\n# evaluation = model.evaluate(X_val_3_channels, [y_series_val, y_study_val, y_condition_val, y_level_val])\n\n# # Print evaluation results\n# print(f\"Validation Loss: {evaluation[0]}\")\n# print(f\"Validation Accuracy: {evaluation[1]}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.983738Z","iopub.execute_input":"2024-08-29T11:22:56.984240Z","iopub.status.idle":"2024-08-29T11:22:56.997557Z","shell.execute_reply.started":"2024-08-29T11:22:56.984160Z","shell.execute_reply":"2024-08-29T11:22:56.996058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Plot training & validation accuracy values\n# plt.plot(history.history['series_id_accuracy'])\n# plt.plot(history.history['val_series_id_accuracy'])\n# plt.title('Model accuracy for series_id')\n# plt.xlabel('Epoch')\n# plt.ylabel('Accuracy')\n# plt.legend(['Train', 'Validation'], loc='upper left')\n# plt.show()\n\n# plt.plot(history.history['condition_accuracy'])\n# plt.plot(history.history['val_condition_accuracy'])\n# plt.title('Model accuracy for condition')\n# plt.xlabel('Epoch')\n# plt.ylabel('Accuracy')\n# plt.legend(['Train', 'Validation'], loc='upper left')\n# plt.show()\n\n# # Similarly, you can plot for other metrics like study_id_accuracy and level_accuracy\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:56.999490Z","iopub.execute_input":"2024-08-29T11:22:56.999901Z","iopub.status.idle":"2024-08-29T11:22:57.011535Z","shell.execute_reply.started":"2024-08-29T11:22:56.999859Z","shell.execute_reply":"2024-08-29T11:22:57.010018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Define the folder path\n# folder_path = 'model_and_encoders_NasNet'\n\n# # Create the folder if it does not exist\n# os.makedirs(folder_path, exist_ok=True)\n\n# # Save the model\n# model.save(os.path.join(folder_path, 'resnet_multi_output_model.h5'))\n\n\n# # Save the label encoders\n# with open(os.path.join(folder_path, 'le_series.pkl'), 'wb') as f:\n#     pickle.dump(le_series, f)\n# with open(os.path.join(folder_path, 'le_study.pkl'), 'wb') as f:\n#     pickle.dump(le_study, f)\n# with open(os.path.join(folder_path, 'le_condition.pkl'), 'wb') as f:\n#     pickle.dump(le_condition, f)\n# with open(os.path.join(folder_path, 'le_level.pkl'), 'wb') as f:\n#     pickle.dump(le_level, f)","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:57.013353Z","iopub.execute_input":"2024-08-29T11:22:57.013933Z","iopub.status.idle":"2024-08-29T11:22:57.024983Z","shell.execute_reply.started":"2024-08-29T11:22:57.013874Z","shell.execute_reply":"2024-08-29T11:22:57.023052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import shutil\n# import os\n\n# # Define the directory you want to download\n# model_folder = 'model_and_encoders_2024_ResNet'\n\n# # Create a ZIP file of the model folder\n# shutil.make_archive(model_folder, 'zip', model_folder)\n\n# # This will create a file 'model_and_encoders_1.zip' in the current directory\n# from IPython.display import FileLink\n\n# # Create a download link for the ZIP file\n# FileLink(f\"{model_folder}.zip\")\n","metadata":{"execution":{"iopub.status.busy":"2024-08-29T11:22:57.026651Z","iopub.execute_input":"2024-08-29T11:22:57.027152Z","iopub.status.idle":"2024-08-29T11:22:57.041381Z","shell.execute_reply.started":"2024-08-29T11:22:57.027092Z","shell.execute_reply":"2024-08-29T11:22:57.040186Z"},"trusted":true},"execution_count":null,"outputs":[]}]}