{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np \nimport pandas as pd \nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn import preprocessing\nfrom sklearn.model_selection import KFold\nimport cv2 as cv\nimport plotly.express as px\nfrom tqdm.notebook import tqdm\n\n\n\n\nimport torch\nimport torchvision.transforms as transforms\nimport torch.optim as optim\nimport torch.nn.functional as F\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\n\nimport albumentations as A\nfrom albumentations.pytorch.transforms import ToTensorV2\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-13T18:59:04.843879Z","iopub.execute_input":"2022-08-13T18:59:04.845177Z","iopub.status.idle":"2022-08-13T18:59:10.407389Z","shell.execute_reply.started":"2022-08-13T18:59:04.845068Z","shell.execute_reply":"2022-08-13T18:59:10.406348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>1. Show data</center></h2>","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/paddy-disease-classification/train.csv')\n\ndf.sample(7)","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:13.501801Z","iopub.execute_input":"2022-08-13T18:59:13.502495Z","iopub.status.idle":"2022-08-13T18:59:13.544499Z","shell.execute_reply.started":"2022-08-13T18:59:13.502459Z","shell.execute_reply":"2022-08-13T18:59:13.543539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '../input/paddy-disease-classification/train_images/'\ndf['path_jpeg'] = df.apply(lambda row: train_dir + row['label'] + '/' + row['image_id'], axis=1)\ndf.sample(7)","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:15.295734Z","iopub.execute_input":"2022-08-13T18:59:15.296522Z","iopub.status.idle":"2022-08-13T18:59:15.447328Z","shell.execute_reply.started":"2022-08-13T18:59:15.296481Z","shell.execute_reply":"2022-08-13T18:59:15.446398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.rcParams[\"font.family\"] = 'serif'\nfig, axes = plt.subplots(nrows=3, ncols=4, figsize=(18, 15),\n                        subplot_kw={'xticks': [], 'yticks': []})\n\nfor ax in axes.flat:\n    i = np.random.randint(df.shape[0])\n    ax.imshow(plt.imread(df['path_jpeg'][i]))\n    ax.set_title(df['label'][i],fontsize=16)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:17.036370Z","iopub.execute_input":"2022-08-13T18:59:17.036851Z","iopub.status.idle":"2022-08-13T18:59:18.419504Z","shell.execute_reply.started":"2022-08-13T18:59:17.036811Z","shell.execute_reply":"2022-08-13T18:59:18.417869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le = preprocessing.LabelEncoder()\nle.fit(df['label'])\ninteger_mapping = {i: l for i, l in enumerate(le.classes_)}\ndf['label'] = le.transform(df['label'])","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:27.140057Z","iopub.execute_input":"2022-08-13T18:59:27.140570Z","iopub.status.idle":"2022-08-13T18:59:27.156860Z","shell.execute_reply.started":"2022-08-13T18:59:27.140528Z","shell.execute_reply":"2022-08-13T18:59:27.155795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"integer_mapping","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:28.358636Z","iopub.execute_input":"2022-08-13T18:59:28.359649Z","iopub.status.idle":"2022-08-13T18:59:28.366800Z","shell.execute_reply.started":"2022-08-13T18:59:28.359603Z","shell.execute_reply":"2022-08-13T18:59:28.365708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_gr = df.value_counts(['label'])\ndf_gr = df_gr.reset_index()\nx = df_gr['label'].values\ny = df_gr[0].values\nplt.figure(figsize =(14, 7))\nplt.bar(x, y)\nplt.xticks(x, fontsize=14)\nplt.yticks([y.min(), y.max(), y.mean()],fontsize=14)\nplt.grid()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:46.980812Z","iopub.execute_input":"2022-08-13T18:59:46.981270Z","iopub.status.idle":"2022-08-13T18:59:47.179435Z","shell.execute_reply.started":"2022-08-13T18:59:46.981215Z","shell.execute_reply":"2022-08-13T18:59:47.178547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>2. K-Fold Stratified Data</center></h2>","metadata":{}},{"cell_type":"code","source":"df['k_fold'] = np.nan\n\nn_folds = 7\nreversed = False\n\nfor label in df.label.unique():\n    \n    folds = list(range(n_folds))\n    if reversed: folds.reverse()\n    \n    kf = KFold(n_splits=n_folds, random_state=42, shuffle=True)\n    \n    label_idxs = df[df.label==label].index\n    \n    kf.get_n_splits(label_idxs)\n\n    for _, valid_index in kf.split(label_idxs):\n\n        actual_fold = folds.pop(0)\n        df_index = label_idxs[valid_index]\n        df.loc[df_index, 'k_fold'] = actual_fold\n    reversed = not reversed\n        \n\n","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:54.028902Z","iopub.execute_input":"2022-08-13T18:59:54.029277Z","iopub.status.idle":"2022-08-13T18:59:54.084260Z","shell.execute_reply.started":"2022-08-13T18:59:54.029237Z","shell.execute_reply":"2022-08-13T18:59:54.083288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"graphic = df.groupby(['label', 'k_fold']).size().reset_index()\ngraphic.columns = ['label', 'k_fold', 'count']\nfig = px.bar(\n    graphic, x=\"k_fold\", y=\"count\",\n    color='label', barmode='group',\n    height=400\n)\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-13T18:59:56.091335Z","iopub.execute_input":"2022-08-13T18:59:56.091718Z","iopub.status.idle":"2022-08-13T18:59:56.883726Z","shell.execute_reply.started":"2022-08-13T18:59:56.091687Z","shell.execute_reply":"2022-08-13T18:59:56.882849Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>3. Create Augmentations</center></h2>","metadata":{"execution":{"iopub.status.busy":"2022-08-11T09:11:16.986411Z","iopub.execute_input":"2022-08-11T09:11:16.987464Z","iopub.status.idle":"2022-08-11T09:11:16.995279Z","shell.execute_reply.started":"2022-08-11T09:11:16.987411Z","shell.execute_reply":"2022-08-11T09:11:16.993632Z"}}},{"cell_type":"markdown","source":"# How does it work? For example:\n\n","metadata":{}},{"cell_type":"code","source":"# create transform  \ntransform = A.Compose([\n    A.Rotate([-30,30]),\n    A.RandomCrop(width=360, height=360),\n    A.RandomBrightnessContrast(brightness_limit=[0.1,0.6], contrast_limit=[0.1,0.6], p=0.3),\n    A.HorizontalFlip(p=0.5)\n])\n# this method return image-array\n# transformed = transform(image=image)\n# transformed.keys()\n\n#create visualization\nrow, col = 3, 5\nnumber = 1\nplt.figure(figsize=(12, 8))\nfor r in range(row):\n    # choose a random picture \n    i = np.random.randint(df.shape[0])\n    image = cv.imread(df['path_jpeg'][i])\n    image = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n    for c in range(col):\n        # create transform\n        if number % col == 1:\n            plt.subplot(row, col, number)\n            plt.imshow(image)\n            plt.title('original')\n        else:\n            transformed_image = transform(image=image)['image']\n            plt.subplot(row, col, number)\n            plt.imshow(transformed_image)\n            \n        plt.xticks([]);\n        plt.yticks([]);\n        number += 1\n                \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:06.952455Z","iopub.execute_input":"2022-08-13T19:00:06.953169Z","iopub.status.idle":"2022-08-13T19:00:07.910973Z","shell.execute_reply.started":"2022-08-13T19:00:06.953135Z","shell.execute_reply":"2022-08-13T19:00:07.910158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def transforms_method(image=None, image_size=360, train=True):\n#     if image is None:\n#         raise ValueError('image is NaN')\n    if train:\n        transforms = A.Compose([\n            A.RandomCrop(height=image_size, width=image_size, always_apply=True),\n            A.Rotate([-30,30], p=1),\n            A.CoarseDropout(max_height=int(image_size * 0.17), max_width=int(image_size * 0.17),\n                             min_holes=4, max_holes=9, p=0.7),\n            A.RandomGridShuffle(grid=(2, 2), p=0.3),\n            A.GaussianBlur(blur_limit=(3, 7), p=0.05),\n            A.RandomSnow(p=0.05),\n            A.RandomRain(p=0.05),\n            A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225],),\n            ToTensorV2(),\n        ])\n    else:\n        transforms = A.Compose([\n        A.CenterCrop(height=image_size, width=image_size, always_apply=True),\n        A.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225],),\n        ToTensorV2(),\n        ])\n        \n    return transforms","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:11.557273Z","iopub.execute_input":"2022-08-13T19:00:11.557938Z","iopub.status.idle":"2022-08-13T19:00:11.566214Z","shell.execute_reply.started":"2022-08-13T19:00:11.557902Z","shell.execute_reply":"2022-08-13T19:00:11.565283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ni = np.random.randint(df.shape[0])\n\nimage = cv.imread(df['path_jpeg'][i])\nimage = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n\ntransform = transforms_method(image)\n\ntransformed_image = transform(image=image)['image']\n#PyTorch Tensor\nplt.imshow(transformed_image.permute(1, 2, 0));","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:12.830619Z","iopub.execute_input":"2022-08-13T19:00:12.831515Z","iopub.status.idle":"2022-08-13T19:00:13.251023Z","shell.execute_reply.started":"2022-08-13T19:00:12.831467Z","shell.execute_reply":"2022-08-13T19:00:13.250129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>4. Create Dataset</center></h2>","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:23:04.865335Z","iopub.execute_input":"2022-08-11T18:23:04.866251Z","iopub.status.idle":"2022-08-11T18:23:04.873020Z","shell.execute_reply.started":"2022-08-11T18:23:04.866209Z","shell.execute_reply":"2022-08-11T18:23:04.871409Z"}}},{"cell_type":"code","source":"class PaddyDataset(Dataset):\n    def __init__(self, images_filepaths, targets, transform=None):\n        self.images_filepaths = images_filepaths\n        self.targets = targets\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.images_filepaths)\n\n    def __getitem__(self, idx):\n        image_filepath = self.images_filepaths[idx]\n        image = cv.imread(image_filepath)\n        image = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n\n        if self.transform is not None:\n            image = self.transform(image=image)['image']\n        \n        label = torch.tensor(self.targets[idx]).long()\n        return image, label","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:15.422527Z","iopub.execute_input":"2022-08-13T19:00:15.423435Z","iopub.status.idle":"2022-08-13T19:00:15.430713Z","shell.execute_reply.started":"2022-08-13T19:00:15.423372Z","shell.execute_reply":"2022-08-13T19:00:15.429674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>5. Let's create a model</center></h2>","metadata":{}},{"cell_type":"code","source":"\nif torch.cuda.is_available():\n    device = torch.device('cuda')\n    print('Thera are  %d GPU(s) available.' % torch.cuda.device_count())\nelse:\n    print('No GPU available, using the CPU instead.')\n    device = torch.device(\"cpu\")\n","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:19.742900Z","iopub.execute_input":"2022-08-13T19:00:19.743869Z","iopub.status.idle":"2022-08-13T19:00:19.809754Z","shell.execute_reply.started":"2022-08-13T19:00:19.743835Z","shell.execute_reply":"2022-08-13T19:00:19.807489Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torchvision import models\nmodel = models.resnet50(pretrained=True)\n\n# #freezy model_parameters \n# for param in model.parameters():\n#     param.requires_grad = False\n    \nmodel.fc = nn.Sequential(\n    nn.Dropout(0.1),\n    nn.Linear(model.fc.in_features,  10)\n    \n)\n# model","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:21.058724Z","iopub.execute_input":"2022-08-13T19:00:21.059769Z","iopub.status.idle":"2022-08-13T19:00:23.021912Z","shell.execute_reply.started":"2022-08-13T19:00:21.059729Z","shell.execute_reply":"2022-08-13T19:00:23.020916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = model.to(device)\nloss = torch.nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(),  lr = 10 **(-3))\nepochs = 5\nbatch_size = 37","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:23.514486Z","iopub.execute_input":"2022-08-13T19:00:23.514948Z","iopub.status.idle":"2022-08-13T19:00:26.723002Z","shell.execute_reply.started":"2022-08-13T19:00:23.514894Z","shell.execute_reply":"2022-08-13T19:00:26.721971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>6. Training model</center></h2>","metadata":{}},{"cell_type":"code","source":"list_of_loss_train = []\nlist_of_loss_val = []\nlist_of_acc = []\nfor epoch_i in range(1, epochs + 1):\n    \n    \n    print(f'---------------------epoch:{epoch_i}/{epochs}---------------------')\n    for valid_fold in tqdm(range(n_folds)):\n        \n            \n        train = df[df['k_fold'] != valid_fold]\n        valid = df[df['k_fold'] == valid_fold]\n\n        X_train = train['path_jpeg']\n        y_train = train['label']\n        X_valid = valid['path_jpeg']\n        y_valid = valid['label']\n\n        train_dataset = PaddyDataset(\n            images_filepaths=X_train.values,\n            targets=y_train.values,\n            transform=transforms_method()\n        )\n\n        valid_dataset = PaddyDataset(\n            images_filepaths=X_valid.values,\n            targets=y_valid.values,\n            transform=transforms_method(train=False)\n        )\n        \n        train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n        valid_loader = DataLoader(valid_dataset, batch_size=batch_size)\n        \n        total_train_loss = 0\n        total_eval_loss = 0\n        summa = 0\n        \n        model.train()\n        \n        for batch in (train_loader):\n            X_batch = batch[0].to(device)\n            y_batch = batch[1].to(device)\n\n            optimizer.zero_grad()\n            res = model.forward(X_batch)\n            loss_value = loss(res, y_batch.long())\n            loss_value.backward()\n\n            total_train_loss += loss_value\n            optimizer.step()\n            \n        model.eval()\n        for batch in (valid_loader):\n            X_batch = batch[0].to(device)\n            y_batch = batch[1].to(device)\n\n            with torch.no_grad(): \n                res = model.forward(X_batch)\n                preds = torch.max(F.softmax(res, dim=1), dim=1)\n                correct= torch.eq(preds[1], y_batch)\n                summa += torch.sum(correct).item()\n                loss_value = loss(res, y_batch.long())\n                total_eval_loss += loss_value\n                \n        avg_train_loss = total_train_loss / len(train_dataset)\n        avg_val_loss = total_eval_loss / len(valid_dataset)\n        acc = summa / len(valid_dataset)\n        \n        list_of_loss_train.append(avg_train_loss.cpu().detach().numpy())\n        list_of_loss_val.append(avg_val_loss.cpu().detach().numpy())\n        list_of_acc.append(acc)\n        \n        print(f'epoch: {epoch_i}, path: {valid_fold+1}/{n_folds} acc:{acc :.2%} ({summa}/{len(valid_dataset)}), loss_train:{avg_train_loss:.5f}, loss_valid:{avg_val_loss:.5f}')\n\n            ","metadata":{"execution":{"iopub.status.busy":"2022-08-13T19:00:28.962133Z","iopub.execute_input":"2022-08-13T19:00:28.962838Z","iopub.status.idle":"2022-08-13T21:34:34.223299Z","shell.execute_reply.started":"2022-08-13T19:00:28.962803Z","shell.execute_reply":"2022-08-13T21:34:34.222293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>7. Visualization of results</center></h2>","metadata":{}},{"cell_type":"code","source":"acc_max = max(list_of_acc)\nloss_train_min = min(list_of_loss_train)\nloss_val_min = min(list_of_loss_val)","metadata":{"execution":{"iopub.status.busy":"2022-08-13T21:42:13.774086Z","iopub.execute_input":"2022-08-13T21:42:13.774864Z","iopub.status.idle":"2022-08-13T21:42:13.780178Z","shell.execute_reply.started":"2022-08-13T21:42:13.774828Z","shell.execute_reply":"2022-08-13T21:42:13.778870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20, 5))\n\nplt.subplot(1,2,1)\nplt.title('Loss_score', fontsize = 15 );\nplt.grid(True)\nplt.xlabel('epoch', fontsize=14)\nplt.plot(list_of_loss_train, color='red', label = f'min_value:{loss_train_min:.5f}');\nplt.plot(list_of_loss_val, color='blue', label = f'min_value:{loss_val_min:.5f}');\nplt.xticks(range(epochs * n_folds ));\nplt.legend();\n\nplt.subplot(1,2,2)\nplt.title('Acc_score', fontsize = 15 );\nplt.grid(True)\nplt.xlabel('epoch', fontsize=14);\nplt.plot(list_of_acc , color='darkblue', label = f'max_acc:{acc_max:.2%}');\nplt.xticks(range(epochs * n_folds ));\nplt.legend();\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-13T21:42:27.529725Z","iopub.execute_input":"2022-08-13T21:42:27.530077Z","iopub.status.idle":"2022-08-13T21:42:28.047036Z","shell.execute_reply.started":"2022-08-13T21:42:27.530048Z","shell.execute_reply":"2022-08-13T21:42:28.046117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='color:#0D0D0D; background:#27BDEB; font-size: 40px;' role=\"tab\" aria-controls=\"home\"><br><center>8. Submit predictions</center></h2>","metadata":{}},{"cell_type":"code","source":"submission_dir = '../input/paddy-disease-classification/test_images/'","metadata":{"execution":{"iopub.status.busy":"2022-08-13T21:42:51.110853Z","iopub.execute_input":"2022-08-13T21:42:51.111205Z","iopub.status.idle":"2022-08-13T21:42:51.116109Z","shell.execute_reply.started":"2022-08-13T21:42:51.111175Z","shell.execute_reply":"2022-08-13T21:42:51.114680Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nmodel.eval()\nimage_ids, labels = [], []\nfor (dirpath, dirname, filenames) in os.walk(submission_dir):\n    filenames.sort()\n    for imade_id in tqdm(filenames):\n        image_filepath = dirpath + imade_id\n        \n        image = cv.imread(image_filepath)\n        image = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n        \n        transform = transforms_method(image, train=False)\n        transformed_image = transform(image=image)['image']\n#       plt.imshow(transformed_image.permute(1, 2, 0));\n\n        res = model.forward(transformed_image.unsqueeze(0).to(device))\n        pred = torch.max(F.softmax(res, dim=1), dim=1)[1].to('cpu')\n        pred_label = integer_mapping[pred.numpy()[0]]\n\n        image_ids.append(imade_id)\n        labels.append(pred_label)","metadata":{"execution":{"iopub.status.busy":"2022-08-13T21:42:59.922026Z","iopub.execute_input":"2022-08-13T21:42:59.922501Z","iopub.status.idle":"2022-08-13T21:44:32.664025Z","shell.execute_reply.started":"2022-08-13T21:42:59.922461Z","shell.execute_reply":"2022-08-13T21:44:32.662982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'image_id': image_ids,\n    'label': labels,\n})","metadata":{"execution":{"iopub.status.busy":"2022-08-13T21:44:35.480019Z","iopub.execute_input":"2022-08-13T21:44:35.480923Z","iopub.status.idle":"2022-08-13T21:44:35.487820Z","shell.execute_reply.started":"2022-08-13T21:44:35.480877Z","shell.execute_reply":"2022-08-13T21:44:35.486772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index=False, header=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-13T21:44:36.181252Z","iopub.execute_input":"2022-08-13T21:44:36.181799Z","iopub.status.idle":"2022-08-13T21:44:36.194343Z","shell.execute_reply.started":"2022-08-13T21:44:36.181765Z","shell.execute_reply":"2022-08-13T21:44:36.193558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}