{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"     # This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nimport torch\nimport torchvision\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader, ConcatDataset, random_split\nfrom torchvision import transforms\nfrom torchvision.datasets import ImageFolder\nimport random\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport shutil\nimport optuna\nfrom sklearn.metrics import accuracy_score\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-02T04:17:17.774881Z","iopub.execute_input":"2024-05-02T04:17:17.775239Z","iopub.status.idle":"2024-05-02T04:17:24.291053Z","shell.execute_reply.started":"2024-05-02T04:17:17.775209Z","shell.execute_reply":"2024-05-02T04:17:24.290196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Extracting zip files\nfrom zipfile import ZipFile\ndataset = '/kaggle/input/dogs-vs-cats/train.zip'\ntest_dataset = '/kaggle/input/dogs-vs-cats/test1.zip'\nwith ZipFile(dataset, 'r') as zip:\n  zip.extractall()\nwith ZipFile(test_dataset, 'r') as zip:\n  zip.extractall()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:24.293179Z","iopub.execute_input":"2024-05-02T04:17:24.293724Z","iopub.status.idle":"2024-05-02T04:17:38.362890Z","shell.execute_reply.started":"2024-05-02T04:17:24.293670Z","shell.execute_reply":"2024-05-02T04:17:38.361806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(os.listdir('/kaggle/working/train')))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:38.364650Z","iopub.execute_input":"2024-05-02T04:17:38.365003Z","iopub.status.idle":"2024-05-02T04:17:38.386037Z","shell.execute_reply.started":"2024-05-02T04:17:38.364975Z","shell.execute_reply":"2024-05-02T04:17:38.385087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '/kaggle/working/train'\ntest_dir = '/kaggle/working/test1'\ntrain_files = os.listdir(train_dir)\nprint(len(train_files))\ntest_files = os.listdir(test_dir)\ncat_files = [tf for tf in train_files if 'cat' in tf]\ndog_files = [tf for tf in train_files if 'dog' in tf]\ncat_train_dir = '/kaggle/working/train/cat'\ndog_train_dir = '/kaggle/working/train/dog'\nprint(len(cat_files))\n\nos.makedirs(cat_train_dir, exist_ok=True)\nos.makedirs(dog_train_dir, exist_ok=True)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:38.387161Z","iopub.execute_input":"2024-05-02T04:17:38.387432Z","iopub.status.idle":"2024-05-02T04:17:38.419848Z","shell.execute_reply.started":"2024-05-02T04:17:38.387403Z","shell.execute_reply":"2024-05-02T04:17:38.418995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for file in cat_files:\n    shutil.move(os.path.join(train_dir,file), cat_train_dir)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:38.421993Z","iopub.execute_input":"2024-05-02T04:17:38.422274Z","iopub.status.idle":"2024-05-02T04:17:39.070238Z","shell.execute_reply.started":"2024-05-02T04:17:38.422252Z","shell.execute_reply":"2024-05-02T04:17:39.069222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(os.listdir(cat_train_dir)))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:39.071312Z","iopub.execute_input":"2024-05-02T04:17:39.071608Z","iopub.status.idle":"2024-05-02T04:17:39.085595Z","shell.execute_reply.started":"2024-05-02T04:17:39.071583Z","shell.execute_reply":"2024-05-02T04:17:39.084714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for file in dog_files:\n    shutil.move(os.path.join(train_dir,file), dog_train_dir)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:39.086697Z","iopub.execute_input":"2024-05-02T04:17:39.087006Z","iopub.status.idle":"2024-05-02T04:17:39.739612Z","shell.execute_reply.started":"2024-05-02T04:17:39.086982Z","shell.execute_reply":"2024-05-02T04:17:39.738360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nprint(len(os.listdir(dog_train_dir)))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:39.741162Z","iopub.execute_input":"2024-05-02T04:17:39.741584Z","iopub.status.idle":"2024-05-02T04:17:39.755213Z","shell.execute_reply.started":"2024-05-02T04:17:39.741546Z","shell.execute_reply":"2024-05-02T04:17:39.754256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((224, 224)),  \n    transforms.ToTensor(),\n])\n\ndataset = ImageFolder(train_dir, transform=transform)\nprint(len(dataset))\ntrain_size = int(0.8 * len(dataset))\nval_size = len(dataset) - train_size\nprint(train_size)\nprint(val_size)\ntrain_dataset, val_dataset = random_split(dataset, [train_size, val_size])\n\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)\nprint(len(train_dataset))\nprint(len(val_dataset))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:39.757597Z","iopub.execute_input":"2024-05-02T04:17:39.758390Z","iopub.status.idle":"2024-05-02T04:17:40.402158Z","shell.execute_reply.started":"2024-05-02T04:17:39.758354Z","shell.execute_reply":"2024-05-02T04:17:40.401248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(train_loader))\nprint(len(val_loader))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:40.403350Z","iopub.execute_input":"2024-05-02T04:17:40.403652Z","iopub.status.idle":"2024-05-02T04:17:40.408566Z","shell.execute_reply.started":"2024-05-02T04:17:40.403627Z","shell.execute_reply":"2024-05-02T04:17:40.407525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DogCatDataset(Dataset):\n    def __init__(self, folder_dir, file_list, mode='train', transform=None) -> None:\n        self.folder_dir = folder_dir\n        self.file_list = file_list\n        self.mode = mode\n        self.transform = transform\n        if mode == 'train':\n            self.label = 1 if 'dog' in self.file_list[0] else 0 \n            \n    def __getitem__(self, index):\n        img = Image.open(os.path.join(self.folder_dir, self.file_list[index]))\n        if self.transform:\n            img = self.transform(img)\n        img = img.numpy()\n        return img.astype('float32'), (self.label if self.mode == 'train' else self.file_list[index])\n    \n    def __len__(self):\n        return len(self.file_list)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:40.409923Z","iopub.execute_input":"2024-05-02T04:17:40.410203Z","iopub.status.idle":"2024-05-02T04:17:40.420527Z","shell.execute_reply.started":"2024-05-02T04:17:40.410181Z","shell.execute_reply":"2024-05-02T04:17:40.419630Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat_train_files = os.listdir(cat_train_dir)\ndog_train_files = os.listdir(dog_train_dir)\ncats = DogCatDataset(cat_train_dir, cat_train_files, transform = transform)\ndogs = DogCatDataset(dog_train_dir, dog_train_files, transform = transform)\ncatdogs = ConcatDataset([cats, dogs])","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:40.421768Z","iopub.execute_input":"2024-05-02T04:17:40.422370Z","iopub.status.idle":"2024-05-02T04:17:40.444330Z","shell.execute_reply.started":"2024-05-02T04:17:40.422339Z","shell.execute_reply":"2024-05-02T04:17:40.443548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(os.listdir(train_dir))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:40.445327Z","iopub.execute_input":"2024-05-02T04:17:40.445694Z","iopub.status.idle":"2024-05-02T04:17:40.450777Z","shell.execute_reply.started":"2024-05-02T04:17:40.445662Z","shell.execute_reply":"2024-05-02T04:17:40.449789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataloader = DataLoader(catdogs,batch_size = 32,shuffle=True,num_workers=0)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:40.455734Z","iopub.execute_input":"2024-05-02T04:17:40.456372Z","iopub.status.idle":"2024-05-02T04:17:40.461164Z","shell.execute_reply.started":"2024-05-02T04:17:40.456345Z","shell.execute_reply":"2024-05-02T04:17:40.460035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataiter = iter(dataloader)\nsamples, labels  = next(dataiter)\nplt.figure(figsize=(24,16))\ngrid_imgs = torchvision.utils.make_grid(samples[:32])\nnp_grid_imgs = grid_imgs.numpy()\nplt.imshow(np.transpose(np_grid_imgs, (1,2,0)))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:40.462358Z","iopub.execute_input":"2024-05-02T04:17:40.462629Z","iopub.status.idle":"2024-05-02T04:17:42.807901Z","shell.execute_reply.started":"2024-05-02T04:17:40.462606Z","shell.execute_reply":"2024-05-02T04:17:42.805819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"resnet = torchvision.models.resnet18(pretrained=True)\nprint(resnet)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:42.809643Z","iopub.execute_input":"2024-05-02T04:17:42.810116Z","iopub.status.idle":"2024-05-02T04:17:43.597396Z","shell.execute_reply.started":"2024-05-02T04:17:42.810078Z","shell.execute_reply":"2024-05-02T04:17:43.596031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomResNet(nn.Module):\n    def __init__(self, num_classes):\n        super(CustomResNet, self).__init__()\n        \n        self.backbone = torchvision.models.resnet18(pretrained=True)\n        \n        num_features = self.backbone.fc.in_features\n        self.backbone.fc = nn.Identity()  \n        \n        \n        self.classifier = nn.Sequential(\n            nn.Linear(512, 100),\n            \n            nn.Linear(100, num_classes)\n        )\n\n    def forward(self, x):\n        \n        x = self.backbone(x)\n           \n        x = self.classifier(x)\n        return x\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.598831Z","iopub.execute_input":"2024-05-02T04:17:43.599248Z","iopub.status.idle":"2024-05-02T04:17:43.606713Z","shell.execute_reply.started":"2024-05-02T04:17:43.599219Z","shell.execute_reply":"2024-05-02T04:17:43.605639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def calculate_accuracy(outputs, labels):\n    _, predicted = torch.max(outputs, 1)\n    accuracy = accuracy_score(labels.cpu().numpy(), predicted.cpu().numpy())\n    return accuracy","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.608087Z","iopub.execute_input":"2024-05-02T04:17:43.608470Z","iopub.status.idle":"2024-05-02T04:17:43.615584Z","shell.execute_reply.started":"2024-05-02T04:17:43.608445Z","shell.execute_reply":"2024-05-02T04:17:43.614667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#model = CustomResNet(num_classes = 2)\n#print(model)\n#criterion = nn.CrossEntropyLoss()\n#optimizer = torch.optim.Adam(model.parameters(), lr=0.001)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.616709Z","iopub.execute_input":"2024-05-02T04:17:43.617063Z","iopub.status.idle":"2024-05-02T04:17:43.624103Z","shell.execute_reply.started":"2024-05-02T04:17:43.617013Z","shell.execute_reply":"2024-05-02T04:17:43.623273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(resnet.layer1[0])","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.625351Z","iopub.execute_input":"2024-05-02T04:17:43.625793Z","iopub.status.idle":"2024-05-02T04:17:43.633362Z","shell.execute_reply.started":"2024-05-02T04:17:43.625759Z","shell.execute_reply":"2024-05-02T04:17:43.632466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len(train_dataset))\nprint(len(val_dataset))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.634425Z","iopub.execute_input":"2024-05-02T04:17:43.634677Z","iopub.status.idle":"2024-05-02T04:17:43.642189Z","shell.execute_reply.started":"2024-05-02T04:17:43.634656Z","shell.execute_reply":"2024-05-02T04:17:43.641259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = CustomResNet(num_classes = 2)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.643237Z","iopub.execute_input":"2024-05-02T04:17:43.643522Z","iopub.status.idle":"2024-05-02T04:17:43.902086Z","shell.execute_reply.started":"2024-05-02T04:17:43.643498Z","shell.execute_reply":"2024-05-02T04:17:43.900990Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot(train_loss_per_epoch, train_acc_per_epoch, val_loss_per_epoch, val_acc_per_epoch):\n    fig, ax = plt.subplots(2,1)\n    ax[0].plot(train_loss_per_epoch, color='b', label=\"Training loss\")\n    ax[0].plot(val_loss_per_epoch, color='r', label=\"validation loss\",axes =ax[0])\n    legend = ax[0].legend(loc='best', shadow=True)\n\n    ax[1].plot(train_acc_per_epoch, color='b', label=\"Training accuracy\")\n    ax[1].plot(val_acc_per_epoch, color='r',label=\"Validation accuracy\")\n    legend = ax[1].legend(loc='best', shadow=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.903663Z","iopub.execute_input":"2024-05-02T04:17:43.904004Z","iopub.status.idle":"2024-05-02T04:17:43.911303Z","shell.execute_reply.started":"2024-05-02T04:17:43.903977Z","shell.execute_reply":"2024-05-02T04:17:43.909755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def objective(trial):\n    criterion_id = trial.suggest_int('criterion', 0, 1)\n    loss = {0: nn.CrossEntropyLoss(), 1: nn.NLLLoss()}\n    criterion = loss[criterion_id]\n    \n    conv1_kernel_size = trial.suggest_int('c1_kernel_size', 1, 5, step = 2)\n    model.backbone.conv1.kernel_size = (conv1_kernel_size, conv1_kernel_size)\n    \n    l1_conv2_kernel_size = trial.suggest_int('l1_c2_kernel_size', 1, 5, step = 2)\n    model.backbone.layer1[0].conv2.kernel_size = (l1_conv2_kernel_size, l1_conv2_kernel_size)\n    \n    clf_linear1_out_size = trial.suggest_int('c1_l1_out_size',50,150, step = 50)\n    model.classifier[0].out_features = clf_linear1_out_size\n    model.classifier[1].in_features = model.classifier[0].out_features\n    \n    lr = trial.suggest_float('lr', 1e-4, 1e-1, log=True)\n    optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n    return train(model, criterion, optimizer)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.912135Z","iopub.execute_input":"2024-05-02T04:17:43.912400Z","iopub.status.idle":"2024-05-02T04:17:43.972671Z","shell.execute_reply.started":"2024-05-02T04:17:43.912378Z","shell.execute_reply":"2024-05-02T04:17:43.971787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel.to(device)\ndef train(model, criterion, optimizer):\n    num_epochs = 5\n    train_loss_per_epoch = []\n    val_loss_per_epoch = []\n    train_acc_per_epoch = []\n    val_acc_per_epoch = []\n\n    for epoch in range(num_epochs):\n        print(f\"Epoch {epoch+1}/{num_epochs}:\")\n        model.train()\n        total_loss = 0.0\n        total_accuracy = 0.0\n        for images, labels in train_loader:\n            images, labels = images.to(device), labels.to(device)\n        \n            optimizer.zero_grad()\n            with torch.set_grad_enabled(True):\n                outputs = model(images)\n                loss = criterion(outputs, labels)\n                _, preds = torch.max(outputs, 1)\n                loss.backward()\n                optimizer.step()\n        \n            cur_epoch_train_loss = loss.item() * images.size(0)\n            total_loss += cur_epoch_train_loss\n        \n            cur_epoch_train_acc = calculate_accuracy(outputs, labels) * images.size(0)\n        \n            total_accuracy += cur_epoch_train_acc       \n        avg_train_loss = total_loss / len(train_dataset)\n        avg_train_accuracy = total_accuracy / len(train_dataset)\n        train_loss_per_epoch.append(avg_train_loss)\n        train_acc_per_epoch.append(avg_train_accuracy)\n        print(\"Training Done\")\n    \n        model.eval()\n        total_val_loss = 0.0\n        total_val_accuracy = 0.0\n        with torch.no_grad():\n            for images, labels in val_loader:\n                images, labels = images.to(device), labels.to(device)\n            \n                outputs = model(images)\n                loss = criterion(outputs, labels)\n                _, preds = torch.max(outputs, 1)\n            \n                cur_epoch_val_loss = loss.item() * images.size(0) \n                total_val_loss += cur_epoch_val_loss\n            \n                cur_epoch_val_acc = calculate_accuracy(outputs, labels) * images.size(0)\n                total_val_accuracy += cur_epoch_val_acc\n            \n        avg_val_loss = total_val_loss / len(val_dataset)\n        avg_val_accuracy = total_val_accuracy / len(val_dataset)\n        val_loss_per_epoch.append(avg_val_loss)\n        val_acc_per_epoch.append(avg_val_accuracy)\n        print(\"Validation Done\")\n        print(f\"Train Loss: {avg_train_loss:.4f}, Train Acc: {avg_train_accuracy:.4f}, \"\n              f\"Val Loss: {avg_val_loss:.4f}, Val Acc: {avg_val_accuracy:.4f}\")\n        \n    plot(train_loss_per_epoch, train_acc_per_epoch, val_loss_per_epoch, val_acc_per_epoch)\n    return np.mean(val_acc_per_epoch)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:43.973866Z","iopub.execute_input":"2024-05-02T04:17:43.974132Z","iopub.status.idle":"2024-05-02T04:17:44.220972Z","shell.execute_reply.started":"2024-05-02T04:17:43.974109Z","shell.execute_reply":"2024-05-02T04:17:44.220107Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"study = optuna.create_study(direction=\"maximize\")\noptuna.logging.set_verbosity(optuna.logging.INFO)\nstudy.optimize(objective, n_trials=5)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T04:17:44.222237Z","iopub.execute_input":"2024-05-02T04:17:44.222613Z","iopub.status.idle":"2024-05-02T05:15:27.409490Z","shell.execute_reply.started":"2024-05-02T04:17:44.222582Z","shell.execute_reply":"2024-05-02T05:15:27.408523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Best trial:\")\ntrial = study.best_trial\nprint(\"  Value: {}\".format(trial.value))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:27.410685Z","iopub.execute_input":"2024-05-02T05:15:27.410993Z","iopub.status.idle":"2024-05-02T05:15:27.416718Z","shell.execute_reply.started":"2024-05-02T05:15:27.410969Z","shell.execute_reply":"2024-05-02T05:15:27.415731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"  Params: \")\nfor key, value in trial.params.items():\n        print(\"    {}: {}\".format(key, value))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:27.417898Z","iopub.execute_input":"2024-05-02T05:15:27.418165Z","iopub.status.idle":"2024-05-02T05:15:27.430006Z","shell.execute_reply.started":"2024-05-02T05:15:27.418142Z","shell.execute_reply":"2024-05-02T05:15:27.429003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_transform = transforms.Compose([\n    transforms.Resize((224,224)),\n    transforms.ToTensor()\n])\n\ntest_set = DogCatDataset(test_dir, test_files, mode='test', transform = test_transform)\ntest_dataloader = DataLoader(test_set, batch_size = 32, shuffle=False, num_workers=2)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:27.431516Z","iopub.execute_input":"2024-05-02T05:15:27.432094Z","iopub.status.idle":"2024-05-02T05:15:27.442940Z","shell.execute_reply.started":"2024-05-02T05:15:27.432048Z","shell.execute_reply":"2024-05-02T05:15:27.441608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filename_pth = 'resnet18_dogcat.pth'\ntorch.save(model.state_dict(), filename_pth)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:27.444266Z","iopub.execute_input":"2024-05-02T05:15:27.444655Z","iopub.status.idle":"2024-05-02T05:15:27.544073Z","shell.execute_reply.started":"2024-05-02T05:15:27.444622Z","shell.execute_reply":"2024-05-02T05:15:27.543204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\nfilename_list = []\npred_list = []\nfor image, filename in test_dataloader:\n    with torch.no_grad():\n        image = image.to(device)\n        output = model(image)\n        pred = torch.argmax(output, dim=1)\n        filename_list += [name[:-4] for name in filename]\n        pred_list += [p.item() for p in pred]\n\nsubmission = pd.DataFrame({\"id\":filename_list, \"label\":pred_list})\nsubmission.to_csv('preds.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:27.545188Z","iopub.execute_input":"2024-05-02T05:15:27.545504Z","iopub.status.idle":"2024-05-02T05:15:53.263724Z","shell.execute_reply.started":"2024-05-02T05:15:27.545480Z","shell.execute_reply":"2024-05-02T05:15:53.262423Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv(\"preds.csv\")\ndata.head()","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:53.265421Z","iopub.execute_input":"2024-05-02T05:15:53.266391Z","iopub.status.idle":"2024-05-02T05:15:53.290939Z","shell.execute_reply.started":"2024-05-02T05:15:53.266342Z","shell.execute_reply":"2024-05-02T05:15:53.289995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"iter_test = iter(test_dataloader)\nsamples, _ = next(iter_test)\nsamples = samples.to(device)\nfig = plt.figure(figsize=(24, 16))\nfig.tight_layout()\noutput = model(samples[:24])\npred = torch.argmax(output, dim=1)\npred = [p.item() for p in pred]\nad = {0:'cat', 1:'dog'}\nfor num, sample in enumerate(samples[:24]):\n    plt.subplot(4,6,num+1)\n    plt.title(ad[pred[num]])\n    plt.axis('off')\n    sample = sample.cpu().numpy()\n    plt.imshow(np.transpose(sample, (1,2,0)))","metadata":{"execution":{"iopub.status.busy":"2024-05-02T05:15:53.292156Z","iopub.execute_input":"2024-05-02T05:15:53.292492Z","iopub.status.idle":"2024-05-02T05:15:57.693352Z","shell.execute_reply.started":"2024-05-02T05:15:53.292459Z","shell.execute_reply":"2024-05-02T05:15:57.692217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}