{"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 timm","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:25:44.438517Z","iopub.execute_input":"2022-07-28T06:25:44.439282Z","iopub.status.idle":"2022-07-28T06:26:02.952598Z","shell.execute_reply.started":"2022-07-28T06:25:44.439150Z","shell.execute_reply":"2022-07-28T06:26:02.951171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import timm\nimport torch\nimport torch.nn as nn\nfrom torchvision import models\nfrom torchvision import transforms\nimport torch.nn.functional as F\n\nassert torch.cuda.is_available()","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:26:13.623270Z","iopub.execute_input":"2022-07-28T06:26:13.623671Z","iopub.status.idle":"2022-07-28T06:26:13.698619Z","shell.execute_reply.started":"2022-07-28T06:26:13.623641Z","shell.execute_reply":"2022-07-28T06:26:13.696737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MyModel(nn.Module):\n  def __init__(self, model_name, target_size=[224, 224], normalize=True):\n    super().__init__()\n    self.target_size = target_size\n    \n    self.encoder = timm.create_model(model_name, pretrained=True)    \n    self.final = nn.AdaptiveAvgPool1d(64)\n    self.normalize = normalize\n\n  def forward(self, x):\n    x = x.to(\"cuda\")\n    x = transforms.functional.resize(x,size=self.target_size)\n    x = x / 255.0\n    x = transforms.functional.normalize(x, \n                                            mean=[0.485, 0.456, 0.406], \n                                            std=[0.229, 0.224, 0.225])\n    x = self.encoder(x)\n    x = self.final(x)\n    if self.normalize:\n        x = torch.nn.functional.normalize(x)\n    return x","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:26:11.614362Z","iopub.execute_input":"2022-07-28T06:26:11.615328Z","iopub.status.idle":"2022-07-28T06:26:11.629382Z","shell.execute_reply.started":"2022-07-28T06:26:11.615297Z","shell.execute_reply":"2022-07-28T06:26:11.628075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = MyModel(\"swin_large_patch4_window12_384_in22k\", target_size=[384, 384], normalize=True)\nmodel = model.to(\"cuda\")\nmodel.eval();","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:28:07.319577Z","iopub.execute_input":"2022-07-28T06:28:07.320188Z","iopub.status.idle":"2022-07-28T06:28:19.643300Z","shell.execute_reply.started":"2022-07-28T06:28:07.320152Z","shell.execute_reply":"2022-07-28T06:28:19.641918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"saved_model = torch.jit.script(model)\nsaved_model.save('saved_model.pt')","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:28:24.501412Z","iopub.execute_input":"2022-07-28T06:28:24.501847Z","iopub.status.idle":"2022-07-28T06:28:27.790544Z","shell.execute_reply.started":"2022-07-28T06:28:24.501816Z","shell.execute_reply":"2022-07-28T06:28:27.789239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls -lh","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:28:27.792940Z","iopub.execute_input":"2022-07-28T06:28:27.793259Z","iopub.status.idle":"2022-07-28T06:28:28.613700Z","shell.execute_reply.started":"2022-07-28T06:28:27.793232Z","shell.execute_reply":"2022-07-28T06:28:28.612323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport numpy as np\nimport time\nfrom torchvision import transforms\n\n# Model loading.\nmodel = torch.jit.load('saved_model.pt')\nmodel.eval()\nembedding_fn = model\n\n# Load image and extract its embedding.\ninput_tensor = torch.randn((3, 224, 224))\ninput_batch = input_tensor.unsqueeze(0)\n\nelapsed_time_list = []\nfor i in range(5):\n    start_time = time.time()\n    with torch.no_grad():\n        embedding = torch.flatten(embedding_fn(input_batch)[0]).cpu().data.numpy()\n    end_time = time.time()\n    \n    elapsed_time_list.append(end_time - start_time)\nprint(f\"elapsed_time: {np.mean(elapsed_time_list):.2f} sec.\")","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:28:40.508190Z","iopub.execute_input":"2022-07-28T06:28:40.508813Z","iopub.status.idle":"2022-07-28T06:28:56.175000Z","shell.execute_reply.started":"2022-07-28T06:28:40.508777Z","shell.execute_reply":"2022-07-28T06:28:56.173662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from zipfile import ZipFile\n\nwith ZipFile('submission.zip','w') as zip:           \n  zip.write('saved_model.pt', arcname='saved_model.pt') ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-28T06:31:47.036710Z","iopub.execute_input":"2022-07-28T06:31:47.037327Z","iopub.status.idle":"2022-07-28T06:31:50.162042Z","shell.execute_reply.started":"2022-07-28T06:31:47.037261Z","shell.execute_reply":"2022-07-28T06:31:50.160524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls -lh","metadata":{"execution":{"iopub.status.busy":"2022-07-28T06:31:50.164310Z","iopub.execute_input":"2022-07-28T06:31:50.165375Z","iopub.status.idle":"2022-07-28T06:31:51.025192Z","shell.execute_reply.started":"2022-07-28T06:31:50.165323Z","shell.execute_reply":"2022-07-28T06:31:51.023637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}