{"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":"# Import Libraries","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nfrom glob import glob\nfrom tqdm import tqdm\nimport sys\nimport matplotlib.pyplot as plt\nfrom sklearn import model_selection\nfrom sklearn import preprocessing\n\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset,DataLoader\nfrom torch import optim\nfrom torchvision import transforms\nfrom torchvision import models\n\nfrom PIL import Image\n\nplt.style.use('ggplot')","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:10:41.905790Z","iopub.execute_input":"2022-11-17T06:10:41.906427Z","iopub.status.idle":"2022-11-17T06:10:44.814370Z","shell.execute_reply.started":"2022-11-17T06:10:41.906326Z","shell.execute_reply":"2022-11-17T06:10:44.813353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Constants ","metadata":{}},{"cell_type":"code","source":"class CFG:\n    PARENT_PATH = '../input/dog-breed-identification'\n    TRAIN_FILES  = os.path.join(PARENT_PATH,'train')\n    TEST_FILES = os.path.join(PARENT_PATH,'test')\n    DEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    FOLD_SPLITS = 5\n    RANDOM_STATE = 2022\n    BATCH_SIZE = 32\n    IMG_SIZE = 224\n    EPOCHES = 10\n    PATIENCE = 3\n    \ncfg = CFG()","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:10:44.819929Z","iopub.execute_input":"2022-11-17T06:10:44.820771Z","iopub.status.idle":"2022-11-17T06:10:44.935573Z","shell.execute_reply.started":"2022-11-17T06:10:44.820732Z","shell.execute_reply":"2022-11-17T06:10:44.934163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import & Prepare Dataset","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv(os.path.join(cfg.PARENT_PATH,'labels.csv'))\ntrain_data['image_name'] = train_data['id']+'.jpg'\ntrain_data['image_path'] = [os.path.join(cfg.TRAIN_FILES,val) for val in train_data['image_name']]\n\nsample_data = pd.read_csv(os.path.join(cfg.PARENT_PATH,'sample_submission.csv'))[['id']]\nsample_data['breed'] = -999\nsample_data['image_name'] = sample_data['id']+'.jpg'\nsample_data['image_path'] = [os.path.join(cfg.TEST_FILES,val) for val in sample_data['image_name']]\n\nsample_submission =  pd.read_csv(os.path.join(cfg.PARENT_PATH,'sample_submission.csv'))","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:10:44.937339Z","iopub.execute_input":"2022-11-17T06:10:44.937761Z","iopub.status.idle":"2022-11-17T06:10:46.072912Z","shell.execute_reply.started":"2022-11-17T06:10:44.937721Z","shell.execute_reply":"2022-11-17T06:10:46.071946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create folds for train data","metadata":{}},{"cell_type":"code","source":"skf = model_selection.StratifiedKFold(n_splits=cfg.FOLD_SPLITS,shuffle=True,random_state=cfg.RANDOM_STATE)\n\ntrain_data['kfold'] = 999\ny = train_data['breed'].values\n\nfor f,(tidx,vidx) in enumerate(skf.split(X=train_data,y=y)):\n    train_data.loc[vidx,'kfold'] = f\n    \ntrain_data.to_csv(\"train_folds.csv\", index=False)\n\ntrain_data = pd.read_csv('./train_folds.csv')","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:39.237939Z","iopub.execute_input":"2022-11-17T06:11:39.238314Z","iopub.status.idle":"2022-11-17T06:11:39.322224Z","shell.execute_reply.started":"2022-11-17T06:11:39.238280Z","shell.execute_reply":"2022-11-17T06:11:39.321309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# View Fold Column\ntrain_data.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:40.152984Z","iopub.execute_input":"2022-11-17T06:11:40.153788Z","iopub.status.idle":"2022-11-17T06:11:40.170666Z","shell.execute_reply.started":"2022-11-17T06:11:40.153741Z","shell.execute_reply":"2022-11-17T06:11:40.169800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Some Visualization","metadata":{}},{"cell_type":"code","source":"train_data.groupby('breed')['breed'] \\\n    .count() \\\n    .reset_index(name='count') \\\n    .sort_values(by = 'count',ascending=False) \\\n    .head(20) \\\n    .plot.bar(x = 'breed',y = 'count',figsize=(15,8))\nplt.title('Top 20 Dog Breeds by count')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:41.495240Z","iopub.execute_input":"2022-11-17T06:11:41.495822Z","iopub.status.idle":"2022-11-17T06:11:41.983755Z","shell.execute_reply.started":"2022-11-17T06:11:41.495775Z","shell.execute_reply":"2022-11-17T06:11:41.982818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Dataset Class","metadata":{}},{"cell_type":"code","source":"class DoggoDataset:\n    def __init__(self,df,mode='train',transform=None):\n        self.df = df\n        self.mode = mode\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self,idx):\n        \n        img = Image.open(self.df.loc[:,'image_path'][idx])\n        label = self.df.loc[:,'breed'][idx]\n        \n        if self.transform:\n            img  = self.transform(img)\n            \n        if self.mode=='train':\n            img = img.numpy()\n            return img.astype('float32'), label\n        else:\n            img = img.numpy()\n            return img.astype('float32'), label","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:42.175866Z","iopub.execute_input":"2022-11-17T06:11:42.176384Z","iopub.status.idle":"2022-11-17T06:11:42.192279Z","shell.execute_reply.started":"2022-11-17T06:11:42.176341Z","shell.execute_reply":"2022-11-17T06:11:42.191424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Transformations","metadata":{}},{"cell_type":"code","source":"train_transform = transforms.Compose([\n        transforms.RandomResizedCrop(size=256, scale=(0.95, 1.0)),\n        transforms.RandomRotation(degrees=15),\n        transforms.ColorJitter(),\n        transforms.RandomHorizontalFlip(),\n        transforms.CenterCrop(size=cfg.IMG_SIZE),  # Image net standards\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406],\n                             [0.229, 0.224, 0.225])\n])\n\nval_transform = transforms.Compose([\n      transforms.RandomResizedCrop(size=256, scale=(0.95, 1.0)),\n      transforms.CenterCrop(size=cfg.IMG_SIZE),\n      transforms.ToTensor(),\n      transforms.Normalize([0.485, 0.456, 0.406],\n                          [0.229, 0.224, 0.225])])\n\ntest_transform = transforms.Compose([\n      transforms.RandomResizedCrop(size=256, scale=(0.95, 1.0)),\n      transforms.CenterCrop(size=cfg.IMG_SIZE),\n      transforms.ToTensor(),\n      transforms.Normalize([0.485, 0.456, 0.406],\n                          [0.229, 0.224, 0.225])])","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:42.754555Z","iopub.execute_input":"2022-11-17T06:11:42.754909Z","iopub.status.idle":"2022-11-17T06:11:42.766256Z","shell.execute_reply.started":"2022-11-17T06:11:42.754877Z","shell.execute_reply":"2022-11-17T06:11:42.765190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prepare a sample dataset & dataloader","metadata":{}},{"cell_type":"code","source":"sample_set = DoggoDataset(train_data,mode='train',transform = train_transform)\nsample_loader = DataLoader(sample_set,batch_size=cfg.BATCH_SIZE,shuffle=True,num_workers=0)","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:43.389738Z","iopub.execute_input":"2022-11-17T06:11:43.390031Z","iopub.status.idle":"2022-11-17T06:11:43.394987Z","shell.execute_reply.started":"2022-11-17T06:11:43.390003Z","shell.execute_reply":"2022-11-17T06:11:43.393986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for img,lab in sample_loader:\n    print(img.shape)\n    break","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:43.589764Z","iopub.execute_input":"2022-11-17T06:11:43.590021Z","iopub.status.idle":"2022-11-17T06:11:44.049171Z","shell.execute_reply.started":"2022-11-17T06:11:43.589996Z","shell.execute_reply":"2022-11-17T06:11:44.047797Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# View a batch of data","metadata":{}},{"cell_type":"code","source":"def view_sample_batch(loader,rows,cols):\n    figure = plt.figure(figsize=(15,15))\n    \n    for i in range(1, cols * rows):\n        img,label = next(iter(loader))\n        figure.add_subplot(rows,cols,i)\n        plt.title(label[i])\n        plt.axis(\"off\")\n        plt.imshow(img[i].permute(1, 2, 0),cmap=\"gray\")\n    plt.show()  ","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:44.347920Z","iopub.execute_input":"2022-11-17T06:11:44.348799Z","iopub.status.idle":"2022-11-17T06:11:44.355384Z","shell.execute_reply.started":"2022-11-17T06:11:44.348757Z","shell.execute_reply":"2022-11-17T06:11:44.354314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"view_sample_batch(sample_loader,4,8)","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:44.517712Z","iopub.execute_input":"2022-11-17T06:11:44.517975Z","iopub.status.idle":"2022-11-17T06:11:52.810430Z","shell.execute_reply.started":"2022-11-17T06:11:44.517950Z","shell.execute_reply":"2022-11-17T06:11:52.809326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Model","metadata":{}},{"cell_type":"code","source":"model = models.resnet50(pretrained=True)\n\nfor param in model.parameters():\n    param.requires_grad = False\n\nmodel.fc = nn.Linear(2048,120)\nmodel = model.to(device = cfg.DEVICE)\n","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:11:52.811761Z","iopub.execute_input":"2022-11-17T06:11:52.812067Z","iopub.status.idle":"2022-11-17T06:12:01.982835Z","shell.execute_reply.started":"2022-11-17T06:11:52.812038Z","shell.execute_reply":"2022-11-17T06:12:01.981838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Encoding the Labels into Numeric","metadata":{}},{"cell_type":"code","source":"labels_map = dict()\nfor index, value in enumerate((sample_submission).columns[1:]):\n    labels_map[value] = index","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:01.984278Z","iopub.execute_input":"2022-11-17T06:12:01.984863Z","iopub.status.idle":"2022-11-17T06:12:01.990442Z","shell.execute_reply.started":"2022-11-17T06:12:01.984822Z","shell.execute_reply":"2022-11-17T06:12:01.989452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mapping the Train Labels","metadata":{}},{"cell_type":"code","source":"train_data['breed'] = train_data['breed'].map(labels_map)","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:01.992906Z","iopub.execute_input":"2022-11-17T06:12:01.994661Z","iopub.status.idle":"2022-11-17T06:12:02.002368Z","shell.execute_reply.started":"2022-11-17T06:12:01.994624Z","shell.execute_reply":"2022-11-17T06:12:02.001522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Specify Loss function & Optimizer","metadata":{}},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters())","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:02.003940Z","iopub.execute_input":"2022-11-17T06:12:02.004320Z","iopub.status.idle":"2022-11-17T06:12:02.012692Z","shell.execute_reply.started":"2022-11-17T06:12:02.004286Z","shell.execute_reply":"2022-11-17T06:12:02.011716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Early Stopping Class\nReference : https://github.com/Bjarten/early-stopping-pytorch","metadata":{}},{"cell_type":"code","source":"class EarlyStopping:\n    \"\"\"Early stops the training if validation loss doesn't improve after a given patience.\"\"\"\n    def __init__(self, patience=7, verbose=False, delta=0, path='checkpoint.pt', trace_func=print):\n        \"\"\"\n        Args:\n            patience (int): How long to wait after last time validation loss improved.\n                            Default: 7\n            verbose (bool): If True, prints a message for each validation loss improvement. \n                            Default: False\n            delta (float): Minimum change in the monitored quantity to qualify as an improvement.\n                            Default: 0\n            path (str): Path for the checkpoint to be saved to.\n                            Default: 'checkpoint.pt'\n            trace_func (function): trace print function.\n                            Default: print            \n        \"\"\"\n        self.patience = patience\n        self.verbose = verbose\n        self.counter = 0\n        self.best_score = None\n        self.early_stop = False\n        self.val_loss_min = np.Inf\n        self.delta = delta\n        self.path = path\n        self.trace_func = trace_func\n    def __call__(self, val_loss, model):\n\n        score = -val_loss\n\n        if self.best_score is None:\n            self.best_score = score\n            self.save_checkpoint(val_loss, model)\n        elif score < self.best_score + self.delta:\n            self.counter += 1\n            self.trace_func(f'EarlyStopping counter: {self.counter} out of {self.patience}')\n            if self.counter >= self.patience:\n                self.early_stop = True\n        else:\n            self.best_score = score\n            self.save_checkpoint(val_loss, model)\n            self.counter = 0\n\n    def save_checkpoint(self, val_loss, model):\n        '''Saves model when validation loss decrease.'''\n        if self.verbose:\n            self.trace_func(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')\n        torch.save(model.state_dict(), self.path)\n        self.val_loss_min = val_loss","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:02.015841Z","iopub.execute_input":"2022-11-17T06:12:02.016353Z","iopub.status.idle":"2022-11-17T06:12:02.029031Z","shell.execute_reply.started":"2022-11-17T06:12:02.016325Z","shell.execute_reply":"2022-11-17T06:12:02.028005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train the Model using Early Stopping","metadata":{}},{"cell_type":"code","source":"def train(model,train_loader,valid_loader,patience,n_epochs,criterion,optimizer):\n    \n    # Track training loss as the model train\n    train_losses = []\n    # Track the validation loss as the model train\n    valid_losses = []\n    # Track the average training loss per epoch\n    avg_train_losses = []\n    # Track the average validation loss per epoch\n    avg_valid_losses = []\n    \n    # initialize the early_stopping object\n    early_stopping = EarlyStopping(patience=patience, verbose=True)\n    \n    for epoch in tqdm(range(1,n_epochs+1)):\n        \n        model.train()\n        for batch,(data,target) in enumerate(train_loader,1):\n            data,target = data.to(cfg.DEVICE),target.to(cfg.DEVICE)\n            optimizer.zero_grad()\n            \n            output = model(data)\n            loss = criterion(output,target)\n            \n            loss.backward()\n            optimizer.step()\n            \n            train_losses.append(loss.item())\n            \n        model.eval() # prep model for evaluation\n        for data, target in valid_loader:\n            data,target = data.to(cfg.DEVICE),target.to(cfg.DEVICE)\n            # forward pass: compute predicted outputs by passing inputs to the model\n            output = model(data)\n            # calculate the loss\n            loss = criterion(output, target)\n            # record validation loss\n            valid_losses.append(loss.item())\n            \n        train_loss = np.average(train_losses)\n        valid_loss = np.average(valid_losses)\n        avg_train_losses.append(train_loss)\n        avg_valid_losses.append(valid_loss)\n        \n        epoch_len = len(str(n_epochs))\n        \n        print_msg = (f'[{epoch:>{epoch_len}}/{n_epochs:>{epoch_len}}] ' +\n                     f'train_loss: {train_loss:.5f} ' +\n                     f'valid_loss: {valid_loss:.5f}')\n        \n        print(print_msg)\n        \n        \n        train_losses = []\n        valid_losses = []\n        \n        # early_stopping needs the validation loss to check if it has decresed, \n        # and if it has, it will make a checkpoint of the current model\n        early_stopping(valid_loss, model)\n        \n        if early_stopping.early_stop:\n            print(\"Early stopping\")\n            break\n        \n    # load the last checkpoint with the best model\n    model.load_state_dict(torch.load('checkpoint.pt'))\n    \n    return  model, avg_train_losses, avg_valid_losses","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:02.030521Z","iopub.execute_input":"2022-11-17T06:12:02.031619Z","iopub.status.idle":"2022-11-17T06:12:02.043365Z","shell.execute_reply.started":"2022-11-17T06:12:02.031583Z","shell.execute_reply":"2022-11-17T06:12:02.042439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plot Loss for each fold","metadata":{}},{"cell_type":"code","source":"def plot_loss(fold,train_loss,valid_loss):\n    fig = plt.figure(figsize=(5,5))\n    \n    plt.plot(range(1,len(train_loss)+1),train_loss, label='Training Loss')\n    plt.plot(range(1,len(valid_loss)+1),valid_loss,label='Validation Loss')\n    \n    minposs = valid_loss.index(min(valid_loss))+1 \n    plt.axvline(minposs, linestyle='--', color='r',label='Early Stopping Checkpoint')\n    \n    plt.title(f\"Plot for fold={fold}\")\n    plt.xlabel('epochs')\n    plt.ylabel('loss')\n    plt.ylim(0, 0.5) # consistent scale\n    plt.xlim(0, len(train_loss)+1) # consistent scale\n    plt.grid(True)\n    plt.legend()\n    plt.tight_layout()\n    plt.show()\n    fig.savefig('loss_plot.png', bbox_inches='tight')","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:46.760104Z","iopub.execute_input":"2022-11-17T06:12:46.761122Z","iopub.status.idle":"2022-11-17T06:12:46.769752Z","shell.execute_reply.started":"2022-11-17T06:12:46.761081Z","shell.execute_reply":"2022-11-17T06:12:46.768395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training on folds","metadata":{}},{"cell_type":"code","source":"def train_on_folds(fold):\n    \n    train_df = train_data.query(\"kfold!=@fold\").reset_index(drop=True)\n    val_df = train_data.query(\"kfold==@fold\").reset_index(drop=True)\n    \n    trainset = DoggoDataset(train_df,mode='train',transform = train_transform)\n    train_loader = DataLoader(trainset,batch_size=cfg.BATCH_SIZE,shuffle=True,num_workers=0)\n\n    valset = DoggoDataset(val_df,mode='test',transform = val_transform)\n    val_loader = DataLoader(valset,batch_size=cfg.BATCH_SIZE,shuffle=False,num_workers=0)\n    \n    m,atl,avl = train(model,\n                      train_loader,\n                      val_loader,\n                      cfg.PATIENCE,\n                      cfg.EPOCHES,\n                      criterion,\n                      optimizer)\n    \n    plot_loss(fold,atl,avl)\n    \n    torch.save(m.state_dict(),f\"resnet50_fold_{fold}.bin\")   \n    ","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:12:48.034857Z","iopub.execute_input":"2022-11-17T06:12:48.035309Z","iopub.status.idle":"2022-11-17T06:12:48.047198Z","shell.execute_reply.started":"2022-11-17T06:12:48.035262Z","shell.execute_reply":"2022-11-17T06:12:48.045537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_on_folds(0)\ntrain_on_folds(1)\ntrain_on_folds(2)\ntrain_on_folds(3)\ntrain_on_folds(4)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2022-11-17T06:12:49.036412Z","iopub.execute_input":"2022-11-17T06:12:49.036725Z","iopub.status.idle":"2022-11-17T06:13:14.258458Z","shell.execute_reply.started":"2022-11-17T06:12:49.036696Z","shell.execute_reply":"2022-11-17T06:13:14.257109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Results for test sets","metadata":{}},{"cell_type":"code","source":"def test(model,dataloader,criterion):\n    model.eval()\n    predictions =pd.DataFrame() \n    with torch.no_grad():\n        for data,_ in tqdm(dataloader):\n            data = data.to(cfg.DEVICE)\n            output = model(data)\n            m = nn.Softmax(dim=1)\n            res = m(output)\n            predictions = pd.concat([predictions, pd.DataFrame(torch.Tensor.cpu(res).numpy(), columns = list(labels_map.keys()))], ignore_index=True)\n            \n        return predictions","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:13:20.285496Z","iopub.execute_input":"2022-11-17T06:13:20.285862Z","iopub.status.idle":"2022-11-17T06:13:20.292805Z","shell.execute_reply.started":"2022-11-17T06:13:20.285830Z","shell.execute_reply":"2022-11-17T06:13:20.291649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def test_on_fold(fold):\n    \n    model.load_state_dict(torch.load(f'./resnet50_fold_{fold}.bin'))\n    \n    test_set = DoggoDataset(sample_data,mode='test',transform=test_transform)\n    test_loader = DataLoader(test_set,batch_size=cfg.BATCH_SIZE,shuffle=False,num_workers=0)\n    \n    preds = test(model,test_loader,criterion)\n    \n    return preds","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:13:21.820838Z","iopub.execute_input":"2022-11-17T06:13:21.821248Z","iopub.status.idle":"2022-11-17T06:13:21.827665Z","shell.execute_reply.started":"2022-11-17T06:13:21.821213Z","shell.execute_reply":"2022-11-17T06:13:21.826584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred1 = test_on_fold(0)\npred2 = test_on_fold(1)\npred3 = test_on_fold(2)\npred4 = test_on_fold(3)\npred5 = test_on_fold(4)","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:13:23.012476Z","iopub.execute_input":"2022-11-17T06:13:23.013118Z","iopub.status.idle":"2022-11-17T06:21:34.025579Z","shell.execute_reply.started":"2022-11-17T06:13:23.013083Z","shell.execute_reply":"2022-11-17T06:21:34.024285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_pred = (pred1+pred2+pred3+pred4+pred5)/5","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:21:35.727826Z","iopub.execute_input":"2022-11-17T06:21:35.728990Z","iopub.status.idle":"2022-11-17T06:21:35.743856Z","shell.execute_reply.started":"2022-11-17T06:21:35.728941Z","shell.execute_reply":"2022-11-17T06:21:35.743022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = pd.DataFrame(pd.read_csv('../input/dog-breed-identification/sample_submission.csv')['id'].values, columns=['id'])","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:32:48.487903Z","iopub.execute_input":"2022-11-17T06:32:48.488289Z","iopub.status.idle":"2022-11-17T06:32:48.698623Z","shell.execute_reply.started":"2022-11-17T06:32:48.488256Z","shell.execute_reply":"2022-11-17T06:32:48.697642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_df = pd.concat([ids, final_pred], ignore_index=True, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:32:55.571573Z","iopub.execute_input":"2022-11-17T06:32:55.571928Z","iopub.status.idle":"2022-11-17T06:32:55.578322Z","shell.execute_reply.started":"2022-11-17T06:32:55.571895Z","shell.execute_reply":"2022-11-17T06:32:55.577286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_df.columns = pd.read_csv('../input/dog-breed-identification/sample_submission.csv').columns","metadata":{"execution":{"iopub.status.busy":"2022-11-17T06:33:21.545668Z","iopub.execute_input":"2022-11-17T06:33:21.546252Z","iopub.status.idle":"2022-11-17T06:33:21.893657Z","shell.execute_reply.started":"2022-11-17T06:33:21.546204Z","shell.execute_reply":"2022-11-17T06:33:21.892591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_df.to_csv('submit_resnet50.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2022-11-16T14:10:27.808204Z","iopub.execute_input":"2022-11-16T14:10:27.808744Z","iopub.status.idle":"2022-11-16T14:10:28.962297Z","shell.execute_reply.started":"2022-11-16T14:10:27.808702Z","shell.execute_reply":"2022-11-16T14:10:28.961338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}