{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"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":"none","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"},{"sourceId":18721,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":15212}],"dockerImageVersionId":30664,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Importing essential libraries\nimport gc\nimport os\nimport random\nimport warnings\nimport numpy as np\nimport pandas as pd\nfrom IPython.display import display\n\n# PyTorch for deep learning\nimport timm\nimport torch\nimport torch.nn as nn  \nimport torch.optim as optim\nimport torch.nn.functional as F\n\n# torchvision for image processing and augmentation\nimport torchvision.transforms as transforms\n\n# Suppressing minor warnings to keep the output clean\nwarnings.filterwarnings('ignore', category=Warning)\n\n# Reclaim memory no longer in use.\ngc.collect()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-20T04:35:35.104357Z","iopub.execute_input":"2024-03-20T04:35:35.105024Z","iopub.status.idle":"2024-03-20T04:35:46.020054Z","shell.execute_reply.started":"2024-03-20T04:35:35.104966Z","shell.execute_reply":"2024-03-20T04:35:46.019164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Config:\n    seed=42\n    image_transform=transforms.Resize((512, 512))\n    \n# Set the seed for reproducibility across multiple libraries\ndef set_seed(seed):\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = True\n    torch.manual_seed(seed)\n    np.random.seed(seed)\n    random.seed(seed)\n    \nset_seed(Config.seed)","metadata":{"execution":{"iopub.status.busy":"2024-03-20T04:35:46.021638Z","iopub.execute_input":"2024-03-20T04:35:46.022121Z","iopub.status.idle":"2024-03-20T04:35:46.032880Z","shell.execute_reply.started":"2024-03-20T04:35:46.022092Z","shell.execute_reply":"2024-03-20T04:35:46.031567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load ResNet34d\n# model_resnet = timm.create_model('resnet50.a1_in1k', pretrained=False, num_classes=6, in_chans=1)\nmodel_resnet = timm.create_model('resnet101.a1_in1k', pretrained=False, num_classes=6, in_chans=1)\nmodel_resnet = torch.nn.DataParallel(model_resnet)\n# Load the trained weights from the corresponding file\nmodel_resnet.load_state_dict(torch.load('/kaggle/input/resnet-101a-hms/pytorch/resnet101_epoch10/2/resnet101d.pth', map_location=torch.device('cpu')))\n# Reclaim memory no longer in use.\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T04:41:36.058278Z","iopub.execute_input":"2024-03-20T04:41:36.058763Z","iopub.status.idle":"2024-03-20T04:41:36.939310Z","shell.execute_reply.started":"2024-03-20T04:41:36.058723Z","shell.execute_reply":"2024-03-20T04:41:36.938435Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load test data and sample submission dataframe\ntest_df = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/test.csv\")\nsubmission = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/sample_submission.csv\")\n\n# Merge the submission dataframe with the test data on EEG IDs\nsubmission = submission.merge(test_df, on='eeg_id', how='left')\n\n# Generate file paths for each spectrogram based on the EEG data in the submission dataframe\nsubmission['path'] = submission['spectrogram_id'].apply(lambda x: f\"/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms/{x}.parquet\")\n\n# Display the first few rows of the submission dataframe\ndisplay(submission.head())\n\n# Reclaim memory no longer in use\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T04:41:39.361105Z","iopub.execute_input":"2024-03-20T04:41:39.361594Z","iopub.status.idle":"2024-03-20T04:41:39.729198Z","shell.execute_reply.started":"2024-03-20T04:41:39.361548Z","shell.execute_reply":"2024-03-20T04:41:39.728277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get file paths for test spectrograms\npaths = submission['path'].values\ntest_preds = []\n\n# Generate predictions for each spectrogram using all models\nfor path in paths:\n    eps = 1e-6\n    # Read and preprocess spectrogram data\n    data = pd.read_parquet(path)\n    data = data.fillna(-1).values[:, 1:].T\n    data = np.clip(data, np.exp(-6), np.exp(10))\n    data = np.log(data)\n    \n    # Normalize the data\n    data_mean = data.mean(axis=(0, 1))\n    data_std = data.std(axis=(0, 1))\n    data = (data - data_mean) / (data_std + eps)\n    data_tensor = torch.unsqueeze(torch.Tensor(data), dim=0)\n    data = Config.image_transform(data_tensor)\n    \n    # Generate predictions using model\n    model_resnet.eval()\n    with torch.no_grad():\n        pred = F.softmax(model_resnet(data.unsqueeze(0)))[0]\n        pred = pred.detach().cpu().numpy()\n    test_preds.append(pred)\n\n# Convert the list of predictions to a NumPy array for further processing\ntest_preds = np.array(test_preds)\n\n# Reclaim memory no longer in use\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T04:41:42.717843Z","iopub.execute_input":"2024-03-20T04:41:42.718321Z","iopub.status.idle":"2024-03-20T04:41:43.812329Z","shell.execute_reply.started":"2024-03-20T04:41:42.718288Z","shell.execute_reply":"2024-03-20T04:41:43.811321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the sample submission file and update it with model predictions for each label\nsubmission = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/sample_submission.csv\")\nlabels = ['seizure', 'lpd', 'gpd', 'lrda', 'grda', 'other']\n\n# Assign model predictions to respective columns in the submission DataFrame\nfor i in range(len(labels)):\n    submission[f'{labels[i]}_vote'] = test_preds[:, i]\n\n# Save the updated DataFrame as the final submission file\nsubmission.to_csv(\"submission.csv\", index=None)\n\n# Display the first few rows of the submission file\ndisplay(submission.head())\n\n# Reclaim memory no longer in use.\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-03-20T04:41:46.529883Z","iopub.execute_input":"2024-03-20T04:41:46.530344Z","iopub.status.idle":"2024-03-20T04:41:46.878507Z","shell.execute_reply.started":"2024-03-20T04:41:46.530309Z","shell.execute_reply":"2024-03-20T04:41:46.877056Z"},"trusted":true},"execution_count":null,"outputs":[]}]}