{"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":"# 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\nfor 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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nfrom torchvision.datasets.utils import download_url\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data.dataloader import DataLoader\nimport torchvision.transforms as tt\nfrom torch.utils.data import random_split\nimport os\nfrom torchvision.datasets import ImageFolder\nimport PIL\nfrom torchvision.transforms.functional import to_pil_image\nfrom torchvision.transforms import ToTensor\nimport matplotlib\nimport matplotlib.pyplot as plt\n%matplotlib inline\nfrom torch.utils.data import Dataset\nimport tarfile\nimport seaborn as sns\n!pip install jovian --upgrade --quiet\nimport jovian\nimport numpy as np\nfrom torchvision.utils import make_grid\nimport pandas as pd\n!pip install  opendatasets --quiet\nimport opendatasets as od ","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:30:53.22346Z","iopub.execute_input":"2023-01-05T04:30:53.224425Z","iopub.status.idle":"2023-01-05T04:31:21.216179Z","shell.execute_reply.started":"2023-01-05T04:30:53.22439Z","shell.execute_reply":"2023-01-05T04:31:21.214905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/mayo-clinic-strip-ai/train.csv')","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.22173Z","iopub.execute_input":"2023-01-05T04:31:21.224489Z","iopub.status.idle":"2023-01-05T04:31:21.247084Z","shell.execute_reply.started":"2023-01-05T04:31:21.22445Z","shell.execute_reply":"2023-01-05T04:31:21.246273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.head(10)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.252044Z","iopub.execute_input":"2023-01-05T04:31:21.254465Z","iopub.status.idle":"2023-01-05T04:31:21.277549Z","shell.execute_reply.started":"2023-01-05T04:31:21.254429Z","shell.execute_reply":"2023-01-05T04:31:21.276779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.281353Z","iopub.execute_input":"2023-01-05T04:31:21.283557Z","iopub.status.idle":"2023-01-05T04:31:21.296627Z","shell.execute_reply.started":"2023-01-05T04:31:21.283522Z","shell.execute_reply":"2023-01-05T04:31:21.295855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"augs = tt.Compose([\n#     transforms.ToPILImage(),\n    tt.Resize((480, 480)),\n    tt.ToTensor(), \n    tt.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n])","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.300425Z","iopub.execute_input":"2023-01-05T04:31:21.302481Z","iopub.status.idle":"2023-01-05T04:31:21.3098Z","shell.execute_reply.started":"2023-01-05T04:31:21.302449Z","shell.execute_reply":"2023-01-05T04:31:21.308892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.314252Z","iopub.execute_input":"2023-01-05T04:31:21.316894Z","iopub.status.idle":"2023-01-05T04:31:21.446316Z","shell.execute_reply.started":"2023-01-05T04:31:21.316857Z","shell.execute_reply":"2023-01-05T04:31:21.445234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train, df_test = train_test_split(\n    train_df, test_size=0.2, random_state=42, stratify=train_df.label)\n\ndf_train.shape, df_test.shape","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.451037Z","iopub.execute_input":"2023-01-05T04:31:21.453573Z","iopub.status.idle":"2023-01-05T04:31:21.475077Z","shell.execute_reply.started":"2023-01-05T04:31:21.453532Z","shell.execute_reply":"2023-01-05T04:31:21.47422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class StripDataset(Dataset):\n    def __init__(self, df, dataset_path, augmentation=None):\n        self.df = df\n        self.dataset_path = dataset_path\n#         self.dset = dset\n        self.image_id = df['image_id'].values\n        self.patient_id = df['patient_id'].values\n        self.targets = df['label'].values\n        self.augs = augmentation\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, idx):\n        image_id = self.image_id[idx]\n        target = self.targets[idx]\n#         image = read_image(image_id, self.dset, scale=None, verbose=0)\n        image = Image.open(os.path.join(self.dataset_path, image_id + \".tif\"))\n        \n        if self.augs:\n            image = self.augs(image)\n        target_map = {\n            \"CE\": 0,\n            \"LAA\": 1\n        }\n        return image, target_map[target]","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:29.983672Z","iopub.execute_input":"2023-01-05T04:43:29.984106Z","iopub.status.idle":"2023-01-05T04:43:29.993359Z","shell.execute_reply.started":"2023-01-05T04:43:29.984072Z","shell.execute_reply":"2023-01-05T04:43:29.992198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_PATH = '/kaggle/input/mayo-clinic-strip-ai/train'\nTEST_PATH  = '/kaggle/input/mayo-clinic-strip-ai/test'","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.500017Z","iopub.execute_input":"2023-01-05T04:31:21.502317Z","iopub.status.idle":"2023-01-05T04:31:21.508342Z","shell.execute_reply.started":"2023-01-05T04:31:21.502281Z","shell.execute_reply":"2023-01-05T04:31:21.50741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = StripDataset(df_train, TRAIN_PATH, augs)\ntest_dataset = StripDataset(df_test, TRAIN_PATH, augs)\n\ntrain_dataloader = DataLoader(\n    train_dataset,\n    batch_size=32,\n    num_workers=2,\n    shuffle=True,\n    pin_memory=True,\n)\ntest_dataloader = DataLoader(\n    test_dataset,\n    batch_size=32,\n    num_workers=2,\n    shuffle=False,\n    pin_memory=True,\n)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:32.742126Z","iopub.execute_input":"2023-01-05T04:43:32.742524Z","iopub.status.idle":"2023-01-05T04:43:32.749595Z","shell.execute_reply.started":"2023-01-05T04:43:32.742493Z","shell.execute_reply":"2023-01-05T04:43:32.748581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_default_device():\n    \"\"\"Pick GPU if available, else CPU\"\"\"\n    if torch.cuda.is_available():\n        return torch.device('cuda')\n    else:\n        return torch.device('cpu')\n    \ndef to_device(data, device):\n    \"\"\"Move tensor(s) to chosen device\"\"\"\n    if isinstance(data, (list,tuple)):\n        return [to_device(x, device) for x in data]\n    return data.to(device, non_blocking=True)\n\nclass DeviceDataLoader():\n    \"\"\"Wrap a dataloader to move data to a device\"\"\"\n    def __init__(self, dl, device):\n        self.dl = dl\n        self.device = device\n        \n    def __iter__(self):\n        \"\"\"Yield a batch of data after moving it to device\"\"\"\n        for b in self.dl: \n            yield to_device(b, self.device)\n\n    def __len__(self):\n        \"\"\"Number of batches\"\"\"\n        return len(self.dl)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:35.516852Z","iopub.execute_input":"2023-01-05T04:43:35.517233Z","iopub.status.idle":"2023-01-05T04:43:35.525919Z","shell.execute_reply.started":"2023-01-05T04:43:35.517202Z","shell.execute_reply":"2023-01-05T04:43:35.524765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = get_default_device()\ntrain_dl = DeviceDataLoader(train_dataloader,device)\ntest_dl = DeviceDataLoader(test_dataloader,device)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.548486Z","iopub.execute_input":"2023-01-05T04:31:21.55146Z","iopub.status.idle":"2023-01-05T04:31:21.691064Z","shell.execute_reply.started":"2023-01-05T04:31:21.551352Z","shell.execute_reply":"2023-01-05T04:31:21.689793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:31:21.692362Z","iopub.execute_input":"2023-01-05T04:31:21.693794Z","iopub.status.idle":"2023-01-05T04:31:21.70264Z","shell.execute_reply.started":"2023-01-05T04:31:21.693751Z","shell.execute_reply":"2023-01-05T04:31:21.701796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageClassificationBase(nn.Module):\n    def training_step(self, batch):\n        images, labels = batch \n        out = self(images)                  # Generate predictions yaha se forward function me pass ho jaega \n        loss = F.cross_entropy(out, labels) # Calculate loss\n        return loss\n    \n    def validation_step(self, batch):\n        images, labels = batch \n        out = self(images)                    # Generate predictions\n        loss = F.cross_entropy(out, labels)   # Calculate loss\n        acc = accuracy(out, labels)           # Calculate accuracy\n        return {'val_loss': loss.detach(), 'val_acc': acc}\n        \n    def validation_epoch_end(self, outputs):\n        batch_losses = [x['val_loss'] for x in outputs]\n        epoch_loss = torch.stack(batch_losses).mean()   # Combine losses\n        batch_accs = [x['val_acc'] for x in outputs]\n        epoch_acc = torch.stack(batch_accs).mean()      # Combine accuracies\n        return {'val_loss': epoch_loss.item(), 'val_acc': epoch_acc.item()}\n    \n    def epoch_end(self, epoch, result):\n        print(\"Epoch [{}], train_loss: {:.4f}, val_loss: {:.4f}, val_acc: {:.4f}\".format(\n            epoch, result['train_loss'], result['val_loss'], result['val_acc']))\n        \ndef accuracy(outputs, labels):\n    _, preds = torch.max(outputs, dim=1)\n    return torch.tensor(torch.sum(preds == labels).item() / len(preds))\n    ","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:38.784499Z","iopub.execute_input":"2023-01-05T04:43:38.784886Z","iopub.status.idle":"2023-01-05T04:43:38.79664Z","shell.execute_reply.started":"2023-01-05T04:43:38.784854Z","shell.execute_reply":"2023-01-05T04:43:38.795421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluate(model, val_loader):\n    model.eval()\n    outputs = [model.validation_step(batch) for batch in val_loader]\n    return model.validation_epoch_end(outputs)\n\ndef fit(epochs, lr, model, train_loader, val_loader, opt_func=torch.optim.SGD):\n    history = []\n    optimizer = opt_func(model.parameters(), lr)\n    for epoch in range(epochs):\n        # Training Phase \n        model.train()\n        train_losses = []\n        for batch in train_loader:\n            loss = model.training_step(batch)\n            train_losses.append(loss)\n            loss.backward()\n            optimizer.step()\n            optimizer.zero_grad()\n        # Validation phase\n        result = evaluate(model, val_loader)\n        result['train_loss'] = torch.stack(train_losses).mean().item()\n        model.epoch_end(epoch, result)\n        history.append(result)\n    return history","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:40.626946Z","iopub.execute_input":"2023-01-05T04:43:40.627338Z","iopub.status.idle":"2023-01-05T04:43:40.638625Z","shell.execute_reply.started":"2023-01-05T04:43:40.627306Z","shell.execute_reply":"2023-01-05T04:43:40.637536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def conv_block(in_channels, out_channels, pool=False):\n    layers = [nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), \n              nn.BatchNorm2d(out_channels), \n              nn.ReLU(inplace=True)]\n    if pool: layers.append(nn.MaxPool2d(2))\n    return nn.Sequential(*layers)","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:42.799033Z","iopub.execute_input":"2023-01-05T04:43:42.79943Z","iopub.status.idle":"2023-01-05T04:43:42.8065Z","shell.execute_reply.started":"2023-01-05T04:43:42.799397Z","shell.execute_reply":"2023-01-05T04:43:42.805248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ResNet9(ImageClassificationBase):\n    def __init__(self, in_channels, num_classes):\n        super().__init__()\n        \n        self.conv1 = conv_block(in_channels, 64)\n        self.conv2 = conv_block(64, 128, pool=True)\n        self.res1 = nn.Sequential(conv_block(128, 128), conv_block(128, 128))\n        \n        self.conv3 = conv_block(128, 256, pool=True)\n        self.conv4 = conv_block(256, 512, pool=True)\n        self.res2 = nn.Sequential(conv_block(512, 512), conv_block(512, 512))\n        \n        self.classifier = nn.Sequential(nn.AdaptiveMaxPool2d(1), \n                                        nn.Flatten(), \n                                        nn.Dropout(0.2),\n                                        nn.Linear(512, num_classes))\n        \n    def forward(self, xb):\n        out = self.conv1(xb)\n        out = self.conv2(out)\n        out = self.res1(out) + out\n        out = self.conv3(out)\n        out = self.conv4(out)\n        out = self.res2(out) + out\n        out = self.classifier(out)\n        return out","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:43.08622Z","iopub.execute_input":"2023-01-05T04:43:43.087445Z","iopub.status.idle":"2023-01-05T04:43:43.097538Z","shell.execute_reply.started":"2023-01-05T04:43:43.0874Z","shell.execute_reply":"2023-01-05T04:43:43.0964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.cuda.empty_cache()\nmodel = to_device(ResNet9(3,2), device)\n## 3 ---no of input channels rgb\n ","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:49.558649Z","iopub.execute_input":"2023-01-05T04:43:49.559425Z","iopub.status.idle":"2023-01-05T04:43:49.677949Z","shell.execute_reply.started":"2023-01-05T04:43:49.559365Z","shell.execute_reply":"2023-01-05T04:43:49.676626Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:41:05.478142Z","iopub.execute_input":"2023-01-05T04:41:05.479059Z","iopub.status.idle":"2023-01-05T04:41:05.487152Z","shell.execute_reply.started":"2023-01-05T04:41:05.479013Z","shell.execute_reply":"2023-01-05T04:41:05.485932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = [evaluate(model, test_dl)]\nhistory","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:53.276926Z","iopub.execute_input":"2023-01-05T04:43:53.277312Z","iopub.status.idle":"2023-01-05T04:43:53.475858Z","shell.execute_reply.started":"2023-01-05T04:43:53.27728Z","shell.execute_reply":"2023-01-05T04:43:53.473213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image","metadata":{"execution":{"iopub.status.busy":"2023-01-05T04:43:20.319923Z","iopub.execute_input":"2023-01-05T04:43:20.321184Z","iopub.status.idle":"2023-01-05T04:43:20.327738Z","shell.execute_reply.started":"2023-01-05T04:43:20.321135Z","shell.execute_reply":"2023-01-05T04:43:20.326434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}