{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":"none","dataSources":[{"sourceId":87923,"databundleVersionId":10048004,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport sys\nimport random\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom tqdm import tqdm\nfrom PIL import Image\nfrom dataclasses import dataclass\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.179522Z","iopub.execute_input":"2024-11-17T17:55:55.180894Z","iopub.status.idle":"2024-11-17T17:55:55.188882Z","shell.execute_reply.started":"2024-11-17T17:55:55.180822Z","shell.execute_reply":"2024-11-17T17:55:55.187057Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def seed_everything(seed=42):\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False\n\nseed_everything()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.191782Z","iopub.execute_input":"2024-11-17T17:55:55.192322Z","iopub.status.idle":"2024-11-17T17:55:55.205145Z","shell.execute_reply.started":"2024-11-17T17:55:55.192266Z","shell.execute_reply":"2024-11-17T17:55:55.203838Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"@dataclass\nclass CFG: \n    batch_size : int = 64\n    lr : float = 1e-4\n    epochs : int = 5\n    device : str = 'cuda' if torch.cuda.is_available() else 'cpu'\n    img_size : int = 32\n    base_path = '/kaggle/input/dsm-2024-competition'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.206888Z","iopub.execute_input":"2024-11-17T17:55:55.207315Z","iopub.status.idle":"2024-11-17T17:55:55.216781Z","shell.execute_reply.started":"2024-11-17T17:55:55.207265Z","shell.execute_reply":"2024-11-17T17:55:55.215538Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class Net(nn.Module):\n    def __init__(self):\n        super(Net, self).__init__()\n\n        self.fc1 = nn.Linear(in_features=3 * 32 * 32, out_features=360)\n        self.fc2 = nn.Linear(in_features=360, out_features=120)\n        self.fc3 = nn.Linear(in_features=120, out_features=84)\n        self.fc4 = nn.Linear(in_features=84, out_features=1)\n \n        self.activation = nn.ReLU()\n        self.sigmoid = nn.Sigmoid()\n\n    def forward(self, x):\n        \n        x = x.view(-1, 3 * 32 * 32)\n\n        x = self.activation(self.fc1(x))\n        x = self.activation(self.fc2(x))\n        x = self.activation(self.fc3(x))\n\n        x = self.fc4(x)\n        x = self.sigmoid(x)\n\n        return x\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.219259Z","iopub.execute_input":"2024-11-17T17:55:55.219754Z","iopub.status.idle":"2024-11-17T17:55:55.231127Z","shell.execute_reply.started":"2024-11-17T17:55:55.219689Z","shell.execute_reply":"2024-11-17T17:55:55.229792Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_set = pd.read_csv(f'{CFG.base_path}/train_labeled.csv')\ntest_set = pd.read_csv(f'{CFG.base_path}/test.csv')\n\nprint(train_set['label'].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.234378Z","iopub.execute_input":"2024-11-17T17:55:55.234882Z","iopub.status.idle":"2024-11-17T17:55:55.261881Z","shell.execute_reply.started":"2024-11-17T17:55:55.234838Z","shell.execute_reply":"2024-11-17T17:55:55.260660Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class MyDataset(Dataset):\n    def __init__(self, df, stage, transform=None):\n        self.df = df\n        self.transform = transform\n        self.stage = stage\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx): \n        img_name = self.df.loc[idx, 'ID']\n        image = Image.open(f'{CFG.base_path}/{img_name}')\n        image = self.transform(image)\n\n        if self.stage == 'train':\n            label = self.df.loc[idx, 'label'] \n            return image, label\n        else:  \n            return image\n\ntrain_transform = transforms.Compose([\n    transforms.Resize((CFG.img_size, CFG.img_size)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n\n])\n\n\n\ntest_transform = transforms.Compose([\n    transforms.Resize((CFG.img_size, CFG.img_size)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n])\n\ntrain_dataset = MyDataset(train_set, stage='train', transform=train_transform)\ntest_dataset = MyDataset(test_set, stage='predict', transform=test_transform)\n\ntrain_loader = DataLoader(train_dataset, batch_size=CFG.batch_size, shuffle=True)\ntest_loader = DataLoader(test_dataset, batch_size=CFG.batch_size, shuffle=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.263315Z","iopub.execute_input":"2024-11-17T17:55:55.263730Z","iopub.status.idle":"2024-11-17T17:55:55.278820Z","shell.execute_reply.started":"2024-11-17T17:55:55.263688Z","shell.execute_reply":"2024-11-17T17:55:55.277498Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train(model, optimizer, criterion, train_loader, device):\n    model.train()\n    running_loss = 0.0\n    bar = tqdm(enumerate(train_loader), total=len(train_loader), colour='cyan', file=sys.stdout)\n    for i, (images, labels) in bar:\n        images = images.to(device)\n        labels = labels.to(device)\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels.float().unsqueeze(1))\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item() * images.size(0)\n        bar.set_postfix(loss=f'{running_loss / (i + 1):.4f}')\n\ndef predict(model, test_loader, device):\n    model.eval()\n    predictions = []\n    with torch.no_grad():\n        for images in test_loader:\n            images = images.to(device)\n            outputs = model(images)\n            predictions.extend(outputs.cpu().numpy())\n    predictions = [int(x[0].round()) for x in predictions]\n\n    return predictions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.280649Z","iopub.execute_input":"2024-11-17T17:55:55.281722Z","iopub.status.idle":"2024-11-17T17:55:55.297094Z","shell.execute_reply.started":"2024-11-17T17:55:55.281645Z","shell.execute_reply":"2024-11-17T17:55:55.295388Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Net()\nmodel.to(CFG.device)\ncriterion = nn.BCELoss()\noptimizer = optim.Adam(model.parameters(), lr=CFG.lr)\n\nfor epoch in range(CFG.epochs):\n    train(model, optimizer, criterion, train_loader, CFG.device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:55:55.298876Z","iopub.execute_input":"2024-11-17T17:55:55.300138Z","iopub.status.idle":"2024-11-17T17:56:53.727675Z","shell.execute_reply.started":"2024-11-17T17:55:55.300089Z","shell.execute_reply":"2024-11-17T17:56:53.726522Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predictions = predict(model, test_loader, CFG.device) \ntest_set['label'] = predictions\ntest_set[['ID','label']].to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-17T17:56:53.729440Z","iopub.execute_input":"2024-11-17T17:56:53.729849Z","iopub.status.idle":"2024-11-17T17:57:06.269933Z","shell.execute_reply.started":"2024-11-17T17:56:53.729806Z","shell.execute_reply":"2024-11-17T17:57:06.268555Z"}},"outputs":[],"execution_count":null}]}