{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import pytorch_lightning as pl\nimport pandas as pd\nimport cv2\nimport os \nfrom torch import nn\nfrom torch.utils.data import Dataset ,DataLoader\nimport numpy as np\nimport torch\nfrom sklearn.model_selection import train_test_split \n\nIMG_SIZE = 64\nPATH = \"../input/cassava-leaf-disease-classification/train_images/\"\nCLASSES = 5","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"CNN Model by using Lightning Module"},{"metadata":{"trusted":true},"cell_type":"code","source":"class CassavaModel(pl.LightningModule):\n    def __init__(self):\n      #image_size = 64\n      super().__init__()\n      self.cnv = nn.Conv2d(3,128,5,4)\n      self.rel = nn.ReLU()\n      self.bn = nn.BatchNorm2d(128)\n      self.mxpool = nn.MaxPool2d(4)\n      self.flat = nn.Flatten()\n      self.fc1 = nn.Linear(1152,64)\n      self.fc2 = nn.Linear(64,64)\n      self.fc3 = nn.Linear(64,CLASSES)\n      self.softmax = nn.Softmax()\n      self.accuracy = pl.metrics.Accuracy()\n\n    def forward(self,x):\n      out = self.bn(self.rel(self.cnv(x)))\n      out = self.flat(self.mxpool(out))\n      out = self.rel(self.fc1(out))\n      out = self.rel(self.fc2(out))\n      out = self.fc3(out)\n      return out\n\n    def loss_fn(self,out,target):\n      return nn.CrossEntropyLoss()(out.view(-1,CLASSES),target)\n    \n    def configure_optimizers(self):\n      LR = 1e-3\n      optimizer = torch.optim.AdamW(self.parameters(),lr=LR)\n      return optimizer\n\n    def training_step(self,batch,batch_idx):\n      x,y = batch[\"x\"],batch[\"y\"]\n      img = x.view(-1,3,IMG_SIZE,IMG_SIZE)\n      label = y.view(-1)\n      out = self(img)\n      loss = self.loss_fn(out,label)\n      self.log('train_loss', loss)\n      return loss       \n\n    def validation_step(self,batch,batch_idx):\n      x,y = batch[\"x\"],batch[\"y\"]\n      img = x.view(-1,3,IMG_SIZE,IMG_SIZE)\n      label = y.view(-1)\n      out = self(img)\n      loss = self.loss_fn(out,label)\n      out = nn.Softmax(-1)(out) \n      logits = torch.argmax(out,dim=1)\n      accu = self.accuracy(logits, label)        \n      self.log('valid_loss', loss)\n      self.log('train_acc_step', accu)\n      return loss, accu\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Getting The Dataset as image"},{"metadata":{"trusted":true},"cell_type":"code","source":"class CassavaDataset(Dataset):\n    def __init__(self,path,image_ids,labels,image_size):\n        self.image_ids = image_ids\n        self.labels = labels\n        self.path = path\n        self.image_size = image_size\n\n    def __len__(self):\n        return len(self.image_ids)\n    \n    def __getitem__(self,item):\n      image_ids = str(self.image_ids[item])\n      labels = self.labels[item]\n      img_file = cv2.imread(self.path+image_ids)\n      img = cv2.resize(img_file,(self.image_size,self.image_size))\n      img = img.astype(np.float64)\n\n      return {\n            \"x\":torch.tensor(img,dtype=torch.float),\n            \"y\":torch.tensor(labels,dtype=torch.long),\n        } ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Data Module - loading the data and batches"},{"metadata":{"trusted":true},"cell_type":"code","source":"\nclass CassavaLightDataset(pl.LightningDataModule):\n    def __init__(self,batch_size=64):\n      super().__init__()\n      self.batch_size = batch_size\n    \n    def setup(self,stage=None):\n      dfx = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\n      xtrain, xval, ytrain, yval = train_test_split(dfx[\"image_id\"].values,\n                                                      dfx.label.values,\n                                                      test_size = 0.1)\n      self.train_dataset = CassavaDataset(PATH,xtrain,ytrain,IMG_SIZE)\n      self.validation_dataset = CassavaDataset(PATH,xval,yval,IMG_SIZE)\n\n    def train_dataloader(self):\n      train_loader = DataLoader(self.train_dataset,\n                            batch_size=self.batch_size,\n                            shuffle=True)\n      return train_loader\n    def val_dataloader(self):\n      valid_loader = DataLoader(self.validation_dataset,\n                            batch_size=self.batch_size,\n                            shuffle=False)       \n      return valid_loader\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Training the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"checkpoint_callback = pl.callbacks.ModelCheckpoint(\n    monitor='valid_loss',\n    dirpath='./',\n    filename='models-{epoch:02d}-{valid_loss:.2f}',\n    save_top_k=3,\n    mode='min') \n\nmod = CassavaModel()\ndx = CassavaLightDataset()\ntrainer = pl.Trainer(gpus=-1,max_epochs=6,callbacks=[checkpoint_callback])\ntrainer.fit(model=mod,datamodule=dx) ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Reloading the models weights for Evaluation"},{"metadata":{"trusted":true},"cell_type":"code","source":"BEST_MODEL_PATH = \"../input/cassava-leaf-disease-clf-model/models-epoch03-valid_loss1.05.ckpt\" #checkpoint_callback.best_model_path\npretrained_model = CassavaModel().load_from_checkpoint(BEST_MODEL_PATH)\npretrained_model.eval()\npretrained_model.freeze()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Prediction On Testing Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"TEST_FILE_PATH = \"../input/cassava-leaf-disease-classification/test_images/\"\nclass CassavaTestDataset(Dataset):\n    def __init__(self,path,image_ids,image_size):\n        self.image_ids = image_ids\n        self.path = path\n        self.image_size = image_size\n\n    def __len__(self):\n        return len(self.image_ids)\n    \n    def __getitem__(self,item):\n      image_ids = str(self.image_ids[item])\n      img_file = cv2.imread(self.path+image_ids)\n      img = cv2.resize(img_file,(self.image_size,self.image_size))\n      img = img.astype(np.float64)\n\n      return {\n            \"x\":torch.tensor(img,dtype=torch.float),\n        } \nsample = pd.read_csv(\"../input/cassava-leaf-disease-classification/sample_submission.csv\")\ntest_dataset = CassavaTestDataset(TEST_FILE_PATH,sample.image_id,IMG_SIZE)\ntest_loader = DataLoader(test_dataset,\n                      batch_size=1,\n                      shuffle=False)\nfin_y = []\nfor data in test_loader:\n  y_hat = pretrained_model(data[\"x\"].view(-1,3,IMG_SIZE,IMG_SIZE))\n  y_hat = nn.Softmax(dim=-1)(y_hat)\n  y_hat = torch.argmax(y_hat,dim=1)\n  fin_y.append(y_hat.cpu().detach().numpy())\nsample[\"label\"] = np.array(fin_y).reshape(-1)\nsample[[\"image_id\",\"label\"]].to_csv(\"submission.csv\",index=False)\nsample.head()","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}