{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install torch-snippets -q","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-30T08:35:24.422350Z","iopub.execute_input":"2022-08-30T08:35:24.422757Z","iopub.status.idle":"2022-08-30T08:35:40.579368Z","shell.execute_reply.started":"2022-08-30T08:35:24.422725Z","shell.execute_reply":"2022-08-30T08:35:40.578272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# imports \nimport torch, cv2\nfrom PIL import Image \nfrom torch_snippets import *\nimport os, numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt \n\nfrom IPython import display \ndisplay.set_matplotlib_formats('svg')","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:07.318821Z","iopub.execute_input":"2022-08-30T08:37:07.319258Z","iopub.status.idle":"2022-08-30T08:37:12.711103Z","shell.execute_reply.started":"2022-08-30T08:37:07.319225Z","shell.execute_reply":"2022-08-30T08:37:12.709862Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load the csv file \nPATH = '../input/aptos2019-blindness-detection'\ntrain = f'{PATH}/train.csv'\ntest = f'{PATH}/test.csv' \n\ntrain_csv = pd.read_csv(train)\ntest_csv = pd.read_csv(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:15.217545Z","iopub.execute_input":"2022-08-30T08:37:15.218501Z","iopub.status.idle":"2022-08-30T08:37:15.246368Z","shell.execute_reply.started":"2022-08-30T08:37:15.218457Z","shell.execute_reply":"2022-08-30T08:37:15.245338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:16.614647Z","iopub.execute_input":"2022-08-30T08:37:16.615057Z","iopub.status.idle":"2022-08-30T08:37:16.635689Z","shell.execute_reply.started":"2022-08-30T08:37:16.615023Z","shell.execute_reply":"2022-08-30T08:37:16.634587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# storing path to csv file \ntrain_csv['train_path'] = [f'{PATH}/train_images/{train_csv.iloc[i, 0]}.png' for i in range(len(train_csv))]\ntest_csv['test_path'] = [f'{PATH}/test_images/{test_csv.iloc[i, 0]}.png' for i in range(len(test_csv))]","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:17.413223Z","iopub.execute_input":"2022-08-30T08:37:17.414178Z","iopub.status.idle":"2022-08-30T08:37:17.602978Z","shell.execute_reply.started":"2022-08-30T08:37:17.414140Z","shell.execute_reply":"2022-08-30T08:37:17.601901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# let's do more augumentation for the training data \nimport albumentations as A\ntransform = A.Compose([\n    A.Rotate(limit = 40, p=0.9), \n    A.HorizontalFlip(p=0.5), \n    A.VerticalFlip(p=0.5), \n    A.RGBShift(r_shift_limit = 25, g_shift_limit = 25, b_shift_limit=25, p=0.9), \n    A.OneOf([\n        A.Blur(blur_limit = 3, p=0.5), \n        A.ColorJitter(p=0.5)\n    ],p=1.0),  \n])","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:18.596021Z","iopub.execute_input":"2022-08-30T08:37:18.596423Z","iopub.status.idle":"2022-08-30T08:37:18.748707Z","shell.execute_reply.started":"2022-08-30T08:37:18.596391Z","shell.execute_reply":"2022-08-30T08:37:18.747722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# custom class for load the dataset \nclass CustomTrain(Dataset): \n    def __init__(self, csv, height, width, method,  transform = None): \n        self.csv = csv  \n        self.height = height \n        self.width = width \n        self.transform = transform \n        self.method = method \n        \n    def __len__(self): \n        return len(self.csv)\n    \n    def __getitem__(self, index): \n        if self.method == 'train': \n            path = self.csv.iloc[index, 2] # To get the path \n            image = cv2.imread(path)\n            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n            image = cv2.resize(image, (self.height, self.width))\n            image = np.transpose(image, (2, 0, 1))\n            label = self.csv.iloc[index, 1]\n            \n            return image, label\n            \n            if self.transform is not None: \n                augumented = self.transform(image = image)\n                image = augumented['image']\n                image = cv2.resize(image, (self.height, self.width))\n                label = self.csv.iloc[index, 1]\n                \n                return image, label \n        \n        if self.method == 'test': \n            path = self.csv.iloc[index,1]\n            image = cv2.imread(path)\n            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n            image = cv2.resize(image, (self.height, self.width))\n            image = np.transpose(image, (2, 0, 1))\n            \n            return image \n\ntrain_dataset = CustomTrain(train_csv, 224, 224, method = 'train')\ntest_dataset = CustomTrain(test_csv, 224, 224, method = 'test')","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:19.326129Z","iopub.execute_input":"2022-08-30T08:37:19.326531Z","iopub.status.idle":"2022-08-30T08:37:19.340053Z","shell.execute_reply.started":"2022-08-30T08:37:19.326499Z","shell.execute_reply":"2022-08-30T08:37:19.338749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = DataLoader(train_dataset, batch_size = 32, shuffle = True) \ntest_loader = DataLoader(test_dataset, batch_size = 32, shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:20.291416Z","iopub.execute_input":"2022-08-30T08:37:20.292141Z","iopub.status.idle":"2022-08-30T08:37:20.297904Z","shell.execute_reply.started":"2022-08-30T08:37:20.292092Z","shell.execute_reply":"2022-08-30T08:37:20.297082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the Pretrained model model \nimport torchvision.models as models\n\ndef get_model(model_name, output_size): \n    \n    model = model_name\n    for param in model.parameters():\n        param.requires_grad = False  # freezing all layers \n    \n    num_ftrs = model.fc.in_features   \n    number_of_classes = output_size \n    \n    model.fc = nn.Linear(num_ftrs, number_of_classes)  # constructing new layers. \n    model.to(device)\n    \n    loss = nn.CrossEntropyLoss()\n    optimizer = optim.Adam(model.fc.parameters(), lr = 0.001) \n    \n    return model, loss, optimizer   \n\nmodel, loss, optimizer = get_model(models.resnet18(pretrained = True), 5) # we have 5 different classes! ","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:23.132674Z","iopub.execute_input":"2022-08-30T08:37:23.133505Z","iopub.status.idle":"2022-08-30T08:37:23.415517Z","shell.execute_reply.started":"2022-08-30T08:37:23.133456Z","shell.execute_reply":"2022-08-30T08:37:23.414494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tqdm import tqdm \ndef train_model(model, train_loader, loss_fn, optimizer, epochs): \n    model.train()\n    \n    # storing variables\n    training_loss = []\n    validation_loss = []\n    training_accuracy = []\n    validation_accuracy = []\n    \n    total_step = len(train_loader)\n    \n    for epoch in tqdm(range(epochs)):  # for loop for epochs \n        \n        # capture loss, acc for training \n        running_loss = 0 \n        total = 0 \n        correct = 0 \n        \n        for data in train_loader: \n            images, labels = data \n            \n            images = images.to(device)\n            labels = labels.to(device)\n            \n            optimizer.zero_grad()\n            outputs = model(images.float())\n            loss = loss_fn(outputs, labels)\n            \n            loss.backward()\n            optimizer.step()\n            \n            running_loss += loss.item()\n            __, prediction = torch.max(outputs, dim = 1)\n            \n            correct += torch.sum(prediction == labels).item()\n            total += labels.size(0)\n            \n        training_accuracy.append( 100 * correct / total )\n        training_loss.append( running_loss / total_step )\n        \n#         # capture loss, acc for validation \n#         total_validataion = 0 \n#         correct_validaion = 0 \n#         running_loss_validation = 0 \n        \n#         with torch.no_grad(): \n#             model.eval()\n            \n#             for test in test_loader: \n#                 images_val, labels_val = test \n                \n#                 images_val = images_val.to(device)\n#                 labels_val = labels_val.to(device)\n                \n#                 outputs_val = model(images_val)\n#                 loss_val = loss_fn(outputs_val, labels_val)\n                \n#                 running_loss_validation += loss_val.item()\n#                 ___, prediction_val = torch.max(outputs_val, dim = 1)\n#                 correct_validaion += torch.sum( prediction_val == labels_val ).item()\n#                 total_validataion += labels_val.size(0)\n                \n#             validation_accuracy.append( 100 * correct_validaion / total_validataion )\n#             validation_loss.append( running_loss_validation / len(test_loader) ) \n            \n        model.train()\n    return model, training_loss, training_accuracy #, validation_loss,validation_accuracy ","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:49.441186Z","iopub.execute_input":"2022-08-30T08:37:49.441625Z","iopub.status.idle":"2022-08-30T08:37:49.454999Z","shell.execute_reply.started":"2022-08-30T08:37:49.441592Z","shell.execute_reply":"2022-08-30T08:37:49.454066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model, training_loss, training_accuracy= train_model(model, train_loader, loss, optimizer, 2)","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:37:57.654704Z","iopub.execute_input":"2022-08-30T08:37:57.655590Z","iopub.status.idle":"2022-08-30T08:58:19.941789Z","shell.execute_reply.started":"2022-08-30T08:37:57.655554Z","shell.execute_reply":"2022-08-30T08:58:19.940064Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def single_classify(image): \n    image = np.expand_dims(image, axis = 0) \n    image = torch.tensor(image)\n    output = model(image.float())\n    \n    _, predicted = torch.max(output, 1)\n    \n    return predicted","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:58:27.153668Z","iopub.execute_input":"2022-08-30T08:58:27.154945Z","iopub.status.idle":"2022-08-30T08:58:27.163240Z","shell.execute_reply.started":"2022-08-30T08:58:27.154845Z","shell.execute_reply":"2022-08-30T08:58:27.161929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# single_classify(train_dataset[3][0])","metadata":{"execution":{"iopub.status.busy":"2022-08-30T08:58:30.291747Z","iopub.execute_input":"2022-08-30T08:58:30.292188Z","iopub.status.idle":"2022-08-30T08:58:30.401491Z","shell.execute_reply.started":"2022-08-30T08:58:30.292152Z","shell.execute_reply":"2022-08-30T08:58:30.400415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# train_dataset[3][1]","metadata":{"execution":{"iopub.status.busy":"2022-08-30T09:08:52.285997Z","iopub.execute_input":"2022-08-30T09:08:52.286469Z","iopub.status.idle":"2022-08-30T09:08:52.345837Z","shell.execute_reply.started":"2022-08-30T09:08:52.286432Z","shell.execute_reply":"2022-08-30T09:08:52.344662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}