{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"},{"sourceId":7089311,"sourceType":"datasetVersion","datasetId":4084981}],"dockerImageVersionId":30588,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport random\nimport glob\nimport tempfile\nimport cv2\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nfrom sklearn.preprocessing import LabelEncoder\nimport torch\nfrom torch import nn, optim, Tensor\nfrom torch.optim.lr_scheduler import CosineAnnealingLR\nfrom torchinfo import summary\nimport timm\nimport torchvision\nfrom torchvision import transforms, datasets, models\nimport torch.utils.data as Data\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader, random_split\nfrom matplotlib import pyplot as plt\nimport numpy as np\nfrom tqdm import tqdm\n#import Ranger","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:12:19.39855Z","iopub.execute_input":"2023-12-02T15:12:19.398894Z","iopub.status.idle":"2023-12-02T15:12:29.491962Z","shell.execute_reply.started":"2023-12-02T15:12:19.398867Z","shell.execute_reply":"2023-12-02T15:12:29.491001Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(r\"/kaggle/input/UBC-OCEAN/train.csv\")\ntest = pd.read_csv(r\"/kaggle/input/UBC-OCEAN/test.csv\")\ntrain_tma = train[train[\"is_tma\"] == True]\ntrain_no_tma = train[train[\"is_tma\"] == False]","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:21.490285Z","iopub.execute_input":"2023-12-02T15:15:21.491159Z","iopub.status.idle":"2023-12-02T15:15:21.541076Z","shell.execute_reply.started":"2023-12-02T15:15:21.491122Z","shell.execute_reply":"2023-12-02T15:15:21.540112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_tma['img_id_ext']=[str(i)+\".png\" for i in train_tma['image_id']]\ntrain_no_tma['img_id_ext']=[str(i)+\"_thumbnail.png\" for i in train_no_tma['image_id']]\ntest['img_id_ext']=[str(i)+\"_thumbnail.png\" for i in test['image_id']]","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:22.30183Z","iopub.execute_input":"2023-12-02T15:15:22.302787Z","iopub.status.idle":"2023-12-02T15:15:22.311148Z","shell.execute_reply.started":"2023-12-02T15:15:22.302743Z","shell.execute_reply":"2023-12-02T15:15:22.310116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.concat([train_tma, train_no_tma])\ntrain_df.sort_index(ascending = True, inplace = True)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:23.103941Z","iopub.execute_input":"2023-12-02T15:15:23.104348Z","iopub.status.idle":"2023-12-02T15:15:23.130999Z","shell.execute_reply.started":"2023-12-02T15:15:23.104314Z","shell.execute_reply":"2023-12-02T15:15:23.130008Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le = LabelEncoder()\nimage_label = train_df['label']\nle.fit(image_label)\ntrain_df['label'] = le.transform(image_label)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:24.792885Z","iopub.execute_input":"2023-12-02T15:15:24.793237Z","iopub.status.idle":"2023-12-02T15:15:24.808376Z","shell.execute_reply.started":"2023-12-02T15:15:24.793208Z","shell.execute_reply":"2023-12-02T15:15:24.80729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:29.966819Z","iopub.execute_input":"2023-12-02T15:15:29.967552Z","iopub.status.idle":"2023-12-02T15:15:29.976258Z","shell.execute_reply.started":"2023-12-02T15:15:29.967522Z","shell.execute_reply":"2023-12-02T15:15:29.97533Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.iloc[0, 0]","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:31.319014Z","iopub.execute_input":"2023-12-02T15:15:31.319787Z","iopub.status.idle":"2023-12-02T15:15:31.325793Z","shell.execute_reply.started":"2023-12-02T15:15:31.319751Z","shell.execute_reply":"2023-12-02T15:15:31.324919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nclass TrainDataset(Dataset):\n    def __init__(self, df, root_path, train_thumbnails, train_images, transform=None):\n        self.df = df\n        self.root_path = root_path\n        self.train_thumbnails = train_thumbnails\n        self.train_images = train_images\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        img_name = self.df.iloc[idx, -1]\n    \n        if \"thumbnail\" in img_name:\n            img_path = os.path.join(root_path + train_thumbnails, img_name)\n        else:\n            img_path = os.path.join(root_path + train_images, img_name)\n\n#         if 'thumbnail' in img_name:\n#             img_path = os.path.join('/kaggle/input/UBC-OCEAN/train_thumbnails/', img_name)\n#         else:\n#             img_path = os.path.join('/kaggle/input/UBC-OCEAN/train_images/', img_name)\n#         img_name = os.path.join(self.root_dir, self.df.iloc[idx, -1])\n        img = Image.open(img_path).convert('RGB')\n\n\n        if self.transform:\n            img = self.transform(img)\n\n        label = self.df.iloc[idx, 1]\n        label = torch.tensor(label)\n        return img, label\n    \n\nnorm_mean = [0.485, 0.456, 0.406]\nnorm_std = [0.229, 0.224, 0.225]\n\ntrain_transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    #transforms.RandomCrop(224, padding=4),\n    transforms.ToTensor(),\n    transforms.Normalize(norm_mean, norm_std),\n])\n\nvalid_transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize(norm_mean, norm_std),\n])\n\nroot_path = \"/kaggle/input/UBC-OCEAN/\"\ntrain_thumbnails = \"train_thumbnails/\"\ntrain_images = \"train_images/\"\ntest_thumbnails = \"test_thumbnails/\"\ntest_images = \"test_images/\"\n\ndataset = TrainDataset(df=train_df, root_path = root_path, train_thumbnails = train_thumbnails, train_images = train_images, transform=train_transform)\n\ntrain_ratio = 0.8\nvalid_ratio = 0.2\n\ntrain_size = int(train_ratio * len(train_df))\nvalid_size = len(train_df) - train_size\n\ndataset_train, dataset_valid = random_split(dataset, [train_size, valid_size])\n\ntrain_dataloader = DataLoader(dataset_train, batch_size = 64, shuffle = True)\nvalid_dataloader = DataLoader(dataset_valid, batch_size = 64, shuffle = True)\n\ndataiter = iter(train_dataloader)\nimages = next(dataiter)\nimages[0].shape","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:31.904705Z","iopub.execute_input":"2023-12-02T15:15:31.905069Z","iopub.status.idle":"2023-12-02T15:15:50.446573Z","shell.execute_reply.started":"2023-12-02T15:15:31.90504Z","shell.execute_reply":"2023-12-02T15:15:50.445621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_pic(dataloader):\n    examples = enumerate(dataloader)  \n    batch_idx, (example_data, example_targets) = next(examples)\n    classes = ('HGSC', 'LGSC', 'EC', 'CC', 'MC')\n    fig = plt.figure()\n    for i in range(5):\n        plt.subplot(2, 3, i + 1)\n        # plt.tight_layout()\n        img = example_data[i]\n        print('pic shape:',img.shape)\n        img = img.swapaxes(0, 1)\n        img = img.swapaxes(1, 2)\n        plt.imshow(img, interpolation='none')\n        plt.title(classes[example_targets[i].item()])\n        plt.xticks([])\n        plt.yticks([])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:50.448608Z","iopub.execute_input":"2023-12-02T15:15:50.449002Z","iopub.status.idle":"2023-12-02T15:15:50.457762Z","shell.execute_reply.started":"2023-12-02T15:15:50.448969Z","shell.execute_reply":"2023-12-02T15:15:50.456868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\ndef build_model(num_classes, model_type = \"resnet18\", freeze_convnets = False, single_layer = True, hidden_units = 32):\n    #Load pre-trained model\n    if model_type == \"resnet18\":\n        model = models.resnet18(pretrained = True)\n    elif model_type ==\"resnet50\":\n        #model = torch.load(\"/kaggle/input/resnet50/resnet50-0676ba61.pth\")\n        model = models.resnet50(pretrained = True)\n    elif model_type ==\"resnet101\":\n        model = models.resnet101(pretrained = True)\n    elif model_type ==\"resnet152\":\n        model = models.resnet152(pretrained = True)\n    else:\n        model = models.resnet18(pretrained = True)\n    \n    #Freeze the convnets\n    if freeze_convnets:\n        for param in model.parameters():\n            param.requires_gradd = False\n    \n    #Get the output dimension from the Conv block\n    num_ftrs = model.fc.in_features\n    \n    #Parameters of newly constructed modules have requires_grad = True by default\n    #Here the size of each output sample is set to num_classes\n    if single_layer:\n        model.fc = nn.Linear(num_ftrs, num_classes)\n    else:\n        model.fc = nn.Sequential(\n                    nn.Linear(num_ftrs, hidden_units),\n                    nn.ReLU(),\n                    nn.Linear(hidden_units, num_classees)\n        \n                )\n    return model\n'''","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:50.458908Z","iopub.execute_input":"2023-12-02T15:15:50.45919Z","iopub.status.idle":"2023-12-02T15:15:50.479196Z","shell.execute_reply.started":"2023-12-02T15:15:50.459155Z","shell.execute_reply":"2023-12-02T15:15:50.478268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ResidualBlock(nn.Module):\n    def __init__(self, in_channels, out_channels, stride = 1, downsample = None):\n        super(ResidualBlock, self).__init__()\n        self.conv1 = nn.Sequential(\n                        nn.Conv2d(in_channels, out_channels, kernel_size = 3, stride = stride, padding = 1),\n                        nn.BatchNorm2d(out_channels),\n                        nn.ReLU())\n        self.conv2 = nn.Sequential(\n                        nn.Conv2d(out_channels, out_channels, kernel_size = 3, stride = 1, padding = 1),\n                        nn.BatchNorm2d(out_channels))\n        self.downsample = downsample\n        self.relu = nn.ReLU()\n        self.out_channels = out_channels\n        \n    def forward(self, x):\n        residual = x\n        out = self.conv1(x)\n        out = self.conv2(out)\n        if self.downsample:\n            residual = self.downsample(x)\n        out += residual\n        out = self.relu(out)\n        return out","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:50.481734Z","iopub.execute_input":"2023-12-02T15:15:50.482063Z","iopub.status.idle":"2023-12-02T15:15:50.492278Z","shell.execute_reply.started":"2023-12-02T15:15:50.482031Z","shell.execute_reply":"2023-12-02T15:15:50.49143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ResNet(nn.Module):\n    def __init__(self, block, layers, num_classes = 5):\n        super(ResNet, self).__init__()\n        self.inplanes = 64\n        self.conv1 = nn.Sequential(\n                        nn.Conv2d(3, 64, kernel_size = 7, stride = 2, padding = 3),\n                        nn.BatchNorm2d(64),\n                        nn.ReLU())\n        self.maxpool = nn.MaxPool2d(kernel_size = 3, stride = 2, padding = 1)\n        self.layer0 = self._make_layer(block, 64, layers[0], stride = 1)\n        self.layer1 = self._make_layer(block, 128, layers[1], stride = 2)\n        self.layer2 = self._make_layer(block, 256, layers[2], stride = 2)\n        self.layer3 = self._make_layer(block, 512, layers[3], stride = 2)\n        self.avgpool = nn.AvgPool2d(7, stride=1)\n        self.fc = nn.Linear(512, num_classes)\n        \n    def _make_layer(self, block, planes, blocks, stride=1):\n        downsample = None\n        if stride != 1 or self.inplanes != planes:\n            \n            downsample = nn.Sequential(\n                nn.Conv2d(self.inplanes, planes, kernel_size=1, stride=stride),\n                nn.BatchNorm2d(planes),\n            )\n        layers = []\n        layers.append(block(self.inplanes, planes, stride, downsample))\n        self.inplanes = planes\n        for i in range(1, blocks):\n            layers.append(block(self.inplanes, planes))\n\n        return nn.Sequential(*layers)\n    \n    \n    def forward(self, x):\n        x = self.conv1(x)\n        x = self.maxpool(x)\n        x = self.layer0(x)\n        x = self.layer1(x)\n        x = self.layer2(x)\n        x = self.layer3(x)\n\n        x = self.avgpool(x)\n        x = x.view(x.size(0), -1)\n        x = self.fc(x)\n\n        return x\n","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:15:50.493621Z","iopub.execute_input":"2023-12-02T15:15:50.493973Z","iopub.status.idle":"2023-12-02T15:15:50.511342Z","shell.execute_reply.started":"2023-12-02T15:15:50.493941Z","shell.execute_reply":"2023-12-02T15:15:50.510461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(net, loss, train_dataloader, valid_dataloader, device, batch_size, num_epoch, lr, lr_min, optim='sgd', init=True, scheduler_type='Cosine'):\n    def init_xavier(m): \n        #if type(m) == nn.Linear or type(m) == nn.Conv2d:\n        if type(m) == nn.Linear:\n            nn.init.xavier_normal_(m.weight)\n\n    if init:\n        net.apply(init_xavier)\n\n    print('training on:', device)\n    net.to(device)\n    \n    if optim == 'sgd': \n        optimizer = torch.optim.SGD((param for param in net.parameters() if param.requires_grad), lr=lr,\n                                    weight_decay=0)\n    elif optim == 'adam':\n        optimizer = torch.optim.Adam((param for param in net.parameters() if param.requires_grad), lr=lr,\n                                     weight_decay=0)\n    elif optim == 'adamW':\n        optimizer = torch.optim.AdamW((param for param in net.parameters() if param.requires_grad), lr=lr,\n                                      weight_decay=0)\n    elif optim == 'ranger':\n        optimizer = Ranger((param for param in net.parameters() if param.requires_grad), lr=lr,\n                           weight_decay=0)\n    if scheduler_type == 'Cosine':\n        scheduler = CosineAnnealingLR(optimizer, T_max=num_epoch, eta_min=lr_min)\n    \n    train_losses = []\n    train_acces = []\n    eval_acces = []\n    best_acc = 0.0\n    #Train\n    for epoch in range(num_epoch):\n\n        print(\"——————Start of training round {}——————\".format(epoch + 1))\n\n        \n        net.train()\n        train_acc = 0\n        for batch in tqdm(train_dataloader, desc='Train'):\n            imgs, targets = batch\n            imgs = imgs.to(device)\n            #targets = torch.cat(targets, dim = 0)\n            targets = targets.to(device)\n            output = net(imgs)\n\n            Loss = loss(output, targets)\n          \n            optimizer.zero_grad()\n            Loss.backward()\n            optimizer.step()\n\n            _, pred = output.max(1)\n            num_correct = (pred == targets).sum().item()\n            acc = num_correct / (batch_size)\n            train_acc += acc\n        scheduler.step()\n        print(\"epoch: {}, Loss: {}, Acc: {}\".format(epoch, Loss.item(), train_acc / len(train_dataloader)))\n        train_acces.append(train_acc / len(train_dataloader))\n        train_losses.append(Loss.item())\n\n        \n        net.eval()\n        eval_loss = 0\n        eval_acc = 0\n        with torch.no_grad():\n            for imgs, targets in valid_dataloader:\n                imgs = imgs.to(device)\n                #targets = torch.cat(targets, dim = 0)\n                targets = targets.to(device)\n                output = net(imgs)\n                Loss = loss(output, targets)\n                _, pred = output.max(1)\n                num_correct = (pred == targets).sum().item()\n                eval_loss += Loss\n                acc = num_correct / imgs.shape[0]\n                eval_acc += acc\n\n            eval_losses = eval_loss / (len(valid_dataloader))\n            eval_acc = eval_acc / (len(valid_dataloader))\n            if eval_acc > best_acc:\n                best_acc = eval_acc\n                torch.save(net.state_dict(),'best_acc.pth')\n            eval_acces.append(eval_acc)\n            print(\"Loss on the overall validation set: {}\".format(eval_losses))\n            print(\"Correctness on the overall validation set: {}\".format(eval_acc))\n    return train_losses, train_acces, eval_acces","metadata":{"execution":{"iopub.status.busy":"2023-11-30T11:18:01.595556Z","iopub.execute_input":"2023-11-30T11:18:01.596323Z","iopub.status.idle":"2023-11-30T11:18:01.615423Z","shell.execute_reply.started":"2023-11-30T11:18:01.596288Z","shell.execute_reply":"2023-11-30T11:18:01.614482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_acces(train_losses, train_acces, valid_acces, num_epoch):\n    plt.plot(1 + np.arange(len(train_losses)), train_losses, linewidth=1.5, linestyle='dashed', label='train_losses')\n    plt.plot(1 + np.arange(len(train_acces)), train_acces, linewidth=1.5, linestyle='dashed', label='train_acces')\n    plt.plot(1 + np.arange(len(eval_acces)), eval_acces, linewidth=1.5, linestyle='dashed', label='eval_acces')\n    plt.grid()\n    plt.xlabel('epoch')\n    plt.xticks(range(1, 1 + num_epoch, 1))\n    plt.legend()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-11-30T11:18:02.697234Z","iopub.execute_input":"2023-11-30T11:18:02.698016Z","iopub.status.idle":"2023-11-30T11:18:02.704762Z","shell.execute_reply.started":"2023-11-30T11:18:02.697981Z","shell.execute_reply":"2023-11-30T11:18:02.703686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"show_pic(train_dataloader)","metadata":{"execution":{"iopub.status.busy":"2023-11-30T11:18:03.819347Z","iopub.execute_input":"2023-11-30T11:18:03.819831Z","iopub.status.idle":"2023-11-30T11:18:17.89694Z","shell.execute_reply.started":"2023-11-30T11:18:03.819795Z","shell.execute_reply":"2023-11-30T11:18:17.896198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:16:44.207524Z","iopub.execute_input":"2023-12-02T15:16:44.208534Z","iopub.status.idle":"2023-12-02T15:16:44.281791Z","shell.execute_reply.started":"2023-12-02T15:16:44.208499Z","shell.execute_reply":"2023-12-02T15:16:44.280742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#net = build_model(num_classes = 5, model_type = \"resnet50\", freeze_convnets = False, single_layer = True, hidden_units = 64)","metadata":{"execution":{"iopub.status.busy":"2023-11-30T10:16:36.602248Z","iopub.execute_input":"2023-11-30T10:16:36.603051Z","iopub.status.idle":"2023-11-30T10:16:37.086029Z","shell.execute_reply.started":"2023-11-30T10:16:36.603018Z","shell.execute_reply":"2023-11-30T10:16:37.085039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_classes = 5\nnum_epochs = 2\nbatch_size = 16\nlearning_rate = 0.01\n\nnet = ResNet(ResidualBlock, [3, 4, 6, 3]).to(device)\n","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:17:45.034623Z","iopub.execute_input":"2023-12-02T15:17:45.035026Z","iopub.status.idle":"2023-12-02T15:17:45.265874Z","shell.execute_reply.started":"2023-12-02T15:17:45.034997Z","shell.execute_reply":"2023-12-02T15:17:45.264994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loss = nn.CrossEntropyLoss()","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:19:14.842423Z","iopub.execute_input":"2023-12-02T15:19:14.842789Z","iopub.status.idle":"2023-12-02T15:19:14.847612Z","shell.execute_reply.started":"2023-12-02T15:19:14.842758Z","shell.execute_reply":"2023-12-02T15:19:14.846685Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train_losses, train_acces, eval_acces = train(net, loss, train_dataloader, valid_dataloader, device, batch_size=64, num_epoch=20, lr=0.001, lr_min=1e-4, optim='sgd', init=False)","metadata":{"execution":{"iopub.status.busy":"2023-11-30T11:19:03.624569Z","iopub.execute_input":"2023-11-30T11:19:03.624944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#show_acces(train_losses, train_acces, eval_acces, num_epoch=20)","metadata":{"execution":{"iopub.status.busy":"2023-11-30T09:06:58.869131Z","iopub.execute_input":"2023-11-30T09:06:58.869503Z","iopub.status.idle":"2023-11-30T09:06:59.124771Z","shell.execute_reply.started":"2023-11-30T09:06:58.869473Z","shell.execute_reply":"2023-11-30T09:06:59.123851Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\nfor imgs, targets in valid_dataloader:\n                imgs = imgs.to(device)\n                #targets = torch.cat(targets, dim = 0)\n                targets = targets.to(device)\n                #print(imgs)\n                output = net(imgs)\n                Loss = loss(output, targets)\n                _, pred = output.max(1)\n                print(pred)\n                break\n'''","metadata":{"execution":{"iopub.status.busy":"2023-12-02T15:17:52.003016Z","iopub.execute_input":"2023-12-02T15:17:52.003768Z","iopub.status.idle":"2023-12-02T15:18:16.328638Z","shell.execute_reply.started":"2023-12-02T15:17:52.003735Z","shell.execute_reply":"2023-12-02T15:18:16.327508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import csv ","metadata":{"execution":{"iopub.status.busy":"2023-12-03T18:52:36.958433Z","iopub.execute_input":"2023-12-03T18:52:36.958809Z","iopub.status.idle":"2023-12-03T18:52:36.97025Z","shell.execute_reply.started":"2023-12-03T18:52:36.958779Z","shell.execute_reply":"2023-12-03T18:52:36.969513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fields = ['image_id', 'label']  \n    \n# data rows of csv file  \nrows = [ '41','CC']  ","metadata":{"execution":{"iopub.status.busy":"2023-12-03T18:55:10.544849Z","iopub.execute_input":"2023-12-03T18:55:10.545288Z","iopub.status.idle":"2023-12-03T18:55:10.54968Z","shell.execute_reply.started":"2023-12-03T18:55:10.545257Z","shell.execute_reply":"2023-12-03T18:55:10.548659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open(\"submission.csv\", 'w') as csvfile:  \n    # creating a csv writer object  \n    csvwriter = csv.writer(csvfile)  \n        \n    # writing the fields  \n    csvwriter.writerow(fields)  \n        \n    # writing the data rows  \n    csvwriter.writerow(rows) ","metadata":{"execution":{"iopub.status.busy":"2023-12-03T18:55:11.309323Z","iopub.execute_input":"2023-12-03T18:55:11.309697Z","iopub.status.idle":"2023-12-03T18:55:11.315421Z","shell.execute_reply.started":"2023-12-03T18:55:11.309667Z","shell.execute_reply":"2023-12-03T18:55:11.314349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}