{"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":7327,"databundleVersionId":861871,"sourceType":"competition"}],"dockerImageVersionId":30683,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Summary\n\nThis notebook explores a hybrid approach for identifying dog breeds utilizing the feature extraction capabilities of Inception V3 and ResNet50 pretrained models. The model incorporates a classifier layer with a dropout rate of 0.7 to enhance generalization and mitigate overfitting.\n\n## Methodology:\n\n* **Preprocessing:** Input images undergo resizing to ensure uniform dimensions. Data augmentation techniques, such as horizontal and vertical flipping with a probability of 0.2, are applied to increase the diversity of training data and improve model generalization.\n* **Feature Extraction:** Inception V3 and ResNet50 pretrained models are utilized to extract high-level features from the input images.\n* **Classifier Layer:** The extracted features are fed into a classifier layer with a dropout rate of 0.7. \n* **Training:** The model is trained using a SGD optimization algorithm with a learning rate of 0.005, and Cross Entropy Loss. Training involves fine-tuning the classifier layer while keeping the parameters of the pretrained models frozen.\n* **Evaluation:** The model's performance is assessed based on validation accuracy and loss metrics.\n","metadata":{}},{"cell_type":"markdown","source":"# Libraries","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nfrom PIL import Image\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\n\n# Visualization\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n\n# PyTorch\n\nimport torch as T\nfrom torch import nn\nfrom torch.utils.data import DataLoader, Dataset\nfrom torchvision import models\nfrom torchvision import transforms","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:30:41.374343Z","iopub.execute_input":"2024-12-10T10:30:41.375115Z","iopub.status.idle":"2024-12-10T10:30:48.958336Z","shell.execute_reply.started":"2024-12-10T10:30:41.375089Z","shell.execute_reply":"2024-12-10T10:30:48.957457Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Configure GPU","metadata":{}},{"cell_type":"code","source":"device = T.device('cuda' if T.cuda.is_available() else 'cpu')","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:30:48.959816Z","iopub.execute_input":"2024-12-10T10:30:48.960177Z","iopub.status.idle":"2024-12-10T10:30:49.024339Z","shell.execute_reply.started":"2024-12-10T10:30:48.960154Z","shell.execute_reply":"2024-12-10T10:30:49.023088Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Loading dataset","metadata":{}},{"cell_type":"code","source":"# Read csv file\ntrain_data = pd.read_csv(\"/kaggle/input/dog-breed-identification/labels.csv\")\n# Train data shape\nprint(f\"Train dataset shape: {train_data.shape}\")\n# Sample of the train_data DataFrame\ntrain_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:31:02.127105Z","iopub.execute_input":"2024-12-10T10:31:02.127800Z","iopub.status.idle":"2024-12-10T10:31:02.168616Z","shell.execute_reply.started":"2024-12-10T10:31:02.127772Z","shell.execute_reply":"2024-12-10T10:31:02.167819Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Distribution of the breed classes","metadata":{}},{"cell_type":"code","source":"breed_classes = train_data.breed.value_counts().reset_index()\nplt.figure(figsize=(20,8))\nsns.barplot(breed_classes, x='breed', y='count', palette=\"flare\")\nplt.xticks(rotation=90)\nplt.title(\"Distribution of the breed classes\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:31:09.394900Z","iopub.execute_input":"2024-12-10T10:31:09.395214Z","iopub.status.idle":"2024-12-10T10:31:10.455592Z","shell.execute_reply.started":"2024-12-10T10:31:09.395190Z","shell.execute_reply":"2024-12-10T10:31:10.454712Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"breed_classes['count'].describe()","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:31:52.902841Z","iopub.execute_input":"2024-12-10T10:31:52.903158Z","iopub.status.idle":"2024-12-10T10:31:52.913364Z","shell.execute_reply.started":"2024-12-10T10:31:52.903133Z","shell.execute_reply":"2024-12-10T10:31:52.912539Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Confirm the 120 dog breed classes","metadata":{}},{"cell_type":"code","source":"breed_classes['breed'].nunique()","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:31:59.305336Z","iopub.execute_input":"2024-12-10T10:31:59.305805Z","iopub.status.idle":"2024-12-10T10:31:59.312296Z","shell.execute_reply.started":"2024-12-10T10:31:59.305775Z","shell.execute_reply":"2024-12-10T10:31:59.311456Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Label Encoding","metadata":{}},{"cell_type":"code","source":"le = LabelEncoder()\ntrain_data.loc[:,'breed'] = le.fit_transform(train_data.loc[:,'breed']) ","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:32:02.947917Z","iopub.execute_input":"2024-12-10T10:32:02.948553Z","iopub.status.idle":"2024-12-10T10:32:02.954969Z","shell.execute_reply.started":"2024-12-10T10:32:02.948526Z","shell.execute_reply":"2024-12-10T10:32:02.954039Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:32:04.482629Z","iopub.execute_input":"2024-12-10T10:32:04.483311Z","iopub.status.idle":"2024-12-10T10:32:04.491178Z","shell.execute_reply.started":"2024-12-10T10:32:04.483285Z","shell.execute_reply":"2024-12-10T10:32:04.490235Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Dog Breed Dataset","metadata":{}},{"cell_type":"code","source":"class Dog_Breed_Dataset(Dataset):\n    \n    def __init__(self, df: pd.DataFrame, img_base_path: str, split: str, transforms = None):        \n        self.df = df\n        self.img_base_path = img_base_path\n        self.split = split\n        self.transforms = transforms\n        \n    def __getitem__(self, index):\n        # Path of the image\n        img_path = os.path.join(self.img_base_path + self.df.loc[index,'id'] + '.jpg')\n        # Read the image\n        img = Image.open(img_path)        \n        # Perform the transformations\n        if self.transforms:\n            img = self.transforms(img)\n        \n        if self.split != 'test':\n            y = self.df.loc[index, 'breed']                     \n            return img, y\n        else:            \n            return img\n    \n    def __len__(self):\n        return len(self.df)        ","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:32:39.853254Z","iopub.execute_input":"2024-12-10T10:32:39.854071Z","iopub.status.idle":"2024-12-10T10:32:39.859757Z","shell.execute_reply.started":"2024-12-10T10:32:39.854041Z","shell.execute_reply":"2024-12-10T10:32:39.858888Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Augmentation","metadata":{}},{"cell_type":"code","source":"train_transforms = transforms.Compose([\n    transforms.Resize((224,224)),\n    transforms.RandomHorizontalFlip(p=0.2),\n    transforms.RandomVerticalFlip(p=0.2),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\ntest_transforms = transforms.Compose([\n    transforms.Resize((224,224)),    \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-12-10T10:32:46.830663Z","iopub.execute_input":"2024-12-10T10:32:46.831509Z","iopub.status.idle":"2024-12-10T10:32:46.836593Z","shell.execute_reply.started":"2024-12-10T10:32:46.831478Z","shell.execute_reply":"2024-12-10T10:32:46.835768Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Get Data Loaders","metadata":{}},{"cell_type":"markdown","source":"### Split the dataset","metadata":{}},{"cell_type":"code","source":"train, val = train_test_split(train_data, test_size=0.2, random_state=42, stratify=train_data['breed'])\n\ntrain = train.reset_index(drop=True)\nval = val.reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:32:58.294140Z","iopub.execute_input":"2024-12-10T10:32:58.294478Z","iopub.status.idle":"2024-12-10T10:32:58.313043Z","shell.execute_reply.started":"2024-12-10T10:32:58.294454Z","shell.execute_reply":"2024-12-10T10:32:58.312317Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Get the data loaders","metadata":{}},{"cell_type":"code","source":"train_dataset = Dog_Breed_Dataset(\n    df=train,\n    img_base_path='/kaggle/input/dog-breed-identification/train/',\n    split='train',\n    transforms=train_transforms\n)\nvalidation_dataset = Dog_Breed_Dataset(\n    df=val,\n    img_base_path='/kaggle/input/dog-breed-identification/train/',\n    split='val',\n    transforms=test_transforms\n)\n\ntrain_dl = DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=4)\nvalidation_dl = DataLoader(validation_dataset, batch_size=64, shuffle=False, num_workers=4)    ","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:33:20.447292Z","iopub.execute_input":"2024-12-10T10:33:20.448077Z","iopub.status.idle":"2024-12-10T10:33:20.453123Z","shell.execute_reply.started":"2024-12-10T10:33:20.448048Z","shell.execute_reply":"2024-12-10T10:33:20.452191Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Train data length: {len(train_dl.dataset)}, Validation data length: {len(validation_dl.dataset)}\")","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:33:23.549661Z","iopub.execute_input":"2024-12-10T10:33:23.550471Z","iopub.status.idle":"2024-12-10T10:33:23.555592Z","shell.execute_reply.started":"2024-12-10T10:33:23.550428Z","shell.execute_reply":"2024-12-10T10:33:23.554545Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Training process","metadata":{}},{"cell_type":"markdown","source":"## Training function","metadata":{}},{"cell_type":"code","source":"from tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T10:33:59.063083Z","iopub.execute_input":"2024-12-10T10:33:59.063765Z","iopub.status.idle":"2024-12-10T10:33:59.067689Z","shell.execute_reply.started":"2024-12-10T10:33:59.063737Z","shell.execute_reply":"2024-12-10T10:33:59.066731Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_model(train_dl, val_dl, model, epochs=20):    \n    \n    train_acc_history = []\n    val_acc_history = []\n    train_loss_history = []\n    val_loss_history = []\n    # Best validation accuracy\n    best_val_loss = 1_000_000.0    \n    # Get initial weights\n    weights = model.get_weights()\n    \n    for epoch in tqdm(range(epochs)):\n        print(\"=\"*20, \"Epoch: \", str(epoch), \"=\"*20)\n        \n        train_correct_pred = 0\n        val_correct_pred = 0\n        train_acc = 0\n        val_acc = 0\n        train_loss = 0\n        val_loss = 0\n        \n        # Set to training mode\n        model.train()\n        \n        for x, y in train_dl:               \n            # Convert data to Tensor            \n            x = x.clone().detach().to(device).requires_grad_(True)\n            y = y.clone().detach().long().to(device)\n            # Reset gradients\n            model.optim.zero_grad()\n            # Predict\n            preds = model(x)            \n            \n            # Compute the loss            \n            loss = model.criterion(preds,y)            \n            \n            # Compute the gradients            \n            loss.backward()\n            # Update weights\n            model.optim.step()\n            # Count the correct predictions\n            preds = T.argmax(preds, dim=1)           \n            train_correct_pred += (preds.long().unsqueeze(1) == y.unsqueeze(1)).sum().item()\n            \n            train_loss += loss.item()           \n        \n        train_acc = train_correct_pred / len(train_dl.dataset)\n        \n        train_acc_history.append(train_acc)\n               \n        train_loss_history.append(train_loss)\n        \n        # Switch to evaluation mode\n        model.eval()        \n        \n        with T.no_grad():\n            for x, y in val_dl:                \n                # Convert data to Tensor                \n                x = x.clone().detach().to(device)\n                y = y.clone().detach().long().to(device)    \n                # Predict\n                preds = model(x)                \n                # Compute the loss\n                loss = model.criterion(preds,y)                                         \n                \n                val_loss += loss.item()                \n                # Count the correct predictions\n                preds = T.argmax(preds, dim=1)\n                \n                val_correct_pred += (preds.long().unsqueeze(1) == y.unsqueeze(1)).sum().item() \n                \n        model.scheduler.step()       \n        \n        val_acc = val_correct_pred / len(val_dl.dataset)\n        \n        val_acc_history.append(val_acc)\n        val_loss_history.append(val_loss)           \n        # Save the weights of the best model\n        if best_val_loss > val_loss:\n            best_val_loss = val_loss\n            weights = model.get_weights()\n            \n        print(\"Train acc: {:.4f} | Train Loss: {:.4f} | Validation acc: {:.4f} | Validation Loss: {:.4f}\".format(train_acc, train_loss, val_acc, val_loss))\n    # Load best model\n    model.load_weights(weights)\n    \n    return [train_acc_history, train_loss_history, val_acc_history, val_loss_history], model","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:42:36.718802Z","iopub.execute_input":"2024-12-10T10:42:36.719384Z","iopub.status.idle":"2024-12-10T10:42:36.730242Z","shell.execute_reply.started":"2024-12-10T10:42:36.719357Z","shell.execute_reply":"2024-12-10T10:42:36.729464Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Models","metadata":{}},{"cell_type":"markdown","source":"Inception model","metadata":{}},{"cell_type":"code","source":"inception.AuxLogits","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T10:45:52.859703Z","iopub.execute_input":"2024-12-10T10:45:52.860480Z","iopub.status.idle":"2024-12-10T10:45:52.865931Z","shell.execute_reply.started":"2024-12-10T10:45:52.860449Z","shell.execute_reply":"2024-12-10T10:45:52.864980Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for name, module in inception.named_children():\n    print(name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T10:45:14.640279Z","iopub.execute_input":"2024-12-10T10:45:14.641092Z","iopub.status.idle":"2024-12-10T10:45:14.646085Z","shell.execute_reply.started":"2024-12-10T10:45:14.641053Z","shell.execute_reply":"2024-12-10T10:45:14.645132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"inception = models.inception_v3(pretrained=True)\n\ninception_model = nn.Sequential(\n    inception.Conv2d_1a_3x3,\n    inception.Conv2d_2a_3x3,\n    inception.Conv2d_2b_3x3,\n    inception.maxpool1,\n    inception.Conv2d_3b_1x1,\n    inception.Conv2d_4a_3x3,\n    inception.maxpool2,\n    inception.Mixed_5b,\n    inception.Mixed_5c,\n    inception.Mixed_5d,\n    inception.Mixed_6a,\n    inception.Mixed_6b,\n    inception.Mixed_6c,\n    inception.Mixed_6d,\n    inception.Mixed_6e,\n    inception.Mixed_7a,\n    inception.Mixed_7b,\n    inception.Mixed_7c,\n    inception.avgpool\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:42:42.734763Z","iopub.execute_input":"2024-12-10T10:42:42.735528Z","iopub.status.idle":"2024-12-10T10:42:43.926174Z","shell.execute_reply.started":"2024-12-10T10:42:42.735498Z","shell.execute_reply":"2024-12-10T10:42:43.925431Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**NOTE**\n+ skip aux layer\n+ skip classification layer at the end","metadata":{}},{"cell_type":"markdown","source":"Resnet50 model","metadata":{}},{"cell_type":"code","source":"for name, module in resnet50.named_children():\n    print(name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-10T10:51:55.633099Z","iopub.execute_input":"2024-12-10T10:51:55.633451Z","iopub.status.idle":"2024-12-10T10:51:55.637984Z","shell.execute_reply.started":"2024-12-10T10:51:55.633398Z","shell.execute_reply":"2024-12-10T10:51:55.637132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"resnet50 = models.resnet50(pretrained=True)\n\nresnet50_model = nn.Sequential(\n    resnet50.conv1,\n    resnet50.bn1,\n    resnet50.relu,\n    resnet50.maxpool,\n    resnet50.layer1,\n    resnet50.layer2,\n    resnet50.layer3,\n    resnet50.layer4,\n    resnet50.avgpool\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:51:34.973156Z","iopub.execute_input":"2024-12-10T10:51:34.973485Z","iopub.status.idle":"2024-12-10T10:51:36.284168Z","shell.execute_reply.started":"2024-12-10T10:51:34.973461Z","shell.execute_reply":"2024-12-10T10:51:36.283464Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**NOTE**\n+ skip the fc layer ","metadata":{}},{"cell_type":"code","source":"# Freeze parameters of pretrained models\nfor param in resnet50_model.parameters():    \n    param.requires_grad = False\n    \nfor param in inception_model.parameters():    \n    param.requires_grad = False","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:52:22.092112Z","iopub.execute_input":"2024-12-10T10:52:22.092953Z","iopub.status.idle":"2024-12-10T10:52:22.098594Z","shell.execute_reply.started":"2024-12-10T10:52:22.092922Z","shell.execute_reply":"2024-12-10T10:52:22.097693Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Model class","metadata":{}},{"cell_type":"code","source":"class Model(nn.Module):\n    \n    def __init__(self, inception_model, resnet50_model):\n        super(Model,self).__init__()\n        \n        self.inception_model = inception_model\n        self.resnet50_model = resnet50_model        \n        \n        self.output = nn.Sequential(\n            nn.Dropout(0.3),\n            nn.Linear(4096,120)            \n        ) # simple fc layer\n        \n        self.to(device)\n        # Optimizer \n        self.optim = T.optim.SGD(self.output.parameters(), lr=0.005, momentum=0.9)\n        # Loss\n        self.criterion = T.nn.CrossEntropyLoss()\n        # Scheduler\n        self.scheduler = T.optim.lr_scheduler.StepLR(self.optim, step_size=7, gamma=0.1)\n        \n    def forward(self, x):\n        X1 = self.inception_model(x)\n        X2 = self.resnet50_model(x)\n        \n        X1 = X1.view(X1.size(0), -1) # resize to (batchsize, -1)\n        X2 = X2.view(X2.size(0), -1) # resize to (batchsize, -1)\n       \n        X = T.cat([X1, X2], dim=1)\n         \n        P = self.output(X)        \n        \n        return P\n    \n    def get_weights(self):\n        return self.output.state_dict()\n    \n    def load_weights(self, weights):\n        self.output.load_state_dict(weights)","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:57:20.743499Z","iopub.execute_input":"2024-12-10T10:57:20.743834Z","iopub.status.idle":"2024-12-10T10:57:20.751365Z","shell.execute_reply.started":"2024-12-10T10:57:20.743810Z","shell.execute_reply":"2024-12-10T10:57:20.750472Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Training model","metadata":{}},{"cell_type":"code","source":"model = Model(inception_model, resnet50_model)","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:57:22.960532Z","iopub.execute_input":"2024-12-10T10:57:22.961276Z","iopub.status.idle":"2024-12-10T10:57:23.241533Z","shell.execute_reply.started":"2024-12-10T10:57:22.961238Z","shell.execute_reply":"2024-12-10T10:57:23.240622Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history, model = train_model(train_dl, validation_dl, model)","metadata":{"execution":{"iopub.status.busy":"2024-12-10T10:57:25.422744Z","iopub.execute_input":"2024-12-10T10:57:25.423063Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Training and Validation Results\nfig, axs = plt.subplots(1,2, figsize=(15,6))\naxs[0].plot(range(20), history[0], label=\"Training accuracy\")\naxs[0].plot(range(20), history[2], label=\"Validation accuracy\")\naxs[0].set_xlabel('Epoch')\naxs[0].set_ylabel('Accuracy')\naxs[0].grid(True)\n\naxs[1].plot(range(20), history[1], label=\"Training Loss\")\naxs[1].plot(range(20), history[3], label=\"Validation Loss\")\naxs[1].set_xlabel('Epoch')\naxs[1].set_ylabel('Loss')\naxs[1].grid(True)\n\nplt.suptitle(\"Training and Validation Results of Model\")\nplt.legend()\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"markdown","source":"## Read test data","metadata":{}},{"cell_type":"code","source":"test_data = pd.DataFrame([])\nfor dirname, _, filename in os.walk('/kaggle/input/dog-breed-identification/test/'):\n    filename = pd.Series(filename)\n    test_data = pd.concat([test_data, filename], axis=0)\ntest_data.columns = ['id']\ntest_data['id'] = test_data['id'].str.replace(\".jpg\",\"\")","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:23:01.883999Z","iopub.execute_input":"2024-04-22T18:23:01.884805Z","iopub.status.idle":"2024-04-22T18:23:21.626962Z","shell.execute_reply.started":"2024-04-22T18:23:01.884769Z","shell.execute_reply":"2024-04-22T18:23:21.625894Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Dataset shape\nprint(f\"Test dataset shape: {test_data.shape}\")\n# Sample of the train_data DataFrame\ntest_data.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:23:21.629105Z","iopub.execute_input":"2024-04-22T18:23:21.629516Z","iopub.status.idle":"2024-04-22T18:23:21.640549Z","shell.execute_reply.started":"2024-04-22T18:23:21.629477Z","shell.execute_reply":"2024-04-22T18:23:21.639448Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Get Test Data Loader","metadata":{}},{"cell_type":"code","source":"test_dataset = Dog_Breed_Dataset(\n    df=test_data,\n    img_base_path='/kaggle/input/dog-breed-identification/test/',\n    split='test',\n    transforms=test_transforms\n)\n\ntest_dl = DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=4)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:23:21.641825Z","iopub.execute_input":"2024-04-22T18:23:21.642137Z","iopub.status.idle":"2024-04-22T18:23:21.649705Z","shell.execute_reply.started":"2024-04-22T18:23:21.642111Z","shell.execute_reply":"2024-04-22T18:23:21.648803Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def test_model(test_dl, model):       \n              \n        # Predictions DataFrame\n        prob_preds = pd.DataFrame([])\n        \n        for x in test_dl:\n            # Convert data to Tensor            \n            x = x.clone().detach().to(device)            \n            # Predict\n            pred = model(x)  \n            prob_pred = T.nn.functional.softmax(pred, dim=1)\n            \n            prob_pred = prob_pred.detach().cpu().numpy()             \n            prob_pred = pd.DataFrame(prob_pred)\n            \n            prob_preds = pd.concat([prob_preds, prob_pred], axis=0)            \n            \n        return prob_preds            ","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:23:21.651999Z","iopub.execute_input":"2024-04-22T18:23:21.652282Z","iopub.status.idle":"2024-04-22T18:23:21.889137Z","shell.execute_reply.started":"2024-04-22T18:23:21.652246Z","shell.execute_reply":"2024-04-22T18:23:21.888112Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds = test_model(test_dl, model)\ntest_preds.shape","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:23:21.890441Z","iopub.execute_input":"2024-04-22T18:23:21.890743Z","iopub.status.idle":"2024-04-22T18:24:01.691382Z","shell.execute_reply.started":"2024-04-22T18:23:21.890719Z","shell.execute_reply":"2024-04-22T18:24:01.690189Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:24:01.693048Z","iopub.execute_input":"2024-04-22T18:24:01.693392Z","iopub.status.idle":"2024-04-22T18:24:01.726554Z","shell.execute_reply.started":"2024-04-22T18:24:01.69336Z","shell.execute_reply":"2024-04-22T18:24:01.724976Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Set columns to breed names\nnum_classes = []\nfor num_class in test_preds.columns:\n    num_classes.append(num_class)\n\nnum_classes = np.array(num_classes)\nnum_classes = le.inverse_transform(num_classes)\ntest_preds.columns = list(num_classes)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:24:01.727929Z","iopub.execute_input":"2024-04-22T18:24:01.728268Z","iopub.status.idle":"2024-04-22T18:24:01.734978Z","shell.execute_reply.started":"2024-04-22T18:24:01.72824Z","shell.execute_reply":"2024-04-22T18:24:01.7339Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:24:01.736295Z","iopub.execute_input":"2024-04-22T18:24:01.736628Z","iopub.status.idle":"2024-04-22T18:24:01.775464Z","shell.execute_reply.started":"2024-04-22T18:24:01.73659Z","shell.execute_reply":"2024-04-22T18:24:01.774394Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Set id column\ntest_preds = test_preds.reset_index(drop=True)\nids = test_data.loc[:,'id']\ntest_preds = pd.concat([ids, test_preds], axis=1)\ntest_preds.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:24:01.777109Z","iopub.execute_input":"2024-04-22T18:24:01.77749Z","iopub.status.idle":"2024-04-22T18:24:01.816896Z","shell.execute_reply.started":"2024-04-22T18:24:01.77746Z","shell.execute_reply":"2024-04-22T18:24:01.815872Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds.to_csv('submission.csv', index=None)","metadata":{"execution":{"iopub.status.busy":"2024-04-22T18:24:01.820606Z","iopub.execute_input":"2024-04-22T18:24:01.821059Z","iopub.status.idle":"2024-04-22T18:24:03.866943Z","shell.execute_reply.started":"2024-04-22T18:24:01.821018Z","shell.execute_reply":"2024-04-22T18:24:03.866013Z"},"trusted":true},"outputs":[],"execution_count":null}]}