{"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":"import torch\nimport numpy as np\nfrom torch.utils.data import Dataset, TensorDataset, SubsetRandomSampler\nimport glob\nimport cv2 as cv\nimport torchvision.transforms as T\nimport random\nimport pandas as pd\nimport torch.nn as nn\nfrom tqdm import tqdm\nimport time\nimport shutil\n\ntorch.manual_seed(0)\n\ndef create_annotation_file(path, out_file=\"data.csv\"):\n    open(out_file, \"w\").close()\n    hotel_ids = glob.glob(pathname=path + \"/train_images/*\")\n    for id in hotel_ids:\n        y = id.split(\"/\")[-1]\n        imgs = glob.glob(pathname=id + \"/*\")\n        with open(out_file, \"a\") as f:\n            for img in imgs:\n                f.write(\",\".join([img.split(\"/\")[-1], y]) + \"\\n\")\n            f.close()\n\n\nclass HotelDataset(Dataset):\n    def __init__(self, path, annotation_file_path, train=True, transform=None):\n        self.transform = transform\n        self.train = train\n        self.img_path = path\n        if self.train:\n            self.annotation = pd.read_csv(annotation_file_path)\n            self.unique_hotel_ids = self.annotation.iloc[:, 1].unique().tolist()\n        else:\n            self.annotation = glob.glob(pathname=path + \"/test_images/*\")\n        \n        \n\n    def __getitem__(self, idx):\n        if self.train:\n            x = self.annotation.iloc[idx, 0]\n            y = self.annotation.iloc[idx, 1]\n            x = torch.tensor(cv.imread(\n                \"{}/{}/{}/{}\".format(self.img_path, \"train_images\", y, x))).permute(2, 0, 1)\n            y = torch.tensor(self.unique_hotel_ids.index(int(y)))\n            if self.transform is not None:\n                x = self.transform(x) / 255.\n            else:\n                x = x / 255.\n            return x, y\n        else:\n            x = self.annotation[idx]\n            x = torch.tensor(cv.imread(\n                \"{}/{}/{}\".format(self.img_path, \"test_images\", x))).permute(2, 0, 1)\n            x = x / 255.\n            return x\n\n    def __len__(self):\n        return len(self.annotation)  # \"Length X: {}, Length Y: {}\".format(len(self.x), len(self.y))\n\n\nif __name__ == '__main__':\n    #create_annotation_file(\"../input/hotel-id-to-combat-human-trafficking-2022-fgvc9/\")\n    test_dataset = HotelDataset(\"../input/hotel-id-to-combat-human-trafficking-2022-fgvc9/\",\n                           transform=transform, annotation_file_path=\"data.csv\", train=False)\n    test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=4)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Encoder(nn.Module):\n    def __init__(self):\n        super(Encoder, self).__init__()\n        self.model = nn.Sequential(\n            nn.Conv2d(3, 16, (5, 5)),\n            nn.BatchNorm2d(16),\n            nn.ReLU(),\n            nn.Conv2d(16, 32, (5, 5)),\n            nn.BatchNorm2d(32),\n            nn.ReLU(),\n            nn.MaxPool2d(2, 2),\n\n            nn.Conv2d(32, 64, (5, 5)),\n            nn.BatchNorm2d(64),\n            nn.ReLU(),\n            nn.Dropout2d(p=0.25),\n            nn.Conv2d(64, 128, (3, 3)),\n            nn.BatchNorm2d(128),\n            nn.ReLU(),\n            nn.MaxPool2d(2, 2),\n\n            nn.Conv2d(128, 256, (5, 5)),\n            nn.BatchNorm2d(256),\n            nn.ReLU(),\n            nn.Dropout2d(p=0.25),\n            nn.Conv2d(256, 512, (3, 3)),\n            nn.BatchNorm2d(512),\n            nn.ReLU(),\n            nn.MaxPool2d(2, 2),\n            \n            nn.Conv2d(512, 512, (3, 3)),\n            nn.BatchNorm2d(512),\n            nn.ReLU(),\n            nn.MaxPool2d(2, 2),\n            \n            nn.Flatten(),\n            nn.Linear(12 * 12 * 512, 3116),\n        )\n        \n    def forward(self, x):\n        x = self.model(x)\n        #print(x.shape)\n        return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def test_step(model):\n    model.eval()\n    with torch.no_grad():\n        for batch_ndx, (x, y) in enumerate(test_loader):\n            x = x.to(device)\n            y_pred = encoder(x)\n            #print(y_pred.shape)\n            loss = loss_fn(y_pred, y)\n            print(\"Epoch: {}, Batch: {}, Loss: {:.4f}\".format(epoch, batch_ndx, loss.cpu().item()))\n            del y_pred, x, y","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")\nencoder = Encoder()\ntest_step(encoder)","metadata":{},"execution_count":null,"outputs":[]}]}