{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"!pip -q install ../input/timm-0-1-30/timm-0.1.30-py3-none-any.whl","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nimport os\nimport torch.nn as nn\nimport cv2\nimport timm\nfrom matplotlib import pyplot as plt\nfrom sklearn.model_selection import StratifiedKFold\nfrom torch.utils.data import DataLoader, Dataset\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nimport torchvision.models as models\nimport pytorch_lightning as pl\nfrom pytorch_lightning.core.lightning import LightningModule\nfrom pytorch_lightning.callbacks import ModelCheckpoint\nfrom argparse import Namespace\n%matplotlib inline\nfrom pylab import rcParams","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"df_train = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ndata_dir = '../input/cassava-leaf-disease-classification/train_images/'\ntest_path = '../input/cassava-leaf-disease-classification/test_images/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DEBUG = False  # set it False for full training","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class config:\n    FOLD_ID = 0\n    IMAGE_SIZE = 256\n    BATCH_SIZE = 32\n    EPOCHS = 1\n    LR = 1e-3\n    NWORKERS = 24\n    SEED = 42\n    NSPLITS = 5\n    NCLASSES = 5\n    T_max = 10\ncfg = config","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DEVICE = ('cuda' if torch.cuda.is_available() else 'cpu')\nprint(DEVICE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transforms_train = A.Compose([\n    A.RandomRotate90(),\n    A.Flip(),\n    A.Transpose(),\n    \n    A.OneOf([\n            A.CLAHE(clip_limit=2),\n            A.IAASharpen(),\n            A.IAAEmboss(),\n            A.RandomBrightnessContrast(),            \n        ], p=0.3),\n        A.HueSaturationValue(p=0.3),\n    \n    A.Resize(cfg.IMAGE_SIZE, cfg.IMAGE_SIZE),\n    A.Normalize(),\n    ToTensorV2()\n])\n\n\ntransforms_valid = A.Compose([\n    A.Resize(cfg.IMAGE_SIZE, cfg.IMAGE_SIZE),\n    A.Normalize(),\n    ToTensorV2()\n])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CLDDataset(Dataset):\n    def __init__(self, df, transform=None, test=False):\n        self.df = df\n        self.transform = transform\n        self.test = test\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, index):\n        row = self.df.iloc[index]\n        label = row.label\n        if self.test == True:\n            p_path = test_path\n        else:\n            p_path = data_dir\n            \n        image = cv2.imread(p_path + row.image_id)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        if self.transform is not None:\n            auged = self.transform(image=image)\n            image = auged['image']\n        \n        return image, label","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dataset = CLDDataset(df_train, transforms_valid)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"rcParams['figure.figsize'] = 20,10\nfor i in range(2):\n    fig, ax = plt.subplots(1,5)\n    for p in range(5):\n        img, label = dataset[i*5+p]\n        ax[p].imshow(img.permute(1,2,0))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CLDC(LightningModule):\n    def __init__(self, hparams):\n        super(CLDC,self).__init__()\n        self.hparams = hparams\n        self.file_path = self.hparams.file_path\n        \n        self.net = timm.create_model('tf_efficientnet_b0_ns', pretrained=False, num_classes=cfg.NCLASSES)\n        self.net.load_state_dict(torch.load('../input/effnet0/weight.pt'))\n        self.criterion = nn.CrossEntropyLoss()\n        \n        self.df = pd.read_csv(self.file_path)\n        \n        if DEBUG:\n            self.df = self.df[:2000]\n    \n        skf = StratifiedKFold(cfg.NSPLITS, random_state=cfg.SEED, shuffle=True)\n        self.df['fold'] = -1\n        for fold, (train_idx, valid_idx) in enumerate(skf.split(self.df, self.df.label)):\n            self.df.loc[valid_idx, 'fold'] = fold\n\n\n\n    def forward(self, x):\n        output = self.net(x)\n        return output\n\n    def training_step(self, batch, batch_idx):\n        imgs, labels = batch\n\n        x = self(imgs)\n        loss = self.criterion(x, labels)\n        \n        self.log('train_loss', loss, on_step=True, on_epoch=True, prog_bar=True, logger=True)\n        \n        return loss\n\n    def validation_step(self, batch, batch_idx):\n        imgs, labels = batch\n        x = self(imgs)\n        val_loss = self.criterion(x, labels)\n        \n        self.log('val_loss', val_loss, on_step=True, on_epoch=True, prog_bar=True, logger=True)\n        \n        return val_loss\n\n    def configure_optimizers(self):\n        optimizer = torch.optim.Adam(self.parameters(), lr=cfg.LR)\n        scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=cfg.T_max)\n        return [optimizer], [scheduler]\n\n    def train_dataloader(self):\n        train_set = CLDDataset(df=self.df[self.df['fold'] != cfg.FOLD_ID], transform=transforms_train)\n        train_loader = DataLoader(train_set, batch_size=cfg.BATCH_SIZE, drop_last=True)\n\n        return train_loader\n\n    def val_dataloader(self):\n        val_set = CLDDataset(df=self.df[self.df['fold'] == cfg.FOLD_ID], transform=transforms_valid)\n        val_loader = DataLoader(val_set, batch_size=cfg.BATCH_SIZE)\n\n        return val_loader","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"args = {\n    'file_path': '../input/cassava-leaf-disease-classification/train.csv',\n}\n\nhyperparams = Namespace(**args)\ncldc = CLDC(hyperparams)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\"\"\"checkpoint_callback = ModelCheckpoint(\n    filepath='./wts/{epoch:02d}-{val_loss:.2f}',\n    save_top_k=1,\n    verbose=True,\n    monitor='val_loss',\n    mode='min',\n    save_weights_only = False\n)\n\"\"\"\n\ncheckpoint_callback = ModelCheckpoint(\n          filepath=os.path.join(os.getcwd(), 'checkpoints'),\n          verbose=True,\n          monitor='val_loss',  \n          mode='min', \n          prefix='tt',\n          save_top_k=-1,\n          period=1)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trainer = pl.Trainer(\n    gpus=-1,\n    max_epochs=cfg.EPOCHS,\n    benchmark=True,\n    amp_level='O1',\n    # auto_lr_find=True,\n    checkpoint_callback=checkpoint_callback\n)\n#trainer.fit(cldc)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_reload = CLDC.load_from_checkpoint('../input/pytorch-lightning/tt-checkpoints.ckpt')\nmodel_reload.cuda()\nmodel_reload.eval()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tqdm import tqdm\nsample = pd.read_csv('../input/cassava-leaf-disease-classification/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\ntestset      = CLDDataset(sample, transform=transforms_valid, test=True)\ntest_loader  = DataLoader(testset, batch_size=cfg.BATCH_SIZE, shuffle=False, num_workers=4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_pred = []\n\nwith torch.no_grad():\n    for i, data in enumerate(tqdm(test_loader, position=0, leave=True)):\n        images, _ = data\n        images = images.cuda()\n        pred = model_reload(images)\n\n        pred = pred.argmax(1).cpu().detach().numpy().astype('int')\n\n        test_pred.extend(pred)\n\nsample.label = test_pred\nsample.to_csv('submission.csv',index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_pred","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for p in cldc.net.parameters():\n    print(p.device)","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}