{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"},{"sourceId":5203358,"sourceType":"datasetVersion","datasetId":3026132},{"sourceId":160111249,"sourceType":"kernelVersion"}],"dockerImageVersionId":30636,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Acknowledgment\nThis notebook uses some part of Inference code created by [MUHAMMAD AHMED](https://www.kaggle.com/muhammad4hmed) and their notebook **[HMS] Inference - ViT on Spectrograms**. I would like to express my gratitude for their valuable contribution to the Kaggle community.\n\nLink to the original notebook: [Original Notebook Link](https://www.kaggle.com/code/muhammad4hmed/hms-inference-vit-on-spectrograms)","metadata":{}},{"cell_type":"markdown","source":"# Experiments Details\n* Model: ViT, Epoch: 1, BS: 32 , CV:1.607 , LB: 0.96\n* Model: ViT, Epoch: 15, BS: 32 , CV: 1.3912, LB: \n\n[Training Notebook](https://www.kaggle.com/dky7376/gpu-train-hms-vit-pipeline)","metadata":{}},{"cell_type":"markdown","source":"# Inference","metadata":{}},{"cell_type":"code","source":"%%writefile inference.py\n\nimport os\nimport argparse\nimport pandas as pd\nimport numpy as np\nfrom PIL import Image\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.optim.lr_scheduler import StepLR\nfrom tqdm import tqdm\nfrom transformers import ViTModel\nimport matplotlib as cm\nfrom torch.nn.functional import softmax, one_hot\ncmap = cm.colormaps[\"viridis\"]\n\n# Define constants\nnum_classes = 6\nbatch_size = 32\n\n# Define dataset class\nclass SpectrogramDataset(Dataset):\n    def __init__(self, data, transform=None):\n        self.data = data\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        specto_id = self.data.loc[idx, 'spectrogram_id']\n        specto_path = f'/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms/{specto_id}.parquet'\n        specto = pd.read_parquet(specto_path)\n        spectrogram = Image.fromarray((cmap(specto) * 255).astype(np.uint8))\n        if self.transform:\n            spectrogram = self.transform(spectrogram)[:3, :, :]\n        return spectrogram\n\n# Define transforms\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),  # Resize to 224x224\n    transforms.ToTensor(),  # Convert to PyTorch tensor\n])\n\n# Define model class\nclass ViTClassifier(torch.nn.Module):\n    def __init__(self, num_classes=1000):\n        super().__init__()\n        self.vit = ViTModel.from_pretrained(\"/kaggle/input/google-vit-base-patch16-224-in21k\")\n        self.classifier = torch.nn.Linear(self.vit.config.hidden_size, num_classes)\n\n    def forward(self, images):\n        output = self.vit(images)\n        output = self.classifier(output.last_hidden_state[:, 0]) \n        output = softmax(output, dim = 1)\n        return output\n\n# Inference function\ndef inference(model, test_loader, device):\n    model.eval()\n    out = []\n    with torch.no_grad():\n        for spectrograms in tqdm(test_loader, desc=\"Inference\"):\n            spectrograms = spectrograms.to(device)\n            outputs = model(spectrograms)\n            outputs = outputs.detach().cpu().numpy()\n            out.append(outputs)\n    outputs = np.vstack(out)\n    return outputs\n    \n\n# Define main function for training\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--test_path\", type=str)\n    parser.add_argument(\"--trained_model\", type=str)\n    args = parser.parse_args()\n    \n    # Load the dataset\n    test_data = pd.read_csv(args.test_path)\n\n    # Check if GPU is available\n    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n    print(f\"Using device: {device}\")\n    \n    dataset = SpectrogramDataset(test_data, transform=transform)\n\n    # Create data loaders\n    test_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)\n\n    # Load the trained model\n    model = ViTClassifier(num_classes).to(device)\n    model.load_state_dict(torch.load(args.trained_model))\n\n    outputs = inference(model, test_loader, device)\n    submission = test_data[['eeg_id']]\n    submission['seizure_vote'] = outputs[:, 0]\n    submission['lpd_vote'] = outputs[:, 5]\n    submission['gpd_vote'] = outputs[:, 1]\n    submission['lrda_vote'] = outputs[:, 2]\n    submission['grda_vote'] = outputs[:, 4]\n    submission['other_vote'] = outputs[:, 3]\n    submission.to_csv('submission.csv', index = False)\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"execution":{"iopub.status.busy":"2024-01-25T05:33:57.323002Z","iopub.execute_input":"2024-01-25T05:33:57.323423Z","iopub.status.idle":"2024-01-25T05:33:57.339605Z","shell.execute_reply.started":"2024-01-25T05:33:57.323390Z","shell.execute_reply":"2024-01-25T05:33:57.338505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TEST_PATH = \"/kaggle/input/hms-harmful-brain-activity-classification/test.csv\"\nTRAINED_MODEL = '/kaggle/input/gpu-train-hms-vit-pipeline/trained_hms_vit_model_v4.pt'","metadata":{"execution":{"iopub.status.busy":"2024-01-25T05:33:57.341356Z","iopub.execute_input":"2024-01-25T05:33:57.341699Z","iopub.status.idle":"2024-01-25T05:33:57.353912Z","shell.execute_reply.started":"2024-01-25T05:33:57.341669Z","shell.execute_reply":"2024-01-25T05:33:57.352828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# utilize both t4 gpus\n!accelerate launch --num_processes 2  inference.py \\\n  --test_path $TEST_PATH \\\n  --trained_model $TRAINED_MODEL","metadata":{"execution":{"iopub.status.busy":"2024-01-25T05:33:57.356098Z","iopub.execute_input":"2024-01-25T05:33:57.356509Z","iopub.status.idle":"2024-01-25T05:34:21.922816Z","shell.execute_reply.started":"2024-01-25T05:33:57.356469Z","shell.execute_reply":"2024-01-25T05:34:21.921571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\nsub = pd.read_csv(\"/kaggle/working/submission.csv\")\ndisplay(sub.head())","metadata":{"execution":{"iopub.status.busy":"2024-01-25T05:34:21.924491Z","iopub.execute_input":"2024-01-25T05:34:21.924951Z","iopub.status.idle":"2024-01-25T05:34:22.408296Z","shell.execute_reply.started":"2024-01-25T05:34:21.924910Z","shell.execute_reply":"2024-01-25T05:34:22.406985Z"},"trusted":true},"execution_count":null,"outputs":[]}]}