{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"pip install transformers torchvision\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nfrom transformers import ViTFeatureExtractor, ViTForImageClassification\nfrom torchvision import transforms\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data import Dataset, DataLoader\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load train data and spectrograms\ntrain_df = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/train.csv')\nspectrograms = pd.read_parquet('/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms.parquet')\n\n# Merge data\ntrain_data = train_df.merge(spectrograms, on='id')\ntrain_data.head()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class EEGSpectrogramDataset(Dataset):\n    def __init__(self, df, feature_extractor, transform=None):\n        self.df = df\n        self.feature_extractor = feature_extractor\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n        label = row['target']  # Assuming binary classification: 0 or 1\n        \n        # Convert spectrogram to image\n        spectrogram = row.iloc[2:].values.reshape(128, -1).astype(np.float32)\n        img = Image.fromarray((spectrogram * 255).astype('uint8'))\n        \n        if self.transform:\n            img = self.transform(img)\n        \n        # Preprocess using ViT feature extractor\n        inputs = self.feature_extractor(images=img, return_tensors=\"pt\")\n        pixel_values = inputs['pixel_values'].squeeze()\n        \n        return pixel_values, torch.tensor(label, dtype=torch.long)\n\n# Initialize feature extractor\nfeature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224-in21k')\n\n# Define transform (resize + normalization)\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n])\n\n# Split into train and validation sets\ntrain_df, val_df = train_test_split(train_data, test_size=0.2, random_state=42)\n\n# Create datasets\ntrain_dataset = EEGSpectrogramDataset(train_df, feature_extractor, transform)\nval_dataset = EEGSpectrogramDataset(val_df, feature_extractor, transform)\n\n# Create data loaders\ntrain_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=16, shuffle=False)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load ViT model for binary classification\nmodel = ViTForImageClassification.from_pretrained(\n    'google/vit-base-patch16-224-in21k', \n    num_labels=2\n)\nmodel = model.to('cuda' if torch.cuda.is_available() else 'cpu')\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train with Mel filter-applied data\ntrain_model(model, train_loader_mel, val_loader_mel, epochs=5)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)\ncriterion = nn.CrossEntropyLoss()\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_model(model, train_loader, val_loader, epochs=5):\n    model.train()\n    for epoch in range(epochs):\n        total_loss = 0\n        correct = 0\n        total = 0\n        \n        for pixel_values, labels in train_loader:\n            pixel_values = pixel_values.to(device)\n            labels = labels.to(device)\n            \n            optimizer.zero_grad()\n            outputs = model(pixel_values)\n            loss = criterion(outputs.logits, labels)\n            loss.backward()\n            optimizer.step()\n            \n            total_loss += loss.item()\n            preds = torch.argmax(outputs.logits, dim=1)\n            correct += (preds == labels).sum().item()\n            total += labels.size(0)\n        \n        train_acc = correct / total\n        val_acc = evaluate_model(model, val_loader)\n        print(f\"Epoch [{epoch+1}/{epochs}] - Loss: {total_loss/len(train_loader):.4f} - Train Acc: {train_acc:.4f} - Val Acc: {val_acc:.4f}\")\n\ndef evaluate_model(model, val_loader):\n    model.eval()\n    correct = 0\n    total = 0\n    \n    with torch.no_grad():\n        for pixel_values, labels in val_loader:\n            pixel_values = pixel_values.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(pixel_values)\n            preds = torch.argmax(outputs.logits, dim=1)\n            correct += (preds == labels).sum().item()\n            total += labels.size(0)\n    \n    return correct / total\n\n# Train the model\ntrain_model(model, train_loader, val_loader, epochs=5)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load test data\ntest_df = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/test.csv')\ntest_spectrograms = pd.read_parquet('/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms.parquet')\ntest_data = test_df.merge(test_spectrograms, on='id')\n\ntest_dataset = EEGSpectrogramDataset(test_data, feature_extractor, transform)\ntest_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)\n\ndef predict(model, test_loader):\n    model.eval()\n    predictions = []\n    \n    with torch.no_grad():\n        for pixel_values, _ in test_loader:\n            pixel_values = pixel_values.to(device)\n            outputs = model(pixel_values)\n            preds = torch.argmax(outputs.logits, dim=1)\n            predictions.extend(preds.cpu().numpy())\n    \n    return predictions\n\n# Generate predictions\npredictions = predict(model, test_loader)\n\n# Create submission file\nsubmission = pd.DataFrame({\n    'id': test_data['id'],\n    'target': predictions\n})\nsubmission.to_csv('submission.csv', index=False)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}