Commit
Β·
60d70cb
1
Parent(s):
2a30c76
Upload 3 files
Browse files- inference.ipynb +139 -0
- inference_with_instructions.ipynb +180 -0
- samsung-icon-training.ipynb +1 -0
inference.ipynb
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "code",
|
| 5 |
+
"execution_count": 2,
|
| 6 |
+
"metadata": {},
|
| 7 |
+
"outputs": [],
|
| 8 |
+
"source": [
|
| 9 |
+
"import torch\n",
|
| 10 |
+
"import torch.nn as nn\n",
|
| 11 |
+
"from torchvision import transforms, models\n",
|
| 12 |
+
"from PIL import Image\n",
|
| 13 |
+
"import torch.nn.functional as F"
|
| 14 |
+
]
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"cell_type": "code",
|
| 18 |
+
"execution_count": 10,
|
| 19 |
+
"metadata": {},
|
| 20 |
+
"outputs": [],
|
| 21 |
+
"source": [
|
| 22 |
+
"#load id_2_class.json\n",
|
| 23 |
+
"import json\n",
|
| 24 |
+
"\n",
|
| 25 |
+
"with open('id_2_class_89.json') as json_file:\n",
|
| 26 |
+
" id_2_class = json.load(json_file)\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"#make class_2_id dict\n",
|
| 29 |
+
"\n",
|
| 30 |
+
"class_2_id = {}\n",
|
| 31 |
+
"for key, value in id_2_class.items():\n",
|
| 32 |
+
" class_2_id[value] = key"
|
| 33 |
+
]
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"cell_type": "code",
|
| 37 |
+
"execution_count": 20,
|
| 38 |
+
"metadata": {},
|
| 39 |
+
"outputs": [],
|
| 40 |
+
"source": [
|
| 41 |
+
"test_transform = transforms.Compose([\n",
|
| 42 |
+
" transforms.Resize((224, 224)),\n",
|
| 43 |
+
" transforms.ToTensor(),\n",
|
| 44 |
+
" transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])\n",
|
| 45 |
+
"])\n",
|
| 46 |
+
"\n",
|
| 47 |
+
"class MaxViT(nn.Module):\n",
|
| 48 |
+
" def __init__(self):\n",
|
| 49 |
+
" super(MaxViT, self).__init__()\n",
|
| 50 |
+
" model = models.maxvit_t(weights=\"DEFAULT\")\n",
|
| 51 |
+
" num_ftrs = model.classifier[5].in_features\n",
|
| 52 |
+
" model.classifier[5] = nn.Linear(num_ftrs, len(class_2_id))\n",
|
| 53 |
+
" self.model = model\n",
|
| 54 |
+
" def forward(self, x):\n",
|
| 55 |
+
" return self.model(x)\n",
|
| 56 |
+
"\n",
|
| 57 |
+
"# Instantiate the model\n",
|
| 58 |
+
"model = MaxViT()\n",
|
| 59 |
+
"model.load_state_dict(torch.load('best_model_89.pth'))\n",
|
| 60 |
+
"model.eval()\n",
|
| 61 |
+
"\n",
|
| 62 |
+
"def inference(image_path, CONFIDENT_THRESHOLD=None):\n",
|
| 63 |
+
" img = Image.open(image_path).convert(\"L\").convert(\"RGB\")\n",
|
| 64 |
+
" img = test_transform(img)\n",
|
| 65 |
+
" img = img.unsqueeze(0)\n",
|
| 66 |
+
"\n",
|
| 67 |
+
" with torch.no_grad():\n",
|
| 68 |
+
" output = F.softmax(model(img), dim=1)\n",
|
| 69 |
+
" confidence, predicted = torch.max(output.data, 1)\n",
|
| 70 |
+
"\n",
|
| 71 |
+
" if CONFIDENT_THRESHOLD is not None and confidence.item() < CONFIDENT_THRESHOLD:\n",
|
| 72 |
+
" return \"UNKNOWN_CLASS\", confidence.item()\n",
|
| 73 |
+
" \n",
|
| 74 |
+
" return id_2_class[str(predicted.item())], confidence.item()\n"
|
| 75 |
+
]
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
"cell_type": "code",
|
| 79 |
+
"execution_count": 21,
|
| 80 |
+
"metadata": {},
|
| 81 |
+
"outputs": [
|
| 82 |
+
{
|
| 83 |
+
"data": {
|
| 84 |
+
"text/plain": [
|
| 85 |
+
"('Volume', 0.9951752424240112)"
|
| 86 |
+
]
|
| 87 |
+
},
|
| 88 |
+
"execution_count": 21,
|
| 89 |
+
"metadata": {},
|
| 90 |
+
"output_type": "execute_result"
|
| 91 |
+
}
|
| 92 |
+
],
|
| 93 |
+
"source": [
|
| 94 |
+
"inference(\"images/7820.jpg\")"
|
| 95 |
+
]
|
| 96 |
+
},
|
| 97 |
+
{
|
| 98 |
+
"cell_type": "code",
|
| 99 |
+
"execution_count": 22,
|
| 100 |
+
"metadata": {},
|
| 101 |
+
"outputs": [
|
| 102 |
+
{
|
| 103 |
+
"data": {
|
| 104 |
+
"text/plain": [
|
| 105 |
+
"('Volume', 0.9951752424240112)"
|
| 106 |
+
]
|
| 107 |
+
},
|
| 108 |
+
"execution_count": 22,
|
| 109 |
+
"metadata": {},
|
| 110 |
+
"output_type": "execute_result"
|
| 111 |
+
}
|
| 112 |
+
],
|
| 113 |
+
"source": [
|
| 114 |
+
"inference(\"images/7820.jpg\", 0.9) #0.9 should be good enough"
|
| 115 |
+
]
|
| 116 |
+
}
|
| 117 |
+
],
|
| 118 |
+
"metadata": {
|
| 119 |
+
"kernelspec": {
|
| 120 |
+
"display_name": "textgen",
|
| 121 |
+
"language": "python",
|
| 122 |
+
"name": "python3"
|
| 123 |
+
},
|
| 124 |
+
"language_info": {
|
| 125 |
+
"codemirror_mode": {
|
| 126 |
+
"name": "ipython",
|
| 127 |
+
"version": 3
|
| 128 |
+
},
|
| 129 |
+
"file_extension": ".py",
|
| 130 |
+
"mimetype": "text/x-python",
|
| 131 |
+
"name": "python",
|
| 132 |
+
"nbconvert_exporter": "python",
|
| 133 |
+
"pygments_lexer": "ipython3",
|
| 134 |
+
"version": "3.10.9"
|
| 135 |
+
}
|
| 136 |
+
},
|
| 137 |
+
"nbformat": 4,
|
| 138 |
+
"nbformat_minor": 2
|
| 139 |
+
}
|
inference_with_instructions.ipynb
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"cells": [
|
| 3 |
+
{
|
| 4 |
+
"cell_type": "markdown",
|
| 5 |
+
"metadata": {},
|
| 6 |
+
"source": [
|
| 7 |
+
"# overview\n",
|
| 8 |
+
"- MaxVIT 120M parameters\n",
|
| 9 |
+
"- runnnig on CPU\n",
|
| 10 |
+
"- id_2_class mapping stored in id_2_class_89.json\n",
|
| 11 |
+
"- (Class, confidence) = inference(image_path)"
|
| 12 |
+
]
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"cell_type": "code",
|
| 16 |
+
"execution_count": 5,
|
| 17 |
+
"metadata": {},
|
| 18 |
+
"outputs": [],
|
| 19 |
+
"source": [
|
| 20 |
+
"import torch\n",
|
| 21 |
+
"import torch.nn as nn\n",
|
| 22 |
+
"from torchvision import transforms, models\n",
|
| 23 |
+
"from PIL import Image\n",
|
| 24 |
+
"import torch.nn.functional as F"
|
| 25 |
+
]
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"cell_type": "code",
|
| 29 |
+
"execution_count": 6,
|
| 30 |
+
"metadata": {},
|
| 31 |
+
"outputs": [],
|
| 32 |
+
"source": [
|
| 33 |
+
"#load id_2_class.json\n",
|
| 34 |
+
"import json\n",
|
| 35 |
+
"\n",
|
| 36 |
+
"with open('id_2_class_89.json') as json_file:\n",
|
| 37 |
+
" id_2_class = json.load(json_file)\n",
|
| 38 |
+
"\n",
|
| 39 |
+
"#make class_2_id dict\n",
|
| 40 |
+
"\n",
|
| 41 |
+
"class_2_id = {}\n",
|
| 42 |
+
"for key, value in id_2_class.items():\n",
|
| 43 |
+
" class_2_id[value] = key"
|
| 44 |
+
]
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
"cell_type": "code",
|
| 48 |
+
"execution_count": 7,
|
| 49 |
+
"metadata": {},
|
| 50 |
+
"outputs": [
|
| 51 |
+
{
|
| 52 |
+
"name": "stderr",
|
| 53 |
+
"output_type": "stream",
|
| 54 |
+
"text": [
|
| 55 |
+
"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",
|
| 56 |
+
" return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]\n"
|
| 57 |
+
]
|
| 58 |
+
}
|
| 59 |
+
],
|
| 60 |
+
"source": [
|
| 61 |
+
"test_transform = transforms.Compose([\n",
|
| 62 |
+
" transforms.Resize((224, 224)),\n",
|
| 63 |
+
" transforms.ToTensor(),\n",
|
| 64 |
+
" transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])\n",
|
| 65 |
+
"])\n",
|
| 66 |
+
"\n",
|
| 67 |
+
"class MaxViT(nn.Module):\n",
|
| 68 |
+
" def __init__(self):\n",
|
| 69 |
+
" super(MaxViT, self).__init__()\n",
|
| 70 |
+
" model = models.maxvit_t(weights=\"DEFAULT\")\n",
|
| 71 |
+
" num_ftrs = model.classifier[5].in_features\n",
|
| 72 |
+
" model.classifier[5] = nn.Linear(num_ftrs, len(class_2_id))\n",
|
| 73 |
+
" self.model = model\n",
|
| 74 |
+
" def forward(self, x):\n",
|
| 75 |
+
" return self.model(x)\n",
|
| 76 |
+
"\n",
|
| 77 |
+
"# Instantiate the model\n",
|
| 78 |
+
"model = MaxViT()\n",
|
| 79 |
+
"model.load_state_dict(torch.load('best_model_89.pth'))\n",
|
| 80 |
+
"model.eval()\n",
|
| 81 |
+
"\n",
|
| 82 |
+
"def inference(image_path, CONFIDENT_THRESHOLD=None):\n",
|
| 83 |
+
" img = Image.open(image_path).convert(\"L\").convert(\"RGB\")\n",
|
| 84 |
+
" img = test_transform(img)\n",
|
| 85 |
+
" img = img.unsqueeze(0)\n",
|
| 86 |
+
"\n",
|
| 87 |
+
" with torch.no_grad():\n",
|
| 88 |
+
" output = F.softmax(model(img), dim=1)\n",
|
| 89 |
+
" confidence, predicted = torch.max(output.data, 1)\n",
|
| 90 |
+
"\n",
|
| 91 |
+
" if CONFIDENT_THRESHOLD is not None and confidence.item() < CONFIDENT_THRESHOLD:\n",
|
| 92 |
+
" return \"UNKNOWN_CLASS\", confidence.item()\n",
|
| 93 |
+
" \n",
|
| 94 |
+
" return id_2_class[str(predicted.item())], confidence.item()\n"
|
| 95 |
+
]
|
| 96 |
+
},
|
| 97 |
+
{
|
| 98 |
+
"cell_type": "code",
|
| 99 |
+
"execution_count": 8,
|
| 100 |
+
"metadata": {},
|
| 101 |
+
"outputs": [
|
| 102 |
+
{
|
| 103 |
+
"data": {
|
| 104 |
+
"image/jpeg": "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",
|
| 105 |
+
"image/png": "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",
|
| 106 |
+
"text/plain": [
|
| 107 |
+
"<PIL.JpegImagePlugin.JpegImageFile image mode=L size=224x224>"
|
| 108 |
+
]
|
| 109 |
+
},
|
| 110 |
+
"metadata": {},
|
| 111 |
+
"output_type": "display_data"
|
| 112 |
+
}
|
| 113 |
+
],
|
| 114 |
+
"source": [
|
| 115 |
+
"display(Image.open(\"images/7820.jpg\"))"
|
| 116 |
+
]
|
| 117 |
+
},
|
| 118 |
+
{
|
| 119 |
+
"cell_type": "code",
|
| 120 |
+
"execution_count": 9,
|
| 121 |
+
"metadata": {},
|
| 122 |
+
"outputs": [
|
| 123 |
+
{
|
| 124 |
+
"data": {
|
| 125 |
+
"text/plain": [
|
| 126 |
+
"('Volume', 0.9951752424240112)"
|
| 127 |
+
]
|
| 128 |
+
},
|
| 129 |
+
"execution_count": 9,
|
| 130 |
+
"metadata": {},
|
| 131 |
+
"output_type": "execute_result"
|
| 132 |
+
}
|
| 133 |
+
],
|
| 134 |
+
"source": [
|
| 135 |
+
"inference(\"images/7820.jpg\")"
|
| 136 |
+
]
|
| 137 |
+
},
|
| 138 |
+
{
|
| 139 |
+
"cell_type": "code",
|
| 140 |
+
"execution_count": 10,
|
| 141 |
+
"metadata": {},
|
| 142 |
+
"outputs": [
|
| 143 |
+
{
|
| 144 |
+
"data": {
|
| 145 |
+
"text/plain": [
|
| 146 |
+
"('Volume', 0.9951752424240112)"
|
| 147 |
+
]
|
| 148 |
+
},
|
| 149 |
+
"execution_count": 10,
|
| 150 |
+
"metadata": {},
|
| 151 |
+
"output_type": "execute_result"
|
| 152 |
+
}
|
| 153 |
+
],
|
| 154 |
+
"source": [
|
| 155 |
+
"inference(\"images/7820.jpg\", 0.9) #0.9 should be good enough"
|
| 156 |
+
]
|
| 157 |
+
}
|
| 158 |
+
],
|
| 159 |
+
"metadata": {
|
| 160 |
+
"kernelspec": {
|
| 161 |
+
"display_name": "textgen",
|
| 162 |
+
"language": "python",
|
| 163 |
+
"name": "python3"
|
| 164 |
+
},
|
| 165 |
+
"language_info": {
|
| 166 |
+
"codemirror_mode": {
|
| 167 |
+
"name": "ipython",
|
| 168 |
+
"version": 3
|
| 169 |
+
},
|
| 170 |
+
"file_extension": ".py",
|
| 171 |
+
"mimetype": "text/x-python",
|
| 172 |
+
"name": "python",
|
| 173 |
+
"nbconvert_exporter": "python",
|
| 174 |
+
"pygments_lexer": "ipython3",
|
| 175 |
+
"version": "3.10.9"
|
| 176 |
+
}
|
| 177 |
+
},
|
| 178 |
+
"nbformat": 4,
|
| 179 |
+
"nbformat_minor": 2
|
| 180 |
+
}
|
samsung-icon-training.ipynb
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"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":["<All keys matched successfully>"]},"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":["<BarContainer object of 321 artists>"]},"execution_count":22,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"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","text/plain":["<Figure size 640x480 with 1 Axes>"]},"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<?, ?it/s]C:\\Users\\User\\AppData\\Local\\Temp\\ipykernel_33268\\864543475.py:9: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n"," outputs = F.softmax(model(inputs.to(\"cuda\")))\n","100%|ββββββββββ| 50/50 [00:04<00:00, 10.82it/s]\n"]},{"data":{"text/plain":["<BarContainer object of 1587 artists>"]},"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":["<Figure size 640x480 with 1 Axes>"]},"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}
|