{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport torch\nimport torch.nn as nn\nimport math\nimport os\nimport copy\nimport time\nimport PIL\nimport torch.utils.data as Data\nfrom torchvision import transforms, models\nfrom typing import Any, Callable, List, Optional, Union, Tuple\nfrom torchvision.datasets.vision import VisionDataset\n\n\nclass RanzcrDataset(VisionDataset):\n    def __init__(\n        self,\n        root: str,\n        transform: Optional[Callable] = None,\n        target_transform: Optional[Callable] = None,):\n\n        super(RanzcrDataset, self).__init__(root, transform=transform,\n                                     target_transform=target_transform)    \n\n        self.train_data = pd.read_csv(os.path.join(self.root, 'ranzcr-clip-catheter-line-classification', \"sample_submission.csv\"),  header=0)\n        self.train_data = self.train_data.values\n       \n    def __getitem__(self, index: int) -> Tuple[Any, Any]:\n        fn = self.train_data[index, 0] + '.jpg'\n        X = PIL.Image.open(os.path.join(self.root, 'ranzcr-clip-catheter-line-classification/test', fn))\n        X=X.convert('RGB')\n        X = X.resize((100, 100), PIL.Image.BILINEAR)\n        X_tensor=transforms.ToTensor()(X)\n        X_tensor=transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))(X_tensor)\n              \n        target = self.train_data[index, 1:-2]\n        target_tensor = torch.tensor(target.tolist())\n        return X_tensor, target_tensor\n\n    def __len__(self) -> int:\n        return len(self.train_data)\n\n\ndef valid_model(model_list, validdataloader, targetCol, criterion):\n    prediction = torch.tensor([]).to(\"cuda\")\n    for images, labels in validdataloader:\n        b_x = images.to(\"cuda\")\n\n        stack = torch.tensor([]).to(\"cuda\")\n        for model in model_list:\n            model.eval()\n            output = model(b_x)\n            new = torch.argmax(output,1).unsqueeze(0)\n            # print(\"new: \", new.shape)\n            stack = torch.cat((stack, new),0)\n\n            # print(\"Stack: \",stack.shape)\n        prediction = torch.cat((prediction, stack), 1)\n        print(\"***Prediction***\", prediction.shape)\n    return torch.Tensor.numpy(prediction.cpu())\n\n\nclass RanZcrNet(nn.Module):\n    def __init__(self):\n        super(RanZcrNet, self).__init__()\n        self.conv1=nn.Sequential(\n            nn.Conv2d(1, 3, kernel_size=1, bias=False),\n            )\n        self.resnet= models.resnet34(pretrained=True)\n        self.classifier = nn.Sequential(\n            nn.Linear(1000, 100),\n            nn.ReLU(True),\n            nn.Dropout(),\n            nn.Linear(100, 10),\n            nn.ReLU(True),\n            nn.Dropout(),\n            nn.Linear(10, 2),\n        )\n\n    def forward(self, x):\n        x=self.conv1(x)\n        x=self.resnet(x)\n        output=self.classifier(x)\n        return output\n\n\nmodel_list = []\nfor targetCol in range(11):\n    model_list.append(torch.load('../input/resnet50/ranzcr_resnet50_col'+str(targetCol)))\n\nvalid_dataset = RanzcrDataset('../input')\nvalid_loader = Data.DataLoader(valid_dataset, batch_size = 16, shuffle = False, num_workers = 4)\ncriterion = nn.CrossEntropyLoss()\n\nprediction = valid_model(model_list, valid_loader, targetCol, criterion)\n\ndf = pd.read_csv(\"../input/ranzcr-clip-catheter-line-classification/sample_submission.csv\")\nfor i in range(11):\n    df[ df.columns[i+1] ] = prediction[i]\ndf.to_csv(\"submission.csv\", index=False)\nprint(\"OVER\")","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}