{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nimport cv2\nimport torch\nimport torchvision\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.optim import lr_scheduler, Adam, SGD\nfrom torch.autograd import Variable\nimport torchvision\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision.models import resnet18, densenet121, mobilenet_v2, VGG\nfrom albumentations import RandomRotate90, Flip, Compose, Normalize, RandomResizedCrop\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\ndevice","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"df = pd.read_csv(r'/kaggle/input/cassava-leaf-disease-classification/train.csv')\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df['label'].unique()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.describe()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_dir = '../input/cassava-leaf-disease-classification/train_images/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(10,10))\nx = cv2.imread(data_dir + df['image_id'][1])\n# clahe = cv2.createCLAHE(clipLimit =2.0, tileGridSize=(8,8))\ncl_img = cv2.GaussianBlur(x,(3,3),0)\nplt.imshow(cl_img)\nplt.show()\nplt.figure(figsize=(10,10))\nplt.imshow(x, cmap = 'gray')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Train-Test Split"},{"metadata":{"trusted":true},"cell_type":"code","source":"X = df.drop(['image_id'], axis=1)\nY= df['label']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, X_valid, y_train, y_valid = train_test_split(X ,Y, test_size=0.2, random_state=1234)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_transforms = transforms.Compose([\n                                       transforms.Resize((224,224)),\n                                       transforms.ToTensor(),\n                                       transforms.Normalize([0.485, 0.456, 0.406],\n                                                            [0.229, 0.224, 0.225])])\n\n\ntest_transforms = transforms.Compose([ \n                                       transforms.Resize((224,224)),\n                                       transforms.ToTensor(),\n                                       transforms.Normalize([0.485, 0.456, 0.406],\n                                                            [0.229, 0.224, 0.225])])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class TrainDataset(Dataset):\n    def __init__(self, df, labels, transform = None):\n        self.df = df\n        self.labels = labels\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_name = self.df['image_id'].values[idx]\n        image = cv2.imread(data_dir + file_name)\n        label = self.labels.values[idx]\n        return image, label\n    \n\nclass TestDataset(Dataset):\n    def __init__(self, df, dir_name, transform=None):\n        self.df = df\n        self.dir_name = dir_name\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        file_name = self.df['image_id'].values[idx]\n        image = cv2.imread(data_dir + file_name)\n\n        \n        return image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dataset = TrainDataset(X_train, y_train, transform= True) \nvalid_dataset = TrainDataset(X_valid, y_valid, transform= True)\ntrain_loader = DataLoader(train_dataset, batch_size=10, num_workers = 4)\nvalid_loader = DataLoader(valid_dataset, batch_size=10, num_workers = 4)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"x,y = next(iter(train_loader))\nx.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vgg = models.vgg16(pretrained=False).to(device)\n    \nfor param in vgg.parameters():\n    param.requires_grad = True \nvgg.fc = nn.Sequential(\n               nn.Linear(25088, 4096),\n               nn.ReLU(inplace=True),\n               nn.Linear(4096, 5)).to(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def focal_loss(targets,logits,eps,l):\n    ce_loss = torch.nn.functional.binary_cross_entropy_with_logits(logits, targets, reduction= 'none')\n    pt = torch.exp(-ce_loss)\n    loss = (eps * (1-pt)**l * ce_loss).mean()\n    return loss","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train(resnet, train_loader, valid_loader, epoch):\n    history = []  \n    \n    resnet.to(device)\n#     print(device)\n    \n    for e in range(epoch):\n        vcorrect = 0\n        predicted = []\n        train_acc = 0\n        valid_acc = 0\n        vtotal = 0\n        running_loss = 0.0\n        train_loss = 0\n        correct = 0\n        total = 0\n        total_train = 0\n        train_loss = 0.0\n        valid_loss = 0.0\n        running_loss = 0.0\n\n        for images, labels in iter(train_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            images = images.permute(0,3,2,1)\n\n            hot_labels = encoder(labels, 5)\n            hot_labels = hot_labels.to(device)\n            optimizer.zero_grad()\n            outputs = resnet(images)\n            loss = focal_loss(hot_labels, outputs, 0.25, 2 )\n            loss.backward()                     #----> backward pass\n            optimizer.step()\n            \n            outputs[outputs >= 0.5] = 1\n            outputs[outputs < 0.5] = 0\n            correct += (outputs == hot_labels).sum().item()\n            total += labels.size(0)\n            running_loss += loss.item()\n            \n        for images, labels in iter(valid_loader):\n            \n            images = images.to(device)\n            labels = labels.to(device)\n            images = images.permute(0,3,2,1)\n\n            hot_labels = encoder(labels, 5)\n            hot_labels = hot_labels.to(device)\n            outputs = resnet(images)\n            loss = focal_loss(hot_labels, outputs, 0.2, 2 )\n            valid_loss += loss.item()\n            outputs[outputs >= 0.5] = 1\n            outputs[outputs < 0.5] = 0\n            vcorrect += (outputs == hot_labels).sum().item()\n            vtotal += hot_labels.size(0)\n\n        train_loss = running_loss / len(train_loader)\n        valid_loss = valid_loss / len(valid_loader)\n        train_acc = correct / total\n        valid_acc = vcorrect / vtotal\n        train_acc/=6\n        valid_acc/=6\n#         score = quadratic_weighted_kappa(valid_labels, preds)\n\n        history.append([train_loss, valid_loss, train_acc, valid_acc])\n        print('Epoch #', e, '\\t\\tTraining loss: ', train_loss, '\\t Validation loss: ', valid_loss)\n        print('\\t\\tTraining Accuracy: ', (100 * train_acc), '\\t Validation Accuracy: ', (100 * valid_acc))\n    history = pd.DataFrame(history, columns=['train_loss', 'valid_loss', 'train_acc', 'valid_acc'])\n#     torch.save(model.state_dict(), './gdrive/My Drive/' + name)\n    return resnet,history","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = optim.SGD(vgg.parameters(), lr=0.01, momentum=0.4)\nmodel, history = train(vgg, train_loader, valid_loader, 20)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Loss and Accuracy Curves"},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(8, 6))\nfor c in ['train_loss', 'valid_loss']:\n    plt.plot(history[c], label=c)\nplt.legend()\nplt.xlabel('Epoch')\nplt.ylabel('Average Negative Log Likelihood')\nplt.title('Training and Validation Losses')\n\nplt.figure(figsize=(8, 6))\nfor c in ['train_acc', 'valid_acc']:\n    plt.plot(100 * history[c], label=c)\nplt.legend()\nplt.xlabel('Epoch')\nplt.ylabel('Average Accuracy')\nplt.title('Training and Validation Accuracy')","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}