{"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":61938,"databundleVersionId":6698770,"sourceType":"competition"},{"sourceId":7562079,"sourceType":"datasetVersion","datasetId":4403222}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport torch\nimport os\nimport torch.nn.functional as F\nimport torch.nn as nn\nfrom torch.utils.data import DataLoader, Dataset\nimport torchvision.datasets as datasets\nfrom torchvision import models\nimport torchvision.transforms as transforms\nimport torch.optim as optim\nfrom skimage import io\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nimport cv2\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-10T16:20:00.852306Z","iopub.execute_input":"2024-02-10T16:20:00.852742Z","iopub.status.idle":"2024-02-10T16:20:09.884425Z","shell.execute_reply.started":"2024-02-10T16:20:00.852714Z","shell.execute_reply":"2024-02-10T16:20:09.883231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Function: plot_images\n\nThis function is designed to display a grid of images using `matplotlib` and `cv2` (OpenCV).","metadata":{}},{"cell_type":"code","source":"def plot_images(rows, columns, images):\n    \n    fig, x= plt.subplots(rows, columns, constrained_layout=True,figsize=(15,8))\n    plt.setp(x, xticks=[], yticks=[])\n    for i in range (len(x)):\n        for j in range (len(x[0])):\n            index = i*columns+j\n            img = cv2.imread('/kaggle/input/dog-breed-identification-data/train/' + images[index])\n            x[i,j].imshow(cv2.resize(img, (224, 224)))\n            \nnum_columns = 5\ntrain_data = os.listdir('/kaggle/input/dog-breed-identification-data/train')[:100]\nplot_images(num_columns, num_columns, train_data)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:09.886903Z","iopub.execute_input":"2024-02-10T16:20:09.887582Z","iopub.status.idle":"2024-02-10T16:20:12.476529Z","shell.execute_reply.started":"2024-02-10T16:20:09.887534Z","shell.execute_reply":"2024-02-10T16:20:12.475394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## DataFrame: df1\n\nThis DataFrame (`df1`) is created by reading the contents of the 'labels.csv' file.","metadata":{}},{"cell_type":"code","source":"df1=pd.read_csv('/kaggle/input/dog-breed-identification-data/labels.csv')\ndf1.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:12.481854Z","iopub.execute_input":"2024-02-10T16:20:12.482152Z","iopub.status.idle":"2024-02-10T16:20:12.529856Z","shell.execute_reply.started":"2024-02-10T16:20:12.482127Z","shell.execute_reply":"2024-02-10T16:20:12.528806Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## DataFrame: df2\n\nThis DataFrame (`df2`) is created by assigning image paths to the original DataFrame (`df1`). The image paths are constructed by concatenating the '/kaggle/input/dog-breed-identification-data/train/' directory with the 'id' column in the DataFrame and adding the '.jpg' extension.\n","metadata":{}},{"cell_type":"code","source":"img_file='/kaggle/input/dog-breed-identification-data/train/'\ndf2 =df1.assign(img_path=lambda x: img_file + x['id'] +'.jpg')\ndf2.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:12.531028Z","iopub.execute_input":"2024-02-10T16:20:12.531349Z","iopub.status.idle":"2024-02-10T16:20:12.550385Z","shell.execute_reply.started":"2024-02-10T16:20:12.531325Z","shell.execute_reply":"2024-02-10T16:20:12.549403Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Count of Dog Breeds in df2","metadata":{}},{"cell_type":"code","source":"df2.breed.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:12.551785Z","iopub.execute_input":"2024-02-10T16:20:12.552208Z","iopub.status.idle":"2024-02-10T16:20:12.575454Z","shell.execute_reply.started":"2024-02-10T16:20:12.552172Z","shell.execute_reply":"2024-02-10T16:20:12.574452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Visualizing Dog Breed Distribution\n\nThe following code snippet visualizes the distribution of dog breeds in the `df2` DataFrame. Each bar represents a unique dog breed, and the length of the bar corresponds to the number of images associated with that breed.\n","metadata":{}},{"cell_type":"code","source":"class_counts = pd.Series(df2['breed']).value_counts(ascending=True)\n\ncolors = sns.color_palette('viridis', len(class_counts))\n\nax = class_counts.plot(kind='barh', fontsize=40, title=\"Class Distribution\", figsize=(50, 100), color=colors)\nax.set(xlabel=\"Images per class\", ylabel=\"Classes\")\nax.xaxis.label.set_size(40)\nax.yaxis.label.set_size(40)\nax.title.set_size(60)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:12.576915Z","iopub.execute_input":"2024-02-10T16:20:12.577479Z","iopub.status.idle":"2024-02-10T16:20:16.871839Z","shell.execute_reply.started":"2024-02-10T16:20:12.577444Z","shell.execute_reply":"2024-02-10T16:20:16.870762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Extracting Top 20 Dog Breeds","metadata":{}},{"cell_type":"code","source":"top_20=list(df2.breed.value_counts()[0:20].index)\ntop_20","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:16.873035Z","iopub.execute_input":"2024-02-10T16:20:16.873340Z","iopub.status.idle":"2024-02-10T16:20:16.882614Z","shell.execute_reply.started":"2024-02-10T16:20:16.873316Z","shell.execute_reply":"2024-02-10T16:20:16.881456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Mapping Dog Breed Labels\n\nThe following code snippet creates a mapping (`map_labels`) of dog breed labels using the columns of the 'sample_submission.csv' file. Each label is assigned a unique index.","metadata":{}},{"cell_type":"code","source":"map_labels = dict()\nfor index, value in enumerate(pd.read_csv('/kaggle/input/dog-breed-identification-data/sample_submission.csv').columns[1:]):\n    map_labels[value] = index\n    \nprint(len(map_labels))\nprint(map_labels)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:33:30.411884Z","iopub.execute_input":"2024-02-10T16:33:30.412572Z","iopub.status.idle":"2024-02-10T16:33:30.708129Z","shell.execute_reply.started":"2024-02-10T16:33:30.412543Z","shell.execute_reply":"2024-02-10T16:33:30.707136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Custom Dataset Class: DogBreedsDataset_train","metadata":{}},{"cell_type":"code","source":"class DogBreedsDataset_train(Dataset):\n    def __init__(self, csv_file, root_dir, transform=None):\n        self.labels = pd.read_csv(csv_file)\n        self.root_dir = root_dir\n        self.transform = transform['train']\n        \n    def __len__(self):\n        return self.labels.shape[0]\n    \n    def __getitem__(self, index):\n        img_path = os.path.join(self.root_dir, self.labels.iloc[index, 0])+'.jpg'\n        image = io.imread(img_path)\n        y_label = torch.tensor(int(map_labels[self.labels.iloc[index, 1]]))\n\n        if self.transform:\n            image = self.transform(image)\n\n        return (image, y_label)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:17.439146Z","iopub.execute_input":"2024-02-10T16:20:17.439432Z","iopub.status.idle":"2024-02-10T16:20:17.446635Z","shell.execute_reply.started":"2024-02-10T16:20:17.439408Z","shell.execute_reply":"2024-02-10T16:20:17.445765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Custom Dataset Class: DogBreedsDataset_test","metadata":{}},{"cell_type":"code","source":"class DogBreedsDataset_test(Dataset):\n    def __init__(self, csv_file, root_dir, transform=None):\n        self.name_images = pd.read_csv(csv_file)['id'].values\n        self.root_dir = root_dir\n        self.transform = transform['test']\n    \n        \n    def __len__(self):\n        return len(self.name_images)\n    \n    def __getitem__(self, index):\n        img_path = os.path.join(self.root_dir, self.name_images[index])+'.jpg'\n        image = io.imread(img_path)\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:17.447662Z","iopub.execute_input":"2024-02-10T16:20:17.447953Z","iopub.status.idle":"2024-02-10T16:20:17.463953Z","shell.execute_reply.started":"2024-02-10T16:20:17.447919Z","shell.execute_reply":"2024-02-10T16:20:17.463103Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Hyperparameters","metadata":{}},{"cell_type":"code","source":"num_classes = 120\nlearning_rate = 1e-4\nbatch_size = 512\nnum_epochs = 300","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:17.464913Z","iopub.execute_input":"2024-02-10T16:20:17.465735Z","iopub.status.idle":"2024-02-10T16:20:17.474126Z","shell.execute_reply.started":"2024-02-10T16:20:17.465174Z","shell.execute_reply":"2024-02-10T16:20:17.473241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Data Preprocessing and Dataset Splitting\n\nThe following code performs image preprocessing and splits the dataset into training and validation sets.","metadata":{}},{"cell_type":"code","source":"# images preprocessing\ntransform ={'train': transforms.Compose([\n        transforms.ToPILImage(),\n        transforms.RandomResizedCrop(size=256, scale=(0.95, 1.0)),\n        transforms.RandomRotation(degrees=15),\n        transforms.ColorJitter(),\n        transforms.RandomHorizontalFlip(),\n        transforms.CenterCrop(size=224),  # Image net standards\n        transforms.ToTensor(),\n        transforms.Normalize([0.485, 0.456, 0.406],\n                             [0.229, 0.224, 0.225])]),  # Imagenet standards\n    'test': transforms.Compose([transforms.ToPILImage(),\n                                      transforms.RandomResizedCrop(size=256, scale=(0.95, 1.0)),\n                                      transforms.CenterCrop(size=224),\n                                      transforms.ToTensor(),\n                                     transforms.Normalize([0.485, 0.456, 0.406],\n                                                          [0.229, 0.224, 0.225])])}\n\ndataset = DogBreedsDataset_train('/kaggle/input/dog-breed-identification-data/labels.csv', '/kaggle/input/dog-breed-identification-data/train', transform)\nfirst_item = dataset[0]\nprint(\"Dataset length\")\nprint(len(dataset))\nprint(\"****************\")\nprint(\"First Image Tensor\")\nprint(first_item)\nprint(\"****************\")\ntrain_set_size = int(len(dataset) * 0.7)\nvalid_set_size = len(dataset) - train_set_size\ntrain_set, valid_set = torch.utils.data.random_split(dataset, [train_set_size, valid_set_size])\ntrain_loader = DataLoader(dataset=train_set, batch_size=batch_size, shuffle=True)\nprint(\"Train loader length\")\nprint(len(train_loader))\nprint(\"****************\")\nvalid_loader = DataLoader(dataset=valid_set, batch_size=batch_size, shuffle=True)\nprint(\"Valid loader length\")\nprint(len(valid_loader))\nprint(\"****************\")\n","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:17.475231Z","iopub.execute_input":"2024-02-10T16:20:17.475514Z","iopub.status.idle":"2024-02-10T16:20:17.658925Z","shell.execute_reply.started":"2024-02-10T16:20:17.475490Z","shell.execute_reply":"2024-02-10T16:20:17.657948Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading and Preparing Test Dataset","metadata":{}},{"cell_type":"code","source":"test_data = DogBreedsDataset_test('/kaggle/input/dog-breed-identification-data/sample_submission.csv', '/kaggle/input/dog-breed-identification-data/test', transform=transform)\nprint(len(test_data))\nprint(\"****************\")\ntest_loader = DataLoader(test_data, batch_size=batch_size)\nprint(len(test_loader))\nprint(\"****************\")\n","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:17.660069Z","iopub.execute_input":"2024-02-10T16:20:17.660333Z","iopub.status.idle":"2024-02-10T16:20:17.984544Z","shell.execute_reply.started":"2024-02-10T16:20:17.660308Z","shell.execute_reply":"2024-02-10T16:20:17.983544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"Device\")\nprint(device)\nprint(\"**************\")","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:17.985985Z","iopub.execute_input":"2024-02-10T16:20:17.986396Z","iopub.status.idle":"2024-02-10T16:20:18.014363Z","shell.execute_reply.started":"2024-02-10T16:20:17.986361Z","shell.execute_reply":"2024-02-10T16:20:18.013378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Checkpoint Functions","metadata":{}},{"cell_type":"code","source":"# save checkpoint\ndef save_checkpoint(state, filename=\"my_checkpoint.pth.tar\"):\n    print(\"=> Saving checkpoint\")\n    torch.save(state, filename)\n\n# load checkpint\ndef load_checkpoint(checkpoint, model, optimizer):\n    print(\"=> Loading checkpoint\")\n    model.load_state_dict(checkpoint[\"state_dict\"])\n    optimizer.load_state_dict(checkpoint[\"optimizer\"])","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:18.015531Z","iopub.execute_input":"2024-02-10T16:20:18.015830Z","iopub.status.idle":"2024-02-10T16:20:18.024370Z","shell.execute_reply.started":"2024-02-10T16:20:18.015797Z","shell.execute_reply":"2024-02-10T16:20:18.023453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Modification: ResNet50 for Dog Breed Classification\n\nModify a pre-trained ResNet50 model for a specific dog breed classification task.","metadata":{}},{"cell_type":"code","source":"model = models.resnet50(pretrained=True)\n\nfor param in model.parameters():\n    param.requires_grad = False\n    \n# replace last layer with from 1000 classes to be 120 classes\nmodel.fc = nn.Linear(2048, 120)\nmodel = model.to(device=device)\nmodel","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:18.025832Z","iopub.execute_input":"2024-02-10T16:20:18.026259Z","iopub.status.idle":"2024-02-10T16:20:19.529013Z","shell.execute_reply.started":"2024-02-10T16:20:18.026224Z","shell.execute_reply":"2024-02-10T16:20:19.528093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loss Function, Optimizer, and Checkpoint\n\nThe following code initializes the loss function, optimizer, and sets up a checkpoint for saving and loading the model during training.","metadata":{}},{"cell_type":"code","source":"# loss function\ncriterion = nn.CrossEntropyLoss()\n# optimizer\noptimizer = optim.Adam(model.parameters(), lr=learning_rate)\n# checkpoint to save and load model\ncheckpoint = {\"state_dict\": model.state_dict(), \"optimizer\": optimizer.state_dict()}","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:19.530257Z","iopub.execute_input":"2024-02-10T16:20:19.530528Z","iopub.status.idle":"2024-02-10T16:20:19.539255Z","shell.execute_reply.started":"2024-02-10T16:20:19.530504Z","shell.execute_reply":"2024-02-10T16:20:19.538346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Visualization: Model Evaluation Metrics\n\nVisualize key model evaluation metrics throughout training epochs.\n","metadata":{}},{"cell_type":"code","source":"def plot_results(training_accuracy_list, training_loss_list, validation_accuracy_list, best_loss_list):\n    epochs = len(training_accuracy_list)\n    x = np.arange(1, epochs + 1)\n\n    training_accuracy_list = [item.cpu().numpy() if isinstance(item, torch.Tensor) else item for item in training_accuracy_list]\n    training_loss_list = [item.cpu().numpy() if isinstance(item, torch.Tensor) else item for item in training_loss_list]\n    validation_accuracy_list = [item.cpu().numpy() if isinstance(item, torch.Tensor) else item for item in validation_accuracy_list]\n    best_loss_list = [item.cpu().numpy() if isinstance(item, torch.Tensor) else item for item in best_loss_list]\n\n    plt.figure(figsize=(10, 6))\n    plt.plot(x, training_accuracy_list, label='Training Accuracy', color='blue')\n    plt.plot(x, training_loss_list, label='Training Loss', color='orange')\n    plt.plot(x, validation_accuracy_list, label='Validation Accuracy', color='green')\n    plt.plot(x, best_loss_list, label='Best Loss', color='red')\n\n    plt.title('Model Evaluation Metrics')\n    plt.xlabel('Epochs')\n    plt.ylim(0, 3)\n    plt.legend()\n    plt.grid(True)\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:19.540599Z","iopub.execute_input":"2024-02-10T16:20:19.540885Z","iopub.status.idle":"2024-02-10T16:20:19.551637Z","shell.execute_reply.started":"2024-02-10T16:20:19.540862Z","shell.execute_reply":"2024-02-10T16:20:19.550688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Modified Training Function with Plotting\n","metadata":{}},{"cell_type":"code","source":"def traindata(device, model, epochs, optimizer, loss_function, train_loader, valid_loader):\n    # Early stopping\n    best_loss = 100\n    patience = 5\n    trigger_times = 0\n\n    # Lists to store data for plotting\n    training_accuracy_list = []\n    training_loss_list = []\n    best_loss_list = []\n    validation_accuracy_list = []\n\n    for epoch in range(1, epochs+1):\n        model.train()\n        correct = 0\n        loss_total = 0\n        for data in train_loader:\n            input = data[0].to(device)\n            label = data[1].to(device)\n\n            optimizer.zero_grad()\n\n            output = model(input)\n            _, predicted = output.max(1)\n            loss = loss_function(output, label)\n            loss_total += loss.item()\n            correct+= (predicted == label).sum()\n            loss.backward()\n            optimizer.step()\n\n        training_accuracy = correct/len(train_loader.sampler)\n        training_loss = loss_total/len(train_loader)\n\n        print('epoch number: {}'.format(epoch))\n        print('Training Accuracy: {} Training loss: {}'.format(training_accuracy, training_loss))\n\n        # Early stopping\n        current_loss, validation_accuracy = validation(model, device, valid_loader, loss_function)\n        print('The Current Loss:', current_loss)\n        print('Best Loss:', best_loss)\n\n        # Append values to lists for plotting\n        training_accuracy_list.append(training_accuracy)\n        training_loss_list.append(training_loss)\n        validation_accuracy_list.append(validation_accuracy)\n        best_loss_list.append(best_loss)\n\n        if current_loss > best_loss:\n            trigger_times += 1\n            print('Trigger Times:', trigger_times)\n\n            if trigger_times >= patience:\n                print('Early stopping!\\nStart to test process.')\n                break  # Exit the loop if early stopping is triggered\n\n        else:\n            print('Trigger times: 0')\n            trigger_times = 0\n            save_checkpoint(checkpoint)\n            best_loss = current_loss\n\n    # Plot the results\n    plot_results(training_accuracy_list, training_loss_list, validation_accuracy_list, best_loss_list)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:19.552831Z","iopub.execute_input":"2024-02-10T16:20:19.553154Z","iopub.status.idle":"2024-02-10T16:20:19.566003Z","shell.execute_reply.started":"2024-02-10T16:20:19.553128Z","shell.execute_reply":"2024-02-10T16:20:19.564955Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Validation Function\n\nPerforms model evaluation on the validation dataset.","metadata":{}},{"cell_type":"code","source":"def validation(model, device, valid_loader, loss_function):\n\n    model.eval()\n    loss_total = 0\n    correct = 0\n    # Test validation data\n    with torch.no_grad():\n        for data in valid_loader:\n            input = data[0].to(device)\n            label = data[1].to(device)\n\n            output = model(input)\n            _, predicted = output.max(1)\n            loss = loss_function(output, label)\n            loss_total += loss.item()\n            correct+= (predicted == label).sum()\n        print('Validation Accuracy: {}'.format(correct/len(valid_loader.sampler)))\n        validation_accuracy = correct/len(valid_loader.sampler)\n    return loss_total / len(valid_loader), validation_accuracy","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:19.567267Z","iopub.execute_input":"2024-02-10T16:20:19.567598Z","iopub.status.idle":"2024-02-10T16:20:19.583390Z","shell.execute_reply.started":"2024-02-10T16:20:19.567572Z","shell.execute_reply":"2024-02-10T16:20:19.582378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Test Function\n\nPerforms model inference on the test dataset.","metadata":{}},{"cell_type":"code","source":"def test(device, model, test_loader, loss_function):\n\n    model.eval()\n    predictions = pd.DataFrame()\n    with torch.no_grad():\n        for data in test_loader:\n            input = data.to(device)\n\n            output = model(input)\n            m = nn.Softmax(dim=1)\n            res = m(output)\n            predictions = pd.concat([predictions, pd.DataFrame(torch.Tensor.cpu(res).numpy(), columns = list(map_labels.keys()))], ignore_index=True)\n            \n        return (predictions)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:19.584833Z","iopub.execute_input":"2024-02-10T16:20:19.585321Z","iopub.status.idle":"2024-02-10T16:20:19.596655Z","shell.execute_reply.started":"2024-02-10T16:20:19.585287Z","shell.execute_reply":"2024-02-10T16:20:19.595620Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Training and Evaluation\n\nTrains the model (`model`) using the `traindata` function, which incorporates training and early stopping mechanisms. The trained model is then evaluated on the validation dataset.","metadata":{}},{"cell_type":"code","source":"model = traindata(device, model, num_epochs, optimizer, criterion, train_loader, valid_loader)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:20:19.597920Z","iopub.execute_input":"2024-02-10T16:20:19.598778Z","iopub.status.idle":"2024-02-10T16:29:38.228223Z","shell.execute_reply.started":"2024-02-10T16:20:19.598743Z","shell.execute_reply":"2024-02-10T16:29:38.227355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading Model Checkpoint\n","metadata":{}},{"cell_type":"code","source":"load_checkpoint(torch.load(\"my_checkpoint.pth.tar\"), model, optimizer)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:29:38.229331Z","iopub.execute_input":"2024-02-10T16:29:38.229589Z","iopub.status.idle":"2024-02-10T16:29:38.337499Z","shell.execute_reply.started":"2024-02-10T16:29:38.229566Z","shell.execute_reply":"2024-02-10T16:29:38.336573Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model Inference on Test Data\n\nThe following code performs model inference on the test dataset (`test_loader`) using the trained model (`model`). The predictions are then formatted into a DataFrame (`final_df`) for submission.\n","metadata":{}},{"cell_type":"code","source":"df = test(device, model, test_loader, criterion)\nids = pd.DataFrame(pd.read_csv('/kaggle/input/dog-breed-identification-data/sample_submission.csv')['id'].values, columns=['id'])\nfinal_df = pd.concat([ids, df], ignore_index=True, axis=1)\nfinal_df.columns = pd.read_csv('/kaggle/input/dog-breed-identification-data/sample_submission.csv').columns","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:29:38.338821Z","iopub.execute_input":"2024-02-10T16:29:38.339197Z","iopub.status.idle":"2024-02-10T16:32:12.300143Z","shell.execute_reply.started":"2024-02-10T16:29:38.339163Z","shell.execute_reply":"2024-02-10T16:32:12.299290Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Save Submission\n\nSave the final DataFrame (`final_df`) as a CSV file for submission.","metadata":{}},{"cell_type":"code","source":"final_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-02-10T16:32:12.301367Z","iopub.execute_input":"2024-02-10T16:32:12.301701Z","iopub.status.idle":"2024-02-10T16:32:14.147010Z","shell.execute_reply.started":"2024-02-10T16:32:12.301674Z","shell.execute_reply":"2024-02-10T16:32:14.146231Z"},"trusted":true},"execution_count":null,"outputs":[]}]}