{"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 -q timm","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:23:43.845534Z","iopub.execute_input":"2022-10-04T09:23:43.846636Z","iopub.status.idle":"2022-10-04T09:23:56.925638Z","shell.execute_reply.started":"2022-10-04T09:23:43.84606Z","shell.execute_reply":"2022-10-04T09:23:56.924467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport shutil\nimport os\nfrom pathlib import Path\nimport cv2\nimport random\nimport shutil\nimport gc\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.utils.class_weight import compute_class_weight\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nimport timm\nimport torch\nfrom torch.utils.data import DataLoader\nfrom torch import nn, optim\nfrom torch.autograd import Variable\nfrom torchvision import models\nimport pytorch_lightning as pl\nfrom torch.nn import functional as F\nfrom torch.optim.lr_scheduler import CosineAnnealingWarmRestarts\nfrom pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint\nfrom pytorch_lightning.loggers import WandbLogger\nfrom torchmetrics import F1Score\nimport warnings\n\nwarnings.filterwarnings(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-10-04T09:23:56.928665Z","iopub.execute_input":"2022-10-04T09:23:56.929079Z","iopub.status.idle":"2022-10-04T09:24:02.199296Z","shell.execute_reply.started":"2022-10-04T09:23:56.929038Z","shell.execute_reply":"2022-10-04T09:24:02.198268Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df1 = pd.read_csv('../input/mayo-images-part1/tiles_df.csv')\n\ndf2 = pd.DataFrame({\n    'image_path': sorted(os.listdir('../input/mayo-images-part2/train_images_part2'))\n})\ndf2.image_path = df2.image_path.apply(lambda x: x[:-4])\n\ndf3 = pd.DataFrame({\n    'image_path': sorted(os.listdir('../input/mayo-images-part1/train_images_part1'))\n})\ndf3.image_path = df3.image_path.apply(lambda x: x[:-4])","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:02.20064Z","iopub.execute_input":"2022-10-04T09:24:02.201399Z","iopub.status.idle":"2022-10-04T09:24:04.734222Z","shell.execute_reply.started":"2022-10-04T09:24:02.201356Z","shell.execute_reply":"2022-10-04T09:24:04.733235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_1 = pd.merge(df2, df1, on='image_path', how='left')\ndf_2 = pd.merge(df3, df1, on='image_path', how='left')","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:04.737845Z","iopub.execute_input":"2022-10-04T09:24:04.738145Z","iopub.status.idle":"2022-10-04T09:24:04.841706Z","shell.execute_reply.started":"2022-10-04T09:24:04.738116Z","shell.execute_reply":"2022-10-04T09:24:04.840739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"args = {\n    'path': '../input/mayo-images-part1/train_images_part1/',\n    'path_2': '../input/mayo-images-part2/train_images_part2/',\n    'img_size': 384,\n    'seed': 0,\n    'batch_size': 16,\n    'epochs': 3,\n    'lr': 1e-4,\n    'p': .5\n}\n\ndf_1['path'] = [args['path_2']+filepath for filepath in sorted(os.listdir(args['path_2']))]\ndf_2['path'] = [args['path']+filepath for filepath in sorted(os.listdir(args['path']))]","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:04.843911Z","iopub.execute_input":"2022-10-04T09:24:04.844633Z","iopub.status.idle":"2022-10-04T09:24:04.932651Z","shell.execute_reply.started":"2022-10-04T09:24:04.844591Z","shell.execute_reply":"2022-10-04T09:24:04.931734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.concat([df_2, df_1], ignore_index=True)","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:04.933977Z","iopub.execute_input":"2022-10-04T09:24:04.934343Z","iopub.status.idle":"2022-10-04T09:24:04.945967Z","shell.execute_reply.started":"2022-10-04T09:24:04.934305Z","shell.execute_reply":"2022-10-04T09:24:04.944824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del df_1, df_2, df1, df2, df3\n_ = gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:04.947369Z","iopub.execute_input":"2022-10-04T09:24:04.948936Z","iopub.status.idle":"2022-10-04T09:24:05.114218Z","shell.execute_reply.started":"2022-10-04T09:24:04.948897Z","shell.execute_reply":"2022-10-04T09:24:05.113095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.countplot(data=df, x='label');","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:05.115856Z","iopub.execute_input":"2022-10-04T09:24:05.116544Z","iopub.status.idle":"2022-10-04T09:24:05.392939Z","shell.execute_reply.started":"2022-10-04T09:24:05.116503Z","shell.execute_reply":"2022-10-04T09:24:05.391941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageDataset(pl.LightningDataModule):\n    def __init__(self, dataframe, transform=None):\n        self.images = [filepath for filepath in dataframe['path']]\n        self.labels = list(dataframe['label'].map({'CE': 0, 'LAA': 1}))\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.images)\n    \n    def __getitem__(self, idx):\n        img = cv2.imread(self.images[idx])\n        if self.transform is not None:\n            img = self.transform(image=img)['image']\n        label = torch.tensor(self.labels[idx])\n        return img, label","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:05.397151Z","iopub.execute_input":"2022-10-04T09:24:05.397799Z","iopub.status.idle":"2022-10-04T09:24:05.409383Z","shell.execute_reply.started":"2022-10-04T09:24:05.397762Z","shell.execute_reply":"2022-10-04T09:24:05.408417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_transform = A.Compose(\n    [\n        A.Resize(args['img_size'], args['img_size']),\n        A.HorizontalFlip(p=args['p']),\n        A.VerticalFlip(p=args['p']),\n        A.Rotate(p=args['p']),\n        A.RGBShift(p=args['p']),\n        A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),\n        ToTensorV2()\n    ]\n)\n\nval_transform = A.Compose(\n    [\n        A.Resize(args['img_size'], args['img_size']),\n        A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),\n        ToTensorV2()\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:05.416291Z","iopub.execute_input":"2022-10-04T09:24:05.41894Z","iopub.status.idle":"2022-10-04T09:24:05.432342Z","shell.execute_reply.started":"2022-10-04T09:24:05.4189Z","shell.execute_reply":"2022-10-04T09:24:05.42876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train, val = train_test_split(df, test_size=.2, random_state=args['seed'], stratify=df['label'].values)\n\ntrain_data = ImageDataset(train, transform=train_transform)\ntrain_loader = DataLoader(train_data, shuffle=True, batch_size=args['batch_size'])\n\nval_data = ImageDataset(val, transform=val_transform)\nval_loader = DataLoader(val_data, shuffle=False, batch_size=args['batch_size'])","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:05.434454Z","iopub.execute_input":"2022-10-04T09:24:05.434814Z","iopub.status.idle":"2022-10-04T09:24:05.625764Z","shell.execute_reply.started":"2022-10-04T09:24:05.434769Z","shell.execute_reply":"2022-10-04T09:24:05.623665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Model(pl.LightningModule):\n    \n    def __init__(self, lr=1e-3):\n        super(Model, self).__init__()\n        self.backbone = timm.create_model('deit3_base_patch16_384_in21ft1k', pretrained=True, num_classes=2)\n        \n        self.lr = lr\n        self.train_f1 = F1Score(num_classes=2, average='weighted')\n        self.val_f1 = F1Score(num_classes=2, average='weighted')\n        \n    def forward(self, x):\n        x = self.backbone(x)\n        return x\n    \n    def loss_fn(self, logits, labels):\n        return F.cross_entropy(logits, labels)\n    \n    def training_step(self, train_batch, batch_idx):\n        x, y = train_batch\n        logits = self.forward(x.float())\n        loss = self.loss_fn(logits, y)\n        self.log('train_loss', loss)\n        \n        self.train_f1(logits, y)\n        self.log('train_f1_step', self.train_f1)\n        return loss\n    \n    def validation_step(self, val_batch, batch_idx):\n        x, y = val_batch\n        logits = self.forward(x.float())\n        loss = self.loss_fn(logits, y)\n        self.log('val_loss', loss)\n        \n        self.val_f1(logits, y)\n        self.log('val_f1_step', self.val_f1)\n        return loss\n    \n    def training_epoch_end(self, outs):\n        self.log('train_f1_epoch', self.train_f1)\n    \n    def validation_epoch_end(self, outs):\n        self.log('val_f1_epoch', self.val_f1)\n        \n    def configure_optimizers(self):\n        optimizer = optim.Adam(self.parameters(), lr=self.lr)\n        return [optimizer]","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:05.627428Z","iopub.execute_input":"2022-10-04T09:24:05.628125Z","iopub.status.idle":"2022-10-04T09:24:05.641124Z","shell.execute_reply.started":"2022-10-04T09:24:05.628086Z","shell.execute_reply":"2022-10-04T09:24:05.640293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Model(lr=args['lr'])\n\nwandb_logger = WandbLogger(project=\"mayo_comp_iter\", log_model=\"all\", name='1')\nmodel_checkpoint = ModelCheckpoint(save_top_k=1, monitor='val_loss', filename='{epoch}--{val_loss:.5f}', dirpath='checkpoints/')\n\ncallbacks = [model_checkpoint]","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:05.642808Z","iopub.execute_input":"2022-10-04T09:24:05.644112Z","iopub.status.idle":"2022-10-04T09:24:52.561839Z","shell.execute_reply.started":"2022-10-04T09:24:05.644073Z","shell.execute_reply":"2022-10-04T09:24:52.560882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def seed_everything(seed=args['seed']):\n    pl.seed_everything(seed=seed, workers=True)\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:52.563245Z","iopub.execute_input":"2022-10-04T09:24:52.563594Z","iopub.status.idle":"2022-10-04T09:24:52.571201Z","shell.execute_reply.started":"2022-10-04T09:24:52.563557Z","shell.execute_reply":"2022-10-04T09:24:52.570166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed_everything()\n\ntrainer = pl.Trainer(\n    max_epochs=args['epochs'],\n    callbacks=callbacks,\n    accelerator='gpu',\n    devices=1,\n    deterministic=True,\n    logger=wandb_logger\n)\ntrainer.fit(model, train_loader, val_loader)","metadata":{"execution":{"iopub.status.busy":"2022-10-04T09:24:52.572565Z","iopub.execute_input":"2022-10-04T09:24:52.573433Z","iopub.status.idle":"2022-10-04T18:12:01.817799Z","shell.execute_reply.started":"2022-10-04T09:24:52.573349Z","shell.execute_reply":"2022-10-04T18:12:01.815927Z"},"trusted":true},"execution_count":null,"outputs":[]}]}