{"metadata":{"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30776,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true},"kernelspec":{"display_name":"Python 3","language":"python","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"},"papermill":{"default_parameters":{},"duration":962.469515,"end_time":"2024-06-21T12:10:10.704023","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-06-21T11:54:08.234508","version":"2.5.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2024-10-03T05:05:25.936013Z","iopub.execute_input":"2024-10-03T05:05:25.936319Z","iopub.status.idle":"2024-10-03T05:05:40.985997Z","shell.execute_reply.started":"2024-10-03T05:05:25.936286Z","shell.execute_reply":"2024-10-03T05:05:40.984905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import py7zr\nimport 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-10-03T05:08:44.693053Z","iopub.execute_input":"2024-10-03T05:08:44.693481Z","iopub.status.idle":"2024-10-03T05:08:49.263185Z","shell.execute_reply.started":"2024-10-03T05:08:44.693427Z","shell.execute_reply":"2024-10-03T05:08:49.262388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tran_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":{"papermill":{"duration":231.099775,"end_time":"2024-06-21T11:58:02.025664","exception":false,"start_time":"2024-06-21T11:54:10.925889","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T05:05:43.106820Z","iopub.execute_input":"2024-10-03T05:05:43.107682Z","iopub.status.idle":"2024-10-03T05:08:36.820319Z","shell.execute_reply.started":"2024-10-03T05:05:43.107641Z","shell.execute_reply":"2024-10-03T05:08:36.819504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls train | wc -l\n!ls test | wc -l","metadata":{"papermill":{"duration":2.544187,"end_time":"2024-06-21T11:58:04.576084","exception":false,"start_time":"2024-06-21T11:58:02.031897","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T05:08:36.821926Z","iopub.execute_input":"2024-10-03T05:08:36.822633Z","iopub.status.idle":"2024-10-03T05:08:39.414023Z","shell.execute_reply.started":"2024-10-03T05:08:36.822579Z","shell.execute_reply":"2024-10-03T05:08:39.412871Z"},"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":{"papermill":{"duration":0.081202,"end_time":"2024-06-21T11:58:09.853027","exception":false,"start_time":"2024-06-21T11:58:09.771825","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T05:09:45.753761Z","iopub.execute_input":"2024-10-03T05:09:45.754328Z","iopub.status.idle":"2024-10-03T05:09:45.804393Z","shell.execute_reply.started":"2024-10-03T05:09:45.754288Z","shell.execute_reply":"2024-10-03T05:09:45.803502Z"},"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":{"papermill":{"duration":0.120306,"end_time":"2024-06-21T11:58:09.979797","exception":false,"start_time":"2024-06-21T11:58:09.859491","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T05:09:49.486285Z","iopub.execute_input":"2024-10-03T05:09:49.487217Z","iopub.status.idle":"2024-10-03T05:09:49.593726Z","shell.execute_reply.started":"2024-10-03T05:09:49.487173Z","shell.execute_reply":"2024-10-03T05:09:49.592738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = models.resnet50(weights=None)\nmodel.fc = torch.nn.Linear(in_features=2048, out_features=10, bias=True)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T05:09:55.104134Z","iopub.execute_input":"2024-10-03T05:09:55.104812Z","iopub.status.idle":"2024-10-03T05:09:55.559609Z","shell.execute_reply.started":"2024-10-03T05:09:55.104771Z","shell.execute_reply":"2024-10-03T05:09:55.558620Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nepochs = 30\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)\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":{"papermill":{"duration":0.228777,"end_time":"2024-06-21T11:58:11.549456","exception":false,"start_time":"2024-06-21T11:58:11.320679","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T06:34:01.103289Z","iopub.execute_input":"2024-10-03T06:34:01.104007Z","iopub.status.idle":"2024-10-03T06:34:01.117018Z","shell.execute_reply.started":"2024-10-03T06:34:01.103966Z","shell.execute_reply":"2024-10-03T06:34:01.115968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for epoch in range(epochs):\n    model.train()  # Set the model to training mode\n    running_loss = 0.0\n    total_train = 0\n    correct_train = 0\n\n    # Training phase\n    for step, (imgs, labels) in enumerate(train_loader):\n        # Move data to the specified device\n        imgs, labels = imgs.to(device), labels.to(device)\n\n        # Forward pass\n        outputs = model(imgs)\n        loss = loss_fn(outputs, labels)\n\n        # Backward pass and optimization\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        # Accumulate loss and accuracy\n        running_loss += loss.item()\n        _, predicted = torch.max(outputs.data, 1)\n        correct_train += (predicted == labels).sum().item()\n        total_train += labels.size(0)\n\n\n    # Calculate training loss and accuracy\n    train_loss = running_loss / len(train_loader)\n    train_accuracy = 100 * correct_train / total_train\n\n    # Validation phase\n    model.eval()  # Set the model to evaluation mode\n    running_val_loss = 0.0\n    total_val = 0\n    correct_val = 0\n\n    with torch.no_grad():\n        for imgs, labels in val_loader:\n            imgs, labels = imgs.to(device), labels.to(device)\n\n            outputs = model(imgs)\n            loss = loss_fn(outputs, labels)\n\n            # Accumulate validation loss and accuracy\n            running_val_loss += loss.item()\n            _, predicted = torch.max(outputs.data, 1)\n            correct_val += (predicted == labels).sum().item()\n            total_val += labels.size(0)\n\n    # Calculate validation loss and accuracy\n    val_loss = running_val_loss / len(val_loader)\n    val_accuracy = 100 * correct_val / total_val\n\n    # Print training and validation results for the epoch\n    print(f'Epoch [{epoch + 1}/{30}], '\n          f'Train Loss: {train_loss:.6f}, '\n          f'Val Loss: {val_loss:.6f}, Val Acc: {val_accuracy:.2f}%')\n\n    # Save the model if validation accuracy improved\n    if val_accuracy > best_acc:\n        torch.save(model.state_dict(),'/kaggle/working/resnet50.pth')  # Save model's state_dict\n        best_acc = val_accuracy\n","metadata":{"execution":{"iopub.status.busy":"2024-10-03T06:38:36.900223Z","iopub.execute_input":"2024-10-03T06:38:36.901050Z","iopub.status.idle":"2024-10-03T06:43:08.793125Z","shell.execute_reply.started":"2024-10-03T06:38:36.901010Z","shell.execute_reply":"2024-10-03T06:43:08.792198Z"},"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":{"papermill":{"duration":1.190382,"end_time":"2024-06-21T12:02:50.619967","exception":false,"start_time":"2024-06-21T12:02:49.429585","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T06:56:57.396218Z","iopub.execute_input":"2024-10-03T06:56:57.396610Z","iopub.status.idle":"2024-10-03T06:56:58.544634Z","shell.execute_reply.started":"2024-10-03T06:56:57.396573Z","shell.execute_reply":"2024-10-03T06:56:58.543840Z"},"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","metadata":{"papermill":{"duration":426.512973,"end_time":"2024-06-21T12:09:57.141676","exception":false,"start_time":"2024-06-21T12:02:50.628703","status":"completed"},"tags":[],"execution":{"iopub.status.busy":"2024-10-03T06:57:48.737127Z","iopub.execute_input":"2024-10-03T06:57:48.737906Z","iopub.status.idle":"2024-10-03T07:04:58.722305Z","shell.execute_reply.started":"2024-10-03T06:57:48.737865Z","shell.execute_reply":"2024-10-03T07:04:58.721404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result_csv['label'] = result\nresult_csv.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-10-03T07:05:03.411654Z","iopub.execute_input":"2024-10-03T07:05:03.412049Z","iopub.status.idle":"2024-10-03T07:05:03.803064Z","shell.execute_reply.started":"2024-10-03T07:05:03.412014Z","shell.execute_reply":"2024-10-03T07:05:03.802269Z"},"trusted":true},"execution_count":null,"outputs":[]}]}