{"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 numpy as np\nimport pandas as pd","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-05-26T17:43:01.792404Z","iopub.execute_input":"2021-05-26T17:43:01.792798Z","iopub.status.idle":"2021-05-26T17:43:01.797261Z","shell.execute_reply.started":"2021-05-26T17:43:01.792713Z","shell.execute_reply":"2021-05-26T17:43:01.796424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/plant-pathology-2021-fgvc8/train.csv').sample(frac=1, random_state=666)\ntrain_df['path'] =  train_df['image'].apply(lambda x: '../input/plant2021-downscaled-images-dataset/' + x)\ntrain_df.head(5)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:01.804743Z","iopub.execute_input":"2021-05-26T17:43:01.805032Z","iopub.status.idle":"2021-05-26T17:43:01.869075Z","shell.execute_reply.started":"2021-05-26T17:43:01.805005Z","shell.execute_reply":"2021-05-26T17:43:01.868044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#train_df.drop_duplicates(['image']).shape","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:01.870912Z","iopub.execute_input":"2021-05-26T17:43:01.871252Z","iopub.status.idle":"2021-05-26T17:43:01.875432Z","shell.execute_reply.started":"2021-05-26T17:43:01.871216Z","shell.execute_reply":"2021-05-26T17:43:01.874375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['label_id'] = train_df['labels'].str.replace('scab', '1').str.replace('rust', '2') \\\n    .str.replace('healthy', '0').str.replace('frog_eye_leaf_spot', '3') \\\n    .str.replace('complex', '4').str.replace('powdery_mildew', '5').str.split(\" \")","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:01.876678Z","iopub.execute_input":"2021-05-26T17:43:01.877302Z","iopub.status.idle":"2021-05-26T17:43:01.980418Z","shell.execute_reply.started":"2021-05-26T17:43:01.877261Z","shell.execute_reply":"2021-05-26T17:43:01.979661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df['label_id'] = [[int(j) for j in i] for i in train_df['label_id'].values]","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:01.981881Z","iopub.execute_input":"2021-05-26T17:43:01.982231Z","iopub.status.idle":"2021-05-26T17:43:02.011422Z","shell.execute_reply.started":"2021-05-26T17:43:01.982197Z","shell.execute_reply":"2021-05-26T17:43:02.010627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from random import sample","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.014572Z","iopub.execute_input":"2021-05-26T17:43:02.015144Z","iopub.status.idle":"2021-05-26T17:43:02.019028Z","shell.execute_reply.started":"2021-05-26T17:43:02.015108Z","shell.execute_reply":"2021-05-26T17:43:02.018024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"valid_df = train_df.iloc[17000:, :]\ntrain_df = train_df.iloc[:17000, :]#.sample(200000, replace=True).groupby('labels').head(4500)#.shape","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.020614Z","iopub.execute_input":"2021-05-26T17:43:02.021209Z","iopub.status.idle":"2021-05-26T17:43:02.030176Z","shell.execute_reply.started":"2021-05-26T17:43:02.021172Z","shell.execute_reply":"2021-05-26T17:43:02.029275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#from sklearn.preprocessing import LabelEncoder\n\n#label = LabelEncoder()\n#label.fit(train_df['labels'])\n#train_df['label_id'] = label.transform(train_df['labels'])\n#label_dic = dict(sorted(train_df[['label_id', 'labels']].values.tolist())) #save for submission\nlabel_dic = {\n    0: 'healthy', \n    1: 'scab',\n    2: 'rust',\n    3: 'frog_eye_leaf_spot',\n    4: 'complex', \n    5: 'powdery_mildew'\n}\nprint(label_dic)\nclasses = 6#len(train_df['labels'].value_counts()) #12\n\ndel train_df['labels'] \n\nimage_labels = np.array(train_df['label_id'].values)\nimage_list = np.array(train_df['path'].values)\n\nimage_labels_v = np.array(valid_df['label_id'].values)\nimage_list_v = np.array(valid_df['path'].values)\n\nprint(image_list.shape) #18632","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.031557Z","iopub.execute_input":"2021-05-26T17:43:02.031890Z","iopub.status.idle":"2021-05-26T17:43:02.045561Z","shell.execute_reply.started":"2021-05-26T17:43:02.031857Z","shell.execute_reply":"2021-05-26T17:43:02.044606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.047332Z","iopub.execute_input":"2021-05-26T17:43:02.047760Z","iopub.status.idle":"2021-05-26T17:43:02.054529Z","shell.execute_reply.started":"2021-05-26T17:43:02.047727Z","shell.execute_reply":"2021-05-26T17:43:02.053339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"[5193 / sum([j in i for i in list(image_labels)]) for j in range(6)]","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.063536Z","iopub.execute_input":"2021-05-26T17:43:02.063920Z","iopub.status.idle":"2021-05-26T17:43:02.080062Z","shell.execute_reply.started":"2021-05-26T17:43:02.063887Z","shell.execute_reply":"2021-05-26T17:43:02.079007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cls_weight = [1.24, 1.0001, 2.72, 1.31, 2.61, 4.4]\ncls_weight","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.082208Z","iopub.execute_input":"2021-05-26T17:43:02.082642Z","iopub.status.idle":"2021-05-26T17:43:02.090023Z","shell.execute_reply.started":"2021-05-26T17:43:02.082607Z","shell.execute_reply":"2021-05-26T17:43:02.088887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!apt install ../input/pyturbojpeg/libturbojpeg_1.4.2-0ubuntu3.4_amd64.deb\n!pip install ../input/pyturbojpeg/PyTurboJPEG-1.4.1","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:02.091678Z","iopub.execute_input":"2021-05-26T17:43:02.092126Z","iopub.status.idle":"2021-05-26T17:43:34.827208Z","shell.execute_reply.started":"2021-05-26T17:43:02.092094Z","shell.execute_reply":"2021-05-26T17:43:34.826380Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport albumentations as A\nimport cv2, torch\nimport torchvision.transforms as transforms\nfrom tqdm.notebook import tqdm\nfrom torch.utils.data import Dataset, DataLoader\nfrom turbojpeg import TurboJPEG\n\ndevice = torch.device('cuda' if torch.cuda.is_available else 'cpu')\n\n#######################################\n\nfrom albumentations.pytorch import ToTensor\n\ndef get_training_augmentation():\n    \n    augmentation_pipeline = A.Compose(\n        [\n            A.OneOf([\n                A.Compose([\n                    A.SmallestMaxSize(224),\n                    A.RandomCrop(224, 224),\n                ], p=1),\n                A.Compose([\n                    A.SmallestMaxSize(400),\n                    A.RandomCrop(224, 224),\n                ], p=1)\n            ], p=1),\n            \n            A.OneOf(\n                [\n                    A.RandomGamma(), \n                    A.RandomBrightness(), \n                    A.RandomContrast(), \n                    A.Blur(blur_limit=10),\n                    A.GaussNoise()\n                ],\n                p = 0.4\n            ),\n            A.OneOf(\n                [\n                    A.Rotate(limit = 360), \n                    A.Flip(p = 0.5),\n                ],\n                p = 0.4\n            ),\n            A.Normalize(\n                mean=[0.485, 0.456, 0.406],\n                std=[0.229, 0.224, 0.225]\n                ),\n            ToTensor() \n        ],\n        p = 1\n    )\n    return lambda img:augmentation_pipeline(image=np.array(img))['image']\n\n\n\ndef transform_valid():\n    \n    augmentation_pipeline = A.Compose(\n        [\n            A.SmallestMaxSize(224),\n            A.RandomCrop(224, 224),\n            A.Normalize(\n                mean=[0.485, 0.456, 0.406],\n                std=[0.229, 0.224, 0.225]\n                ),\n            ToTensor() \n        ],\n        p = 1\n    )\n    return lambda img:augmentation_pipeline(image=np.array(img))['image']\n\n######################################\n\njpeg_reader = TurboJPEG()\n\ndef read_img(img):\n    with open(img, \"rb\") as f:\n        return jpeg_reader.decode(f.read(), 0) \n    \n\nclass dataset(Dataset) :\n    def __init__(self, image_list, image_labels, transform, device) :\n        self.image_list = image_list\n        self.image_labels = image_labels\n        self.transform = transform\n    \n    def __len__(self) :\n        return len(self.image_list)\n    \n    def __getitem__(self, index) :\n        x = read_img(self.image_list[index])\n        x = self.transform(x).to(device)\n        \n        y = self.image_labels[index]\n        y = torch.nn.functional.one_hot(torch.tensor(y), 6).sum(0).to(device)\n        \n        return x, y\n\n\ntrain_data = dataset(image_list, image_labels, get_training_augmentation(), device)\n\nprint(len(train_data))\n\ntrain_data = DataLoader(train_data, batch_size = 12, shuffle = True)\n\n##########\n# validation loader\nvalid_data = dataset(image_list_v, image_labels_v, transform_valid(), device)\nprint(len(valid_data))\nvalid_data = DataLoader(valid_data, batch_size = 12, shuffle = True)\n########","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:34.832150Z","iopub.execute_input":"2021-05-26T17:43:34.832448Z","iopub.status.idle":"2021-05-26T17:43:38.378019Z","shell.execute_reply.started":"2021-05-26T17:43:34.832420Z","shell.execute_reply":"2021-05-26T17:43:38.375859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.nn.functional.one_hot(torch.tensor([1,5]),6).sum(0).view(1,6)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:38.380169Z","iopub.execute_input":"2021-05-26T17:43:38.380446Z","iopub.status.idle":"2021-05-26T17:43:38.426021Z","shell.execute_reply.started":"2021-05-26T17:43:38.380419Z","shell.execute_reply":"2021-05-26T17:43:38.425091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#next(iter(train_data))","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:38.427700Z","iopub.execute_input":"2021-05-26T17:43:38.428060Z","iopub.status.idle":"2021-05-26T17:43:38.431892Z","shell.execute_reply.started":"2021-05-26T17:43:38.428025Z","shell.execute_reply":"2021-05-26T17:43:38.431067Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataloaders = {\n    'train': train_data , \n    'val': valid_data\n}\n\ndataset_sizes = {\n    'train': 17000, \n    'val': 1632\n}","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:38.433726Z","iopub.execute_input":"2021-05-26T17:43:38.434139Z","iopub.status.idle":"2021-05-26T17:43:38.445041Z","shell.execute_reply.started":"2021-05-26T17:43:38.434100Z","shell.execute_reply":"2021-05-26T17:43:38.442507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def gallery(array, ncols=3):\n    nindex, height, width, intensity = array.shape\n    nrows = nindex//ncols\n    assert nindex == nrows*ncols\n    result = (array.reshape(nrows, ncols, height, width, intensity)\n              .swapaxes(1,2)\n              .reshape(height*nrows, width*ncols, intensity))\n    return result","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:38.446744Z","iopub.execute_input":"2021-05-26T17:43:38.447015Z","iopub.status.idle":"2021-05-26T17:43:38.455854Z","shell.execute_reply.started":"2021-05-26T17:43:38.446990Z","shell.execute_reply":"2021-05-26T17:43:38.454760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#get_training_augmentation()(image).numpy().reshape(1,3,224,224).shape","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:38.457445Z","iopub.execute_input":"2021-05-26T17:43:38.458242Z","iopub.status.idle":"2021-05-26T17:43:38.465535Z","shell.execute_reply.started":"2021-05-26T17:43:38.458141Z","shell.execute_reply":"2021-05-26T17:43:38.464413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image = read_img('../input/plant2021-downscaled-images-dataset/800edef467d27c15.jpg')\n\nimages_aug = np.array([(get_training_augmentation()(image)).permute((1,2,0)).numpy() for _ in range(25)])\n\nplt.figure(figsize=(10,10))\nplt.axis('off')\nplt.imshow(gallery(images_aug, ncols = 5))\nplt.title('Augmentation pipeline examples')","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:38.466985Z","iopub.execute_input":"2021-05-26T17:43:38.467455Z","iopub.status.idle":"2021-05-26T17:43:39.139384Z","shell.execute_reply.started":"2021-05-26T17:43:38.467418Z","shell.execute_reply":"2021-05-26T17:43:39.138300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(image)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:39.140665Z","iopub.execute_input":"2021-05-26T17:43:39.141017Z","iopub.status.idle":"2021-05-26T17:43:39.364565Z","shell.execute_reply.started":"2021-05-26T17:43:39.140985Z","shell.execute_reply":"2021-05-26T17:43:39.363651Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\n\nsys.path.append(\"../input/efficientnet-pytorch/EfficientNet-PyTorch/EfficientNet-PyTorch-master\")\n\nfrom efficientnet_pytorch import model as enet","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:39.365788Z","iopub.execute_input":"2021-05-26T17:43:39.366302Z","iopub.status.idle":"2021-05-26T17:43:39.416123Z","shell.execute_reply.started":"2021-05-26T17:43:39.366259Z","shell.execute_reply":"2021-05-26T17:43:39.415379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = enet.EfficientNet.from_name('efficientnet-b0')\n\nmodel.load_state_dict(torch.load('../input/efficientnet-pytorch/efficientnet-b0-08094119.pth'))","metadata":{"execution":{"iopub.status.busy":"2021-05-26T17:43:39.417611Z","iopub.execute_input":"2021-05-26T17:43:39.417995Z","iopub.status.idle":"2021-05-26T17:43:40.197282Z","shell.execute_reply.started":"2021-05-26T17:43:39.417960Z","shell.execute_reply":"2021-05-26T17:43:40.196395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model\n\n\n#np.array([0.99, 0.9, 0.92, 0.2, 0.7, 0.6]).mean()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:37.562028Z","iopub.execute_input":"2021-05-26T09:36:37.56234Z","iopub.status.idle":"2021-05-26T09:36:37.568465Z","shell.execute_reply.started":"2021-05-26T09:36:37.562313Z","shell.execute_reply":"2021-05-26T09:36:37.565301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\n\nclass FocalLoss(nn.Module):\n    \"\"\"\n    The focal loss for fighting against class-imbalance\n    \"\"\"\n    def __init__(self, alpha=1, gamma=2):\n        super(FocalLoss, self).__init__()\n        self.alpha = alpha\n        self.gamma = gamma\n        self.epsilon = 1e-12  # prevent training from Nan-loss error\n        self.cls_weights = torch.tensor([cls_weight],dtype=torch.float, requires_grad=False, device=device)\n\n    def forward(self, logits, target):\n        \"\"\"\n        logits & target should be tensors with shape [batch_size, num_classes]\n        \"\"\"\n        probs = torch.sigmoid(logits)\n        one_subtract_probs = 1.0 - probs\n        # add epsilon\n        probs_new = probs + self.epsilon\n        one_subtract_probs_new = one_subtract_probs + self.epsilon\n        # calculate focal loss\n        log_pt = target * torch.log(probs_new) + (1.0 - target) * torch.log(one_subtract_probs_new)\n        pt = torch.exp(log_pt)\n        focal_loss = -1.0 * (self.alpha * (1 - pt) ** self.gamma) * log_pt\n        focal_loss = focal_loss * self.cls_weights\n        return torch.mean(focal_loss)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:37.570534Z","iopub.execute_input":"2021-05-26T09:36:37.570967Z","iopub.status.idle":"2021-05-26T09:36:37.580895Z","shell.execute_reply.started":"2021-05-26T09:36:37.570872Z","shell.execute_reply":"2021-05-26T09:36:37.579766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import f1_score","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:37.582506Z","iopub.execute_input":"2021-05-26T09:36:37.582928Z","iopub.status.idle":"2021-05-26T09:36:37.72981Z","shell.execute_reply.started":"2021-05-26T09:36:37.582876Z","shell.execute_reply":"2021-05-26T09:36:37.729075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model._fc.in_features","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:37.731918Z","iopub.execute_input":"2021-05-26T09:36:37.732172Z","iopub.status.idle":"2021-05-26T09:36:37.741635Z","shell.execute_reply.started":"2021-05-26T09:36:37.732147Z","shell.execute_reply":"2021-05-26T09:36:37.740577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model._fc = nn.Linear(in_features=model._fc.in_features, out_features=6).cuda()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:37.743227Z","iopub.execute_input":"2021-05-26T09:36:37.743635Z","iopub.status.idle":"2021-05-26T09:36:41.703673Z","shell.execute_reply.started":"2021-05-26T09:36:37.743598Z","shell.execute_reply":"2021-05-26T09:36:41.702845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(list(model.parameters()))","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:41.705015Z","iopub.execute_input":"2021-05-26T09:36:41.705348Z","iopub.status.idle":"2021-05-26T09:36:41.717222Z","shell.execute_reply.started":"2021-05-26T09:36:41.705307Z","shell.execute_reply":"2021-05-26T09:36:41.716184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch.nn as nn\nfrom torch.optim import Adam\nfrom torch.optim import lr_scheduler\n\n#model._fc.out_features = classes #change the last FC layer\n\nmodel = model.to(device)\ncriterion = FocalLoss().to(device) #nn.CrossEntropyLoss().to(device) nn.BCEWithLogitsLoss().to(device)#\noptimizer = torch.optim.Adam(model.parameters(), lr = 0.0001) # lr, SGD\n\nexp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:41.718958Z","iopub.execute_input":"2021-05-26T09:36:41.719366Z","iopub.status.idle":"2021-05-26T09:36:41.762235Z","shell.execute_reply.started":"2021-05-26T09:36:41.719264Z","shell.execute_reply":"2021-05-26T09:36:41.761558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_sizes","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:41.763544Z","iopub.execute_input":"2021-05-26T09:36:41.763892Z","iopub.status.idle":"2021-05-26T09:36:41.771681Z","shell.execute_reply.started":"2021-05-26T09:36:41.763843Z","shell.execute_reply":"2021-05-26T09:36:41.770709Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion((model(next(iter(train_data))[0])), next(iter(train_data))[1].float())","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:41.773123Z","iopub.execute_input":"2021-05-26T09:36:41.773455Z","iopub.status.idle":"2021-05-26T09:36:42.790145Z","shell.execute_reply.started":"2021-05-26T09:36:41.773411Z","shell.execute_reply":"2021-05-26T09:36:42.78946Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def to_lab(preds):\n    return ((preds > 0) + torch.nn.functional.one_hot(preds.argmax(1), 6) != 0).long()\n\na, b = next(iter(train_data))\n\npreds = to_lab(model(a))\n((preds == b).sum(1)==6).sum(), f1_score(preds.cpu(), b.cpu(), average='macro', zero_division=True)#/72\n#preds\n#(preds == next(iter(train_data))[1]).sum()/72,torch.sum((preds == next(iter(train_data))[1]).float().mean()*6)/12\n#","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:42.791486Z","iopub.execute_input":"2021-05-26T09:36:42.79181Z","iopub.status.idle":"2021-05-26T09:36:43.02138Z","shell.execute_reply.started":"2021-05-26T09:36:42.791776Z","shell.execute_reply":"2021-05-26T09:36:43.020689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(preds+torch.nn.functional.one_hot(model(a).argmax(1), 6) != 0).long()","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:43.022788Z","iopub.execute_input":"2021-05-26T09:36:43.023154Z","iopub.status.idle":"2021-05-26T09:36:43.060461Z","shell.execute_reply.started":"2021-05-26T09:36:43.023118Z","shell.execute_reply":"2021-05-26T09:36:43.059512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(model(a) > 0).sum(1)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:43.061858Z","iopub.execute_input":"2021-05-26T09:36:43.062231Z","iopub.status.idle":"2021-05-26T09:36:43.097211Z","shell.execute_reply.started":"2021-05-26T09:36:43.062195Z","shell.execute_reply":"2021-05-26T09:36:43.096378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(preds*b).sum(dim=0)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:43.098759Z","iopub.execute_input":"2021-05-26T09:36:43.099117Z","iopub.status.idle":"2021-05-26T09:36:43.106502Z","shell.execute_reply.started":"2021-05-26T09:36:43.099081Z","shell.execute_reply":"2021-05-26T09:36:43.105639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\nimport copy\n\ndef train_model(model, criterion, optimizer, scheduler, num_epochs=20):\n    since = time.time()\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                optimizer.step()\n                scheduler.step()\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            f1l = 0\n\n            # Iterate over data.\n            for inputs, labels in tqdm(dataloaders[phase]):\n                inputs = inputs.to(device)\n                labels = labels.to(device) #\n                #print(labels)\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                    outputs = model(inputs)\n                    #outputs = torch.nn.Sigmoid()(outputs)\n                    #_, preds = torch.max(outputs, 1)\n                    preds = to_lab(outputs)\n                    loss = criterion(outputs, labels.float())\n\n                    # backward + optimize only if in training phase\n                    if phase == 'train':\n                        loss.backward()\n                        optimizer.step()\n                        \n                #torch.cuda.empty_cache()\n\n                # statistics\n                running_loss += loss.item() * inputs.size(0)\n                running_corrects += ((preds == labels.data).sum(1)==6).sum()\n                f1l += f1_score(preds.cpu().numpy(), labels.cpu().numpy(), average='macro', zero_division=True) * inputs.size(0)\n\n            epoch_loss = running_loss / dataset_sizes[phase]\n            epoch_acc = running_corrects.double() / dataset_sizes[phase]\n            epoch_f1 = f1l / dataset_sizes[phase]\n\n            print('{} Loss: {:.4f} Acc: {:.4f} F1: {:.4f}'.format(phase, epoch_loss, epoch_acc, epoch_f1))\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                torch.save(model.state_dict(), 'best_model.pth')\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","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:43.111093Z","iopub.execute_input":"2021-05-26T09:36:43.111493Z","iopub.status.idle":"2021-05-26T09:36:43.124828Z","shell.execute_reply.started":"2021-05-26T09:36:43.111444Z","shell.execute_reply":"2021-05-26T09:36:43.123833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = train_model(model, criterion, optimizer, exp_lr_scheduler, num_epochs=30)","metadata":{"execution":{"iopub.status.busy":"2021-05-26T09:36:58.104687Z","iopub.execute_input":"2021-05-26T09:36:58.105062Z","iopub.status.idle":"2021-05-26T09:49:05.162718Z","shell.execute_reply.started":"2021-05-26T09:36:58.105028Z","shell.execute_reply":"2021-05-26T09:49:05.160901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#nn.functional.one_hot(torch.tensor([]), 6)","metadata":{"execution":{"iopub.status.busy":"2021-05-25T11:06:20.387197Z","iopub.status.idle":"2021-05-25T11:06:20.387888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from glob import glob\n\nvalid_image_list = glob('../input/plant-pathology-2021-fgvc8/test_images/*.jpg')\n\nmodel.eval()\npredict_list = []\nimage_name_list = []\nfor i, image in tqdm(enumerate(valid_image_list)) :\n    image_name = image[48:]\n    \n    img = read_img(image)\n    img = transform_valid()(img)\n    \n    result_list = torch.FloatTensor(np.zeros((classes))).to(device)\n    img = img.to(device)\n    img = img.reshape(-1, 3, 224, 224)\n    with torch.set_grad_enabled(False):\n        predict = model(img)\n    predict_list.append(list(to_lab(predict).reshape(-1).nonzero().reshape(-1).cpu().numpy()))\n    #predict_list.append(result_list)\n    image_name_list.append(image_name)\n    \n#predict_list = np.array(predict_list)\nimage_name_list = np.array(image_name_list)\nprint(image_name_list)\n\nsubmission_df = pd.DataFrame()\nsubmission_df['image'] = image_name_list\nsubmission_df['label_id'] = predict_list\nsubmission_df['labels'] = submission_df['label_id'].apply(lambda x: \" \".join([label_dic[i] for i in x]))\ndel submission_df['label_id']\nsubmission_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T11:06:20.389684Z","iopub.status.idle":"2021-05-25T11:06:20.390624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2021-05-25T11:06:20.392315Z","iopub.status.idle":"2021-05-25T11:06:20.393001Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}