{"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":"This code is inspired/heavily borrowed/copied  with minor edits from:https://www.kaggle.com/code/konradszafer/paddy-disease-pytorch-acc-98-0  and https://pytorch.org/tutorials/beginner/finetuning_torchvision_models_tutorial.html\nAll credits to the orginal authors\n","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nfrom matplotlib import pyplot as plt\nimport seaborn as sb\nimport cv2\nfrom torch.utils.data import Dataset, DataLoader\nimport io\nimport os\nfrom PIL import Image","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:45.47066Z","iopub.execute_input":"2022-07-18T03:21:45.471081Z","iopub.status.idle":"2022-07-18T03:21:47.738612Z","shell.execute_reply.started":"2022-07-18T03:21:45.471044Z","shell.execute_reply":"2022-07-18T03:21:47.7374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from __future__ import print_function \nfrom __future__ import division\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport numpy as np\nimport torchvision\nfrom torchvision import datasets, models, transforms\nimport matplotlib.pyplot as plt\nimport time\nimport os\nimport copy\nprint(\"PyTorch Version: \",torch.__version__)\nprint(\"Torchvision Version: \",torchvision.__version__)","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:47.740282Z","iopub.execute_input":"2022-07-18T03:21:47.74076Z","iopub.status.idle":"2022-07-18T03:21:47.99343Z","shell.execute_reply.started":"2022-07-18T03:21:47.740733Z","shell.execute_reply":"2022-07-18T03:21:47.992327Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir='../input/paddy-disease-classification/train_images'\ntest_dir='../input/paddy-disease-classification/test_images'","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:50.38795Z","iopub.execute_input":"2022-07-18T03:21:50.388284Z","iopub.status.idle":"2022-07-18T03:21:50.392991Z","shell.execute_reply.started":"2022-07-18T03:21:50.388255Z","shell.execute_reply":"2022-07-18T03:21:50.391714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data_path = '../input/paddy-disease-classification/train.csv'\ntrain_data = pd.read_csv(train_data_path)\n\ntrain_data.head(5)","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:52.627876Z","iopub.execute_input":"2022-07-18T03:21:52.628223Z","iopub.status.idle":"2022-07-18T03:21:52.667321Z","shell.execute_reply.started":"2022-07-18T03:21:52.628194Z","shell.execute_reply":"2022-07-18T03:21:52.666299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_cols = 4\ndisease_groups = train_data.groupby(\"label\")\nrow_count=1\nfor name,disease_group in disease_groups:\n    index =0\n    plot_index = 1\n    plt.figure(figsize=(20,120))\n    for row_index,row in disease_group.iterrows():\n        img_path = os.path.join(train_dir,row.label, row.image_id)\n        img = cv2.imread(img_path)\n        plt.subplot(4,4,  plot_index)\n        plot_index += 1\n        plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))\n        plt.title(f\"{row.label}\")\n        index += 1\n        if index == 4:\n            break\n    row_count += 1\n    plt.show()\n        ","metadata":{"execution":{"iopub.status.busy":"2022-07-15T04:56:00.310025Z","iopub.execute_input":"2022-07-15T04:56:00.310886Z","iopub.status.idle":"2022-07-15T04:56:11.072843Z","shell.execute_reply.started":"2022-07-15T04:56:00.310836Z","shell.execute_reply":"2022-07-15T04:56:11.07121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labelArr = train_data['label'].unique()\n\nlabel2id = {}\nid2label = {}\nindex = 0\nfor  class_name in labelArr:\n    label2id[class_name] = str(index)\n    id2label[str(index)] = class_name\n    index=index +1\nprint(label2id)","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:55.797472Z","iopub.execute_input":"2022-07-18T03:21:55.798108Z","iopub.status.idle":"2022-07-18T03:21:55.812553Z","shell.execute_reply.started":"2022-07-18T03:21:55.798072Z","shell.execute_reply":"2022-07-18T03:21:55.811419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Models to choose from [resnet, alexnet, vgg, squeezenet, densenet, inception]\nmodel_name = \"resnet\"\n\n# Number of classes in the dataset\nnum_classes = 10\n\n# Batch size for training (change depending on how much memory you have)\nbatch_size = 128\n\n# Number of epochs to train for \nnum_epochs = 100\n\n# Flag for feature extracting. When False, we finetune the whole model, \n#   when True we only update the reshaped layer params\nfeature_extract = False","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:57.899786Z","iopub.execute_input":"2022-07-18T03:21:57.900128Z","iopub.status.idle":"2022-07-18T03:21:57.907873Z","shell.execute_reply.started":"2022-07-18T03:21:57.9001Z","shell.execute_reply":"2022-07-18T03:21:57.906964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain, valid = train_test_split(train_data, test_size=0.05,random_state=0)\nprint(len(train))\nprint(len(valid))","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:59.715683Z","iopub.execute_input":"2022-07-18T03:21:59.716027Z","iopub.status.idle":"2022-07-18T03:21:59.742421Z","shell.execute_reply.started":"2022-07-18T03:21:59.715996Z","shell.execute_reply":"2022-07-18T03:21:59.741447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['label'].value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"class PaddyDataset(Dataset):\n    \n    def __init__(self, dataframe, root_dir,is_train, transform=None):\n        self.dataframe = dataframe\n        self.root_dir = root_dir\n        self.transform = transform\n        self.is_train = is_train \n        \n    def __len__(self):\n        return len(self.dataframe)\n    \n    def __getitem__(self, idx):\n        if torch.is_tensor(idx):\n            idx = idx.tolist()\n\n        img_name = os.path.join(self.root_dir,self.dataframe.iloc[idx, 1],\n                                self.dataframe.iloc[idx, 0])\n        image1 = cv2.imread(img_name)\n        image = Image.fromarray(image1)\n        if self.is_train:\n            labelKey = self.dataframe.iloc[idx, 1]\n            label = torch.tensor(int(label2id[labelKey]))\n            \n        else:\n            label =torch.tensor(1)\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image,label","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:22:02.284141Z","iopub.execute_input":"2022-07-18T03:22:02.284477Z","iopub.status.idle":"2022-07-18T03:22:02.294508Z","shell.execute_reply.started":"2022-07-18T03:22:02.284447Z","shell.execute_reply":"2022-07-18T03:22:02.293288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"input_size =224\ntransform_train = transforms.Compose([\n        transforms.RandomVerticalFlip(0.7),\n        transforms.RandomHorizontalFlip(0.8),\n        transforms.RandomRotation(60),\n        transforms.Resize((224,224)),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n    ])\ntransform_valid =      transforms.Compose([\n        transforms.Resize((224,224)),\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n    ])","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:22:05.443897Z","iopub.execute_input":"2022-07-18T03:22:05.444235Z","iopub.status.idle":"2022-07-18T03:22:05.451062Z","shell.execute_reply.started":"2022-07-18T03:22:05.444205Z","shell.execute_reply":"2022-07-18T03:22:05.450136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = PaddyDataset( train,root_dir='../input/paddy-disease-classification/train_images', is_train=True, transform=transform_train)\nvalid_dataset = PaddyDataset( valid,root_dir='../input/paddy-disease-classification/train_images', is_train=True, transform=transform_valid)\ntrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, num_workers=2, shuffle=True)\nval_loader =torch.utils.data.DataLoader(valid_dataset, batch_size=batch_size, num_workers=2)\ndataloaders_dict ={}\ndataloaders_dict['train']= train_loader\ndataloaders_dict['val'] = val_loader","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:22:07.972406Z","iopub.execute_input":"2022-07-18T03:22:07.973044Z","iopub.status.idle":"2022-07-18T03:22:07.980027Z","shell.execute_reply.started":"2022-07-18T03:22:07.972995Z","shell.execute_reply":"2022-07-18T03:22:07.978682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\ndef mean_std(loader):\n  images, labels = next(iter(loader))\n  # shape of images = [b,c,w,h]\n  mean, std = images.mean([0,2,3]), images.std([0,2,3])\n  return mean, std\n\nmean, std = mean_std(dataloaders_dict['train'])\nprint(\"mean and std: \\n\", mean, std)\n'''","metadata":{"execution":{"iopub.status.busy":"2022-07-17T05:35:02.045429Z","iopub.execute_input":"2022-07-17T05:35:02.045767Z","iopub.status.idle":"2022-07-17T05:35:12.049324Z","shell.execute_reply.started":"2022-07-17T05:35:02.045738Z","shell.execute_reply":"2022-07-17T05:35:12.047384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_features, train_labels = next(iter(train_loader))\nprint(f\"Feature batch shape: {train_features.size()}\")\nprint(f\"Labels batch shape: {train_labels.size()}\")\nimg = train_features[1].squeeze()\nimg = (img.T).detach().numpy()\nlabel = train_labels[0]\nplt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))\nplt.show()\nprint(f\"Label: {label}\")","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:21:32.461697Z","iopub.execute_input":"2022-07-18T03:21:32.462125Z","iopub.status.idle":"2022-07-18T03:21:32.491999Z","shell.execute_reply.started":"2022-07-18T03:21:32.462087Z","shell.execute_reply":"2022-07-18T03:21:32.490273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_model(model, dataloaders, criterion, optimizer, num_epochs=25, is_inception=False):\n    since = time.time()\n\n    val_acc_history = []\n    \n    best_model_wts = copy.deepcopy(model.state_dict())\n    best_acc = 0.0\n\n    for epoch in range(num_epochs):\n        print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n        print('-' * 10)\n\n        # Each epoch has a training and validation phase\n        for phase in ['train', 'val']:\n            if phase == 'train':\n                model.train()  # Set model to training mode\n            else:\n                model.eval()   # Set model to evaluate mode\n\n            running_loss = 0.0\n            running_corrects = 0\n\n            # Iterate over data.\n            for inputs, labels in dataloaders[phase]:\n                #print(inputs)\n                #print(labels)\n                inputs = inputs.to(device)\n                labels = labels.to(device)\n\n                # zero the parameter gradients\n                optimizer.zero_grad()\n\n                # forward\n                # track history if only in train\n                with torch.set_grad_enabled(phase == 'train'):\n                    # Get model outputs and calculate loss\n                    # Special case for inception because in training it has an auxiliary output. In train\n                    #   mode we calculate the loss by summing the final output and the auxiliary output\n                    #   but in testing we only consider the final output.\n                    if is_inception and phase == 'train':\n                        # From https://discuss.pytorch.org/t/how-to-optimize-inception-model-with-auxiliary-classifiers/7958\n                        outputs, aux_outputs = model(inputs)\n                        loss1 = criterion(outputs, labels)\n                        loss2 = criterion(aux_outputs, labels)\n                        loss = loss1 + 0.4*loss2\n                    else:\n                        outputs = model(inputs)\n                        loss = criterion(outputs, labels)\n\n                    _, preds = torch.max(outputs, 1)\n\n                    # backward + optimize only if in training phase\n                    if phase == 'train':\n                        loss.backward()\n                        optimizer.step()\n\n                # statistics\n                running_loss += loss.item() * inputs.size(0)\n                running_corrects += torch.sum(preds == labels.data)\n\n            epoch_loss = running_loss / len(dataloaders[phase].dataset)\n            epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)\n\n            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))\n\n            # deep copy the model\n            if phase == 'val' and epoch_acc > best_acc:\n                best_acc = epoch_acc\n                best_model_wts = copy.deepcopy(model.state_dict())\n            if phase == 'val':\n                val_acc_history.append(epoch_acc)\n\n        print()\n\n    time_elapsed = time.time() - since\n    print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))\n    print('Best val Acc: {:4f}'.format(best_acc))\n\n    # load best model weights\n    model.load_state_dict(best_model_wts)\n    return model, val_acc_history\n","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:22:13.855667Z","iopub.execute_input":"2022-07-18T03:22:13.856183Z","iopub.status.idle":"2022-07-18T03:22:13.872339Z","shell.execute_reply.started":"2022-07-18T03:22:13.856145Z","shell.execute_reply":"2022-07-18T03:22:13.87106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def set_parameter_requires_grad(model, feature_extracting):\n    if feature_extracting:\n        for param in model.parameters():\n            param.requires_grad = False","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:22:15.421915Z","iopub.execute_input":"2022-07-18T03:22:15.422252Z","iopub.status.idle":"2022-07-18T03:22:15.427323Z","shell.execute_reply.started":"2022-07-18T03:22:15.422223Z","shell.execute_reply":"2022-07-18T03:22:15.426422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):\n    # Initialize these variables which will be set in this if statement. Each of these\n    #   variables is model specific.\n    model_ft = None\n    input_size = 0\n\n    if model_name == \"resnet\":\n        \"\"\" Resnet18\n        \"\"\"\n        #models.resnet.model_urls[\"resnet50\"] = \"https://download.pytorch.org/models/resnet50-11ad3fa6.pth\"\n        model_ft = models.resnet18(pretrained=use_pretrained)\n        set_parameter_requires_grad(model_ft, feature_extract)\n        num_ftrs = model_ft.fc.in_features\n        \n        model_ft.fc =  nn.Sequential(nn.Dropout(0.1),\n                                     nn.Linear(num_ftrs, num_classes)\n                                    )\n        input_size = 224\n\n    elif model_name == \"alexnet\":\n        \"\"\" Alexnet\n        \"\"\"\n        model_ft = models.alexnet(pretrained=use_pretrained)\n        set_parameter_requires_grad(model_ft, feature_extract)\n        num_ftrs = model_ft.classifier[6].in_features\n        model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)\n        input_size = 224\n\n    elif model_name == \"vgg\":\n        \"\"\" VGG11_bn\n        \"\"\"\n        model_ft = models.vgg11_bn(pretrained=use_pretrained)\n        set_parameter_requires_grad(model_ft, feature_extract)\n        num_ftrs = model_ft.classifier[6].in_features\n        model_ft.classifier[6] =  nn.Sequential(nn.Dropout(0.1),\n                                     nn.Linear(num_ftrs, num_classes)\n                                    )\n        input_size = 224\n\n    elif model_name == \"squeezenet\":\n        \"\"\" Squeezenet\n        \"\"\"\n        model_ft = models.squeezenet1_0(pretrained=use_pretrained)\n        set_parameter_requires_grad(model_ft, feature_extract)\n        model_ft.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1,1), stride=(1,1))\n        model_ft.num_classes = num_classes\n        \n        input_size = 224\n\n    elif model_name == \"densenet\":\n        \"\"\" Densenet\n        \"\"\"\n        model_ft = models.densenet121(pretrained=use_pretrained)\n        set_parameter_requires_grad(model_ft, feature_extract)\n        num_ftrs = model_ft.classifier.in_features\n        model_ft.classifier = nn.Linear(num_ftrs, num_classes) \n        input_size = 224\n\n    elif model_name == \"inception\":\n        \"\"\" Inception v3 \n        Be careful, expects (299,299) sized images and has auxiliary output\n        \"\"\"\n        model_ft = models.inception_v3(pretrained=use_pretrained)\n        set_parameter_requires_grad(model_ft, feature_extract)\n        # Handle the auxilary net\n        num_ftrs = model_ft.AuxLogits.fc.in_features\n        model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)\n        # Handle the primary net\n        num_ftrs = model_ft.fc.in_features\n        model_ft.fc = nn.Linear(num_ftrs,num_classes)\n        input_size = 299\n    \n\n    else:\n        print(\"Invalid model name, exiting...\")\n        exit()\n    \n    return model_ft, input_size\n\n# Initialize the model for this run\nmodel_ft, input_size = initialize_model(model_name, num_classes, feature_extract, use_pretrained=True)\n\n# Print the model we just instantiated\nprint(model_ft)\n","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:38:15.41846Z","iopub.execute_input":"2022-07-18T03:38:15.41907Z","iopub.status.idle":"2022-07-18T03:38:15.481935Z","shell.execute_reply.started":"2022-07-18T03:38:15.419032Z","shell.execute_reply":"2022-07-18T03:38:15.480877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Send the model to GPU\ntorch.manual_seed(1)\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nif device == 'cuda':\n    torch.backends.cudnn.benchmark = True\nprint(f'using {device} device')\n#device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel_ft = model_ft.to(device)\n\n# Gather the parameters to be optimized/updated in this run. If we are\n#  finetuning we will be updating all parameters. However, if we are \n#  doing feature extract method, we will only update the parameters\n#  that we have just initialized, i.e. the parameters with requires_grad\n#  is True.\nparams_to_update = model_ft.parameters()\nprint(\"Params to learn:\")\nif feature_extract:\n    params_to_update = []\n    for name,param in model_ft.named_parameters():\n        if param.requires_grad == True:\n            params_to_update.append(param)\n            print(\"\\t\",name)\nelse:\n    for name,param in model_ft.named_parameters():\n        if param.requires_grad == True:\n            print(\"\\t\",name)\n\n# Observe that all parameters are being optimized\noptimizer_ft = optim.SGD(params_to_update, lr=2e-3, momentum=0.9,weight_decay=1e-6, nesterov=True)\n#optimizer_ft = optim.Adam(params_to_update, lr=1e-3)","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:38:26.144944Z","iopub.execute_input":"2022-07-18T03:38:26.145887Z","iopub.status.idle":"2022-07-18T03:38:26.160682Z","shell.execute_reply.started":"2022-07-18T03:38:26.145852Z","shell.execute_reply":"2022-07-18T03:38:26.159747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Setup the loss fxn\ncriterion = nn.CrossEntropyLoss()\n\n# Train and evaluate\nmodel_ft, hist = train_model(model_ft, dataloaders_dict, criterion, optimizer_ft, num_epochs=num_epochs, is_inception=(model_name==\"inception\"))","metadata":{"execution":{"iopub.status.busy":"2022-07-18T03:38:30.172649Z","iopub.execute_input":"2022-07-18T03:38:30.173047Z","iopub.status.idle":"2022-07-18T03:41:03.791932Z","shell.execute_reply.started":"2022-07-18T03:38:30.173013Z","shell.execute_reply":"2022-07-18T03:41:03.790148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"folder = './test_images'\nif not os.path.exists(folder):\n        os.makedirs(folder)\n        \ntest_dataframe = pd.DataFrame(enumerate(sorted(os.listdir(test_dir))))\n\ntest_dataframe.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class PaddyTestDataset(Dataset):\n    \n    def __init__(self, dataframe, root_dir, transform=None):\n        self.dataframe = dataframe\n        self.root_dir = root_dir\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.dataframe)\n    \n    def __getitem__(self, idx):\n        if torch.is_tensor(idx):\n            idx = idx.tolist()\n\n        img_name = os.path.join(self.root_dir,\n                                self.dataframe.iloc[idx, 1])\n        image1 = cv2.imread(img_name)\n        image = Image.fromarray(image1)\n        \n        label =torch.tensor(1)\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image,self.dataframe.iloc[idx, 1]\n","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:03:52.787295Z","iopub.execute_input":"2022-07-11T06:03:52.787643Z","iopub.status.idle":"2022-07-11T06:03:52.796055Z","shell.execute_reply.started":"2022-07-11T06:03:52.787613Z","shell.execute_reply":"2022-07-11T06:03:52.794786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = PaddyTestDataset( test_dataframe,root_dir='../input/paddy-disease-classification/test_images', transform=transform_valid)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:03:59.830023Z","iopub.execute_input":"2022-07-11T06:03:59.830856Z","iopub.status.idle":"2022-07-11T06:03:59.836118Z","shell.execute_reply.started":"2022-07-11T06:03:59.830818Z","shell.execute_reply":"2022-07-11T06:03:59.834923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loader =torch.utils.data.DataLoader(test_dataset, batch_size=64, num_workers=2)","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:04:07.79385Z","iopub.execute_input":"2022-07-11T06:04:07.794207Z","iopub.status.idle":"2022-07-11T06:04:07.799823Z","shell.execute_reply.started":"2022-07-11T06:04:07.794175Z","shell.execute_reply":"2022-07-11T06:04:07.798781Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model_ft.cuda()\nmodel_ft.eval()\nfilenames=[]\nfinalpredictions=[]\nfor inputs, files in test_loader:\n                #print(inputs)\n                #print(files)\n                inputs = inputs.to(device)\n                outputs = model_ft(inputs)\n                _, preds = torch.max(outputs, 1)\n                finalpred=[]\n                for file in files:\n                    filenames.append(file)\n                for pred in preds:\n                    finalpredictions.append(id2label[str(pred.item())])\n                #print(finalpred)\n                ","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:04:11.118696Z","iopub.execute_input":"2022-07-11T06:04:11.119039Z","iopub.status.idle":"2022-07-11T06:04:49.52565Z","shell.execute_reply.started":"2022-07-11T06:04:11.119008Z","shell.execute_reply":"2022-07-11T06:04:49.524465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_preds = pd.DataFrame({'image_id': filenames, \"label\": finalpredictions})\ndf_preds.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:05:35.212921Z","iopub.execute_input":"2022-07-11T06:05:35.213332Z","iopub.status.idle":"2022-07-11T06:05:35.228813Z","shell.execute_reply.started":"2022-07-11T06:05:35.213296Z","shell.execute_reply":"2022-07-11T06:05:35.227839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv(\"../input/paddy-disease-classification/sample_submission.csv\")\n\nsubmission_df = pd.merge(test_df[['image_id']], df_preds, how='inner', on='image_id')\n\nsubmission_df.to_csv(\"submission.csv\", index = False)\n\nsubmission_df.head()\n","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:05:38.683056Z","iopub.execute_input":"2022-07-11T06:05:38.683426Z","iopub.status.idle":"2022-07-11T06:05:38.723586Z","shell.execute_reply.started":"2022-07-11T06:05:38.683393Z","shell.execute_reply":"2022-07-11T06:05:38.72266Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(submission_df))","metadata":{"execution":{"iopub.status.busy":"2022-07-11T06:06:17.243972Z","iopub.execute_input":"2022-07-11T06:06:17.244371Z","iopub.status.idle":"2022-07-11T06:06:17.249939Z","shell.execute_reply.started":"2022-07-11T06:06:17.244338Z","shell.execute_reply":"2022-07-11T06:06:17.248959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.save(model_ft,\"PaddyDoctorResnet.pt\")","metadata":{},"execution_count":null,"outputs":[]}]}