{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os.path as osp\n\n# computation\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\n\n# data pipeline\nimport imageio\nfrom imgaug import augmenters as iaa\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\n\n# utils\nfrom tqdm.notebook import tqdm\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import train_test_split","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# BELOW CELLS SHOULD BE AS SAME AS YOUR TRAINING NOTEBOOK"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Some constants\nROOT = '/kaggle/input/cassava-leaf-disease-classification'\nTRAIN_DIR = f'{ROOT}/train_images/'\nTRAIN_CSV = f'{ROOT}/train.csv'\nTEST_DIR = f'{ROOT}/test_images/'\nTEST_CSV = f'{ROOT}/sample_submission.csv'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# WARNING: THIS PART SHOULD BE AS SAME AS YOUR TRAINING NOTEBOOK!\nclass CassavaDataset(Dataset):\n    def __init__(self, split, transform=None):\n        assert split in ('train', 'val', 'test')\n        self.split = split\n        self.transform = transform\n        if split in ('train', 'val'):\n            csv = pd.read_csv(TRAIN_CSV)\n            self.df = train_test_split(\n                csv, test_size=0.1, random_state=0\n            )[0 if split == 'train' else 1].reset_index()\n        else:\n            self.df = pd.read_csv(TEST_CSV)\n        \n    def __len__(self):\n        return self.df.shape[0]\n    \n    def __getitem__(self, i: int):\n        base_dir = TRAIN_DIR if self.split in ('train', 'val') else TEST_DIR\n        x = imageio.imread(osp.join(base_dir, self.df['image_id'][i]))\n        y = self.df['label'][i] if self.split in ('train', 'val') else -1\n        if self.transform:\n            x = self.transform(x)\n        return (x, y)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# WARNING: THIS PART SHOULD BE AS SAME AS YOUR TRAINING NOTEBOOK!\nINPUT_SIZE = 128\nTRANSFORMS = {\n    'train': transforms.Compose([\n        iaa.Sequential([\n            iaa.Resize((INPUT_SIZE, INPUT_SIZE)),\n        ]).augment_image,\n        transforms.ToTensor(),\n    ]),\n    'val': transforms.Compose([\n        iaa.Sequential([\n            iaa.Resize((INPUT_SIZE, INPUT_SIZE)),\n        ]).augment_image,\n        transforms.ToTensor(),\n    ]),\n    'test': transforms.Compose([\n        iaa.Sequential([\n            iaa.Resize((INPUT_SIZE, INPUT_SIZE)),\n        ]).augment_image,\n        transforms.ToTensor(),\n    ]),\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# WARNING: THIS PART SHOULD BE AS SAME AS YOUR TRAINING NOTEBOOK!\nclass CassavaClassifier(nn.Module):\n    def __init__(self):\n\n        super().__init__()\n        CH_LAST = 128\n        NUM_CLASSES = 5\n        # TODO: Change this part to improve your score\n        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)\n        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)\n        self.conv3 = nn.Conv2d(128, CH_LAST, kernel_size=3, padding=1)\n        # NOTE: input channel should match CH_LAST * (IMAGE_INPUT_SIZE / 2 ** NUM_DOWNSAMPLE) ** 2 \n        self.fc = nn.Linear(CH_LAST *  (INPUT_SIZE // 2 ** 3) ** 2, NUM_CLASSES)\n        self.pool = nn.MaxPool2d(kernel_size=(3, 3), stride=2, padding=1)\n        \n    def forward(self, x):\n        h = self.pool(F.relu(self.conv1(x)))\n        h = self.pool(F.relu(self.conv2(h)))\n        h = self.pool(F.relu(self.conv3(h)))\n        return self.fc(h.flatten(1))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# EVALUATION\n\n1. Turn off the GPU acceleration in your training notebook.\n2. **Turn on** the GPU acceleration for this notebook, and **turn off the internet** in \"Settings\" at the right-side panel.\n3. Click the **\"Add data\"** button at the right-side panel.\n4. Click **\"Notebook Output Files\"** - **\"Your Work\"** and find your *training* notebook that has been saved with **\"Save and Run All\"**.\n5. Run this notebook to verify that the trained model can be loaded without any errors.\n6. Save this notebook with **\"Save and Run All\"**.\n7. Submit the saved version of this notebook & output files to the challenge!"},{"metadata":{"trusted":true},"cell_type":"code","source":"# WARNING: MAKE SURE THIS PATH MATCHES YOUR IMPORTED OUTPUTS FILES OF THE TRAINING NOTEBOOK \nPATH = '../input/cassava-classification-lg-cv-2021-train/model.pt'\nmodel = torch.load(PATH)\nmodel.eval()\ntest_dataset = CassavaDataset('test', transform=TRANSFORMS['test'])\ntest_loader = DataLoader(test_dataset, batch_size=32)\ntest_csv = pd.read_csv(TEST_CSV)\n\ny_hats = []\nfor x, _ in test_loader:\n    y_hat = model(x.cuda())\n    y_hat = torch.argmax(y_hat,dim=1)\n    y_hats.extend(y_hat.cpu().detach().numpy().tolist())\n    \n\ntest_csv['label'] = y_hats\ntest_csv[['image_id','label']].to_csv(\"submission.csv\", index=False)\ntest_csv.head()","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}