{"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)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!pip install torch-lr-finder\nimport torch\nfrom PIL import Image\nimport os\nimport torchvision\nimport torchvision.transforms as transforms\nfrom torch.utils.data import Dataset,DataLoader\nimport torchvision.models as models\nimport albumentations as A\nimport cv2\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch_lr_finder import *\nfrom torch_lr_finder import LRFinder\nimport matplotlib.pyplot as plt\nimport torchvision.models as models\nfrom sklearn.model_selection import train_test_split\nfrom numpy import asarray ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if not os.path.exists('/root/.cache/torch/hub/checkpoints/'):\n        os.makedirs('/root/.cache/torch/hub/checkpoints/')\n!cp '../input/resnet101/resnet101.pth' '/root/.cache/torch/hub/checkpoints/resnet101-333f7ec4.pth'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"    \ndef train_tfm(size):\n    return A.Compose([\n    #             A.RandomResizedCrop(128, 128),\n                A.Resize(size + size//10, size + size//10),\n                A.RandomCrop(size, size),\n                A.Transpose(p=0.5),\n                A.HorizontalFlip(p=0.5),\n                A.VerticalFlip(p=0.5),\n                A.ShiftScaleRotate(p=0.5),\n                A.HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n                A.RandomBrightnessContrast(brightness_limit=(-0.1,0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n                A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], max_pixel_value=255.0, p=1.0),\n                A.CoarseDropout(p=0.5),\n                A.Cutout(p=0.5),\n                #A.ToTensorV2(p=1.0),\n            ], p=1.)\n\n      \n\ndef valid_tfm(size):\n    return A.Compose([ A.Resize(size, size),\n                     A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], max_pixel_value=255.0, p=1.0)\n                     ])\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def train_(epocs, loader, model, valid_set):\n    best_v_acc = 0.0\n    for epoch in range(epocs):  # loop over the dataset multiple times\n        print(\"Training...\")\n        correct = 0\n        total = 0\n        running_loss = 0.0\n        for i, data in enumerate(loader, 0):\n            # get the inputs; data is a list of [inputs, labels]\n            inputs, labels = data\n            inputs, labels = inputs.to('cuda'), labels.to('cuda')\n\n            # zero the parameter gradients\n            optimizer.zero_grad()\n\n            # forward + backward + optimize\n            outputs = model(inputs)\n            loss=criterion(outputs, labels)\n            loss.backward()\n            optimizer.step()\n            max_index = outputs.max(dim = 1)[1]\n            correct += (max_index == labels).sum().item()\n            total += labels.size(0)\n\n            \n            # print statistics\n            running_loss += loss.item()\n            if i % len(loader) == len(loader) - 1:    \n                print('[epoc: %d, %5d] training loss: %.3f' %\n                      (epoch + 1, i + 1, running_loss / len(loader)))\n                running_loss = 0.0\n        print(\"Training Accuracy = {}\".format(100 * correct / total))\n        \n        \n        correct = 0\n        total = 0\n        running_loss = 0.0\n        print(\"Validating...\")\n        for i, data in enumerate(valid_set, 0):\n            \n            with torch.no_grad():\n                inputs, labels = data\n                inputs, labels = inputs.to('cuda'), labels.to('cuda')\n                outputs = model(inputs)\n                loss=criterion(outputs, labels)\n                max_index = outputs.max(dim = 1)[1]\n                correct += (max_index == labels).sum().item()\n                total += labels.size(0)\n                \n                # print statistics\n                running_loss += loss.item()\n                if i % len(valid_set) == len(valid_set) - 1:    \n                    print('[epoc: %d, %5d] valid loss: %.3f' %\n                          (epoch + 1, i + 1, running_loss / len(loader)))\n                    running_loss = 0.0\n                    \n        if (100 * correct / total) > best_v_acc:\n            best_v_acc = (100 * correct / total)\n            print(\"best model saved\")\n            torch.save(model.state_dict(), 'best_model.pt')\n            \n                \n        print(\"valid Accuracy = {}\".format(100 * correct / total))\n                \n                \n    print('Finished Training')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X, y = df['image_id'].values, df['label'].values\nX_train, X_valid, Y_train, Y_valid = train_test_split(X, y, test_size=0.2)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class CassDataset(Dataset):\n    def __init__(self, Dir, FNames, Labels, Transform):\n        self.dir = Dir\n        self.fnames = FNames\n        self.transform = Transform\n        self.lbs = Labels\n        \n    def __len__(self):\n        return len(self.fnames)\n\n    def __getitem__(self, index):\n        x = Image.open(os.path.join(self.dir, self.fnames[index]))\n#         if self.valid:\n#             res  = self.transform(image=asarray(x))\n#             image = res['image'].astype(np.float32)\n#             return image, self.lbs[index] \n        if \"train\" in self.dir: \n            res  = self.transform(image=asarray(x))\n            image = res['image'].astype(np.float32)\n            return image, self.lbs[index]            \n        elif \"test\" in self.dir:            \n            return self.transform(image=asarray(x)), self.fnames[index]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def custom_collate(batch):\n    data = torch.stack([torch.tensor(item[0]) for item in batch]).permute(0, 3, 1, 2) # fixes axes before feeding no nn.\n    target = torch.LongTensor([item[1] for item in batch])  \n\n    return data, target","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"validate_tfm = valid_tfm(256)\ntraining_tfm = train_tfm(256)\n\ncass_trainset = CassDataset('../input/cassava-leaf-disease-classification/train_images/', X_train, Y_train, training_tfm)\ncass_trainloader = DataLoader(cass_trainset, batch_size=64, shuffle=True, num_workers=4, collate_fn=custom_collate)\ncass_validset = CassDataset('../input/cassava-leaf-disease-classification/train_images/', X_valid, Y_valid, validate_tfm)\ncass_validloader = DataLoader(cass_validset, batch_size=64, shuffle=True, num_workers=4, collate_fn=custom_collate)\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Lets look at some of the samples"},{"metadata":{"trusted":true},"cell_type":"code","source":"def visualize(image):\n    plt.figure(figsize=(10, 10))\n    plt.imshow(image)\n    #plt.cla()\n\nfor i in range(10):\n    visualize(cass_trainset[i][0][:])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## k, lets train!"},{"metadata":{"trusted":true},"cell_type":"code","source":"model_ft = models.resnet34(pretrained=True)\nnum_ftrs = model_ft.fc.in_features\nmodel_ft.fc = nn.Linear(num_ftrs, 5)\ncriterion = nn.CrossEntropyLoss()\nmodel_ft = model_ft.to('cuda')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n#optimizer = optim.Adam(model_ft.parameters(), lr=1e-7, weight_decay=1e-2)\noptimizer = optim.SGD(model_ft.parameters(), lr=1e-7, momentum=0.9)\nlr_finder = LRFinder(model_ft, optimizer, criterion)\nlr_finder.range_test(cass_trainloader, end_lr=100, num_iter=100)\nlr_finder.plot()\nlr_finder.reset()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = optim.SGD(model_ft.parameters(), lr=1e-2, momentum=0.9)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_(13, cass_trainloader, model_ft, cass_validloader)","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}