{"cells":[{"metadata":{},"cell_type":"markdown","source":"* You can use this notebook to load your best model weights and test at test sets.\n* And ensure that you disabled the internet so you can submit your result.\n* Add your model weights though the top right corner button.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import sys\npackage_path = \"../input/pytorch-img-class-models/pytorch-image-models-master\"\nsys.path.append(package_path)\n\nimport timm","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import torch\nimport torch.nn.functional as F\nimport torch.nn as nn\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom sklearn.model_selection import GroupKFold\nimport pandas as pd\nimport numpy as np\nimport os\nimport cv2\nimport time\nimport datetime\nimport warnings\nimport gc\n# import albumentations as A\n# from albumentations.pytorch import ToTensorV2\nfrom PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"warnings.simplefilter('ignore')\ntorch.manual_seed(47)\nnp.random.seed(47)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Dataset(Dataset):\n    def __init__(self, df: pd.DataFrame, imfolder: str, train: bool = True, transforms = None,):\n        self.df = df\n        self.imfolder = imfolder\n        self.transforms = transforms\n        self.train = train\n\n\n    def __getitem__(self, index):\n        im_path = os.path.join(self.imfolder, self.df.iloc[index]['image_id'])\n#         x = cv2.imread(im_path)\n#         x = cv2.cvtColor(x,cv2.COLOR_BGR2RGB)\n        x = Image.open(im_path) #for torchvision.transform\n        \n\n        if self.transforms:\n            x = self.transforms(x)   #FOR torchvision.transform\n#             augmented = self.transforms(image=x)\n#             x = augmented['image']\n\n        if self.train:\n            y = self.df.iloc[index]['label']\n            return x, y\n        else:\n            return x\n\n    def __len__(self):\n        return len(self.df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CustomEffNet(nn.Module):\n    def __init__(self, model_name:str=\"tf_efficientnet_b3\", pretrained:bool=True, n_out:int=5):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=pretrained)\n\n#         n_features = self.model.classifier.in_features   #efficientnet\n        n_features = self.model.fc.in_features    #resnet\n        self.model.fc = nn.Linear(n_features, n_out)\n\n    def forward(self, x):\n        x = self.model(x)\n        return x\nmodel = CustomEffNet(\"resnext50_32x4d\", False, 5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# print(model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_transform = transforms.Compose([\n    transforms.RandomResizedCrop(size=512, scale=(0.8, 0.8)),\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomVerticalFlip(),\n    transforms.ColorJitter(brightness=32. / 255.,saturation=0.5),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])\n])\ntest_transform = transforms.Compose([\n    transforms.CenterCrop(512),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_transform = A.Compose([\n# #     A.Resize(380,380),\n# #     A.CenterCrop(240,240,p=1),\n#     A.Resize(256,256),\n# #     A.InvertImg(p=0.6),\n#     A.RandomShadow(shadow_roi=(0, 0.5, 1, 1), num_shadows_lower=1, num_shadows_upper=4, shadow_dimension=5, always_apply=False),\n#     A.Flip(p=0.75),\n#     A.RandomRotate90(p=0.75),\n#     A.ColorJitter(brightness=0.4,contrast=0.5,saturation=0.5,hue=0.3,p=0.7,always_apply=False),\n# #     A.ToTensor(),\n#     A.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),\n#     ToTensorV2(p=1.0)\n# ])\n# test_transform = A.Compose([\n# #     A.Resize(380,380),\n#     A.CenterCrop(240,240,p=1),\n# #     A.Resize(256,256),\n# #     A.ToTensor(),\n#     A.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),\n#     ToTensorV2(p=1.0)\n# ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"skf = GroupKFold(n_splits=3)\n\n\ntrain_df = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ntest_df = pd.read_csv('../input/cassava-leaf-disease-classification/sample_submission.csv')\n\n\nb_df = train_df.loc[train_df['label']==3].sample(frac = 0.4,replace = False)\nsample_df = pd.concat([b_df,train_df.loc[train_df['label']!=3]])\n\n\ntest = Dataset(df=test_df,\n                       imfolder='../input/cassava-leaf-disease-classification/test_images',\n                       train=False,\n                       transforms=test_transform,\n                       )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"epochs = 50  \nes_patience = 3  \nTTA = 1 \n\n\ntest_loader = DataLoader(dataset=test, batch_size=16, shuffle=False, num_workers=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if __name__ == '__main__':\n\n    z_pred = torch.zeros((len(test), 5), dtype=torch.float32, device=device)\n    for num in range(0,2):\n        print('=' * 20, 'Fold', num, '=' * 20)\n        model_path = f'../input/efficient/0122_Resnet_{num}.pth'\n        best_val = None  # Best validation score within this fold\n        patience = es_patience  # Current patience counter\n#         model = torch.load(model_path)  # Loading best model of this fold\n        model = torch.load(model_path)\n        model = model.to(device)\n        model.eval()  # switch model to the evaluation mode\n        with torch.no_grad():\n            start_time = time.time()\n            for _ in range(TTA):\n                for i, x_test in enumerate(test_loader):\n                    x_test = torch.tensor(x_test, device=device, dtype=torch.float32)\n                    z_test = model(x_test)\n                    z_pre = F.softmax(z_test)\n                    z_pred[i*2:i*2+x_test.size(0)] += z_pre\n            z_pred /= TTA\n            print('Test time: {}'.format(str(datetime.timedelta(seconds=time.time() - start_time))[:7]))\n        gc.collect()\n\n    z_pred /= skf.n_splits\n    z_preds = torch.argmax(z_pred,dim=1)\n    sub = pd.read_csv('../input/cassava-leaf-disease-classification/sample_submission.csv')\n    sub['label'] = z_preds.cpu().numpy().reshape(-1, )\n    sub.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}