{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Library Imports"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport torch\nfrom torch import nn, optim\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader as DL\nfrom torch.nn.utils import weight_norm as WN\nimport torch.nn.functional as F\n\nimport gc\nimport os\nimport cv2\nfrom time import time\n\ntorch.backends.cudnn.deterministic = True\ntorch.backends.cudnn.benchmark = False\n\nseed = 42","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Helper Functions"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"def breaker():\n    print(\"\\n\" + 50*\"-\" + \"\\n\")\n\ndef head(x, no_of_ele=5):\n    print(x[:no_of_ele])\n    \ndef getImages(file_path=None, file_names=None, size=None):\n    images = []\n    for name in file_names:\n        try:\n            image = cv2.imread(file_path + name + \".jpg\", cv2.IMREAD_GRAYSCALE).astype(\"float64\")\n        except AttributeError:\n            print(file_path + name)\n        if size:\n            image = cv2.resize(image, dsize=(size, size), interpolation=cv2.INTER_LANCZOS4)\n        cv2.normalize(src=image, dst=image, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)\n        images.append(image.reshape(1, size, size))\n    return np.array(images)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Handling"},{"metadata":{},"cell_type":"markdown","source":"**Loading Image Data**"},{"metadata":{"trusted":true},"cell_type":"code","source":"start_time = time()\n\nss = pd.read_csv(\"../input/ranzcr-clip-catheter-line-classification/sample_submission.csv\")\n\nts_img_names = ss[\"StudyInstanceUID\"].values\nts_images = getImages(\"../input/ranzcr-clip-catheter-line-classification/test/\", \n                      ts_img_names, \n                      size=144)\n\nbreaker()\nprint(\"Time Taken to read data : {:.2f} minutes\".format((time() - start_time)/60))\nbreaker()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Dataset Template**"},{"metadata":{"trusted":true},"cell_type":"code","source":"class Dataset(Dataset):\n    def __init__(this, X=None, y=None, mode=\"train\"):\n        this.mode = mode\n        this.X = X\n        if mode == \"train\":\n            this.y = y\n            \n    def __len__(this):\n        return this.X.shape[0]\n    \n    def __getitem__(this, idx):\n        if this.mode == \"train\":\n            return torch.FloatTensor(this.X[idx]), torch.FloatTensor(this.y[idx])\n        else:\n            return torch.FloatTensor(this.X[idx])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# CNN Configuration and Setup"},{"metadata":{},"cell_type":"markdown","source":"**Config**"},{"metadata":{"trusted":true},"cell_type":"code","source":"class CFG():\n    tr_batch_size = 128 # Alos va_batch_size\n    ts_batch_size = 128\n    \n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    \n    in_channels = 1\n    OL = 11\n    \n    def __init__(this, filter_sizes=[64, 128, 256, 512], HL=[4096, 4096], epochs=50, n_folds=5):\n        this.filter_sizes = filter_sizes\n        this.HL = HL\n        this.epochs = epochs\n        this.n_folds = n_folds","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Setup**"},{"metadata":{"trusted":true},"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(this, in_channels=1, filter_sizes=None, HL=None, OL=None, use_DP=False, DP1=0.2, DP2=0.5):\n        super(CNN, this).__init__()\n        \n        this.use_DP = use_DP\n        \n        this.DP1 = nn.Dropout(p=0.2)\n        this.DP2 = nn.Dropout(p=0.5)\n        \n        this.MP_ = nn.MaxPool2d(kernel_size=2)\n        \n        this.CN1 = nn.Conv2d(in_channels=in_channels, out_channels=filter_sizes[0], kernel_size=3, stride=1, padding=1)\n        this.BN1 = nn.BatchNorm2d(num_features=filter_sizes[0], eps=1e-5)\n        \n        this.CN2 = nn.Conv2d(in_channels=filter_sizes[0], out_channels=filter_sizes[1], kernel_size=3, stride=1, padding=1)\n        this.BN2 = nn.BatchNorm2d(num_features=filter_sizes[1], eps=1e-5)\n        \n        this.CN3 = nn.Conv2d(in_channels=filter_sizes[1], out_channels=filter_sizes[2], kernel_size=3, stride=1, padding=1)\n        this.BN3 = nn.BatchNorm2d(num_features=filter_sizes[2], eps=1e-5)\n    \n        this.CN4 = nn.Conv2d(in_channels=filter_sizes[2], out_channels=filter_sizes[3], kernel_size=3, stride=1, padding=1)\n        this.BN4 = nn.BatchNorm2d(num_features=filter_sizes[3], eps=1e-5)\n        \n        this.CN5 = nn.Conv2d(in_channels=filter_sizes[3], out_channels=filter_sizes[3], kernel_size=3, stride=1, padding=1)\n        this.BN5 = nn.BatchNorm2d(num_features=filter_sizes[3], eps=1e-5)\n        \n        this.CN6 = nn.Conv2d(in_channels=filter_sizes[3], out_channels=filter_sizes[3], kernel_size=3, stride=1, padding=1)\n        this.BN6 = nn.BatchNorm2d(num_features=filter_sizes[3], eps=1e-5)\n        \n        this.FC1 = nn.Linear(in_features=filter_sizes[3]*2*2, out_features=HL[0])\n        this.FC2 = nn.Linear(in_features=HL[0], out_features=HL[1])\n        this.FC3 = nn.Linear(in_features=HL[1], out_features=OL)\n        \n    def getOptimizer(this, A_S=True, lr=1e-3, wd=0):\n        if A_S:\n            return optim.Adam(this.parameters(), lr=lr, weight_decay=wd)\n        else:\n            return optim.SGD(this.parameters(), lr=lr, momentum=0.9, weight_decay=wd)\n\n    def getStepLR(this, optimizer=None, step_size=5, gamma=0.1):\n        return optim.lr_scheduler.StepLR(optimizer=optimizer, step_size=step_size, gamma=gamma)\n\n    def getMultiStepLR(this, optimizer=None, milestones=None, gamma=0.1):\n        return optim.lr_scheduler.MultiStepLR(optimizer=optimizer, milestones=milestones, gamma=gamma)\n        \n    def getPlateauLR(this, optimizer=None, patience=5, eps=1e-6):\n        return optim.lr_scheduler.ReduceLROnPlateau(optimizer=optimizer, patience=patience, eps=eps, verbose=True)\n    \n    def forward(this, x):\n        if not this.use_DP:\n            x = F.relu(this.MP_(this.BN1(this.CN1(x))))\n            x = F.relu(this.MP_(this.BN2(this.CN2(x))))\n            x = F.relu(this.MP_(this.BN3(this.CN3(x))))\n            x = F.relu(this.MP_(this.BN4(this.CN4(x))))\n            x = F.relu(this.MP_(this.BN5(this.CN5(x))))\n            x = F.relu(this.MP_(this.BN6(this.CN6(x))))\n            \n            x = x.view(x.shape[0], -1)\n            \n            x = F.relu(this.FC1(x))\n            x = F.relu(this.FC2(x))\n            x = this.FC3(x)\n            \n            return x\n        else:\n            x = F.relu(this.MP_(this.BN1(this.CN1(x))))\n            x = F.relu(this.MP_(this.BN2(this.CN2(x))))\n            x = F.relu(this.MP_(this.BN3(this.CN3(x))))\n            x = F.relu(this.MP_(this.BN4(this.CN4(x))))\n            x = F.relu(this.MP_(this.BN5(this.CN5(x))))\n            x = F.relu(this.MP_(this.BN6(this.CN6(x))))\n            \n            x = x.view(x.shape[0], -1)\n            \n            x = F.relu(this.DP2(this.FC1(x)))\n            x = F.relu(this.DP2(this.FC2(x)))\n            x = this.FC3(x)\n            \n            return x","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Predict Function**"},{"metadata":{"trusted":true},"cell_type":"code","source":"def predict_(model=None, dataloader=None, device=None, path=None):\n    if path:\n        model.load_state_dict(torch.load(path))\n    else:\n        pass\n    model.to(device)\n    model.eval()\n\n    y_pred = torch.zeros(1, 11).to(device)\n\n    for X in dataloader:\n        X = X.to(device)\n        with torch.no_grad():\n            Pred = torch.sigmoid(model(X))\n        y_pred = torch.cat((y_pred, Pred), dim=0)\n    \n    return y_pred[1:].detach().cpu().numpy()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Submission "},{"metadata":{"trusted":true},"cell_type":"code","source":"cfg = CFG(filter_sizes=[64, 128, 256, 512], HL=[4096, 4096], epochs=50, n_folds=5)\n\nts_data_setup = Dataset(ts_images, None, \"test\")\nts_data = DL(ts_data_setup, batch_size=cfg.ts_batch_size, shuffle=False)\n\nmodel = CNN(in_channels=cfg.in_channels, filter_sizes=cfg.filter_sizes, HL=cfg.HL, OL=cfg.OL)\n\ny_pred_e19 = predict_(model=model, dataloader=ts_data, device=cfg.device, path=\"../input/rccl-1x144-f-train/Epoch_19.pt\")\ny_pred_e20 = predict_(model=model, dataloader=ts_data, device=cfg.device, path=\"../input/rccl-1x144-f-train/Epoch_20.pt\")\ny_pred_e23 = predict_(model=model, dataloader=ts_data, device=cfg.device, path=\"../input/rccl-1x144-f-train/Epoch_23.pt\")\ny_pred_e25 = predict_(model=model, dataloader=ts_data, device=cfg.device, path=\"../input/rccl-1x144-f-train/Epoch_25.pt\")\n\ny_pred = (y_pred_e19 + y_pred_e20 + y_pred_e23 + y_pred_e25)/4\ny_pred = np.clip(y_pred, 1e-15, 1-1e-15)\n\nss.iloc[:, 1:] = y_pred\nss.to_csv(\"./submission.csv\", index=False)\nss.head(5)","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}