{"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":"gpu","dataSources":[{"sourceId":3649,"databundleVersionId":46718,"sourceType":"competition"}],"dockerImageVersionId":30776,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom tqdm import tqdm\nfrom PIL import Image\n\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nimport torchvision.datasets as datasets\nfrom torchvision.models import resnet50\nfrom torchvision import transforms","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:36:22.026089Z","iopub.execute_input":"2024-09-29T08:36:22.026987Z","iopub.status.idle":"2024-09-29T08:36:22.032248Z","shell.execute_reply.started":"2024-09-29T08:36:22.026944Z","shell.execute_reply":"2024-09-29T08:36:22.031310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 64\nlearning_rate = 1e-4\nnum_epochs = 10\nimg_size = 128","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:36:36.459219Z","iopub.execute_input":"2024-09-29T08:36:36.459703Z","iopub.status.idle":"2024-09-29T08:36:36.464786Z","shell.execute_reply.started":"2024-09-29T08:36:36.459656Z","shell.execute_reply":"2024-09-29T08:36:36.463715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Set seed\nimport os\nimport random\nimport numpy as np\nimport torch\n\nrandom_seed = 42\nrandom.seed(random_seed)\nnp.random.seed(random_seed)\nos.environ[\"PYTHONHASHSEED\"] = str(random_seed)\ntorch.manual_seed(random_seed)\ntorch.cuda.manual_seed(random_seed)\ntorch.cuda.manual_seed_all(random_seed)\ntorch.backends.cudnn.deterministic = True\ntorch.backends.cudnn.benchmark = False\ntorch.use_deterministic_algorithms(False)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:36:50.923767Z","iopub.execute_input":"2024-09-29T08:36:50.924797Z","iopub.status.idle":"2024-09-29T08:36:50.933477Z","shell.execute_reply.started":"2024-09-29T08:36:50.924742Z","shell.execute_reply":"2024-09-29T08:36:50.932527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Read csv\nsample = pd.read_csv('/kaggle/input/cifar-10/sampleSubmission.csv')","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:36:53.458674Z","iopub.execute_input":"2024-09-29T08:36:53.459073Z","iopub.status.idle":"2024-09-29T08:36:53.550768Z","shell.execute_reply.started":"2024-09-29T08:36:53.459033Z","shell.execute_reply":"2024-09-29T08:36:53.549970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Check the form of data\nsample.head(10)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:36:55.108100Z","iopub.execute_input":"2024-09-29T08:36:55.108909Z","iopub.status.idle":"2024-09-29T08:36:55.118214Z","shell.execute_reply.started":"2024-09-29T08:36:55.108866Z","shell.execute_reply":"2024-09-29T08:36:55.117289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define transforms\ntrain_transforms = transforms.Compose(\n    [\n        transforms.Resize(img_size),\n        transforms.RandomRotation(20),\n        transforms.RandomHorizontalFlip(0.5),\n        transforms.ToTensor(),\n        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n    ]\n)\ntest_transforms = transforms.Compose(\n    [\n        transforms.Resize(img_size),\n        transforms.ToTensor(),\n        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n    ]\n)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:36:57.940099Z","iopub.execute_input":"2024-09-29T08:36:57.940793Z","iopub.status.idle":"2024-09-29T08:36:57.947190Z","shell.execute_reply.started":"2024-09-29T08:36:57.940750Z","shell.execute_reply":"2024-09-29T08:36:57.946270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load data\ntrain_dataset = datasets.CIFAR10(root='./data', train=True, transform=train_transforms, download=True)\nvalid_dataset = datasets.CIFAR10(root='./data', train=False, transform=test_transforms, download=True)\n\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=False)\nvalid_loader = DataLoader(valid_dataset, batch_size=batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:37:00.779435Z","iopub.execute_input":"2024-09-29T08:37:00.780146Z","iopub.status.idle":"2024-09-29T08:37:15.878203Z","shell.execute_reply.started":"2024-09-29T08:37:00.780103Z","shell.execute_reply":"2024-09-29T08:37:15.877369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get pretrained ResNet50 model and customize for CIFAR10 classification\nclass ResNet50(nn.Module):\n    def __init__(self, num_classes):\n        super(ResNet50, self).__init__()\n        self.model = resnet50(weights=\"DEFAULT\")\n        self.in_features = self.model.fc.in_features\n        self.model.fc = nn.Linear(self.in_features, num_classes)\n        \n    def forward(self, x):\n        x = self.model(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:37:19.314668Z","iopub.execute_input":"2024-09-29T08:37:19.315071Z","iopub.status.idle":"2024-09-29T08:37:19.321816Z","shell.execute_reply.started":"2024-09-29T08:37:19.315031Z","shell.execute_reply":"2024-09-29T08:37:19.320666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Use cuda if you have gpu\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\n\n# Define model, optimizer, loss function\nmodel = ResNet50(num_classes=10).to(device)\noptimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\ncriterion = nn.CrossEntropyLoss().to(device)\nscheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.5)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:37:21.713989Z","iopub.execute_input":"2024-09-29T08:37:21.714373Z","iopub.status.idle":"2024-09-29T08:37:24.604267Z","shell.execute_reply.started":"2024-09-29T08:37:21.714335Z","shell.execute_reply":"2024-09-29T08:37:24.603427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torchinfo\ntorchinfo.summary(model, input_size = (1,3,224,2224), verbose = 1, col_names=[\"input_size\", \"output_size\", \"kernel_size\", \"num_params\", \"params_percent\", \"trainable\"]);","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:37:38.252459Z","iopub.execute_input":"2024-09-29T08:37:38.252827Z","iopub.status.idle":"2024-09-29T08:37:38.935872Z","shell.execute_reply.started":"2024-09-29T08:37:38.252792Z","shell.execute_reply":"2024-09-29T08:37:38.934845Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train\nbest_epoch = 0\nbest_acc = 0.0\nfor epoch in range(1, num_epochs + 1):\n    print(\"-\" * 40)\n    print(f\"Epoch: {epoch}\")\n    epoch_loss = 0.0\n    epoch_corrects = 0\n    model.train()\n    for batch_in, batch_out in tqdm(train_loader):\n        batch_in = batch_in.to(device)\n        batch_out = batch_out.to(device)\n\n        y_pred = model(batch_in)\n        preds = torch.argmax(y_pred, 1)\n        loss = criterion(y_pred, batch_out)\n\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n\n        epoch_loss += loss.item() * batch_in.size(0)\n        epoch_corrects += torch.sum(preds == batch_out.data)\n\n    epoch_loss = epoch_loss / len(train_loader.dataset)\n    epoch_acc = epoch_corrects / len(train_loader.dataset)\n\n    print(f\"Train loss: {epoch_loss:.4f}\")\n    print(f\"Train acc: {epoch_acc:.4f}\")\n\n# Validation\n    with torch.no_grad():\n        epoch_loss = 0.0\n        epoch_corrects = 0\n        model.eval()\n        for batch_in, batch_out in tqdm(valid_loader):\n            batch_in = batch_in.to(device)\n            batch_out = batch_out.to(device)\n\n            y_pred = model(batch_in)\n            preds = torch.argmax(y_pred, 1)\n            loss = criterion(y_pred, batch_out)\n\n            epoch_loss += loss.item() * batch_in.size(0)\n            epoch_corrects += torch.sum(preds == batch_out.data)\n\n    epoch_loss = epoch_loss / len(valid_loader.dataset)\n    epoch_acc = epoch_corrects / len(valid_loader.dataset)\n    \n    scheduler.step()\n\n    print(f\"Valid loss: {epoch_loss:.4f}\")\n    print(f\"Valid acc: {epoch_acc:.4f}\")\n\n    if epoch_acc >= best_acc:\n        best_epoch = epoch\n        best_acc = epoch_acc\n        torch.save(model, \"./model.pt\")\n\n    print(f\"Best epoch: {best_epoch}\")\n    print(f\"Best acc: {best_acc:.4f}\")\n    print(\"-\" * 40)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T08:37:43.856645Z","iopub.execute_input":"2024-09-29T08:37:43.857366Z","iopub.status.idle":"2024-09-29T09:04:35.295711Z","shell.execute_reply.started":"2024-09-29T08:37:43.857320Z","shell.execute_reply":"2024-09-29T09:04:35.294776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Decompression data\n!pip install py7zr\n\nimport py7zr\n\nwith py7zr.SevenZipFile('/kaggle/input/cifar-10/test.7z', mode='r') as z:\n    z.extractall('/kaggle/working/')","metadata":{"execution":{"iopub.status.busy":"2024-09-29T09:06:46.315191Z","iopub.execute_input":"2024-09-29T09:06:46.315617Z","iopub.status.idle":"2024-09-29T09:09:32.463790Z","shell.execute_reply.started":"2024-09-29T09:06:46.315547Z","shell.execute_reply":"2024-09-29T09:09:32.462548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Make a list of data filenames for dataset\ntest_filenames = [os.path.join('/kaggle/working/test', f) for f in os.listdir('/kaggle/working/test')]\ntest_filenames.sort(key=lambda x: int(x.split('/')[-1].split('.')[0]))","metadata":{"execution":{"iopub.status.busy":"2024-09-29T09:09:37.913943Z","iopub.execute_input":"2024-09-29T09:09:37.914811Z","iopub.status.idle":"2024-09-29T09:09:38.989809Z","shell.execute_reply.started":"2024-09-29T09:09:37.914764Z","shell.execute_reply":"2024-09-29T09:09:38.988983Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define dataset\nclass CIFAR10(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","metadata":{"execution":{"iopub.status.busy":"2024-09-29T09:09:49.633988Z","iopub.execute_input":"2024-09-29T09:09:49.634388Z","iopub.status.idle":"2024-09-29T09:09:49.640356Z","shell.execute_reply.started":"2024-09-29T09:09:49.634348Z","shell.execute_reply":"2024-09-29T09:09:49.639454Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load dataset\ntest_dataset = CIFAR10(test_filenames, test_transforms)\n\ntest_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T09:09:54.258386Z","iopub.execute_input":"2024-09-29T09:09:54.259511Z","iopub.status.idle":"2024-09-29T09:09:54.264033Z","shell.execute_reply.started":"2024-09-29T09:09:54.259468Z","shell.execute_reply":"2024-09-29T09:09:54.263047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For one-hot encoding\nclasses = ('airplane', \n           'automobile', \n           'bird',\n           'cat',\n           'deer',\n           'dog', \n           'frog', \n           'horse', \n           'ship',\n           'truck')","metadata":{"execution":{"iopub.status.busy":"2024-09-29T09:09:57.103834Z","iopub.execute_input":"2024-09-29T09:09:57.104238Z","iopub.status.idle":"2024-09-29T09:09:57.108978Z","shell.execute_reply.started":"2024-09-29T09:09:57.104198Z","shell.execute_reply":"2024-09-29T09:09:57.107994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the best model\nmodel = torch.load('./model.pt').to(device)\n\n# Get the result\nresult = []\n\nwith torch.no_grad():\n    model.eval()\n    for batch_in in tqdm(test_loader):\n        batch_in = batch_in.to(device)\n        \n        y_pred = model(batch_in)\n        preds = torch.argmax(y_pred, 1)\n        preds = preds.cpu().numpy()\n        result.extend([classes[i] for i in preds])\n\nsample['label'] = result\nsample.to_csv('./predict.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-09-29T09:09:59.580731Z","iopub.execute_input":"2024-09-29T09:09:59.581949Z","iopub.status.idle":"2024-09-29T09:17:18.701616Z","shell.execute_reply.started":"2024-09-29T09:09:59.581879Z","shell.execute_reply":"2024-09-29T09:17:18.700776Z"},"trusted":true},"execution_count":null,"outputs":[]}]}