{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":34426,"databundleVersionId":3218632,"sourceType":"competition"},{"sourceId":172687,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":146998,"modelId":169520}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Note:\n- Code được chạy trên kaggle, có dùng GPU.\n- Nhãn: 0 - cat, 1 - dog","metadata":{}},{"cell_type":"markdown","source":"# Import thư viện","metadata":{}},{"cell_type":"code","source":"import os\nimport torch\nfrom torchvision import transforms\nfrom torchvision.models import resnet34\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport pandas as pd","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:15.516327Z","iopub.execute_input":"2024-11-20T08:39:15.516638Z","iopub.status.idle":"2024-11-20T08:39:20.115194Z","shell.execute_reply.started":"2024-11-20T08:39:15.516605Z","shell.execute_reply":"2024-11-20T08:39:20.114422Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Đường dẫn tập test\ntest_dir = '/kaggle/input/dog-vs-cat-classification/test/test'\n\n# Tạo danh sách file ảnh\ntest_files = sorted([os.path.join(test_dir, img) for img in os.listdir(test_dir)])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:20.116956Z","iopub.execute_input":"2024-11-20T08:39:20.117717Z","iopub.status.idle":"2024-11-20T08:39:20.580862Z","shell.execute_reply.started":"2024-11-20T08:39:20.117676Z","shell.execute_reply":"2024-11-20T08:39:20.580120Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Transform dữ liệu test\ntest_preprocessing = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])\n])\n\n# Dataset tùy chỉnh cho test\nclass TestDataset(Dataset):\n    def __init__(self, file_paths, transform=None):\n        self.file_paths = file_paths\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.file_paths)\n\n    def __getitem__(self, index):\n        img_path = self.file_paths[index]\n        image = Image.open(img_path).convert(\"RGB\")\n        if self.transform:\n            image = self.transform(image)\n        return image, os.path.basename(img_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:20.581823Z","iopub.execute_input":"2024-11-20T08:39:20.582184Z","iopub.status.idle":"2024-11-20T08:39:20.588844Z","shell.execute_reply.started":"2024-11-20T08:39:20.582146Z","shell.execute_reply":"2024-11-20T08:39:20.588002Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Dataset và DataLoader cho test\ntest_dataset = TestDataset(test_files, test_preprocessing)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:20.590661Z","iopub.execute_input":"2024-11-20T08:39:20.590974Z","iopub.status.idle":"2024-11-20T08:39:20.601474Z","shell.execute_reply.started":"2024-11-20T08:39:20.590947Z","shell.execute_reply":"2024-11-20T08:39:20.600569Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Mô hình ResNet34 tùy chỉnh\nclass CustomResNet34(torch.nn.Module):\n    def __init__(self, output_classes):\n        super(CustomResNet34, self).__init__()\n        self.base_model = resnet34(weights=None)\n        in_features = self.base_model.fc.in_features\n        self.base_model.fc = torch.nn.Linear(in_features, output_classes)\n\n    def forward(self, x):\n        return self.base_model(x)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:20.602493Z","iopub.execute_input":"2024-11-20T08:39:20.602915Z","iopub.status.idle":"2024-11-20T08:39:20.612620Z","shell.execute_reply.started":"2024-11-20T08:39:20.602890Z","shell.execute_reply":"2024-11-20T08:39:20.611850Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Tải mô hình\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = CustomResNet34(output_classes=2).to(device)\nmodel.load_state_dict(torch.load(\"/kaggle/input/dogandcat_resnet34/pytorch/default/1/DogandCat_resnet34.pth\", map_location=device))\nmodel.eval()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:20.613643Z","iopub.execute_input":"2024-11-20T08:39:20.613939Z","iopub.status.idle":"2024-11-20T08:39:22.837822Z","shell.execute_reply.started":"2024-11-20T08:39:20.613889Z","shell.execute_reply":"2024-11-20T08:39:22.836804Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Dự đoán trên tập test\npredictions = []\nimage_ids = []\n\nwith torch.no_grad():\n    for imgs, img_names in test_loader:\n        imgs = imgs.to(device)\n        outputs = model(imgs)\n        _, preds = torch.max(outputs, dim=1)\n        predictions.extend(preds.cpu().numpy())\n        image_ids.extend(img_names)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:39:22.839015Z","iopub.execute_input":"2024-11-20T08:39:22.839364Z","iopub.status.idle":"2024-11-20T08:42:25.528676Z","shell.execute_reply.started":"2024-11-20T08:39:22.839335Z","shell.execute_reply":"2024-11-20T08:42:25.527884Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Lưu kết quả vào file submission.csv\nsubmission_df = pd.DataFrame({\n    \"id\": image_ids,\n    \"labels\": predictions\n})\nsubmission_df.to_csv(\"submission.csv\", index=False)\nprint(\"File submission.csv đã được lưu thành công!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-20T08:42:25.529800Z","iopub.execute_input":"2024-11-20T08:42:25.530156Z","iopub.status.idle":"2024-11-20T08:42:25.564930Z","shell.execute_reply.started":"2024-11-20T08:42:25.530119Z","shell.execute_reply":"2024-11-20T08:42:25.564032Z"}},"outputs":[],"execution_count":null}]}