{"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":"markdown","source":"# Imports","metadata":{}},{"cell_type":"code","source":"pip install torchsummary","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:43:26.262310Z","iopub.execute_input":"2023-09-21T19:43:26.263080Z","iopub.status.idle":"2023-09-21T19:43:40.439059Z","shell.execute_reply.started":"2023-09-21T19:43:26.263047Z","shell.execute_reply":"2023-09-21T19:43:40.438049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport os\nimport zipfile\nimport random\nrandom.seed(5)\nimport wandb\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\n\n# torch\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\nfrom torchsummary import summary\nfrom torchvision import transforms, models\nfrom torch.utils.data import Dataset, DataLoader\n\n# custom utilities\nimport sys\nsys.path.append('/kaggle/input/useful-utilities')\nfrom train_eval import *\n\nfrom PIL import Image  # for loading image from path\nfrom tqdm import tqdm\n\n#from kaggle_secrets import UserSecretsClient\n#user_secrets = UserSecretsClient()\n#my_secret = user_secrets.get_secret(\"wandb_api_key\") \n#wandb.login(key=my_secret)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-21T19:43:40.441155Z","iopub.execute_input":"2023-09-21T19:43:40.441454Z","iopub.status.idle":"2023-09-21T19:43:45.755701Z","shell.execute_reply.started":"2023-09-21T19:43:40.441424Z","shell.execute_reply":"2023-09-21T19:43:45.754725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device=\"cuda\" if torch.cuda.is_available() else \"cpu\"\n\ntorch.manual_seed(42)\nif device == 'cuda':\n    torch.cuda.manual_seed_all(42)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:43:45.757137Z","iopub.execute_input":"2023-09-21T19:43:45.757706Z","iopub.status.idle":"2023-09-21T19:43:45.793124Z","shell.execute_reply.started":"2023-09-21T19:43:45.757639Z","shell.execute_reply":"2023-09-21T19:43:45.792187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BASE_PATH = '/kaggle/working/'\ntest_path = os.path.join(BASE_PATH , 'test') \ntrain_path = os.path.join(BASE_PATH , 'train')\n\nif not os.path.exists(test_path):\n    os.mkdir(test_path)\n    os.mkdir(train_path)\n    \n    with zipfile.ZipFile('/kaggle/input/dogs-vs-cats/test1.zip', 'r') as zip_ref:\n        zip_ref.extractall(test_path)\n    with zipfile.ZipFile('/kaggle/input/dogs-vs-cats/train.zip', 'r') as zip_ref:\n        zip_ref.extractall(train_path)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:43:45.797352Z","iopub.execute_input":"2023-09-21T19:43:45.798234Z","iopub.status.idle":"2023-09-21T19:44:01.365111Z","shell.execute_reply.started":"2023-09-21T19:43:45.798201Z","shell.execute_reply":"2023-09-21T19:44:01.364137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_df(dir_path):\n    paths , classes = [] , []\n    for file in os.listdir(dir_path):\n        full_path = os.path.join(dir_path , file)\n        paths.append(full_path)\n        if file.split('.')[0]=='cat' :\n            category = 0\n        else :\n            category = 1\n        classes.append(category)\n    \n    df = pd.DataFrame({'Path': paths , 'category': classes})\n    return df\n\ntrain_df = create_df('/kaggle/working/train/train')\ntest_df = create_df('/kaggle/working/test/test1')\n\ntrain_df.shape , test_df.shape","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:01.366477Z","iopub.execute_input":"2023-09-21T19:44:01.366850Z","iopub.status.idle":"2023-09-21T19:44:01.507615Z","shell.execute_reply.started":"2023-09-21T19:44:01.366813Z","shell.execute_reply":"2023-09-21T19:44:01.506574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plotting Images","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(10, 15))\nfor i in range (12):\n    arr = plt.imread(random.choice(train_df.Path))\n\n    plt.subplot(3,4, i + 1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.title(arr.shape)\n    plt.imshow(arr)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:01.509249Z","iopub.execute_input":"2023-09-21T19:44:01.509614Z","iopub.status.idle":"2023-09-21T19:44:02.557232Z","shell.execute_reply.started":"2023-09-21T19:44:01.509580Z","shell.execute_reply":"2023-09-21T19:44:02.556359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Splitting data (categorical)\n\nX_tr, X_val, Y_tr, Y_val =train_test_split(train_df.iloc[:, 0], train_df.iloc[:, 1],\n                                           stratify=train_df.iloc[:,1],test_size=0.25)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:02.558213Z","iopub.execute_input":"2023-09-21T19:44:02.558527Z","iopub.status.idle":"2023-09-21T19:44:02.586401Z","shell.execute_reply.started":"2023-09-21T19:44:02.558498Z","shell.execute_reply":"2023-09-21T19:44:02.585465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Creating PipeLine","metadata":{}},{"cell_type":"code","source":"class MyDataset(Dataset):\n    def __init__(self, X, Y, transform = None):\n        # convert into PyTorch tensors and remember them\n        self.X = X\n        self.Y = Y\n        self.len = len(self.X)\n        self.transform = transform\n \n    def __len__(self):\n        # this should return the size of the dataset\n        return self.len\n \n    def __getitem__(self, idx):\n        # this should return one sample from the dataset\n        path = self.X.iloc[idx]\n        target = self.Y.iloc[idx]\n        image = Image.open(path) \n        if self.transform : \n            image = self.transform(image)\n\n        return image, F.one_hot(torch.tensor(target) , num_classes=2).float()\n    def get(self, idx):\n        return self.__getitem__(idx)\n\n    \n\n# Create a list of transforms\ntr_transform = [\n    transforms.Resize((256, 256)),\n    transforms.RandomHorizontalFlip(p=0.4),\n    transforms.ToTensor(),\n    transforms.RandomRotation(degrees = (-15, 15)),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n]\ntst_transform = [\n    transforms.Resize((256, 256)),\n    transforms.ToTensor(),\n    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n]\n\n# Create a composed transform\ntransform_tr = transforms.Compose(tr_transform)\ntransform_val = transforms.Compose(tst_transform)\n\ntr_dataset = MyDataset(X_tr, Y_tr ,transform = transform_tr)\nval_dataset = MyDataset(X_val, Y_val , transform = transform_val)\ntst_dataset = MyDataset(test_df.iloc[:, 0], test_df.iloc[:,1] , transform = transform_val)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:02.587877Z","iopub.execute_input":"2023-09-21T19:44:02.588224Z","iopub.status.idle":"2023-09-21T19:44:02.600169Z","shell.execute_reply.started":"2023-09-21T19:44:02.588193Z","shell.execute_reply":"2023-09-21T19:44:02.599124Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"F.one_hot(torch.tensor(0) , num_classes=2)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:02.601983Z","iopub.execute_input":"2023-09-21T19:44:02.602327Z","iopub.status.idle":"2023-09-21T19:44:02.665530Z","shell.execute_reply.started":"2023-09-21T19:44:02.602281Z","shell.execute_reply":"2023-09-21T19:44:02.664578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Config for Custom Model","metadata":{}},{"cell_type":"code","source":"config = {\n    'BATCH_SIZE' : 32 , \n    'epochs' : 20,\n    'lr' : 0.001\n}","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:02.669428Z","iopub.execute_input":"2023-09-21T19:44:02.669709Z","iopub.status.idle":"2023-09-21T19:44:02.674028Z","shell.execute_reply.started":"2023-09-21T19:44:02.669679Z","shell.execute_reply":"2023-09-21T19:44:02.673122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tr_loader = DataLoader(tr_dataset, batch_size=config['BATCH_SIZE'], shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=config['BATCH_SIZE'], shuffle=True)\n\nx,y = next(iter(tr_loader))\nx.shape , y.shape","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:02.675521Z","iopub.execute_input":"2023-09-21T19:44:02.676179Z","iopub.status.idle":"2023-09-21T19:44:03.025117Z","shell.execute_reply.started":"2023-09-21T19:44:02.676147Z","shell.execute_reply":"2023-09-21T19:44:03.024026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CNN(nn.Module):\n\n    \n    def __init__(self):\n        super().__init__()\n        self.conv0 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=(3,3), stride=(1,1), padding=(1,1), bias=False)\n        self.bn0 = nn.BatchNorm2d(num_features=16)\n        self.maxpool = nn.MaxPool2d(kernel_size=(2,2), stride=(2,2))\n        \n        self.conv1 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=(3,3), stride=(1,1), padding=(1,1), bias=False)\n        self.bn1 = nn.BatchNorm2d(num_features=32)\n        # self.maxpool\n        \n        self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=(3,3), stride=(1,1), padding=(1,1), bias=False)\n        self.bn2 = nn.BatchNorm2d(num_features=64)\n        # self.maxpool\n        \n        self.conv3 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=(3,3), stride=(1,1), padding=(1,1), bias=False)\n        self.bn3 = nn.BatchNorm2d(num_features=128)\n        # self.maxpool\n        \n        self.dropout = nn.Dropout(p=0.5)\n        self.fc0 = nn.Linear(in_features=128*16*16, out_features=512)\n        self.fc1 = nn.Linear(in_features=512, out_features=128)\n        self.fc2 = nn.Linear(in_features=128, out_features=1)\n        \n    def forward(self, x):\n        x = F.relu(self.bn0(self.conv0(x)))\n        x = self.maxpool(x)\n        \n        x = F.relu(self.bn1(self.conv1(x)))\n        x = self.maxpool(x)\n        \n        x = F.relu(self.bn2(self.conv2(x)))\n        x = self.maxpool(x)\n        \n        x = F.relu(self.bn3(self.conv3(x)))\n        x = self.maxpool(x)\n\n        x = x.reshape(x.shape[0], -1)\n        \n        x = self.dropout(x)\n        x = F.relu(self.fc0(x))\n        x = F.relu(self.fc1(x))\n        x = F.sigmoid(self.fc2(x))\n        \n        return x\n\n            ","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.026888Z","iopub.execute_input":"2023-09-21T19:44:03.027245Z","iopub.status.idle":"2023-09-21T19:44:03.041581Z","shell.execute_reply.started":"2023-09-21T19:44:03.027212Z","shell.execute_reply":"2023-09-21T19:44:03.040494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model = CNN().to(device)\n# #print(summary(model, input_size=(4,3,100,100)))\n#optimizer = optim.Adam(params = model.parameters(),lr =config['lr'])\n#loss_function = nn.BCELoss()","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.042916Z","iopub.execute_input":"2023-09-21T19:44:03.043320Z","iopub.status.idle":"2023-09-21T19:44:03.057137Z","shell.execute_reply.started":"2023-09-21T19:44:03.043287Z","shell.execute_reply":"2023-09-21T19:44:03.055913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''def predict_test_data(model, test_loader):\n    \n    num_correct = 0\n    num_samples = 0\n    \n    model.eval()\n    \n    with torch.no_grad():\n        for batch, (X_test, y_test) in enumerate(val_loader):\n            X_test = X_test.float().to(device)\n            y_test = y_test.float().to(device)\n\n            # Calculate loss (forward propagation)\n            test_preds = model(X_test)\n            y_test = y_test.unsqueeze(1)\n            test_loss  = loss_function(test_preds, y_test)\n            \n            # Calculate accuracy\n            rounded_test_preds = torch.round(test_preds)\n            num_correct += torch.sum(rounded_test_preds == y_test)\n            num_samples += len(y_test)\n        \n    model.train()\n    \n    test_acc = num_correct/num_samples\n    \n    return test_loss, test_acc'''","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.058607Z","iopub.execute_input":"2023-09-21T19:44:03.059030Z","iopub.status.idle":"2023-09-21T19:44:03.070899Z","shell.execute_reply.started":"2023-09-21T19:44:03.058935Z","shell.execute_reply":"2023-09-21T19:44:03.069686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''train_losses = []    # Training and testing loss was calculated based on the last batch of each epoch.\ntest_losses  = []\ntrain_accs = []\ntest_accs  = []\n\nfor epoch in range(config['epochs']):\n    \n    num_correct_train = 0\n    num_samples_train = 0\n    for batch, (X_train, y_train) in tqdm(enumerate(tr_loader), total=len(tr_loader)):\n        X_train = X_train.float().to(device)\n        y_train = y_train.float().to(device)\n        \n        # Forward propagation\n        train_preds = model(X_train)\n        y_train = y_train.unsqueeze(1)\n        train_loss = loss_function(train_preds, y_train)\n        \n        # Calculate train accuracy\n        with torch.no_grad():\n            rounded_train_preds = torch.round(train_preds)\n            num_correct_train += torch.sum(rounded_train_preds == y_train)\n            num_samples_train += len(y_train)\n            \n        # Backward propagation\n        optimizer.zero_grad()\n        train_loss.backward()\n        \n        # Gradient descent\n        optimizer.step()\n    \n    train_acc = num_correct_train/num_samples_train\n    test_loss, test_acc = predict_test_data(model, val_loader)\n    \n    train_losses.append(train_loss.item())\n    test_losses.append(test_loss.item())\n    train_accs.append(train_acc.item())\n    test_accs.append(test_acc.item())\n        \n    print(f'Epoch: {epoch} \\t|' \\\n            f' Train loss: {np.round(train_loss.item(),3)} \\t|' \\\n            f' Test loss: {np.round(test_loss.item(),3)} \\t|' \\\n            f' Train acc: {np.round(train_acc.item(),2)} \\t|' \\\n            f' Test acc: {np.round(test_acc.item(),2)}')'''","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.072411Z","iopub.execute_input":"2023-09-21T19:44:03.072815Z","iopub.status.idle":"2023-09-21T19:44:03.090461Z","shell.execute_reply.started":"2023-09-21T19:44:03.072782Z","shell.execute_reply":"2023-09-21T19:44:03.089372Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plt.figure(figsize=(10,6))\n#plt.grid()\n#plt.plot(train_losses)\n#plt.plot(test_losses)\n#plt.legend(['train_losses', 'test_losses'])\n#plt.xlabel('epoch')\n#plt.ylabel('loss')\n#plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.091618Z","iopub.execute_input":"2023-09-21T19:44:03.092100Z","iopub.status.idle":"2023-09-21T19:44:03.103322Z","shell.execute_reply.started":"2023-09-21T19:44:03.092068Z","shell.execute_reply":"2023-09-21T19:44:03.102492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plt.figure(figsize=(10,6))\n#plt.grid()\n#plt.plot(train_accs)\n#plt.plot(test_accs)\n#plt.legend(['train_accs', 'test_accs'])\n#plt.xlabel('epoch')\n#plt.ylabel('accuracy')\n#plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.105385Z","iopub.execute_input":"2023-09-21T19:44:03.106375Z","iopub.status.idle":"2023-09-21T19:44:03.115185Z","shell.execute_reply.started":"2023-09-21T19:44:03.106344Z","shell.execute_reply":"2023-09-21T19:44:03.114251Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''# Load test images\niter_test = iter(val_loader)\nimg_test, lbl_test = next(iter_test)\n\n# Predict labels\npreds_test = model(img_test.to(device))\nimg_test_permuted = img_test.permute(0, 2, 3, 1)\nrounded_preds = preds_test.round()\n\n# Show test images and the predicted labels\nshow_images(img_test_permuted, rounded_preds, 0)'''","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.116573Z","iopub.execute_input":"2023-09-21T19:44:03.117161Z","iopub.status.idle":"2023-09-21T19:44:03.127737Z","shell.execute_reply.started":"2023-09-21T19:44:03.117131Z","shell.execute_reply":"2023-09-21T19:44:03.126866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Transfer Learning","metadata":{}},{"cell_type":"code","source":"transfer_config = {\n    'BATCH_SIZE' : 32 ,\n    'INPUT_SIZE' : (3,256, 256), \n    'OUTPUT_SIZE' : (2) , \n    'lr' : 0.005 ,\n    'model_name' : 'fine_tuned_resnet',\n    'dir_path' : '/kaggle/working'\n}","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.129288Z","iopub.execute_input":"2023-09-21T19:44:03.129949Z","iopub.status.idle":"2023-09-21T19:44:03.141612Z","shell.execute_reply.started":"2023-09-21T19:44:03.129917Z","shell.execute_reply":"2023-09-21T19:44:03.140594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet = models.resnet50(pretrained=True).to(device)\n    \nfor param in resnet.parameters():\n    param.requires_grad = False   \n\nclass Dense(nn.Module):\n    def __init__(self, drop ,in_size, out_size):\n        super(Dense ,self).__init__()\n        self.dropout = nn.Dropout(drop)\n        self.linear = nn.Linear(in_size, out_size)\n        self.prelu = nn.PReLU()\n\n    def forward(self, x):\n        x = self.dropout(x)\n        x = self.linear(x)\n        x = self.prelu(x)\n        return x\n    \nresnet.fc = nn.Sequential(\n                Dense(0.2 , 2048 ,1024), \n                Dense(0.15, 1024, 512) ,\n                Dense(0.15, 512, 128) ,\n                Dense(0, 128, 2) \n                        ).to(device)\n\nsummary(resnet, transfer_config['INPUT_SIZE'])","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:03.143007Z","iopub.execute_input":"2023-09-21T19:44:03.143693Z","iopub.status.idle":"2023-09-21T19:44:12.543329Z","shell.execute_reply.started":"2023-09-21T19:44:03.143631Z","shell.execute_reply":"2023-09-21T19:44:12.542367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from train_eval import Train_Eval\noptimizer = torch.optim.Adam(resnet.parameters(), lr=transfer_config['lr'])\ncriterion = torch.nn.BCEWithLogitsLoss()\n\nlr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience = 5,cooldown= 2, factor = 0.4, verbose = True, threshold = 1e-2)\n\nobj = Train_Eval(model=resnet, model_name=transfer_config['model_name'], dir_path = transfer_config['dir_path'] ,device=device ,train_loader=tr_loader, \n                 val_loader=val_loader, optimizer=optimizer, criterion=criterion, lr_scheduler= lr_scheduler)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:12.544910Z","iopub.execute_input":"2023-09-21T19:44:12.545519Z","iopub.status.idle":"2023-09-21T19:44:12.554313Z","shell.execute_reply.started":"2023-09-21T19:44:12.545483Z","shell.execute_reply":"2023-09-21T19:44:12.553183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"obj.run(5)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T19:44:12.555689Z","iopub.execute_input":"2023-09-21T19:44:12.556243Z","iopub.status.idle":"2023-09-21T20:01:33.816583Z","shell.execute_reply.started":"2023-09-21T19:44:12.556210Z","shell.execute_reply":"2023-09-21T20:01:33.815638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path = os.path.join(transfer_config['dir_path'] , (\"history_{x}.pickle\".format(x = transfer_config['model_name'])))\nhistory = pickle.load(open(path, \"rb\"))\n\nobj.plot_history(history)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T20:01:33.817939Z","iopub.execute_input":"2023-09-21T20:01:33.818339Z","iopub.status.idle":"2023-09-21T20:01:34.820874Z","shell.execute_reply.started":"2023-09-21T20:01:33.818291Z","shell.execute_reply":"2023-09-21T20:01:34.819950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluation","metadata":{}},{"cell_type":"code","source":"preds = []\nfor idx in range(len(test_df)):\n    X, target = tst_dataset.get(idx)\n    X = torch.unsqueeze(X, 0)\n    outputs = resnet(X.to(device))\n    pred = torch.argmax(outputs, dim=1)\n    preds.append(pred.cpu().numpy()[0])\n    \ndf = pd.read_csv('/kaggle/input/dogs-vs-cats/sampleSubmission.csv')\ndf['label'] = preds\ndf.to_csv('/kaggle/working/final_submission.csv' ,index = False)","metadata":{"execution":{"iopub.status.busy":"2023-09-21T20:01:34.822293Z","iopub.execute_input":"2023-09-21T20:01:34.822869Z","iopub.status.idle":"2023-09-21T20:03:46.176479Z","shell.execute_reply.started":"2023-09-21T20:01:34.822835Z","shell.execute_reply":"2023-09-21T20:03:46.175502Z"},"trusted":true},"execution_count":null,"outputs":[]}]}