{"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":91844,"databundleVersionId":11361821,"sourceType":"competition"},{"sourceId":328674,"sourceType":"modelInstanceVersion","modelInstanceId":275760,"modelId":296653}],"dockerImageVersionId":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch.nn as nn # Import the neural network module from PyTorch\nimport timm # Import the timm library","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T08:43:57.285003Z","iopub.execute_input":"2025-04-11T08:43:57.285310Z","iopub.status.idle":"2025-04-11T08:44:03.097224Z","shell.execute_reply.started":"2025-04-11T08:43:57.285285Z","shell.execute_reply":"2025-04-11T08:44:03.096545Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class BirdCLEFModel(nn.Module):\n    def __init__(self, cfg, num_classes):\n        super().__init__()\n        self.backbone = timm.create_model(cfg.model_name, pretrained=True, in_chans=cfg.in_channels, num_classes=0)\n        self.lstm = nn.LSTM(self.backbone.num_features, 512, num_layers=1, batch_first=True, bidirectional=True)\n        self.attention = nn.Linear(512 * 2, 1)\n        self.classifier = nn.Linear(512 * 2, num_classes)\n\n    def forward(self, x):\n        features = self.backbone(x)\n        features = features.unsqueeze(1)\n        lstm_out, _ = self.lstm(features)\n        attn_weights = torch.softmax(self.attention(lstm_out), dim=1)\n        context = (lstm_out * attn_weights).sum(dim=1)\n        return self.classifier(context)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T08:44:09.090042Z","iopub.execute_input":"2025-04-11T08:44:09.090343Z","iopub.status.idle":"2025-04-11T08:44:09.095885Z","shell.execute_reply.started":"2025-04-11T08:44:09.090320Z","shell.execute_reply":"2025-04-11T08:44:09.095005Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n# Load the entire model (architecture + weights)\nmodel = torch.load('/kaggle/input/birdclef/pytorch/default/1/full_model.pth', weights_only=False)\n\n# Set the model to evaluation mode\nmodel.eval()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T08:44:14.421505Z","iopub.execute_input":"2025-04-11T08:44:14.421804Z","iopub.status.idle":"2025-04-11T08:44:15.439295Z","shell.execute_reply.started":"2025-04-11T08:44:14.421781Z","shell.execute_reply":"2025-04-11T08:44:15.438446Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport librosa\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn.functional as F\n\n# Set seed\nnp.random.seed(42)\n\n# Load model\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\n\n\n# Class labels from train audio\nclass_labels = sorted(os.listdir('/kaggle/input/birdclef-2025/train_audio/'))\n\n# List of test soundscapes\ntest_soundscape_path = '/kaggle/input/birdclef-2025/test_soundscapes/'\ntest_soundscapes = [os.path.join(test_soundscape_path, afile) \n                    for afile in sorted(os.listdir(test_soundscape_path)) if afile.endswith('.ogg')]\n\n# Prepare predictions DataFrame\npredictions = pd.DataFrame(columns=['row_id'] + class_labels)\n\n# Process each test soundscape\nfor soundscape in test_soundscapes:\n    # Load audio\n    sig, rate = librosa.load(path=soundscape, sr=None)\n\n    # Split into 5-second chunks\n    chunks = []\n    for i in range(0, len(sig), rate * 5):\n        chunk = sig[i:i + rate * 5]\n        if len(chunk) < rate * 5:  # pad if less than 5 sec\n            pad_len = rate * 5 - len(chunk)\n            chunk = np.pad(chunk, (0, pad_len))\n        chunks.append(chunk)\n\n    # Run model inference on each chunk\n    for i, chunk in enumerate(chunks):\n        row_id = os.path.basename(soundscape).split('.')[0] + f'_{i * 5 + 5}'\n\n        # Convert chunk to tensor\n        chunk_tensor = torch.tensor(chunk, dtype=torch.float32).unsqueeze(0).unsqueeze(0).to(device)  # shape: [1, 1, samples]\n\n        with torch.no_grad():\n            output = model(chunk_tensor)  # output shape: [1, num_classes]\n            probs = F.sigmoid(output).cpu().numpy().flatten()  # sigmoid if multi-label\n\n        # Add prediction to dataframe\n        new_row = pd.DataFrame([[row_id] + list(probs)], columns=['row_id'] + class_labels)\n        predictions = pd.concat([predictions, new_row], axis=0, ignore_index=True)\n\n# Save submission\npredictions.to_csv('submission.csv', index=False)\npredictions.head()  ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-11T09:14:34.704807Z","iopub.execute_input":"2025-04-11T09:14:34.705179Z","iopub.status.idle":"2025-04-11T09:14:36.577662Z","shell.execute_reply.started":"2025-04-11T09:14:34.705148Z","shell.execute_reply":"2025-04-11T09:14:36.576830Z"}},"outputs":[],"execution_count":null}]}