{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.12"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"databundleVersionId":46665,"sourceId":4117,"sourceType":"competition"},{"databundleVersionId":16474510,"datasetId":9938514,"sourceId":15545655,"sourceType":"datasetVersion"},{"sourceId":309279866,"sourceType":"kernelVersion"}],"isGpuEnabled":true,"isInternetEnabled":true,"language":"python","sourceType":"notebook"},"papermill":{"default_parameters":{},"duration":90.931146,"end_time":"2026-04-06T02:17:17.753959+00:00","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2026-04-06T02:15:46.822813+00:00","version":"2.7.0"},"widgets":{"application/vnd.jupyter.widget-state+json":{"state":{"13dbbd9b7c964dee80dd3960d5ad4848":{"model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"2.0.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border_bottom":null,"border_left":null,"border_right":null,"border_top":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3f46ac7b456d4a158b9d8b66e8eb212b":{"model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"2.0.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border_bottom":null,"border_left":null,"border_right":null,"border_top":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"43e4e2dbeef545c9b0374351c3a8d42d":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"2.0.0","_view_name":"HTMLView","description":"","description_allow_html":false,"layout":"IPY_MODEL_3f46ac7b456d4a158b9d8b66e8eb212b","placeholder":"​","style":"IPY_MODEL_9d322c36bebc42c0a50550f43ad996a9","tabbable":null,"tooltip":null,"value":"Inference: 100%"}},"46d44eccc47940bc8a8523965525c2a1":{"model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"2.0.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border_bottom":null,"border_left":null,"border_right":null,"border_top":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5bb530ce87b34ec89fe3d5c855d12208":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"2.0.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_43e4e2dbeef545c9b0374351c3a8d42d","IPY_MODEL_ce24ec58328c4a3faef36e524b89376b","IPY_MODEL_b5f21d0f072f46cc9170324a0fdd6793"],"layout":"IPY_MODEL_5f8b1ac13bd747d897f3f0ab288ab2b2","tabbable":null,"tooltip":null}},"5f8b1ac13bd747d897f3f0ab288ab2b2":{"model_module":"@jupyter-widgets/base","model_module_version":"2.0.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"2.0.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border_bottom":null,"border_left":null,"border_right":null,"border_top":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"884a859940e049cfa18bb25a628549d4":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"HTMLStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"HTMLStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"StyleView","background":null,"description_width":"","font_size":null,"text_color":null}},"9d322c36bebc42c0a50550f43ad996a9":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"HTMLStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"HTMLStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"StyleView","background":null,"description_width":"","font_size":null,"text_color":null}},"b5f21d0f072f46cc9170324a0fdd6793":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"2.0.0","_view_name":"HTMLView","description":"","description_allow_html":false,"layout":"IPY_MODEL_13dbbd9b7c964dee80dd3960d5ad4848","placeholder":"​","style":"IPY_MODEL_884a859940e049cfa18bb25a628549d4","tabbable":null,"tooltip":null,"value":" 340/340 [01:09&lt;00:00,  4.70it/s]"}},"ce24ec58328c4a3faef36e524b89376b":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"2.0.0","_view_name":"ProgressView","bar_style":"success","description":"","description_allow_html":false,"layout":"IPY_MODEL_46d44eccc47940bc8a8523965525c2a1","max":340,"min":0,"orientation":"horizontal","style":"IPY_MODEL_fbdee4f32c7e466a9d4e21bc6dfada40","tabbable":null,"tooltip":null,"value":340}},"fbdee4f32c7e466a9d4e21bc6dfada40":{"model_module":"@jupyter-widgets/controls","model_module_version":"2.0.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"2.0.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"2.0.0","_view_name":"StyleView","bar_color":null,"description_width":""}}},"version_major":2,"version_minor":0}}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"a72da120","cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nfrom torchvision.transforms import InterpolationMode\nfrom PIL import Image\nimport timm\nfrom tqdm.notebook import tqdm","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2026-04-06T02:15:49.141374Z","iopub.status.busy":"2026-04-06T02:15:49.140812Z","iopub.status.idle":"2026-04-06T02:16:02.998573Z","shell.execute_reply":"2026-04-06T02:16:02.997623Z"},"papermill":{"duration":13.863137,"end_time":"2026-04-06T02:16:03.000602+00:00","exception":false,"start_time":"2026-04-06T02:15:49.137465+00:00","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"01d7322d","cell_type":"code","source":"# --- CẤU HÌNH ĐƯỜNG DẪN ---\nTEST_IMG_DIR = \"/kaggle/input/datasets/trankimhuu/images-datasets-of-big2015/test_images/test_images/kaggle/working/test_images\"\nSAMPLE_SUB_PATH = \"/kaggle/input/competitions/malware-classification/sampleSubmission.csv\"\n# Đường dẫn tới file trọng số của Version 3\nMODEL_WEIGHTS_PATH = \"/kaggle/input/notebooks/huylhn1810/levit-192-ver3/best_levit_model_v3.pth\"\nOUTPUT_SUBMISSION_PATH = \"/kaggle/working/submission_ver3_final.csv\"\n\nBATCH_SIZE = 32\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(f\"Đang sử dụng thiết bị: {device}\")","metadata":{"execution":{"iopub.execute_input":"2026-04-06T02:16:03.004940Z","iopub.status.busy":"2026-04-06T02:16:03.004543Z","iopub.status.idle":"2026-04-06T02:16:03.256689Z","shell.execute_reply":"2026-04-06T02:16:03.255826Z"},"papermill":{"duration":0.255946,"end_time":"2026-04-06T02:16:03.258183+00:00","exception":false,"start_time":"2026-04-06T02:16:03.002237+00:00","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"0e12b26a","cell_type":"code","source":"class LeViT_Malware(nn.Module):\n    def __init__(self, model_name='levit_192', num_classes=9, pretrained=False):\n        super().__init__()\n        self.backbone = timm.create_model(model_name, pretrained=pretrained, num_classes=0)\n        num_features = self.backbone.num_features\n        \n        # Cấu hình Head đồng bộ với Version 3\n        self.head = nn.Sequential(\n            nn.BatchNorm1d(num_features),\n            nn.Dropout(p=0.2), \n            nn.Linear(num_features, 256), \n            nn.GELU(),\n            nn.BatchNorm1d(256),\n            nn.Dropout(p=0.1), \n            nn.Linear(256, num_classes)\n        )\n\n    def forward(self, x):\n        features = self.backbone(x)\n        return self.head(features)","metadata":{"execution":{"iopub.execute_input":"2026-04-06T02:16:03.262310Z","iopub.status.busy":"2026-04-06T02:16:03.261839Z","iopub.status.idle":"2026-04-06T02:16:03.267234Z","shell.execute_reply":"2026-04-06T02:16:03.266571Z"},"papermill":{"duration":0.008907,"end_time":"2026-04-06T02:16:03.268594+00:00","exception":false,"start_time":"2026-04-06T02:16:03.259687+00:00","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"ea26401e","cell_type":"code","source":"class MalwareTestDataset(Dataset):\n    def __init__(self, sample_sub_df, img_dir, transform=None):\n        self.sample_sub_df = sample_sub_df\n        self.img_dir = img_dir\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.sample_sub_df)\n\n    def __getitem__(self, idx):\n        img_id = str(self.sample_sub_df.iloc[idx]['Id'])\n        img_name = img_id + \".png\" \n        img_path = os.path.join(self.img_dir, img_name)\n        \n        image = Image.open(img_path).convert('RGB')\n        if self.transform:\n            image = self.transform(image)\n        return image, img_id\n\n# Đồng bộ hóa với Version 3: dùng InterpolationMode.NEAREST\ntest_transform = transforms.Compose([\n    transforms.Resize((224, 224), interpolation=InterpolationMode.NEAREST),\n    transforms.ToTensor(),\n    # Sử dụng chuẩn ImageNet hoặc thay bằng Mean/Std thực tế bạn đã tính ở V3\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])","metadata":{"execution":{"iopub.execute_input":"2026-04-06T02:16:03.272876Z","iopub.status.busy":"2026-04-06T02:16:03.272273Z","iopub.status.idle":"2026-04-06T02:16:03.278656Z","shell.execute_reply":"2026-04-06T02:16:03.278062Z"},"papermill":{"duration":0.010266,"end_time":"2026-04-06T02:16:03.280246+00:00","exception":false,"start_time":"2026-04-06T02:16:03.269980+00:00","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"6d139ebd","cell_type":"code","source":"def run_inference():\n    print(\"Đang nạp dữ liệu mẫu...\")\n    sample_sub = pd.read_csv(SAMPLE_SUB_PATH)\n    \n    test_dataset = MalwareTestDataset(sample_sub, TEST_IMG_DIR, transform=test_transform)\n    test_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)\n\n    print(\"Đang nạp mô hình và trọng số V3...\")\n    model = LeViT_Malware(pretrained=False).to(device)\n    \n    # Nạp trọng số với chế độ strict=True để đảm bảo khớp hoàn toàn\n    state_dict = torch.load(MODEL_WEIGHTS_PATH, map_location=device, weights_only=True)\n    model.load_state_dict(state_dict)\n    \n    model.eval()\n\n    all_predictions = []\n    all_ids = []\n\n    print(\"Bắt đầu dự đoán trên tập Test...\")\n    with torch.no_grad():\n        for images, img_ids in tqdm(test_loader, desc=\"Inference\"):\n            images = images.to(device)\n            logits = model(images)\n            probs = F.softmax(logits, dim=1)\n            \n            all_predictions.extend(probs.cpu().numpy())\n            all_ids.extend(img_ids)\n\n    print(\"\\nĐang đóng gói file submission...\")\n    submission_df = pd.DataFrame(all_predictions, columns=[f'Prediction{i}' for i in range(1, 10)])\n    submission_df.insert(0, 'Id', all_ids) \n\n    submission_df.to_csv(OUTPUT_SUBMISSION_PATH, index=False)\n    print(f\"Thành công! File đã lưu tại: {OUTPUT_SUBMISSION_PATH}\")\n","metadata":{"execution":{"iopub.execute_input":"2026-04-06T02:16:03.284071Z","iopub.status.busy":"2026-04-06T02:16:03.283839Z","iopub.status.idle":"2026-04-06T02:16:03.290673Z","shell.execute_reply":"2026-04-06T02:16:03.290067Z"},"papermill":{"duration":0.010362,"end_time":"2026-04-06T02:16:03.291976+00:00","exception":false,"start_time":"2026-04-06T02:16:03.281614+00:00","status":"completed"},"tags":[]},"outputs":[],"execution_count":null},{"id":"01875d31","cell_type":"code","source":"if __name__ == '__main__':\n    run_inference()","metadata":{"execution":{"iopub.execute_input":"2026-04-06T02:16:03.295904Z","iopub.status.busy":"2026-04-06T02:16:03.295593Z","iopub.status.idle":"2026-04-06T02:17:14.920275Z","shell.execute_reply":"2026-04-06T02:17:14.919084Z"},"papermill":{"duration":71.628536,"end_time":"2026-04-06T02:17:14.921946+00:00","exception":false,"start_time":"2026-04-06T02:16:03.293410+00:00","status":"completed"},"tags":[]},"outputs":[],"execution_count":null}]}