{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# 解压数据集\n%pip install py7zr\nimport py7zr\ntran_7z = py7zr.SevenZipFile(r'/kaggle/input/cifar-10/train.7z','r')\ntran_7z.extractall(path=r'./')\ntran_7z.close()\ntest_7z = py7zr.SevenZipFile(r'/kaggle/input/cifar-10/test.7z','r')\ntest_7z.extractall(path=r'./')\ntest_7z.close()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls train | wc -l\n!ls test | wc -l","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:37:59.426509Z","iopub.execute_input":"2024-06-21T11:37:59.426908Z","iopub.status.idle":"2024-06-21T11:38:01.901695Z","shell.execute_reply.started":"2024-06-21T11:37:59.426878Z","shell.execute_reply":"2024-06-21T11:38:01.900590Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport pandas as pd\nimport torch\nfrom torch.utils.data import Dataset\nfrom torch.utils.data import DataLoader\nimport torchvision.models as models\nfrom torchvision import transforms\nfrom tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:38:03.725467Z","iopub.execute_input":"2024-06-21T11:38:03.726274Z","iopub.status.idle":"2024-06-21T11:38:06.885139Z","shell.execute_reply.started":"2024-06-21T11:38:03.726235Z","shell.execute_reply":"2024-06-21T11:38:06.884162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_path = '/kaggle/input/cifar-10/trainLabels.csv'\nlabel_csv = pd.read_csv(label_path)\nlabel_num_list = label_csv['label'].unique().tolist()\nprint(label_num_list)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:38:09.840072Z","iopub.execute_input":"2024-06-21T11:38:09.841164Z","iopub.status.idle":"2024-06-21T11:38:09.870672Z","shell.execute_reply.started":"2024-06-21T11:38:09.841126Z","shell.execute_reply":"2024-06-21T11:38:09.869854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_size = 128\ntrain_transformer = transforms.Compose([\n    transforms.Resize(img_size),\n    transforms.RandomRotation(20),\n    transforms.RandomHorizontalFlip(0.5),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)),\n])\n\nval_transformer = transforms.Compose([\n    transforms.Resize(img_size),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)),\n])\n\nclass TrainDataset(Dataset):\n    def __init__(self, img_path, label_path, transform, val=False):\n        self.img_path = img_path\n        self.img_list = os.listdir(img_path)\n        if val:\n            self.img_list = self.img_list[40000:]\n        else:\n            self.img_list = self.img_list[:40000]\n        self.transform = transform\n        \n        self.label_csv = pd.read_csv(label_path)\n        self.label_csv.set_index('id', inplace=True)\n    \n    def __getitem__(self, idx):\n        img_name = self.img_list[idx]\n        img_label_id = int(img_name[:-4])\n        label = self.label_csv.at[img_label_id, 'label']\n        label_id = label_num_list.index(label)\n        \n        img = Image.open(os.path.join(self.img_path, img_name))\n        img = self.transform(img)\n        return img, label_id\n    \n    def __len__(self):\n        return len(self.img_list)\n    \ntrain_dataset = TrainDataset('/kaggle/working/train', label_path, train_transformer)\nval_dataset = TrainDataset('/kaggle/working/train', label_path, val_transformer, True)\nprint(len(train_dataset), len(val_dataset))","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:42:02.949443Z","iopub.execute_input":"2024-06-21T11:42:02.950240Z","iopub.status.idle":"2024-06-21T11:42:03.052616Z","shell.execute_reply.started":"2024-06-21T11:42:02.950207Z","shell.execute_reply":"2024-06-21T11:42:03.051682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"weights = models.ResNet50_Weights.DEFAULT\nmodel = models.resnet50(weights=weights)\nmodel.fc = torch.nn.Linear(in_features=2048, out_features=10, bias=True)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:42:06.328266Z","iopub.execute_input":"2024-06-21T11:42:06.328682Z","iopub.status.idle":"2024-06-21T11:42:06.891326Z","shell.execute_reply.started":"2024-06-21T11:42:06.328651Z","shell.execute_reply":"2024-06-21T11:42:06.890433Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nepoch = 2\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)\npth_path = 'resnet.pth'\n\ntrain_loader = DataLoader(dataset=train_dataset, \n                          batch_size=batch_size,\n                          shuffle=True,\n                          num_workers=0)\n\nval_loader = DataLoader(dataset=val_dataset, \n                          batch_size=batch_size,\n                          shuffle=True,\n                          num_workers=0)\n\nloss_fn = torch.nn.CrossEntropyLoss()\nlearning_rate = 1e-2\noptimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)\n\nbest_acc = 0.0","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:42:15.798461Z","iopub.execute_input":"2024-06-21T11:42:15.799393Z","iopub.status.idle":"2024-06-21T11:42:15.965934Z","shell.execute_reply.started":"2024-06-21T11:42:15.799356Z","shell.execute_reply":"2024-06-21T11:42:15.964859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(epoch):\n    running_loss = 0.0\n    \n    model.train()\n    for step, (imgs, labels) in enumerate(train_loader):\n        outputs = model(imgs.to(device))\n        loss = loss_fn(outputs, labels.to(device))\n        \n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        \n        running_loss += loss.item()\n        if step%100 == 99:\n            print('[%d, %5d] loss: %.3f' % (i + 1, step + 1, running_loss / 1000))\n            running_loss = 0.0\n    \n    model.eval()\n    running_acc = 0.0\n    total = 0.0\n    with torch.no_grad():\n        for imgs, labels in val_loader:\n            outputs = model(imgs.to(device))\n            _, predicted = torch.max(outputs.data, 1)\n            total += labels.size(0)\n            running_acc += (predicted == labels.to(device)).sum().item()\n    running_acc = (100 * running_acc / total)\n    print('[%d val] acc:%.3f' % (i+1, running_acc))\n    \n    if running_acc > best_acc:\n        torch.save(model, pth_path)\n        best_acc = running_acc","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torch.load(pth_path)\nmodel.to(device)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_csv = '/kaggle/input/cifar-10/sampleSubmission.csv'\nresult_csv = pd.read_csv(submission_csv)\ntest_path = '/kaggle/working/test'\n\ntest_transformer = transforms.Compose([\n    transforms.Resize(img_size),\n    transforms.ToTensor(),\n    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)),\n])\n\ntest_filenames = [os.path.join(test_path, f) for f in os.listdir(test_path)]\ntest_filenames.sort(key=lambda x: int(x.split('/')[-1].split('.')[0]))\n\nclass TestDataset(Dataset):\n    def __init__(self, filenames, transforms):\n        self.filenames = filenames\n        self.transforms = transforms\n        \n    def __len__(self):\n        return len(self.filenames)\n    \n    def __getitem__(self, idx):\n        img = Image.open(self.filenames[idx])\n        transformed_img = self.transforms(img)\n        return transformed_img\ntest_dataset = TestDataset(test_filenames, test_transformer)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:43:06.365236Z","iopub.execute_input":"2024-06-21T11:43:06.365910Z","iopub.status.idle":"2024-06-21T11:43:07.485116Z","shell.execute_reply.started":"2024-06-21T11:43:06.365874Z","shell.execute_reply":"2024-06-21T11:43:07.484295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = []\nwith torch.no_grad():\n    model.eval()\n    for imgs in tqdm(test_loader):\n        imgs = imgs.to(device)\n        outputs = model(imgs)\n        preds = torch.argmax(outputs, 1)\n        preds = preds.cpu().numpy()\n        result.extend([label_num_list[i] for i in preds])\n\nresult_csv['label'] = result\nresult_csv.to_csv('submissions.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:43:44.170632Z","iopub.execute_input":"2024-06-21T11:43:44.171011Z","iopub.status.idle":"2024-06-21T11:50:56.638363Z","shell.execute_reply.started":"2024-06-21T11:43:44.170982Z","shell.execute_reply":"2024-06-21T11:50:56.637269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf test train","metadata":{"execution":{"iopub.status.busy":"2024-06-21T11:53:22.952042Z","iopub.execute_input":"2024-06-21T11:53:22.952781Z","iopub.status.idle":"2024-06-21T11:53:23.945596Z","shell.execute_reply.started":"2024-06-21T11:53:22.952741Z","shell.execute_reply":"2024-06-21T11:53:23.944342Z"},"trusted":true},"execution_count":null,"outputs":[]}]}