{"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":"gpu","dataSources":[{"sourceId":85517,"databundleVersionId":9677541,"sourceType":"competition"},{"sourceId":182657,"sourceType":"modelInstanceVersion","modelInstanceId":155684,"modelId":178145}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nimport pickle\nimport time\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport numpy as np\nimport pandas as pd\n\nclass ImageClassificationBase(nn.Module):\n    def training_step(self, batch):\n        images, labels = batch \n        out = self(images)\n        loss = F.cross_entropy(out, labels)\n        return loss\n    \n    def validation_step(self, batch):\n        images, labels = batch \n        out = self(images)\n        loss = F.cross_entropy(out, labels)\n        acc = accuracy(out, labels)\n        return {'val_loss': loss.detach(), 'val_acc': acc}\n        \n    def validation_epoch_end(self, outputs):\n        batch_losses = [x['val_loss'] for x in outputs]\n        epoch_loss = torch.stack(batch_losses).mean()\n        batch_accs = [x['val_acc'] for x in outputs]\n        epoch_acc = torch.stack(batch_accs).mean()\n        return {'val_loss': epoch_loss.item(), 'val_acc': epoch_acc.item()}\n    \n    def epoch_end(self, epoch, result):\n        print(f\"Epoch [{epoch}], last_lr: {result['lrs'][-1]:.5f}, train_loss: {result['train_loss']:.4f}, val_loss: {result['val_loss']:.4f}, val_acc: {result['val_acc']:.4f}\")\n\ndef conv_block(in_channels, out_channels, pool=False):\n    layers = [nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), \n              nn.BatchNorm2d(out_channels), \n              nn.ReLU(inplace=True)]\n    if pool: layers.append(nn.MaxPool2d(2))\n    return nn.Sequential(*layers)\n\nclass ResNet9(ImageClassificationBase):\n    def __init__(self, in_channels, num_classes):\n        super().__init__()\n        \n        self.conv1 = conv_block(in_channels, 64)\n        self.conv2 = conv_block(64, 128, pool=True)\n        self.res1 = nn.Sequential(conv_block(128, 128), conv_block(128, 128))\n        \n        self.conv3 = conv_block(128, 256, pool=True)\n        self.conv4 = conv_block(256, 512, pool=True)\n        self.res2 = nn.Sequential(conv_block(512, 512), conv_block(512, 512))\n        self.conv5 = conv_block(512, 1028, pool=True)\n        self.res3 = nn.Sequential(conv_block(1028, 1028), conv_block(1028, 1028))\n        \n        self.classifier = nn.Sequential(nn.MaxPool2d(2),\n                                        nn.Flatten(),\n                                        nn.Linear(1028, num_classes))\n        \n    def forward(self, xb):\n        out = self.conv1(xb)\n        out = self.conv2(out)\n        out = self.res1(out) + out\n        out = self.conv3(out)\n        out = self.conv4(out)\n        out = self.res2(out) + out\n        out = self.conv5(out)\n        out = self.res3(out) + out\n        out = self.classifier(out)\n        return out\n\ndef get_default_device():\n    return torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\ndef to_device(data, device):\n    if isinstance(data, (list,tuple)):\n        return [to_device(x, device) for x in data]\n    return data.to(device, non_blocking=True)\n\nclass DeviceDataLoader():\n    def __init__(self, dl, device):\n        self.dl = dl\n        self.device = device\n        \n    def __iter__(self):\n        for b in self.dl: \n            yield to_device(b, self.device)\n\n    def __len__(self):\n        return len(self.dl)\n\nmodel_path = '/kaggle/input/resnet9/pytorch/default/1/model.pth'\ntest_file = '/kaggle/input/col-774-a-3/test.pkl'\nalpha = 0.7\ngamma = 5\n\ndevice = get_default_device()\n\n# Load the model\nmodel = ResNet9(3, 100)\nmodel.load_state_dict(torch.load(model_path, map_location=device))\nmodel = to_device(model, device)\nmodel.eval()\n\n# Load test data\nwith open(test_file, 'rb') as f:\n    test_data = pickle.load(f)\n\n# Create test loader\nbatch_size = 400\ntest_loader = torch.utils.data.DataLoader(\n    test_data, batch_size*2, pin_memory=True, num_workers=2)\ntest_loader = DeviceDataLoader(test_loader, device)\n\n# Prediction\nstart_time = time.time()\ntest_predictions = []\ntest_probabilities = []\n\nwith torch.no_grad():\n    for images, *_ in test_loader:\n        outputs = model(images)\n        probabilities = F.softmax(outputs, dim=1)\n        _, predicted = outputs.max(1)\n        test_predictions.append(predicted.cpu().numpy())\n        test_probabilities.append(probabilities.cpu().numpy())\n\n# Convert lists to numpy arrays\ntest_predictions = np.concatenate(test_predictions)\ntest_probabilities = np.concatenate(test_probabilities)\n\n# Apply confidence threshold\nconf = np.max(test_probabilities, axis=1)\nfinal_predictions = np.where(conf > 0.934, test_predictions, -1)\n\n# Create DataFrame and save to CSV\ndf = pd.DataFrame({\n    \"ID\": np.arange(len(final_predictions)),\n    \"Predicted_label\": final_predictions\n})\ndf.to_csv(\"submission.csv\", index=False)\n\nend_time = time.time()\ninference_time = end_time - start_time\nprint(f\"Inference completed in {inference_time:.2f} seconds\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-29T13:19:35.683890Z","iopub.execute_input":"2024-11-29T13:19:35.684581Z","iopub.status.idle":"2024-11-29T13:19:42.708134Z","shell.execute_reply.started":"2024-11-29T13:19:35.684546Z","shell.execute_reply":"2024-11-29T13:19:42.706815Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}