{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nsys.path.append(\"/kaggle/usr/lib/notebooks/winnypolfliet/\")\nimport kaggleb2b as bb","metadata":{"_uuid":"f2f5894c-6665-447e-8aca-683c4579a368","_cell_guid":"4ea6ded9-cccf-44f2-bedf-288c2bddb734","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T06:03:20.699286Z","iopub.execute_input":"2026-06-12T06:03:20.699666Z","iopub.status.idle":"2026-06-12T06:03:37.473923Z","shell.execute_reply.started":"2026-06-12T06:03:20.699594Z","shell.execute_reply":"2026-06-12T06:03:37.472942Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import inspect\nfunctions = [name for name, obj in inspect.getmembers(bb) \n             if inspect.isfunction(obj)]\nprint(functions)","metadata":{"_uuid":"a57713d1-d119-449e-904b-47100995384c","_cell_guid":"5f051ed7-86f6-4862-9911-94f2766413bb","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:55:27.149240Z","iopub.execute_input":"2026-06-12T04:55:27.149709Z","iopub.status.idle":"2026-06-12T04:55:27.155038Z","shell.execute_reply.started":"2026-06-12T04:55:27.149682Z","shell.execute_reply":"2026-06-12T04:55:27.154099Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install py7zr","metadata":{"_uuid":"738858d4-cdcc-4d4a-9c0e-dc3b586cd2ef","_cell_guid":"690f92b6-a570-4f5e-9e08-ebe30eecca5a","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:55:27.156089Z","iopub.execute_input":"2026-06-12T04:55:27.156492Z","iopub.status.idle":"2026-06-12T04:55:32.790727Z","shell.execute_reply.started":"2026-06-12T04:55:27.156460Z","shell.execute_reply":"2026-06-12T04:55:32.789773Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\nfrom torch.utils.data import TensorDataset, DataLoader, Subset,Dataset\nimport torchvision\nimport torchvision.transforms as transforms \nimport torchvision.models as models\nimport matplotlib.pyplot as plt\nfrom IPython import display\nimport time\nimport os\nfrom PIL import Image \nimport shutil\nfrom pathlib import Path\nfrom sklearn.model_selection import train_test_split\nfrom torchsummary import summary","metadata":{"_uuid":"ba8e96b5-ed4d-45ec-b384-fe488c0f2a20","_cell_guid":"ca93cc99-6a90-4b2f-b949-5ac64aec2330","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:55:32.792121Z","iopub.execute_input":"2026-06-12T04:55:32.792487Z","iopub.status.idle":"2026-06-12T04:55:32.809096Z","shell.execute_reply.started":"2026-06-12T04:55:32.792457Z","shell.execute_reply":"2026-06-12T04:55:32.808316Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import py7zr\nimport shutil\nfrom pathlib import Path\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T04:55:32.810016Z","iopub.execute_input":"2026-06-12T04:55:32.810300Z","iopub.status.idle":"2026-06-12T04:55:32.954463Z","shell.execute_reply.started":"2026-06-12T04:55:32.810267Z","shell.execute_reply":"2026-06-12T04:55:32.953857Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"root = Path('./data')\ninput_path = Path('../input/competitions/cifar-10')\n\nwith py7zr.SevenZipFile(input_path/'train.7z', mode='r') as z:\n    z.extractall(root)\n\nwith py7zr.SevenZipFile(input_path/'test.7z', mode='r') as z:\n    z.extractall(root)\n\nshutil.copy(input_path/'trainLabels.csv', root/'trainLabels.csv')\n\n(root/'train').rename(root/'original_train')\n(root/'test').rename(root/'original_test')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T04:55:32.955319Z","iopub.execute_input":"2026-06-12T04:55:32.955645Z","iopub.status.idle":"2026-06-12T04:58:23.801405Z","shell.execute_reply.started":"2026-06-12T04:55:32.955612Z","shell.execute_reply":"2026-06-12T04:58:23.800775Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_root = Path(\"/kaggle/working/data\")\ntrain_img_dir = data_root / \"original_train\"\ntest_img_dir = data_root / \"original_test\"\nlabel_csv = data_root / \"trainLabels.csv\"\n\nclass CIFARImgDS(Dataset):\n    def __init__(self, img_folder, csv_path=None, transform=None):\n        self.transform = transform\n        self.images = sorted(list(img_folder.glob(\"*.png\")))\n        self.label2num = None  \n        self.lookup = None\n\n        if csv_path is not None:\n            df = pd.read_csv(csv_path)\n            unique_labels = sorted(df[\"label\"].unique())\n            self.label2num = {cls: i for i, cls in enumerate(unique_labels)}\n            self.lookup = dict(zip(df.id, df.label))\n\n    def __len__(self):\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        img_p = self.images[idx]\n        img = Image.open(img_p).convert(\"RGB\")\n        \n        if self.transform:\n            img = self.transform(img)\n        \n        img_id = int(img_p.stem)\n        if self.lookup is not None and self.label2num is not None:\n            str_label = self.lookup[img_id]     \n            num_label = self.label2num[str_label] \n            label_tensor = torch.tensor(num_label, dtype=torch.long)\n            return img, label_tensor\n        else:\n            id_tensor = torch.tensor(img_id, dtype=torch.long)\n            return img, id_tensor\n\nimagenet_mean = [0.485, 0.456, 0.406]\nimagenet_std  = [0.229, 0.224, 0.225]\nnormalize = transforms.Normalize(mean=imagenet_mean, std=imagenet_std)\n\ntrain_augs = transforms.Compose([\n    transforms.Resize(40),\n    transforms.RandomResizedCrop(32, scale=(0.64, 1.0), ratio=(1.0, 1.0)),\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),   # 必须在这里，统一只转一次tensor\n    normalize\n])\n\nvalid_augs = transforms.Compose([\n    transforms.ToTensor(),\n    normalize\n])\n\n\nfull_train = CIFARImgDS(train_img_dir, label_csv, transform=None)\nfull_test = CIFARImgDS(test_img_dir, transform=None)\n\nprint(\"训练集数量：\", len(full_train))\nprint(\"测试集数量：\", len(full_test))","metadata":{"_uuid":"0bc48d84-dd16-44f0-ae74-dc253148cbcc","_cell_guid":"d8fb06d0-212d-4fc9-a339-45dd2afb5bdf","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:58:23.803390Z","iopub.execute_input":"2026-06-12T04:58:23.803613Z","iopub.status.idle":"2026-06-12T04:58:29.727180Z","shell.execute_reply.started":"2026-06-12T04:58:23.803592Z","shell.execute_reply":"2026-06-12T04:58:29.726291Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class TransformWrapper(Dataset):\n    def __init__(self, dataset, transform):\n        self.dataset = dataset\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.dataset)\n\n    def __getitem__(self, idx):\n        x, y = self.dataset[idx]\n        if self.transform:\n            x = self.transform(x)\n        return x, y","metadata":{"_uuid":"e7e0492f-0ff9-45fa-b805-b4df12de162f","_cell_guid":"61dd7c31-aad3-444d-94fc-14e155e5af2a","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:58:29.728232Z","iopub.execute_input":"2026-06-12T04:58:29.728791Z","iopub.status.idle":"2026-06-12T04:58:29.733153Z","shell.execute_reply.started":"2026-06-12T04:58:29.728763Z","shell.execute_reply":"2026-06-12T04:58:29.732517Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"BATCH_SIZE = 32\nVAL_RATIO = 0.2  \nRANDOM_SEED = 42\n\nall_indices = list(range(len(full_train)))\ntrain_indices, val_indices = train_test_split(\n    all_indices,\n    test_size=VAL_RATIO,\n    random_state=RANDOM_SEED,\n    shuffle=True\n)\n\ntrain_subset = Subset(full_train, train_indices)\nvalid_subset = Subset(full_train, val_indices)\n\n# 外层传入完整aug（包含ToTensor）\ntrain_dataset = TransformWrapper(train_subset, train_augs)\nval_dataset = TransformWrapper(valid_subset, valid_augs)\n\ntrain_iter = DataLoader(train_dataset, batch_size = BATCH_SIZE, shuffle=True, drop_last=True)\nvalid_iter = DataLoader(val_dataset, batch_size = BATCH_SIZE, shuffle=False, drop_last=False)\n","metadata":{"_uuid":"018e1096-77e9-4096-a271-2ab63d22dd20","_cell_guid":"32f8cd0f-5288-4700-a49a-3e5e87a5fac5","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:58:29.734103Z","iopub.execute_input":"2026-06-12T04:58:29.734374Z","iopub.status.idle":"2026-06-12T04:58:29.761984Z","shell.execute_reply.started":"2026-06-12T04:58:29.734343Z","shell.execute_reply":"2026-06-12T04:58:29.761157Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"net = models.resnet34()","metadata":{"_uuid":"c2be6b8d-a05c-4d83-b256-6fbe3f5ee322","_cell_guid":"23e1751a-1432-4e4c-be79-a63bac142dda","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:58:29.762846Z","iopub.execute_input":"2026-06-12T04:58:29.763163Z","iopub.status.idle":"2026-06-12T04:58:30.083598Z","shell.execute_reply.started":"2026-06-12T04:58:29.763118Z","shell.execute_reply":"2026-06-12T04:58:30.082988Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_epochs, lr, weight_decay =  20, 5e-5, 5e-3\nlr_period, lr_decay = 4, 0.9\nloss = nn.CrossEntropyLoss()","metadata":{"_uuid":"3fb23e45-5171-424b-9c54-b35ca5fb6a4c","_cell_guid":"84f95545-a9ac-470e-8427-94a24750fed9","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:58:30.084656Z","iopub.execute_input":"2026-06-12T04:58:30.084973Z","iopub.status.idle":"2026-06-12T04:58:30.089094Z","shell.execute_reply.started":"2026-06-12T04:58:30.084937Z","shell.execute_reply":"2026-06-12T04:58:30.088427Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# bb.train_fine_tuning(\n#     net,\n#     loss,\n#     train_iter,\n#     valid_iter,\n#     learning_rate=lr,\n#     weight_decay=weight_decay,\n#     num_epochs=num_epochs,\n#     lr_period=lr_period,\n#     lr_decay=lr_decay,\n#     SGD=False,\n#     momentum=0.9,\n#     betas=(0.9, 0.999),\n#     param_group=False,\n# )","metadata":{"_uuid":"c1c9adf0-2123-4f24-b24d-910b5dd4befd","_cell_guid":"b37751e9-655b-4ee8-83e6-820412abc4a7","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2026-06-12T04:58:30.089926Z","iopub.execute_input":"2026-06-12T04:58:30.090226Z","iopub.status.idle":"2026-06-12T04:58:30.102863Z","shell.execute_reply.started":"2026-06-12T04:58:30.090172Z","shell.execute_reply":"2026-06-12T04:58:30.102219Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"all_dataset = TransformWrapper(full_train, train_augs)\nall_iter =DataLoader(all_dataset, batch_size = BATCH_SIZE, shuffle=True, drop_last=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T04:58:30.103638Z","iopub.execute_input":"2026-06-12T04:58:30.103947Z","iopub.status.idle":"2026-06-12T04:58:30.116509Z","shell.execute_reply.started":"2026-06-12T04:58:30.103925Z","shell.execute_reply":"2026-06-12T04:58:30.115977Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"bb.train_fine_tuning(\n    net,\n    loss,\n    all_iter,\n    None,\n    learning_rate=lr,\n    weight_decay=weight_decay,\n    num_epochs=num_epochs,\n    lr_period=lr_period,\n    lr_decay=lr_decay,\n    SGD=False,\n    momentum=0.9,\n    betas=(0.9, 0.999),\n    param_group=False,\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T04:58:30.117721Z","iopub.execute_input":"2026-06-12T04:58:30.118021Z","iopub.status.idle":"2026-06-12T05:40:32.578336Z","shell.execute_reply.started":"2026-06-12T04:58:30.118000Z","shell.execute_reply":"2026-06-12T05:40:32.577787Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset = TransformWrapper(full_test, valid_augs)\ntest_iter =DataLoader(test_dataset, batch_size = BATCH_SIZE, shuffle=False, drop_last=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T05:41:05.710862Z","iopub.execute_input":"2026-06-12T05:41:05.711125Z","iopub.status.idle":"2026-06-12T05:41:05.715148Z","shell.execute_reply.started":"2026-06-12T05:41:05.711103Z","shell.execute_reply":"2026-06-12T05:41:05.714472Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"devices = bb.try_all_gpus()\npreds = []\nfor X, _ in test_iter:\n    y_hat = net(X.to(devices[0]))\n    preds.extend(y_hat.argmax(dim=1).type(torch.int32).cpu().numpy())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T05:48:35.297124Z","iopub.execute_input":"2026-06-12T05:48:35.297579Z","iopub.status.idle":"2026-06-12T05:52:30.064287Z","shell.execute_reply.started":"2026-06-12T05:48:35.297551Z","shell.execute_reply":"2026-06-12T05:52:30.063660Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sorted_ids = list(range(1, len(test_dataset) + 1))\nsorted_ids.sort(key=lambda x: str(x))\ndf = pd.DataFrame({'id': sorted_ids, 'label': preds})\n\ncifar_classes = [\n    'airplane', 'automobile', 'bird', 'cat', 'deer',\n    'dog', 'frog', 'horse', 'ship', 'truck'\n]\n# 数字索引 → 类别名称\ndf['label'] = df['label'].apply(lambda x: cifar_classes[x])\n\ndf.to_csv('submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-12T05:59:06.191775Z","iopub.execute_input":"2026-06-12T05:59:06.192176Z","iopub.status.idle":"2026-06-12T05:59:06.727202Z","shell.execute_reply.started":"2026-06-12T05:59:06.192149Z","shell.execute_reply":"2026-06-12T05:59:06.726295Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}