{"cells":[{"cell_type":"code","execution_count":1,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:03:57.784108Z","iopub.status.busy":"2023-11-27T08:03:57.783742Z","iopub.status.idle":"2023-11-27T08:04:02.510978Z","shell.execute_reply":"2023-11-27T08:04:02.509977Z","shell.execute_reply.started":"2023-11-27T08:03:57.784070Z"},"trusted":true},"outputs":[],"source":["import torch\n","import torch.nn as nn\n","import torch.optim as optim\n","from torchvision import datasets, transforms, models\n","from torch.utils.data import DataLoader, Dataset, random_split\n","import pandas as pd\n","from PIL import Image\n","import torch.nn.functional as F\n","from tqdm import tqdm\n","from sklearn.metrics import f1_score,accuracy_score,classification_report\n","import numpy as np\n","import shutil\n","import os"]},{"cell_type":"code","execution_count":2,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:02.513433Z","iopub.status.busy":"2023-11-27T08:04:02.513036Z","iopub.status.idle":"2023-11-27T08:04:02.517597Z","shell.execute_reply":"2023-11-27T08:04:02.516631Z","shell.execute_reply.started":"2023-11-27T08:04:02.513406Z"},"trusted":true},"outputs":[],"source":["TRAIN_FOLDER = \"icon_data/train/\"\n","# TEST_FOLDER = \"/kaggle/input/sadat-icons/icon_data/test/\""]},{"cell_type":"code","execution_count":3,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:02.520149Z","iopub.status.busy":"2023-11-27T08:04:02.519847Z","iopub.status.idle":"2023-11-27T08:04:03.479542Z","shell.execute_reply":"2023-11-27T08:04:03.478422Z","shell.execute_reply.started":"2023-11-27T08:04:02.520125Z"},"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["A subdirectory or file images already exists.\n"]}],"source":["!mkdir images"]},{"cell_type":"code","execution_count":4,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:03.481576Z","iopub.status.busy":"2023-11-27T08:04:03.481188Z","iopub.status.idle":"2023-11-27T08:04:03.495143Z","shell.execute_reply":"2023-11-27T08:04:03.494255Z","shell.execute_reply.started":"2023-11-27T08:04:03.481534Z"},"trusted":true},"outputs":[],"source":["class_2_id = {}\n","id_2_class = {}\n","i=0\n","for folder in os.listdir(TRAIN_FOLDER):\n"," class_2_id[folder]=i\n"," id_2_class[i]=folder\n"," i+=1"]},{"cell_type":"code","execution_count":5,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:03.498319Z","iopub.status.busy":"2023-11-27T08:04:03.498024Z","iopub.status.idle":"2023-11-27T08:04:03.506912Z","shell.execute_reply":"2023-11-27T08:04:03.506063Z","shell.execute_reply.started":"2023-11-27T08:04:03.498293Z"},"trusted":true},"outputs":[{"data":{"text/plain":["{0: 'back',\n"," 1: 'Briefcase',\n"," 2: 'Call',\n"," 3: 'Camera',\n"," 4: 'Circle',\n"," 5: 'Cloud',\n"," 6: 'delete',\n"," 7: 'Down',\n"," 8: 'edit',\n"," 9: 'Export',\n"," 10: 'Face',\n"," 11: 'Folder',\n"," 12: 'Globe',\n"," 13: 'Google',\n"," 14: 'Heart',\n"," 15: 'Home',\n"," 16: 'Image',\n"," 17: 'Import',\n"," 18: 'Info',\n"," 19: 'Link',\n"," 20: 'Location',\n"," 21: 'Mail',\n"," 22: 'menu',\n"," 23: 'Merge',\n"," 24: 'Message',\n"," 25: 'Microphone',\n"," 26: 'more',\n"," 27: 'Music',\n"," 28: 'Mute',\n"," 29: 'Person',\n"," 30: 'Phone',\n"," 31: 'plus',\n"," 32: 'QRCODE',\n"," 33: 'Refresh',\n"," 34: 'search',\n"," 35: 'settings',\n"," 36: 'share',\n"," 37: 'Star',\n"," 38: 'Tick',\n"," 39: 'Up',\n"," 40: 'vidCam',\n"," 41: 'Video',\n"," 42: 'Volume'}"]},"execution_count":5,"metadata":{},"output_type":"execute_result"}],"source":["id_2_class"]},{"cell_type":"code","execution_count":6,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:03.508112Z","iopub.status.busy":"2023-11-27T08:04:03.507853Z","iopub.status.idle":"2023-11-27T08:04:03.519107Z","shell.execute_reply":"2023-11-27T08:04:03.518124Z","shell.execute_reply.started":"2023-11-27T08:04:03.508089Z"},"trusted":true},"outputs":[{"data":{"text/plain":["{0: 'back',\n"," 1: 'Briefcase',\n"," 2: 'Call',\n"," 3: 'Camera',\n"," 4: 'Circle',\n"," 5: 'Cloud',\n"," 6: 'delete',\n"," 7: 'Down',\n"," 8: 'edit',\n"," 9: 'Export',\n"," 10: 'Face',\n"," 11: 'Folder',\n"," 12: 'Globe',\n"," 13: 'Google',\n"," 14: 'Heart',\n"," 15: 'Home',\n"," 16: 'Image',\n"," 17: 'Import',\n"," 18: 'Info',\n"," 19: 'Link',\n"," 20: 'Location',\n"," 21: 'Mail',\n"," 22: 'menu',\n"," 23: 'Merge',\n"," 24: 'Message',\n"," 25: 'Microphone',\n"," 26: 'more',\n"," 27: 'Music',\n"," 28: 'Mute',\n"," 29: 'Person',\n"," 30: 'Phone',\n"," 31: 'plus',\n"," 32: 'QRCODE',\n"," 33: 'Refresh',\n"," 34: 'search',\n"," 35: 'settings',\n"," 36: 'share',\n"," 37: 'Star',\n"," 38: 'Tick',\n"," 39: 'Up',\n"," 40: 'vidCam',\n"," 41: 'Video',\n"," 42: 'Volume'}"]},"execution_count":6,"metadata":{},"output_type":"execute_result"}],"source":["id_2_class"]},{"cell_type":"code","execution_count":25,"metadata":{},"outputs":[],"source":["#save to json\n","\n","import json\n","with open('id_2_class.json', 'w') as fp:\n"," json.dump(id_2_class, fp)"]},{"cell_type":"code","execution_count":7,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:03.521040Z","iopub.status.busy":"2023-11-27T08:04:03.520311Z","iopub.status.idle":"2023-11-27T08:04:37.185102Z","shell.execute_reply":"2023-11-27T08:04:37.184220Z","shell.execute_reply.started":"2023-11-27T08:04:03.521004Z"},"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["c:\\Users\\User\\miniconda3\\envs\\textgen\\lib\\site-packages\\PIL\\Image.py:970: UserWarning: Palette images with Transparency expressed in bytes should be converted to RGBA images\n"," warnings.warn(\n"]}],"source":["for_csv = {\n"," \"id\":[],\n"," \"label\":[],\n"," \"text_label\":[]\n","}\n","IMG_SIZE = 224\n","i = 0\n","\n","FOLDER = TRAIN_FOLDER\n","for folder in os.listdir(FOLDER):\n"," folder_path = os.path.join(FOLDER, folder)\n"," for image in os.listdir(folder_path):\n"," image_path = os.path.join(folder_path,image)\n"," try:\n"," img = Image.open(image_path).resize((IMG_SIZE,IMG_SIZE)).convert(\"L\")\n"," img.save(\"images/\"+str(i)+\".jpg\")\n"," for_csv[\"id\"].append(i)\n"," for_csv[\"label\"].append(class_2_id[folder])\n"," for_csv[\"text_label\"].append(folder)\n"," i+=1\n"," except:\n"," continue\n","\n","# FOLDER = TEST_FOLDER\n","# for folder in os.listdir(FOLDER):\n","# folder_path = os.path.join(FOLDER, folder)\n","# for image in os.listdir(folder_path):\n","# image_path = os.path.join(folder_path,image)\n","# try:\n","# img = Image.open(image_path).resize((IMG_SIZE,IMG_SIZE)).convert(\"RGB\")\n","# img.save(\"images/\"+str(i)+\".jpg\")\n","# for_csv[\"id\"].append(i)\n","# for_csv[\"label\"].append(class_2_id[folder])\n","# for_csv[\"text_label\"].append(folder)\n","# i+=1\n","# except:\n","# continue"]},{"cell_type":"code","execution_count":8,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.187018Z","iopub.status.busy":"2023-11-27T08:04:37.186379Z","iopub.status.idle":"2023-11-27T08:04:37.203381Z","shell.execute_reply":"2023-11-27T08:04:37.202604Z","shell.execute_reply.started":"2023-11-27T08:04:37.186980Z"},"trusted":true},"outputs":[],"source":["\n","# Load the CSV file\n","labels_df = pd.DataFrame(for_csv, index=None)"]},{"cell_type":"code","execution_count":9,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.204627Z","iopub.status.busy":"2023-11-27T08:04:37.204384Z","iopub.status.idle":"2023-11-27T08:04:37.223011Z","shell.execute_reply":"2023-11-27T08:04:37.222243Z","shell.execute_reply.started":"2023-11-27T08:04:37.204605Z"},"trusted":true},"outputs":[],"source":["labels_df = labels_df.sample(frac=1).reset_index(drop=True)"]},{"cell_type":"code","execution_count":10,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.224272Z","iopub.status.busy":"2023-11-27T08:04:37.223964Z","iopub.status.idle":"2023-11-27T08:04:37.244182Z","shell.execute_reply":"2023-11-27T08:04:37.243499Z","shell.execute_reply.started":"2023-11-27T08:04:37.224243Z"},"trusted":true},"outputs":[],"source":["import pandas as pd\n","from sklearn.model_selection import train_test_split\n","\n","def split_dataframe_by_label(df, frac):\n","\n"," # Ensure that frac is between 0 and 1\n"," if not (0 <= frac <= 1):\n"," raise ValueError(\"The fraction must be between 0 and 1.\")\n","\n"," # Initialize empty dataframes for the split\n"," df_first = pd.DataFrame(columns=df.columns)\n"," df_second = pd.DataFrame(columns=df.columns)\n","\n"," # Iterate over each label and split the data\n"," for label in df['label'].unique():\n"," label_df = df[df['label'] == label]\n"," df1, df2 = train_test_split(label_df, train_size=frac, random_state=42)\n"," df_first = pd.concat([df_first, df1])\n"," df_second = pd.concat([df_second, df2])\n","\n"," return df_first, df_second\n","\n","# Example usage\n","# df_first, df_second = split_dataframe_by_label(your_dataframe, 0.7)\n"]},{"cell_type":"code","execution_count":11,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.245394Z","iopub.status.busy":"2023-11-27T08:04:37.245130Z","iopub.status.idle":"2023-11-27T08:04:37.343110Z","shell.execute_reply":"2023-11-27T08:04:37.342176Z","shell.execute_reply.started":"2023-11-27T08:04:37.245370Z"},"trusted":true},"outputs":[],"source":["train_df, test_df = split_dataframe_by_label(labels_df, 0.8)"]},{"cell_type":"code","execution_count":12,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.344433Z","iopub.status.busy":"2023-11-27T08:04:37.344161Z","iopub.status.idle":"2023-11-27T08:04:37.350672Z","shell.execute_reply":"2023-11-27T08:04:37.349742Z","shell.execute_reply.started":"2023-11-27T08:04:37.344408Z"},"trusted":true},"outputs":[],"source":["def undersample_dataframe(df, max_samples):\n"," # Check if max_samples is a positive integer\n"," if not isinstance(max_samples, int) or max_samples <= 0:\n"," raise ValueError(\"max_samples must be a positive integer.\")\n","\n"," # Group by label and undersample each group\n"," grouped = df.groupby('label')\n"," undersampled_df = pd.DataFrame(grouped.apply(lambda x: x.sample(min(len(x), max_samples))))\n","\n"," # Reset index after groupby and sampling\n"," undersampled_df.reset_index(drop=True, inplace=True)\n","\n"," return undersampled_df\n"]},{"cell_type":"code","execution_count":13,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.352120Z","iopub.status.busy":"2023-11-27T08:04:37.351814Z","iopub.status.idle":"2023-11-27T08:04:37.360944Z","shell.execute_reply":"2023-11-27T08:04:37.360110Z","shell.execute_reply.started":"2023-11-27T08:04:37.352096Z"},"trusted":true},"outputs":[],"source":["def upsample_dataframe(df, min_samples):\n","\n"," # Check if min_samples is a positive integer\n"," if not isinstance(min_samples, int) or min_samples <= 0:\n"," raise ValueError(\"min_samples must be a positive integer.\")\n","\n"," # Group by label and upsample each group\n"," grouped = df.groupby('label')\n"," upsampled_df = pd.DataFrame(grouped.apply(lambda x: x.sample(min_samples, replace=True) if len(x) < min_samples else x))\n","\n"," # Reset index after groupby and sampling\n"," upsampled_df.reset_index(drop=True, inplace=True)\n","\n"," return upsampled_df\n","\n"]},{"cell_type":"code","execution_count":14,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.364825Z","iopub.status.busy":"2023-11-27T08:04:37.364488Z","iopub.status.idle":"2023-11-27T08:04:37.390356Z","shell.execute_reply":"2023-11-27T08:04:37.389532Z","shell.execute_reply.started":"2023-11-27T08:04:37.364795Z"},"trusted":true},"outputs":[],"source":["train_df = upsample_dataframe(train_df,100)\n","# test_df = undersample_dataframe(test_df,100)\n","# train_df = undersample_dataframe(train_df,150)"]},{"cell_type":"code","execution_count":15,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.391599Z","iopub.status.busy":"2023-11-27T08:04:37.391334Z","iopub.status.idle":"2023-11-27T08:04:37.837887Z","shell.execute_reply":"2023-11-27T08:04:37.836930Z","shell.execute_reply.started":"2023-11-27T08:04:37.391575Z"},"trusted":true},"outputs":[{"name":"stdout","output_type":"stream","text":["0 127 32\n","1 174 44\n","2 236 60\n","3 100 22\n","4 120 31\n","5 198 50\n","6 130 33\n","7 122 31\n","8 103 26\n","9 182 46\n","10 100 22\n","11 198 50\n","12 141 36\n","13 198 50\n","14 198 50\n","15 198 50\n","16 160 41\n","17 157 40\n","18 100 22\n","19 173 44\n","20 113 29\n","21 152 39\n","22 109 28\n","23 197 50\n","24 100 17\n","25 180 45\n","26 101 26\n","27 116 29\n","28 199 50\n","29 151 38\n","30 100 25\n","31 100 24\n","32 198 50\n","33 199 50\n","34 100 25\n","35 100 23\n","36 100 17\n","37 197 50\n","38 205 52\n","39 204 51\n","40 100 14\n","41 104 27\n","42 192 48\n"]}],"source":["count_dict = {}\n","for i, row in train_df.iterrows():\n"," l = row[\"label\"]\n"," if l in count_dict:\n"," count_dict[l]+=1\n"," else:\n"," count_dict[l]=1\n","\n","count_dict2 = {}\n","\n","for i, row in test_df.iterrows():\n"," l = row[\"label\"]\n"," if l in count_dict2:\n"," count_dict2[l]+=1\n"," else:\n"," count_dict2[l]=1\n","\n","for i in range(len(class_2_id)):\n"," print(i, count_dict[i], count_dict2[i])"]},{"cell_type":"code","execution_count":16,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:37.839384Z","iopub.status.busy":"2023-11-27T08:04:37.839091Z","iopub.status.idle":"2023-11-27T08:04:37.843670Z","shell.execute_reply":"2023-11-27T08:04:37.842728Z","shell.execute_reply.started":"2023-11-27T08:04:37.839357Z"},"trusted":true},"outputs":[],"source":["FOLDER = \"images/\""]},{"cell_type":"code","execution_count":17,"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.execute_input":"2023-11-27T08:04:37.845227Z","iopub.status.busy":"2023-11-27T08:04:37.844946Z","iopub.status.idle":"2023-11-27T08:04:42.565747Z","shell.execute_reply":"2023-11-27T08:04:42.564920Z","shell.execute_reply.started":"2023-11-27T08:04:37.845187Z"},"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["c:\\Users\\User\\miniconda3\\envs\\textgen\\lib\\site-packages\\torch\\functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ..\\aten\\src\\ATen\\native\\TensorShape.cpp:3484.)\n"," return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]\n"]}],"source":["# Define the transformation\n","test_transform = transforms.Compose([\n","# transforms.Resize((224, 224)),\n"," transforms.ToTensor(),\n"," transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])\n","])\n","\n","train_transform = transforms.Compose([\n","# transforms.Resize((224, 224)),\n"," transforms.RandomApply([transforms.ColorJitter(0.3, 0.3, 0.0, 0.0)], p=0.5), #brightness, contrast, saturation, hue\n"," transforms.ToTensor(),\n"," transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])\n","])\n","\n","\n","# Define a custom dataset\n","class IconDataset(Dataset):\n"," def __init__(self, labels_frame, root_dir, transform=None):\n"," self.labels_frame = labels_frame\n"," self.root_dir = root_dir\n"," self.transform = transform\n","\n"," def __len__(self):\n"," return len(self.labels_frame)\n","\n"," def __getitem__(self, idx):\n"," img_name = f\"{self.root_dir}/{self.labels_frame.iloc[idx, 0]}.jpg\"\n"," image = Image.open(img_name).convert(\"RGB\")\n"," label = self.labels_frame.iloc[idx, 1]\n","\n"," if self.transform:\n"," image = self.transform(image)\n","\n"," return image, label\n","\n","\n","# Create dataset\n","train_dataset = IconDataset(labels_frame=train_df, root_dir=FOLDER, transform=train_transform)\n","test_dataset = IconDataset(labels_frame=test_df, root_dir=FOLDER, transform=test_transform)\n","\n","train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n","test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)\n","\n","# CNN Model\n","class SimpleCNN(nn.Module):\n"," def __init__(self):\n"," super(SimpleCNN, self).__init__()\n"," self.conv1 = nn.Conv2d(3, 16, 3, 1, 1)\n"," self.bn1 = nn.BatchNorm2d(16)\n"," self.conv2 = nn.Conv2d(16, 32, 3, 1, 1)\n"," self.bn2 = nn.BatchNorm2d(32)\n"," self.fc1 = nn.Linear(32 * 224 * 224, 37) # Assuming images are 224x224\n","\n"," def forward(self, x):\n"," x = F.relu(self.bn1(self.conv1(x)))\n"," x = F.relu(self.bn2(self.conv2(x)))\n"," x = torch.flatten(x, 1)\n"," x = F.softmax(self.fc1(x),dim=0)\n"," return x\n","\n","class MaxViT(nn.Module):\n"," def __init__(self):\n"," super(MaxViT, self).__init__()\n"," model = models.maxvit_t(weights=\"DEFAULT\")\n"," num_ftrs = model.classifier[5].in_features\n"," model.classifier[5] = nn.Linear(num_ftrs, len(class_2_id))\n"," self.model = model\n"," def forward(self, x):\n"," return self.model(x)\n","\n","# Instantiate the model\n","model = MaxViT().to(\"cuda\")\n","\n","# Loss function and optimizer\n","criterion = nn.CrossEntropyLoss()\n","optimizer = optim.AdamW(model.parameters(), lr=0.001)\n","scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda epoch: 1 - epoch / 100)\n"]},{"cell_type":"code","execution_count":18,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T08:04:42.567156Z","iopub.status.busy":"2023-11-27T08:04:42.566879Z","iopub.status.idle":"2023-11-27T08:36:43.560704Z","shell.execute_reply":"2023-11-27T08:36:43.559618Z","shell.execute_reply.started":"2023-11-27T08:04:42.567132Z"},"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:48<00:00, 4.17it/s]\n","100%|██████████| 50/50 [00:07<00:00, 6.99it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 1/20, Loss: 0.6631521582603455, Accuracy: 80.97038437303088% F1: 0.8143231843539931\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.93 0.88 0.90 32\n"," 1 0.95 0.93 0.94 44\n"," 2 0.98 0.90 0.94 60\n"," 3 0.81 1.00 0.90 22\n"," 4 0.73 0.71 0.72 31\n"," 5 0.64 0.92 0.75 50\n"," 6 0.89 1.00 0.94 33\n"," 7 0.78 0.81 0.79 31\n"," 8 0.93 1.00 0.96 26\n"," 9 0.76 0.76 0.76 46\n"," 10 0.88 0.68 0.77 22\n"," 11 0.78 0.86 0.82 50\n"," 12 0.85 0.94 0.89 36\n"," 13 1.00 0.50 0.67 50\n"," 14 1.00 0.50 0.67 50\n"," 15 0.75 0.92 0.83 50\n"," 16 0.80 0.90 0.85 41\n"," 17 0.66 0.78 0.71 40\n"," 18 0.90 0.82 0.86 22\n"," 19 0.82 0.64 0.72 44\n"," 20 0.88 1.00 0.94 29\n"," 21 0.84 0.92 0.88 39\n"," 22 0.83 0.89 0.86 28\n"," 23 0.83 0.40 0.54 50\n"," 24 0.81 0.76 0.79 17\n"," 25 0.84 0.84 0.84 45\n"," 26 0.95 0.73 0.83 26\n"," 27 0.92 0.76 0.83 29\n"," 28 0.95 0.74 0.83 50\n"," 29 0.56 0.97 0.71 38\n"," 30 0.89 0.64 0.74 25\n"," 31 0.82 0.96 0.88 24\n"," 32 0.75 0.94 0.83 50\n"," 33 0.69 0.74 0.71 50\n"," 34 0.96 0.96 0.96 25\n"," 35 0.86 0.83 0.84 23\n"," 36 0.94 0.88 0.91 17\n"," 37 0.95 0.84 0.89 50\n"," 38 0.84 0.81 0.82 52\n"," 39 0.63 0.63 0.63 51\n"," 40 0.64 1.00 0.78 14\n"," 41 0.62 0.74 0.68 27\n"," 42 0.85 0.92 0.88 48\n","\n"," accuracy 0.81 1587\n"," macro avg 0.83 0.82 0.81 1587\n","weighted avg 0.83 0.81 0.81 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.34it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.72it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 2/20, Loss: 0.5732803344726562, Accuracy: 84.7511027095148% F1: 0.8471072856598753\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.79 0.97 0.87 32\n"," 1 1.00 0.86 0.93 44\n"," 2 0.97 0.97 0.97 60\n"," 3 0.91 0.91 0.91 22\n"," 4 0.82 0.74 0.78 31\n"," 5 0.84 0.86 0.85 50\n"," 6 0.92 1.00 0.96 33\n"," 7 0.54 0.90 0.67 31\n"," 8 0.84 1.00 0.91 26\n"," 9 0.71 0.80 0.76 46\n"," 10 0.82 0.64 0.72 22\n"," 11 0.90 0.94 0.92 50\n"," 12 0.78 0.97 0.86 36\n"," 13 0.83 0.70 0.76 50\n"," 14 0.88 0.72 0.79 50\n"," 15 0.83 0.86 0.84 50\n"," 16 0.90 0.93 0.92 41\n"," 17 0.80 0.40 0.53 40\n"," 18 0.89 0.77 0.83 22\n"," 19 0.81 0.77 0.79 44\n"," 20 0.90 0.97 0.93 29\n"," 21 0.88 0.97 0.93 39\n"," 22 0.83 0.89 0.86 28\n"," 23 0.62 0.70 0.66 50\n"," 24 1.00 0.71 0.83 17\n"," 25 0.89 0.87 0.88 45\n"," 26 0.96 0.88 0.92 26\n"," 27 0.71 0.76 0.73 29\n"," 28 0.95 0.82 0.88 50\n"," 29 0.83 0.92 0.88 38\n"," 30 0.94 0.68 0.79 25\n"," 31 0.88 0.96 0.92 24\n"," 32 0.82 0.90 0.86 50\n"," 33 0.85 0.80 0.82 50\n"," 34 1.00 1.00 1.00 25\n"," 35 0.95 0.83 0.88 23\n"," 36 0.84 0.94 0.89 17\n"," 37 0.88 0.92 0.90 50\n"," 38 1.00 0.92 0.96 52\n"," 39 0.93 0.73 0.81 51\n"," 40 0.74 1.00 0.85 14\n"," 41 0.95 0.74 0.83 27\n"," 42 0.75 0.94 0.83 48\n","\n"," accuracy 0.85 1587\n"," macro avg 0.86 0.85 0.85 1587\n","weighted avg 0.86 0.85 0.85 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.37it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.99it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 3/20, Loss: 0.7223578095436096, Accuracy: 85.82230623818525% F1: 0.8563987625960884\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.84 0.97 0.90 32\n"," 1 1.00 0.91 0.95 44\n"," 2 0.97 0.97 0.97 60\n"," 3 0.95 0.91 0.93 22\n"," 4 0.79 0.74 0.77 31\n"," 5 0.65 0.94 0.77 50\n"," 6 0.97 1.00 0.99 33\n"," 7 0.86 0.77 0.81 31\n"," 8 1.00 0.92 0.96 26\n"," 9 0.81 0.76 0.79 46\n"," 10 0.67 0.82 0.73 22\n"," 11 0.88 0.92 0.90 50\n"," 12 0.92 0.97 0.95 36\n"," 13 0.90 0.86 0.88 50\n"," 14 0.92 0.68 0.78 50\n"," 15 0.88 0.84 0.86 50\n"," 16 0.95 0.90 0.92 41\n"," 17 0.73 0.80 0.76 40\n"," 18 0.85 0.77 0.81 22\n"," 19 0.94 0.66 0.77 44\n"," 20 0.88 1.00 0.94 29\n"," 21 0.91 1.00 0.95 39\n"," 22 0.81 0.89 0.85 28\n"," 23 0.74 0.68 0.71 50\n"," 24 0.81 0.76 0.79 17\n"," 25 0.92 0.80 0.86 45\n"," 26 0.92 0.85 0.88 26\n"," 27 0.86 0.62 0.72 29\n"," 28 0.89 0.94 0.91 50\n"," 29 0.97 0.84 0.90 38\n"," 30 0.95 0.72 0.82 25\n"," 31 0.92 0.96 0.94 24\n"," 32 0.82 0.98 0.89 50\n"," 33 0.80 0.80 0.80 50\n"," 34 0.73 0.96 0.83 25\n"," 35 0.71 0.87 0.78 23\n"," 36 0.84 0.94 0.89 17\n"," 37 0.88 0.92 0.90 50\n"," 38 0.92 0.88 0.90 52\n"," 39 0.84 0.73 0.78 51\n"," 40 0.82 1.00 0.90 14\n"," 41 0.84 0.78 0.81 27\n"," 42 0.83 0.94 0.88 48\n","\n"," accuracy 0.86 1587\n"," macro avg 0.86 0.86 0.86 1587\n","weighted avg 0.87 0.86 0.86 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.38it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.83it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 4/20, Loss: 0.5389899015426636, Accuracy: 83.30182734719597% F1: 0.8397030664461608\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.37it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.84it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 5/20, Loss: 0.26058411598205566, Accuracy: 86.7044738500315% F1: 0.8652079255655145\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.94 0.97 0.95 32\n"," 1 0.93 0.95 0.94 44\n"," 2 0.98 0.95 0.97 60\n"," 3 0.95 0.91 0.93 22\n"," 4 0.69 0.77 0.73 31\n"," 5 0.83 0.90 0.87 50\n"," 6 1.00 0.94 0.97 33\n"," 7 0.69 0.94 0.79 31\n"," 8 0.96 0.96 0.96 26\n"," 9 0.65 0.85 0.74 46\n"," 10 0.94 0.77 0.85 22\n"," 11 0.98 0.84 0.90 50\n"," 12 0.94 0.92 0.93 36\n"," 13 0.91 0.84 0.87 50\n"," 14 0.92 0.66 0.77 50\n"," 15 0.91 0.84 0.87 50\n"," 16 0.93 0.90 0.91 41\n"," 17 0.88 0.70 0.78 40\n"," 18 0.68 0.77 0.72 22\n"," 19 0.89 0.77 0.83 44\n"," 20 0.94 1.00 0.97 29\n"," 21 0.93 0.95 0.94 39\n"," 22 0.83 0.89 0.86 28\n"," 23 0.71 0.74 0.73 50\n"," 24 0.68 0.76 0.72 17\n"," 25 0.86 0.98 0.92 45\n"," 26 0.81 0.81 0.81 26\n"," 27 0.69 0.83 0.75 29\n"," 28 0.96 0.88 0.92 50\n"," 29 0.94 0.84 0.89 38\n"," 30 1.00 0.68 0.81 25\n"," 31 0.96 0.96 0.96 24\n"," 32 0.87 0.92 0.89 50\n"," 33 0.86 0.84 0.85 50\n"," 34 1.00 1.00 1.00 25\n"," 35 0.95 0.87 0.91 23\n"," 36 0.80 0.94 0.86 17\n"," 37 0.96 0.90 0.93 50\n"," 38 0.91 0.92 0.91 52\n"," 39 0.83 0.75 0.78 51\n"," 40 0.67 1.00 0.80 14\n"," 41 0.82 0.85 0.84 27\n"," 42 0.82 0.94 0.87 48\n","\n"," accuracy 0.87 1587\n"," macro avg 0.87 0.87 0.87 1587\n","weighted avg 0.88 0.87 0.87 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.37it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.78it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 6/20, Loss: 0.11516380310058594, Accuracy: 86.32640201638311% F1: 0.8651042180451826\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.37it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.75it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 7/20, Loss: 0.2884931266307831, Accuracy: 84.05797101449275% F1: 0.8479193552665635\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.33it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.63it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 8/20, Loss: 0.4003789722919464, Accuracy: 85.1291745431632% F1: 0.8538440496150018\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.38it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.92it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 9/20, Loss: 0.17860029637813568, Accuracy: 87.77567737870196% F1: 0.8782015659184909\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.90 0.88 0.89 32\n"," 1 1.00 0.93 0.96 44\n"," 2 0.95 0.97 0.96 60\n"," 3 0.84 0.95 0.89 22\n"," 4 0.79 0.74 0.77 31\n"," 5 0.77 0.92 0.84 50\n"," 6 0.97 1.00 0.99 33\n"," 7 0.83 0.81 0.82 31\n"," 8 1.00 0.96 0.98 26\n"," 9 0.85 0.87 0.86 46\n"," 10 0.95 0.82 0.88 22\n"," 11 0.94 0.88 0.91 50\n"," 12 0.90 1.00 0.95 36\n"," 13 1.00 0.66 0.80 50\n"," 14 0.80 0.82 0.81 50\n"," 15 0.75 0.84 0.79 50\n"," 16 0.81 0.93 0.86 41\n"," 17 0.82 0.82 0.82 40\n"," 18 0.86 0.82 0.84 22\n"," 19 0.80 0.80 0.80 44\n"," 20 0.90 0.97 0.93 29\n"," 21 0.97 0.97 0.97 39\n"," 22 0.77 0.96 0.86 28\n"," 23 0.93 0.74 0.82 50\n"," 24 0.92 0.65 0.76 17\n"," 25 0.91 0.93 0.92 45\n"," 26 0.92 0.88 0.90 26\n"," 27 0.95 0.72 0.82 29\n"," 28 0.92 0.90 0.91 50\n"," 29 0.92 0.92 0.92 38\n"," 30 0.76 0.88 0.81 25\n"," 31 0.96 0.96 0.96 24\n"," 32 0.81 0.96 0.88 50\n"," 33 0.90 0.74 0.81 50\n"," 34 0.96 1.00 0.98 25\n"," 35 0.88 0.91 0.89 23\n"," 36 1.00 0.94 0.97 17\n"," 37 0.94 0.90 0.92 50\n"," 38 0.87 0.92 0.90 52\n"," 39 0.84 0.84 0.84 51\n"," 40 0.81 0.93 0.87 14\n"," 41 0.81 0.78 0.79 27\n"," 42 0.85 0.96 0.90 48\n","\n"," accuracy 0.88 1587\n"," macro avg 0.88 0.88 0.88 1587\n","weighted avg 0.88 0.88 0.88 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.40it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.80it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 10/20, Loss: 0.2623906135559082, Accuracy: 85.94833018273472% F1: 0.8568683109835779\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.39it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.82it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 11/20, Loss: 0.03642905130982399, Accuracy: 87.46061751732829% F1: 0.8752476652110971\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.38it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.74it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 12/20, Loss: 0.04971063882112503, Accuracy: 88.84688090737241% F1: 0.8874316680196108\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.91 0.97 0.94 32\n"," 1 0.98 1.00 0.99 44\n"," 2 0.98 0.95 0.97 60\n"," 3 1.00 0.95 0.98 22\n"," 4 0.70 0.84 0.76 31\n"," 5 0.80 0.94 0.86 50\n"," 6 1.00 1.00 1.00 33\n"," 7 0.85 0.90 0.88 31\n"," 8 0.96 1.00 0.98 26\n"," 9 0.72 0.89 0.80 46\n"," 10 1.00 0.64 0.78 22\n"," 11 0.87 0.90 0.88 50\n"," 12 0.97 1.00 0.99 36\n"," 13 1.00 0.84 0.91 50\n"," 14 0.95 0.74 0.83 50\n"," 15 0.90 0.88 0.89 50\n"," 16 0.97 0.90 0.94 41\n"," 17 0.88 0.75 0.81 40\n"," 18 0.84 0.73 0.78 22\n"," 19 0.84 0.82 0.83 44\n"," 20 0.93 0.97 0.95 29\n"," 21 0.95 0.95 0.95 39\n"," 22 0.64 0.96 0.77 28\n"," 23 0.97 0.74 0.84 50\n"," 24 0.92 0.65 0.76 17\n"," 25 0.95 0.89 0.92 45\n"," 26 0.92 0.88 0.90 26\n"," 27 0.91 0.69 0.78 29\n"," 28 0.90 0.92 0.91 50\n"," 29 0.78 0.95 0.86 38\n"," 30 0.81 0.84 0.82 25\n"," 31 1.00 0.96 0.98 24\n"," 32 0.91 0.98 0.94 50\n"," 33 0.81 0.88 0.85 50\n"," 34 1.00 0.96 0.98 25\n"," 35 0.95 0.87 0.91 23\n"," 36 1.00 0.94 0.97 17\n"," 37 0.92 0.96 0.94 50\n"," 38 0.94 0.90 0.92 52\n"," 39 0.77 0.78 0.78 51\n"," 40 0.82 1.00 0.90 14\n"," 41 0.88 0.81 0.85 27\n"," 42 0.84 0.96 0.89 48\n","\n"," accuracy 0.89 1587\n"," macro avg 0.90 0.89 0.89 1587\n","weighted avg 0.90 0.89 0.89 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.33it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.69it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 13/20, Loss: 0.24502374231815338, Accuracy: 88.78386893509767% F1: 0.8914100815186707\n","Model weights saved.\n"," precision recall f1-score support\n","\n"," 0 0.86 0.97 0.91 32\n"," 1 0.98 0.93 0.95 44\n"," 2 0.97 0.95 0.96 60\n"," 3 0.95 0.86 0.90 22\n"," 4 0.64 0.81 0.71 31\n"," 5 0.85 0.92 0.88 50\n"," 6 0.92 1.00 0.96 33\n"," 7 0.83 0.94 0.88 31\n"," 8 1.00 0.88 0.94 26\n"," 9 0.67 0.87 0.75 46\n"," 10 1.00 0.77 0.87 22\n"," 11 0.91 0.82 0.86 50\n"," 12 0.95 0.97 0.96 36\n"," 13 0.95 0.80 0.87 50\n"," 14 0.93 0.80 0.86 50\n"," 15 0.81 0.88 0.85 50\n"," 16 0.97 0.88 0.92 41\n"," 17 0.75 0.82 0.79 40\n"," 18 0.90 0.86 0.88 22\n"," 19 0.97 0.82 0.89 44\n"," 20 1.00 1.00 1.00 29\n"," 21 0.95 1.00 0.97 39\n"," 22 0.83 0.89 0.86 28\n"," 23 0.77 0.86 0.81 50\n"," 24 0.92 0.71 0.80 17\n"," 25 0.94 0.98 0.96 45\n"," 26 0.96 0.88 0.92 26\n"," 27 0.78 0.86 0.82 29\n"," 28 0.98 0.90 0.94 50\n"," 29 0.92 0.87 0.89 38\n"," 30 0.95 0.80 0.87 25\n"," 31 1.00 0.96 0.98 24\n"," 32 0.89 0.94 0.91 50\n"," 33 0.86 0.84 0.85 50\n"," 34 1.00 0.96 0.98 25\n"," 35 0.95 0.87 0.91 23\n"," 36 1.00 0.88 0.94 17\n"," 37 0.76 1.00 0.86 50\n"," 38 1.00 0.92 0.96 52\n"," 39 0.86 0.71 0.77 51\n"," 40 0.88 1.00 0.93 14\n"," 41 0.88 0.85 0.87 27\n"," 42 0.92 0.92 0.92 48\n","\n"," accuracy 0.89 1587\n"," macro avg 0.90 0.89 0.89 1587\n","weighted avg 0.90 0.89 0.89 1587\n","\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.35it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.94it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 14/20, Loss: 0.12690715491771698, Accuracy: 87.0825456836799% F1: 0.8691777714430017\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.37it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.89it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 15/20, Loss: 0.039787568151950836, Accuracy: 87.52362948960302% F1: 0.8785891393604705\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.40it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.79it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 16/20, Loss: 0.09257231652736664, Accuracy: 87.96471329552615% F1: 0.8818484762362288\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.37it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.83it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 17/20, Loss: 0.14385418593883514, Accuracy: 87.0825456836799% F1: 0.870063776256168\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.39it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.77it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 18/20, Loss: 0.1985616385936737, Accuracy: 87.58664146187776% F1: 0.8737545801811116\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.36it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.60it/s]\n"]},{"name":"stdout","output_type":"stream","text":["Epoch 19/20, Loss: 0.007958111353218555, Accuracy: 88.21676118462508% F1: 0.8797355118295431\n"]},{"name":"stderr","output_type":"stream","text":["100%|██████████| 201/201 [00:37<00:00, 5.36it/s]\n","100%|██████████| 50/50 [00:04<00:00, 11.94it/s]"]},{"name":"stdout","output_type":"stream","text":["Epoch 20/20, Loss: 0.3914642035961151, Accuracy: 86.7044738500315% F1: 0.8674478996558217\n"]},{"name":"stderr","output_type":"stream","text":["\n"]}],"source":["best_f1 = 0\n","# Training loop\n","num_epochs = 20\n","for epoch in range(num_epochs):\n"," model.train()\n"," for inputs, labels in tqdm(train_loader):\n"," optimizer.zero_grad()\n"," outputs = model(inputs.to(\"cuda\"))\n"," loss = criterion(outputs, labels.to(\"cuda\"))\n"," loss.backward()\n"," optimizer.step()\n"," scheduler.step()\n","\n"," # Validation loop\n"," model.eval()\n"," total = 0\n"," all_labels = []\n"," all_predicted = []\n"," with torch.no_grad():\n"," for inputs, labels in tqdm(test_loader):\n"," outputs = model(inputs.to(\"cuda\"))\n"," _, predicted = torch.max(outputs.data, 1)\n"," total += labels.size(0)\n"," all_labels.append(labels.numpy())\n"," all_predicted.append(predicted.detach().to(\"cpu\").numpy())\n"," \n"," all_labels = np.concatenate(all_labels)\n"," all_predicted = np.concatenate(all_predicted)\n"," f1 = f1_score(all_labels,all_predicted, average='macro')\n"," acc = accuracy_score(all_labels,all_predicted)\n"," print(f\"Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}, Accuracy: {acc*100}% F1: {f1}\")\n","\n"," if f1>best_f1:\n"," best_f1 = f1\n"," torch.save(model.state_dict(), 'best_model.pth')\n"," print('Model weights saved.')\n"," print(classification_report(all_labels,all_predicted))"]},{"cell_type":"code","execution_count":20,"metadata":{},"outputs":[{"data":{"text/plain":[""]},"execution_count":20,"metadata":{},"output_type":"execute_result"}],"source":["#load best model\n","model.load_state_dict(torch.load('best_model.pth'))"]},{"cell_type":"code","execution_count":21,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T09:14:06.192390Z","iopub.status.busy":"2023-11-27T09:14:06.192039Z","iopub.status.idle":"2023-11-27T09:14:15.612115Z","shell.execute_reply":"2023-11-27T09:14:15.611319Z","shell.execute_reply.started":"2023-11-27T09:14:06.192362Z"},"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":["C:\\Users\\User\\AppData\\Local\\Temp\\ipykernel_33268\\1528050369.py:8: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n"," res = F.softmax(model(image_tensor.unsqueeze(0)))\n","c:\\Users\\User\\miniconda3\\envs\\textgen\\lib\\site-packages\\PIL\\Image.py:970: UserWarning: Palette images with Transparency expressed in bytes should be converted to RGBA images\n"," warnings.warn(\n"]}],"source":["list_ = []\n","PATH = \"icon_data/UNKNOWN/\"\n","for image_name in os.listdir(PATH):\n"," image = Image.open(PATH+image_name).resize((224,224)).convert(\"RGB\")\n"," image_tensor = test_transform(image).to(\"cuda\")\n","\n"," with torch.no_grad():\n"," res = F.softmax(model(image_tensor.unsqueeze(0)))\n"," \n"," list_.append(torch.max(res[0]).to(\"cpu\").tolist())\n"," \n","# print(tensor_entropy(res[0]))\n","# print([id_2_class[i] for i in torch.topk(res,5,dim=1).indices[0].to(\"cpu\").tolist()])"]},{"cell_type":"code","execution_count":22,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T09:14:15.613800Z","iopub.status.busy":"2023-11-27T09:14:15.613493Z","iopub.status.idle":"2023-11-27T09:14:16.293542Z","shell.execute_reply":"2023-11-27T09:14:16.292537Z","shell.execute_reply.started":"2023-11-27T09:14:15.613773Z"},"trusted":true},"outputs":[{"data":{"text/plain":[""]},"execution_count":22,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["from matplotlib import pyplot as plt\n","list_.sort()\n","\n","plt.bar( range(len(list_)) ,list_)"]},{"cell_type":"code","execution_count":23,"metadata":{"execution":{"iopub.execute_input":"2023-11-27T09:16:28.779463Z","iopub.status.busy":"2023-11-27T09:16:28.778543Z","iopub.status.idle":"2023-11-27T09:16:37.212765Z","shell.execute_reply":"2023-11-27T09:16:37.211798Z","shell.execute_reply.started":"2023-11-27T09:16:28.779423Z"},"trusted":true},"outputs":[{"name":"stderr","output_type":"stream","text":[" 0%| | 0/50 [00:00"]},"execution_count":23,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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9djR0aHFixdr/PjxuuKKK5Samqr7779fR44c8TlGKPd4rnnz5ikiIkJLly712R4OPf7xj3/UHXfcodjYWF1xxRWaNGmSDh8+7N1v9XX20r/NJTRUVlaaqKgo89vf/tZ8+umn5uGHHzZxcXGmubm5r0u7qNzcXLN8+XKzd+9eU19fb26//XaTnp5ujh8/7p0zb948k5aWZqqqqsyOHTvMTTfdZL7//e9793/zzTdm3LhxJicnx+zatcu8++67JjEx0RQXF/dFS93atm2bGTFihMnMzDSPP/64d3uo9/f111+ba665xjzwwANm69at5s9//rPZsGGD2b9/v3dOaWmpiY2NNWvXrjWffPKJueOOO0xGRob5y1/+4p0zffp0M2HCBFNbW2s+/PBDM3LkSDN79uy+aOk8zz//vElISDDvvPOOOXjwoFm1apUZOnSoefnll71zQq3Hd9991/ziF78wq1evNpLMmjVrfPYHop+2tjaTnJxs5syZY/bu3WvefPNNM3jwYPP666/3eY+tra0mJyfH/P73vzf//d//bWpqaszkyZNNVlaWzzFCucezrV692kyYMMGkpqaal156yWdfqPe4f/9+Ex8fbxYtWmR27txp9u/fb9566y2ffwNtvs5eNuFj8uTJprCw0Pv89OnTJjU11ZSUlPRhVb3T0tJiJJnq6mpjzLcvEIMGDTKrVq3yzvnjH/9oJJmamhpjzLe/mAMGDDBNTU3eOeXl5SYmJsZ4PB67DXTj2LFjZtSoUWbjxo3mhz/8oTd8hEN/ixcvNrfccku3+zs7O43T6TT/+q//6t3W2tpqHA6HefPNN40xxnz22WdGktm+fbt3znvvvWciIiLMl19+Gbzieyg/P9/87d/+rc+2WbNmmTlz5hhjQr/Hc1/QA9XPq6++aq688kqf39PFixeb0aNHB7mj813oH+Yztm3bZiSZzz//3BgTPj1+8cUX5uqrrzZ79+4111xzjU/4CIce7777bnPvvfd2+zO2X2cvi7ddTp06pbq6OuXk5Hi3DRgwQDk5OaqpqenDynqnra1NkhQfHy9JqqurU0dHh09/Y8aMUXp6ure/mpoajR8/3meht9zcXLndbn366acWq+9eYWGh8vPzffqQwqO///zP/9TEiRP1k5/8RElJSbrxxhv1m9/8xrv/4MGDampq8ukxNjZW2dnZPj3GxcVp4sSJ3jk5OTkaMGCAtm7daq+Zbnz/+99XVVWV/vSnP0mSPvnkE3300UfKy8uTFB49ni1Q/dTU1GjKlCmKioryzsnNzVVDQ4P+7//+z1I3PdfW1qaIiAjvd3CFQ4+dnZ267777tGjRIt1www3n7Q/1Hjs7O7Vu3Tp95zvfUW5urpKSkpSdne3z1ozt19nLInz87//+r06fPn3eCqvJyclqamrqo6p6p7OzUwsWLNDNN9+scePGSZKampoUFRV13hfynd1fU1NTl/2f2dfXKisrtXPnTpWUlJy3Lxz6+/Of/6zy8nKNGjVKGzZs0KOPPqqf/exneuONNyT9tcYL/Y42NTUpKSnJZ39kZKTi4+P7RY9LlizRPffcozFjxmjQoEG68cYbtWDBAs2ZM0dSePR4tkD1099/d8928uRJLV68WLNnz/Z+AVk49Pgv//IvioyM1M9+9rMu94d6jy0tLTp+/LhKS0s1ffp0/dd//ZfuuusuzZo1S9XV1d4abb7OBmV5dQRPYWGh9u7dq48++qivSwmYxsZGPf7449q4caOio6P7upyg6Ozs1MSJE/XP//zPkqQbb7xRe/fu1Wuvvaa5c+f2cXWB8Yc//EErV65URUWFbrjhBtXX12vBggVKTU0Nmx4vZx0dHfqbv/kbGWNUXl7e1+UETF1dnV5++WXt3LlTERERfV1OUHR2dkqSZs6cqYULF0qSvvvd7+rjjz/Wa6+9ph/+8IfWa7osrnwkJiZq4MCB531qt7m5WU6ns4+q8t/8+fP1zjvvaNOmTRo+fLh3u9Pp1KlTp9Ta2uoz/+z+nE5nl/2f2deX6urq1NLSou9973uKjIxUZGSkqqur9corrygyMlLJyckh3Z8kpaSkaOzYsT7brr/+eu8nzc/UeKHfUafTqZaWFp/933zzjb7++ut+0eOiRYu8Vz/Gjx+v++67TwsXLvRezQqHHs8WqH76+++u9Nfg8fnnn2vjxo0+X7se6j1++OGHamlpUXp6uvf15/PPP9fPf/5zjRgxwltjKPeYmJioyMjIi74G2XydvSzCR1RUlLKyslRVVeXd1tnZqaqqKrlcrj6srGeMMZo/f77WrFmjDz74QBkZGT77s7KyNGjQIJ/+GhoadPjwYW9/LpdLe/bs8fkLdOZF5NxfSNumTZumPXv2qL6+3jsmTpyoOXPmeP8cyv1J0s0333ze7dF/+tOfdM0110iSMjIy5HQ6fXp0u93aunWrT4+tra2qq6vzzvnggw/U2dmp7OxsC11c2IkTJzRggO9LysCBA73/1xUOPZ4tUP24XC5t2bJFHR0d3jkbN27U6NGjdeWVV1rqpntngse+ffv0/vvvKyEhwWd/qPd43333affu3T6vP6mpqVq0aJE2bNggKfR7jIqK0qRJky74GmT93xG/Pp4awiorK43D4TArVqwwn332mXnkkUdMXFycz6d2+6tHH33UxMbGms2bN5ujR496x4kTJ7xz5s2bZ9LT080HH3xgduzYYVwul3G5XN79Z26Ruu2220x9fb1Zv369ueqqq/rNrajnOvtuF2NCv79t27aZyMhI8/zzz5t9+/aZlStXmiFDhpjf/e533jmlpaUmLi7OvPXWW2b37t1m5syZXd62eeONN5qtW7eajz76yIwaNarf3Go7d+5cc/XVV3tvtV29erVJTEw0TzzxhHdOqPV47Ngxs2vXLrNr1y4jybz44otm165d3js9AtFPa2urSU5ONvfdd5/Zu3evqaysNEOGDLF2i+aFejx16pS54447zPDhw019fb3P68/ZdzeEco9dOfduF2NCv8fVq1ebQYMGmV//+tdm37595le/+pUZOHCg+fDDD73HsPk6e9mED2OM+dWvfmXS09NNVFSUmTx5sqmtre3rknpEUpdj+fLl3jl/+ctfzN/93d+ZK6+80gwZMsTcdddd5ujRoz7HOXTokMnLyzODBw82iYmJ5uc//7np6Oiw3E3PnBs+wqG/t99+24wbN844HA4zZswY8+tf/9pnf2dnp3nqqadMcnKycTgcZtq0aaahocFnzldffWVmz55thg4damJiYsyDDz5ojh07ZrONbrndbvP444+b9PR0Ex0dba699lrzi1/8wucfqVDrcdOmTV3+3Zs7d64xJnD9fPLJJ+aWW24xDofDXH311aa0tNRWixfs8eDBg92+/mzatCkseuxKV+EjHHpctmyZGTlypImOjjYTJkwwa9eu9TmGzdfZCGPOWn4QAAAgyC6Lz3wAAID+g/ABAACsInwAAACrCB8AAMAqwgcAALCK8AEAAKwifAAAAKsIHwAAwCrCBwAAsIrwAQAArCJ8AAAAqwgfAADAqv8HF6PcXlOYEfkAAAAASUVORK5CYII=","text/plain":["
"]},"metadata":{},"output_type":"display_data"}],"source":["model.eval()\n","total = 0\n","all_labels = []\n","all_predicted = []\n","\n","all_vals = []\n","with torch.no_grad():\n"," for inputs, labels in tqdm(test_loader):\n"," outputs = F.softmax(model(inputs.to(\"cuda\")))\n"," val, predicted = torch.max(outputs.data, 1)\n"," total += labels.size(0)\n"," all_predicted+=predicted.detach().to(\"cpu\").tolist()\n"," all_vals+=val.detach().to(\"cpu\").tolist()\n"," all_labels+=labels\n"," \n","all_predicted.sort()\n","\n","plt.bar( range(len(test_dataset)) ,all_vals)"]}],"metadata":{"kaggle":{"accelerator":"gpu","dataSources":[{"datasetId":4060149,"sourceId":7063206,"sourceType":"datasetVersion"}],"dockerImageVersionId":30588,"isGpuEnabled":true,"isInternetEnabled":true,"language":"python","sourceType":"notebook"},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.10.9"}},"nbformat":4,"nbformat_minor":4}