{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import time\nimport torchvision\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import transforms\nfrom torch.optim import lr_scheduler\nimport torchvision , torchvision.models as mdl\nimport os , cv2\nfrom tqdm import tqdm_notebook as tqdm\nimport pandas as pd\nfrom PIL import Image, ImageFile\nfrom torch.utils.data import Dataset , DataLoader\nimport torch\nimport numpy as np\n\n\nimport albumentations as A\ndevice = torch.device(\"cuda:0\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"dataf = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"eval_data = pd.DataFrame()\nfor label in [0,1,2,3,4]:\n    sample = dataf[dataf[\"label\"]== label].head(100)\n    eval_data = pd.concat([eval_data , sample] , sort = False )\ntrain_data = dataf.drop(eval_data.index)\ntrain_data = train_data.reset_index(drop = True)\neval_data  = eval_data.reset_index(drop  = True)\n\n\nclass_3_idx = train_data[train_data[\"label\"] == 3].sample(9000).index\ntrain_data =train_data.drop(class_3_idx).reset_index(drop = True)\nprint(train_data.shape , eval_data.shape)\ntrain_data[\"label\"].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_size = 256\nselected_aug = A.Compose([A.RandomCrop(height = 500, width = 500 ) ,\n                          A.Transpose(p=0.3) , \n                          A.VerticalFlip(p=0.5),\n                          A.HorizontalFlip(p=0.5),\n                          A.RandomContrast(limit=0.05, p=0.5),\n                          A.OneOf([ A.MedianBlur(blur_limit=3),\n                                    #A.GaussianBlur(blur_limit=3),\n                                    A.GaussNoise(var_limit=(5.0, 30.0)) ,], p=0.6),\n                          A.OneOf([ A.OpticalDistortion(distort_limit=0.7), \n                                    A.GridDistortion(num_steps=2, distort_limit=0.2),\n                                    A.ElasticTransform(alpha=3),  ], p=0.7),\n                          A.CLAHE(clip_limit=4.0, p=0.7),\n                          A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=20, val_shift_limit=10, p=0.5) , \n                          A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=15, border_mode=0, p=0.8),\n                          A.Cutout(max_h_size=int(image_size * 0.2), max_w_size=int(image_size * 0.2), num_holes=1, p=0.5), \n                          A.Cutout(max_h_size=int(image_size * 0.1), max_w_size=int(image_size * 0.1), num_holes=3, p=0.5), \n                          A.Resize(image_size ,image_size )])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Cassava_dataset(Dataset):\n\n    def __init__(self, dataframe , transfrm):\n\n        self.data = dataframe\n        self.transform = transfrm\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        img_path = \"../input/cassava-leaf-disease-classification/train_images\"\n        img_name = os.path.join( img_path ,self.data.loc[idx, 'image_id'] )\n        im_bgr = cv2.imread(img_name)\n        im_rgb = im_bgr[:, :, ::-1]\n#         image = Image.open(img_name)\n        image = self.transform(image=im_rgb)\n        #image = image.resize((256, 256), resample=Image.BILINEAR)\n        label = torch.tensor(self.data.loc[idx, 'label'])\n        return {'image': transforms.ToTensor()(image[\"image\"]),\n                'label': label\n                }","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class MY_RESNet34(nn.Module):\n    def __init__(self):\n        super(MY_RESNet34,self).__init__()\n        self.model = mdl.resnet34(pretrained = False)\n        self.model.conv1 = nn.Conv2d(3, 64, kernel_size=(3, 3), stride=(2, 2), bias=False)\n        \n        self.fc1 = nn.Linear(1000,5)\n        \n    def forward(self,x):\n        x = self.model(x)\n        x1 = self.fc1(x)\n        return x1\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = MY_RESNet34().to(device)\noptimizer = optimizer = torch.optim.Adam(model.parameters(), lr=4e-4)\n#scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=1e-4, max_lr=0.05)\ncriterion = nn.CrossEntropyLoss()\nbatch_size = 32\n\nepochs = 40","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"losses = []\naccs = []\nfor epoch in range(epochs):\n    train_image = Cassava_dataset(train_data , selected_aug)\n    train_loader = DataLoader(train_image,batch_size=batch_size,shuffle=True)\n    \n    print('epochs {}/{} '.format(epoch,epochs))\n    running_loss = 0.0\n    running_acc = 0.0\n    for idx, data_t in enumerate(train_loader):\n        if idx % 50 == 0 :\n            print(epoch , idx)\n        input_img = data_t[\"image\"].to(device)\n        label = data_t[\"label\"].to(device)\n        #print(\"check data size \" ,input_img.shape , label.shape)\n        optimizer.zero_grad()\n        output= model(input_img)\n        loss = criterion(output,label)\n        running_loss += loss\n        running_acc += (output.argmax(1)==label).float().mean()\n    \n        (loss).backward()\n        optimizer.step()\n    #scheduler.step()\n    losses.append(running_loss/len(train_loader))\n    accs.append(running_acc/(len(train_loader)))\n    print('acc : {:.2f}%'.format(running_acc/(len(train_loader))))\n    print('loss : {:.4f}'.format(running_loss/len(train_loader)))\n    \n    if epoch in [0, 1 , 2 , 3 , 5 ,10 , 20 , 29 , 35, 39 ]:\n        model.eval()\n        for idd in eval_data.index :\n            img_name = eval_data.loc[idd , \"image_id\"]\n            img_path = \"../input/cassava-leaf-disease-classification/train_images/\" + img_name\n            img = Image.open(img_path)\n            image = img.resize((256, 256), resample=Image.BILINEAR)\n            image = transforms.ToTensor()(image).cuda()\n            image = image.reshape(-1,3,256,256)\n            eval_data.loc[idd , \"pred\"] =int( model(image).argmax().item())\n        actual_labels =  eval_data[\"label\"].values\n        predictions   = eval_data[\"pred\"].values.astype(int)\n        print(\"accuracy  =\" ,(actual_labels == predictions).sum()/500)\n        \n        cmt = torch.zeros(5, 5, dtype=torch.int32)\n        for i in range(len(actual_labels)):\n            cmt[actual_labels[i], predictions[i]] += 1\n        print(cmt)\n        model.train()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(\"../input/cassava-leaf-disease-classification/sample_submission.csv\")\n\nmodel.eval()\nfor idd in submission.index :\n    img_name = submission.loc[idd , \"image_id\"]\n    img_path = \"../input/cassava-leaf-disease-classification/test_images/\" + img_name\n    img = Image.open(img_path)\n    image = img.resize((256, 256), resample=Image.BILINEAR)\n    image = transforms.ToTensor()(image).cuda()\n    image = image.reshape(-1,3,256,256)\n    submission.loc[idd , \"label\"] = int( model(image).argmax().item())\n    submission[\"label\"] = submission[\"label\"].astype(int)\nsubmission.to_csv(\"submission.csv\" , index = False)\nsubmission.shape","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}