├── README.md ├── cnn-scratch-inference.ipynb ├── cnn-scratch-training.ipynb ├── img.png └── out.png /README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /cnn-scratch-inference.ipynb: -------------------------------------------------------------------------------- 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.transforms import transforms\n", 12 | "import numpy as np\n", 13 | "from torch.autograd import Variable\n", 14 | "from torchvision.models import squeezenet1_1\n", 15 | "import torch.functional as F\n", 16 | "from io import open\n", 17 | "import os\n", 18 | "from PIL import Image\n", 19 | "import pathlib\n", 20 | "import glob\n", 21 | "import cv2\n" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 3, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "train_path='/home/user/Desktop/pytorch_projects/scene_detection/seg_train/seg_train'\n", 31 | "pred_path='/home/user/Desktop/pytorch_projects/scene_detection/seg_pred/seg_pred'" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 4, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "#categories\n", 41 | "root=pathlib.Path(train_path)\n", 42 | "classes=sorted([j.name.split('/')[-1] for j in root.iterdir()])" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 5, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "#CNN Network\n", 52 | "\n", 53 | "\n", 54 | "class ConvNet(nn.Module):\n", 55 | " def __init__(self,num_classes=6):\n", 56 | " super(ConvNet,self).__init__()\n", 57 | " \n", 58 | " #Output size after convolution filter\n", 59 | " #((w-f+2P)/s) +1\n", 60 | " \n", 61 | " #Input shape= (256,3,150,150)\n", 62 | " \n", 63 | " self.conv1=nn.Conv2d(in_channels=3,out_channels=12,kernel_size=3,stride=1,padding=1)\n", 64 | " #Shape= (256,12,150,150)\n", 65 | " self.bn1=nn.BatchNorm2d(num_features=12)\n", 66 | " #Shape= (256,12,150,150)\n", 67 | " self.relu1=nn.ReLU()\n", 68 | " #Shape= (256,12,150,150)\n", 69 | " \n", 70 | " self.pool=nn.MaxPool2d(kernel_size=2)\n", 71 | " #Reduce the image size be factor 2\n", 72 | " #Shape= (256,12,75,75)\n", 73 | " \n", 74 | " \n", 75 | " self.conv2=nn.Conv2d(in_channels=12,out_channels=20,kernel_size=3,stride=1,padding=1)\n", 76 | " #Shape= (256,20,75,75)\n", 77 | " self.relu2=nn.ReLU()\n", 78 | " #Shape= (256,20,75,75)\n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " self.conv3=nn.Conv2d(in_channels=20,out_channels=32,kernel_size=3,stride=1,padding=1)\n", 83 | " #Shape= (256,32,75,75)\n", 84 | " self.bn3=nn.BatchNorm2d(num_features=32)\n", 85 | " #Shape= (256,32,75,75)\n", 86 | " self.relu3=nn.ReLU()\n", 87 | " #Shape= (256,32,75,75)\n", 88 | " \n", 89 | " \n", 90 | " self.fc=nn.Linear(in_features=75 * 75 * 32,out_features=num_classes)\n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " #Feed forwad function\n", 95 | " \n", 96 | " def forward(self,input):\n", 97 | " output=self.conv1(input)\n", 98 | " output=self.bn1(output)\n", 99 | " output=self.relu1(output)\n", 100 | " \n", 101 | " output=self.pool(output)\n", 102 | " \n", 103 | " output=self.conv2(output)\n", 104 | " output=self.relu2(output)\n", 105 | " \n", 106 | " output=self.conv3(output)\n", 107 | " output=self.bn3(output)\n", 108 | " output=self.relu3(output)\n", 109 | " \n", 110 | " \n", 111 | " #Above output will be in matrix form, with shape (256,32,75,75)\n", 112 | " \n", 113 | " output=output.view(-1,32*75*75)\n", 114 | " \n", 115 | " \n", 116 | " output=self.fc(output)\n", 117 | " \n", 118 | " return output\n", 119 | " \n", 120 | " \n" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": {}, 127 | "outputs": [ 128 | { 129 | "data": { 130 | "text/plain": [ 131 | "ConvNet(\n", 132 | " (conv1): Conv2d(3, 12, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", 133 | " (bn1): BatchNorm2d(12, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", 134 | " (relu1): ReLU()\n", 135 | " (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", 136 | " (conv2): Conv2d(12, 20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", 137 | " (relu2): ReLU()\n", 138 | " (conv3): Conv2d(20, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", 139 | " (bn3): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", 140 | " (relu3): ReLU()\n", 141 | " (fc): Linear(in_features=180000, out_features=6, bias=True)\n", 142 | ")" 143 | ] 144 | }, 145 | "execution_count": 6, 146 | "metadata": {}, 147 | "output_type": "execute_result" 148 | } 149 | ], 150 | "source": [ 151 | "checkpoint=torch.load('best_checkpoint.model')\n", 152 | "model=ConvNet(num_classes=6)\n", 153 | "model.load_state_dict(checkpoint)\n", 154 | "model.eval()" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": 7, 160 | "metadata": {}, 161 | "outputs": [], 162 | "source": [ 163 | "#Transforms\n", 164 | "transformer=transforms.Compose([\n", 165 | " transforms.Resize((150,150)),\n", 166 | " transforms.ToTensor(), #0-255 to 0-1, numpy to tensors\n", 167 | " transforms.Normalize([0.5,0.5,0.5], # 0-1 to [-1,1] , formula (x-mean)/std\n", 168 | " [0.5,0.5,0.5])\n", 169 | "])" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 13, 175 | "metadata": {}, 176 | "outputs": [], 177 | "source": [ 178 | "#prediction function\n", 179 | "def prediction(img_path,transformer):\n", 180 | " \n", 181 | " image=Image.open(img_path)\n", 182 | " \n", 183 | " image_tensor=transformer(image).float()\n", 184 | " \n", 185 | " \n", 186 | " image_tensor=image_tensor.unsqueeze_(0)\n", 187 | " \n", 188 | " if torch.cuda.is_available():\n", 189 | " image_tensor.cuda()\n", 190 | " \n", 191 | " input=Variable(image_tensor)\n", 192 | " \n", 193 | " \n", 194 | " output=model(input)\n", 195 | " \n", 196 | " index=output.data.numpy().argmax()\n", 197 | " \n", 198 | " pred=classes[index]\n", 199 | " \n", 200 | " return pred\n", 201 | " \n" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 14, 207 | "metadata": {}, 208 | "outputs": [], 209 | "source": [ 210 | "images_path=glob.glob(pred_path+'/*.jpg')" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 15, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "pred_dict={}\n", 220 | "\n", 221 | "for i in images_path:\n", 222 | " pred_dict[i[i.rfind('/')+1:]]=prediction(i,transformer)" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": 16, 228 | "metadata": {}, 229 | "outputs": [ 230 | { 231 | "data": { 232 | "text/plain": [ 233 | "{'12541.jpg': 'mountain',\n", 234 | " '15375.jpg': 'forest',\n", 235 | " '3962.jpg': 'glacier',\n", 236 | " '7310.jpg': 'mountain',\n", 237 | " '22492.jpg': 'mountain',\n", 238 | " '3776.jpg': 'sea',\n", 239 | " '8654.jpg': 'street',\n", 240 | " '5782.jpg': 'sea',\n", 241 | " '19597.jpg': 'forest',\n", 242 | " '7736.jpg': 'buildings',\n", 243 | " '10839.jpg': 'glacier',\n", 244 | " '18975.jpg': 'glacier',\n", 245 | " '22749.jpg': 'sea',\n", 246 | " '7557.jpg': 'mountain',\n", 247 | " '9529.jpg': 'sea',\n", 248 | " '7608.jpg': 'buildings',\n", 249 | " '1504.jpg': 'forest',\n", 250 | " '11968.jpg': 'street',\n", 251 | " '6483.jpg': 'forest',\n", 252 | " '10377.jpg': 'mountain',\n", 253 | " '19561.jpg': 'sea',\n", 254 | " '1239.jpg': 'mountain',\n", 255 | " '2750.jpg': 'forest',\n", 256 | " '9237.jpg': 'buildings',\n", 257 | " '23670.jpg': 'forest',\n", 258 | " '18021.jpg': 'sea',\n", 259 | " '9790.jpg': 'sea',\n", 260 | " '6424.jpg': 'forest',\n", 261 | " '13619.jpg': 'sea',\n", 262 | " '13852.jpg': 'mountain',\n", 263 | " '4757.jpg': 'forest',\n", 264 | " '17723.jpg': 'glacier',\n", 265 | " '20145.jpg': 'mountain',\n", 266 | " '13977.jpg': 'mountain',\n", 267 | " '12971.jpg': 'sea',\n", 268 | " '11811.jpg': 'mountain',\n", 269 | " '11153.jpg': 'glacier',\n", 270 | " '1271.jpg': 'forest',\n", 271 | " '2980.jpg': 'glacier',\n", 272 | " '8182.jpg': 'mountain',\n", 273 | " '14364.jpg': 'glacier',\n", 274 | " '6459.jpg': 'buildings',\n", 275 | " '21072.jpg': 'glacier',\n", 276 | " '522.jpg': 'mountain',\n", 277 | " '7660.jpg': 'glacier',\n", 278 | " '6318.jpg': 'glacier',\n", 279 | " '7622.jpg': 'mountain',\n", 280 | " '2240.jpg': 'buildings',\n", 281 | " '13015.jpg': 'mountain',\n", 282 | " '16619.jpg': 'sea',\n", 283 | " '7230.jpg': 'forest',\n", 284 | " '17048.jpg': 'mountain',\n", 285 | " '14653.jpg': 'glacier',\n", 286 | " '15914.jpg': 'buildings',\n", 287 | " '24272.jpg': 'mountain',\n", 288 | " '1211.jpg': 'glacier',\n", 289 | " '21379.jpg': 'glacier',\n", 290 | " '10100.jpg': 'mountain',\n", 291 | " '9028.jpg': 'mountain',\n", 292 | " '3819.jpg': 'forest',\n", 293 | " '17316.jpg': 'glacier',\n", 294 | " '5320.jpg': 'glacier',\n", 295 | " '2271.jpg': 'sea',\n", 296 | " '12709.jpg': 'glacier',\n", 297 | " '672.jpg': 'forest',\n", 298 | " '16446.jpg': 'sea',\n", 299 | " '23028.jpg': 'buildings',\n", 300 | " '23840.jpg': 'mountain',\n", 301 | " '2901.jpg': 'mountain',\n", 302 | " '18537.jpg': 'forest',\n", 303 | " '14181.jpg': 'sea',\n", 304 | " '11103.jpg': 'glacier',\n", 305 | " '2466.jpg': 'sea',\n", 306 | " '14211.jpg': 'mountain',\n", 307 | " '13329.jpg': 'forest',\n", 308 | " '2872.jpg': 'forest',\n", 309 | " '19111.jpg': 'mountain',\n", 310 | " '121.jpg': 'street',\n", 311 | " '3167.jpg': 'sea',\n", 312 | " '1409.jpg': 'forest',\n", 313 | " '11430.jpg': 'mountain',\n", 314 | " '9996.jpg': 'street',\n", 315 | " '9618.jpg': 'mountain',\n", 316 | " '6521.jpg': 'forest',\n", 317 | " '19572.jpg': 'street',\n", 318 | " '4183.jpg': 'street',\n", 319 | " '9212.jpg': 'sea',\n", 320 | " '23957.jpg': 'forest',\n", 321 | " '1920.jpg': 'buildings',\n", 322 | " '23828.jpg': 'mountain',\n", 323 | " '4625.jpg': 'mountain',\n", 324 | " '23132.jpg': 'glacier',\n", 325 | " '20791.jpg': 'mountain',\n", 326 | " '2895.jpg': 'glacier',\n", 327 | " '7371.jpg': 'forest',\n", 328 | " '5366.jpg': 'mountain',\n", 329 | " '6068.jpg': 'forest',\n", 330 | " '4947.jpg': 'forest',\n", 331 | " '13088.jpg': 'sea',\n", 332 | " '7029.jpg': 'glacier',\n", 333 | " '3672.jpg': 'glacier',\n", 334 | " '21075.jpg': 'street',\n", 335 | " '16632.jpg': 'glacier',\n", 336 | " '22968.jpg': 'buildings',\n", 337 | " '15274.jpg': 'forest',\n", 338 | " '1769.jpg': 'glacier',\n", 339 | " '9010.jpg': 'street',\n", 340 | " '20237.jpg': 'glacier',\n", 341 | " '2739.jpg': 'mountain',\n", 342 | " '22248.jpg': 'mountain',\n", 343 | " '13414.jpg': 'street',\n", 344 | " '13990.jpg': 'forest',\n", 345 | " '7349.jpg': 'buildings',\n", 346 | " '22270.jpg': 'buildings',\n", 347 | " '13074.jpg': 'glacier',\n", 348 | " '19106.jpg': 'sea',\n", 349 | " '5550.jpg': 'street',\n", 350 | " '4454.jpg': 'forest',\n", 351 | " '24202.jpg': 'glacier',\n", 352 | " '11819.jpg': 'glacier',\n", 353 | " '13936.jpg': 'forest',\n", 354 | " '10445.jpg': 'forest',\n", 355 | " '17982.jpg': 'mountain',\n", 356 | " '4778.jpg': 'street',\n", 357 | " '13912.jpg': 'buildings',\n", 358 | " '20957.jpg': 'sea',\n", 359 | " '10233.jpg': 'street',\n", 360 | " '7519.jpg': 'mountain',\n", 361 | " '9651.jpg': 'forest',\n", 362 | " '16713.jpg': 'buildings',\n", 363 | " '17580.jpg': 'street',\n", 364 | " '1092.jpg': 'glacier',\n", 365 | " '24081.jpg': 'street',\n", 366 | " '6593.jpg': 'street',\n", 367 | " '3522.jpg': 'glacier',\n", 368 | " '2028.jpg': 'glacier',\n", 369 | " '327.jpg': 'mountain',\n", 370 | " '17974.jpg': 'glacier',\n", 371 | " '10760.jpg': 'glacier',\n", 372 | " '17366.jpg': 'sea',\n", 373 | " '8315.jpg': 'street',\n", 374 | " '9122.jpg': 'mountain',\n", 375 | " '10918.jpg': 'mountain',\n", 376 | " '3254.jpg': 'mountain',\n", 377 | " '4409.jpg': 'glacier',\n", 378 | " '8721.jpg': 'forest',\n", 379 | " '22151.jpg': 'mountain',\n", 380 | " '8632.jpg': 'sea',\n", 381 | " '2302.jpg': 'forest',\n", 382 | " '5066.jpg': 'glacier',\n", 383 | " '8916.jpg': 'sea',\n", 384 | " '22523.jpg': 'forest',\n", 385 | " '9477.jpg': 'forest',\n", 386 | " '23671.jpg': 'forest',\n", 387 | " '10478.jpg': 'sea',\n", 388 | " '4127.jpg': 'sea',\n", 389 | " '23340.jpg': 'glacier',\n", 390 | " '1337.jpg': 'buildings',\n", 391 | " '17550.jpg': 'buildings',\n", 392 | " '17376.jpg': 'forest',\n", 393 | " '7322.jpg': 'glacier',\n", 394 | " '18228.jpg': 'sea',\n", 395 | " '12830.jpg': 'forest',\n", 396 | " '11738.jpg': 'glacier',\n", 397 | " '24183.jpg': 'glacier',\n", 398 | " '8582.jpg': 'sea',\n", 399 | " '21778.jpg': 'forest',\n", 400 | " '11078.jpg': 'forest',\n", 401 | " '23991.jpg': 'sea',\n", 402 | " '17833.jpg': 'forest',\n", 403 | " '16587.jpg': 'street',\n", 404 | " '3926.jpg': 'forest',\n", 405 | " '19287.jpg': 'street',\n", 406 | " '17650.jpg': 'street',\n", 407 | " '23113.jpg': 'mountain',\n", 408 | " '4366.jpg': 'forest',\n", 409 | " '549.jpg': 'forest',\n", 410 | " '482.jpg': 'mountain',\n", 411 | " '1931.jpg': 'glacier',\n", 412 | " '18286.jpg': 'buildings',\n", 413 | " '6194.jpg': 'glacier',\n", 414 | " '7395.jpg': 'sea',\n", 415 | " '9062.jpg': 'mountain',\n", 416 | " '15630.jpg': 'forest',\n", 417 | " '16841.jpg': 'mountain',\n", 418 | " '3093.jpg': 'glacier',\n", 419 | " '3805.jpg': 'mountain',\n", 420 | " '10208.jpg': 'buildings',\n", 421 | " '13468.jpg': 'glacier',\n", 422 | " '3065.jpg': 'street',\n", 423 | " '10586.jpg': 'forest',\n", 424 | " '13931.jpg': 'glacier',\n", 425 | " '6855.jpg': 'glacier',\n", 426 | " '1374.jpg': 'mountain',\n", 427 | " '18601.jpg': 'forest',\n", 428 | " '24303.jpg': 'sea',\n", 429 | " '393.jpg': 'street',\n", 430 | " '22601.jpg': 'mountain',\n", 431 | " '8505.jpg': 'mountain',\n", 432 | " '24064.jpg': 'forest',\n", 433 | " '13530.jpg': 'street',\n", 434 | " '22397.jpg': 'glacier',\n", 435 | " '2941.jpg': 'sea',\n", 436 | " '12662.jpg': 'mountain',\n", 437 | " '3982.jpg': 'glacier',\n", 438 | " '22937.jpg': 'street',\n", 439 | " '6822.jpg': 'buildings',\n", 440 | " '6614.jpg': 'mountain',\n", 441 | " '7419.jpg': 'forest',\n", 442 | " '5567.jpg': 'buildings',\n", 443 | " '10614.jpg': 'forest',\n", 444 | " '16056.jpg': 'glacier',\n", 445 | " '19893.jpg': 'street',\n", 446 | " '8142.jpg': 'buildings',\n", 447 | " '16702.jpg': 'buildings',\n", 448 | " '5609.jpg': 'buildings',\n", 449 | " '995.jpg': 'forest',\n", 450 | " '10758.jpg': 'street',\n", 451 | " '14251.jpg': 'buildings',\n", 452 | " '5598.jpg': 'street',\n", 453 | " '17266.jpg': 'mountain',\n", 454 | " '8551.jpg': 'buildings',\n", 455 | " '14197.jpg': 'street',\n", 456 | " '21700.jpg': 'street',\n", 457 | " '23035.jpg': 'mountain',\n", 458 | " '17901.jpg': 'mountain',\n", 459 | " '19581.jpg': 'street',\n", 460 | " '8316.jpg': 'street',\n", 461 | " '18062.jpg': 'glacier',\n", 462 | " '10375.jpg': 'street',\n", 463 | " '21164.jpg': 'mountain',\n", 464 | " '12095.jpg': 'glacier',\n", 465 | " '9084.jpg': 'glacier',\n", 466 | " '2206.jpg': 'street',\n", 467 | " '10190.jpg': 'glacier',\n", 468 | " '16411.jpg': 'forest',\n", 469 | " '5639.jpg': 'glacier',\n", 470 | " '15555.jpg': 'street',\n", 471 | " '700.jpg': 'street',\n", 472 | " '22080.jpg': 'forest',\n", 473 | " '12796.jpg': 'street',\n", 474 | " '16950.jpg': 'glacier',\n", 475 | " '10680.jpg': 'forest',\n", 476 | " '15870.jpg': 'mountain',\n", 477 | " '7515.jpg': 'glacier',\n", 478 | " '16242.jpg': 'mountain',\n", 479 | " '803.jpg': 'glacier',\n", 480 | " '2017.jpg': 'buildings',\n", 481 | " '19408.jpg': 'forest',\n", 482 | " '8828.jpg': 'buildings',\n", 483 | " '3536.jpg': 'buildings',\n", 484 | " '21251.jpg': 'street',\n", 485 | " '14970.jpg': 'street',\n", 486 | " '1771.jpg': 'sea',\n", 487 | " '13929.jpg': 'sea',\n", 488 | " '8319.jpg': 'sea',\n", 489 | " '11912.jpg': 'glacier',\n", 490 | " '156.jpg': 'buildings',\n", 491 | " '3918.jpg': 'glacier',\n", 492 | " '22077.jpg': 'street',\n", 493 | " '22605.jpg': 'street',\n", 494 | " '8967.jpg': 'sea',\n", 495 | " '15342.jpg': 'glacier',\n", 496 | " '5863.jpg': 'street',\n", 497 | " '4615.jpg': 'street',\n", 498 | " '3655.jpg': 'forest',\n", 499 | " '23303.jpg': 'mountain',\n", 500 | " '4179.jpg': 'glacier',\n", 501 | " '9194.jpg': 'glacier',\n", 502 | " '13031.jpg': 'forest',\n", 503 | " '23805.jpg': 'forest',\n", 504 | " '308.jpg': 'mountain',\n", 505 | " '4990.jpg': 'forest',\n", 506 | " '23434.jpg': 'sea',\n", 507 | " '23615.jpg': 'sea',\n", 508 | " '22300.jpg': 'street',\n", 509 | " '11548.jpg': 'glacier',\n", 510 | " '10814.jpg': 'buildings',\n", 511 | " '20381.jpg': 'buildings',\n", 512 | " '18358.jpg': 'mountain',\n", 513 | " '17365.jpg': 'forest',\n", 514 | " '6658.jpg': 'mountain',\n", 515 | " '20422.jpg': 'glacier',\n", 516 | " '9712.jpg': 'glacier',\n", 517 | " '18121.jpg': 'glacier',\n", 518 | " '8829.jpg': 'glacier',\n", 519 | " '7353.jpg': 'street',\n", 520 | " '6630.jpg': 'glacier',\n", 521 | " '8423.jpg': 'street',\n", 522 | " '2593.jpg': 'glacier',\n", 523 | " '5020.jpg': 'mountain',\n", 524 | " '11163.jpg': 'mountain',\n", 525 | " '19620.jpg': 'glacier',\n", 526 | " '8176.jpg': 'buildings',\n", 527 | " '557.jpg': 'forest',\n", 528 | " '21668.jpg': 'forest',\n", 529 | " '1534.jpg': 'mountain',\n", 530 | " '6872.jpg': 'mountain',\n", 531 | " '622.jpg': 'mountain',\n", 532 | " '16718.jpg': 'sea',\n", 533 | " '3240.jpg': 'mountain',\n", 534 | " '18961.jpg': 'glacier',\n", 535 | " '5187.jpg': 'buildings',\n", 536 | " '14886.jpg': 'sea',\n", 537 | " '14983.jpg': 'forest',\n", 538 | " '11420.jpg': 'glacier',\n", 539 | " '14083.jpg': 'glacier',\n", 540 | " '3830.jpg': 'street',\n", 541 | " '17133.jpg': 'mountain',\n", 542 | " '6621.jpg': 'street',\n", 543 | " '2398.jpg': 'buildings',\n", 544 | " '22682.jpg': 'buildings',\n", 545 | " '24291.jpg': 'mountain',\n", 546 | " '7067.jpg': 'glacier',\n", 547 | " '21299.jpg': 'mountain',\n", 548 | " '19503.jpg': 'glacier',\n", 549 | " '17392.jpg': 'mountain',\n", 550 | " '20977.jpg': 'buildings',\n", 551 | " '22889.jpg': 'street',\n", 552 | " '16305.jpg': 'glacier',\n", 553 | " '1972.jpg': 'mountain',\n", 554 | " '9827.jpg': 'street',\n", 555 | " '20614.jpg': 'mountain',\n", 556 | " '23345.jpg': 'forest',\n", 557 | " '3379.jpg': 'street',\n", 558 | " '4429.jpg': 'mountain',\n", 559 | " '19157.jpg': 'buildings',\n", 560 | " '242.jpg': 'buildings',\n", 561 | " '8251.jpg': 'forest',\n", 562 | " '19682.jpg': 'sea',\n", 563 | " '16396.jpg': 'street',\n", 564 | " '18617.jpg': 'glacier',\n", 565 | " '5690.jpg': 'glacier',\n", 566 | " '23020.jpg': 'glacier',\n", 567 | " '13805.jpg': 'glacier',\n", 568 | " '17556.jpg': 'mountain',\n", 569 | " '8075.jpg': 'glacier',\n", 570 | " '11324.jpg': 'glacier',\n", 571 | " '14678.jpg': 'buildings',\n", 572 | " '8814.jpg': 'sea',\n", 573 | " '21439.jpg': 'sea',\n", 574 | " '18570.jpg': 'street',\n", 575 | " '21848.jpg': 'glacier',\n", 576 | " '7423.jpg': 'sea',\n", 577 | " '11256.jpg': 'forest',\n", 578 | " '12475.jpg': 'glacier',\n", 579 | " '23556.jpg': 'mountain',\n", 580 | " '8164.jpg': 'mountain',\n", 581 | " '3700.jpg': 'mountain',\n", 582 | " '1452.jpg': 'mountain',\n", 583 | " '3633.jpg': 'mountain',\n", 584 | " '3753.jpg': 'glacier',\n", 585 | " '21822.jpg': 'forest',\n", 586 | " '3140.jpg': 'mountain',\n", 587 | " '11648.jpg': 'glacier',\n", 588 | " '11540.jpg': 'sea',\n", 589 | " '7739.jpg': 'glacier',\n", 590 | " '22292.jpg': 'forest',\n", 591 | " '14813.jpg': 'street',\n", 592 | " '7894.jpg': 'glacier',\n", 593 | " '7099.jpg': 'street',\n", 594 | " '22932.jpg': 'forest',\n", 595 | " '12394.jpg': 'glacier',\n", 596 | " '6596.jpg': 'street',\n", 597 | " '3705.jpg': 'glacier',\n", 598 | " '8666.jpg': 'mountain',\n", 599 | " '19880.jpg': 'glacier',\n", 600 | " '15750.jpg': 'glacier',\n", 601 | " '21579.jpg': 'street',\n", 602 | " '15621.jpg': 'sea',\n", 603 | " '4610.jpg': 'mountain',\n", 604 | " '17599.jpg': 'glacier',\n", 605 | " '14631.jpg': 'mountain',\n", 606 | " '14614.jpg': 'mountain',\n", 607 | " '15658.jpg': 'street',\n", 608 | " '1300.jpg': 'sea',\n", 609 | " '10060.jpg': 'forest',\n", 610 | " '2701.jpg': 'glacier',\n", 611 | " '4343.jpg': 'buildings',\n", 612 | " '21460.jpg': 'forest',\n", 613 | " '16304.jpg': 'glacier',\n", 614 | " '20532.jpg': 'glacier',\n", 615 | " '4241.jpg': 'street',\n", 616 | " '18698.jpg': 'mountain',\n", 617 | " '19497.jpg': 'mountain',\n", 618 | " '22430.jpg': 'forest',\n", 619 | " '19949.jpg': 'sea',\n", 620 | " '7957.jpg': 'street',\n", 621 | " '132.jpg': 'sea',\n", 622 | " '19064.jpg': 'glacier',\n", 623 | " '677.jpg': 'glacier',\n", 624 | " '17440.jpg': 'street',\n", 625 | " '2383.jpg': 'street',\n", 626 | " '63.jpg': 'glacier',\n", 627 | " '5491.jpg': 'mountain',\n", 628 | " '3855.jpg': 'mountain',\n", 629 | " '24276.jpg': 'sea',\n", 630 | " '20399.jpg': 'forest',\n", 631 | " '12977.jpg': 'glacier',\n", 632 | " '17710.jpg': 'mountain',\n", 633 | " '9542.jpg': 'glacier',\n", 634 | " '5665.jpg': 'glacier',\n", 635 | " '15506.jpg': 'mountain',\n", 636 | " '9215.jpg': 'buildings',\n", 637 | " '4636.jpg': 'glacier',\n", 638 | " '1992.jpg': 'glacier',\n", 639 | " '19972.jpg': 'street',\n", 640 | " '798.jpg': 'sea',\n", 641 | " '7917.jpg': 'buildings',\n", 642 | " '9438.jpg': 'street',\n", 643 | " '20364.jpg': 'mountain',\n", 644 | " '2141.jpg': 'glacier',\n", 645 | " '5773.jpg': 'glacier',\n", 646 | " '9207.jpg': 'sea',\n", 647 | " '2046.jpg': 'mountain',\n", 648 | " '13344.jpg': 'sea',\n", 649 | " '21171.jpg': 'mountain',\n", 650 | " '8722.jpg': 'sea',\n", 651 | " '6788.jpg': 'sea',\n", 652 | " '22604.jpg': 'glacier',\n", 653 | " '23693.jpg': 'forest',\n", 654 | " '875.jpg': 'mountain',\n", 655 | " '11391.jpg': 'mountain',\n", 656 | " '14421.jpg': 'sea',\n", 657 | " '7315.jpg': 'forest',\n", 658 | " '6577.jpg': 'glacier',\n", 659 | " '3466.jpg': 'street',\n", 660 | " '1990.jpg': 'glacier',\n", 661 | " '14098.jpg': 'sea',\n", 662 | " '20251.jpg': 'forest',\n", 663 | " '21521.jpg': 'forest',\n", 664 | " '23881.jpg': 'street',\n", 665 | " '16993.jpg': 'mountain',\n", 666 | " '9100.jpg': 'sea',\n", 667 | " '18067.jpg': 'mountain',\n", 668 | " '81.jpg': 'glacier',\n", 669 | " '7797.jpg': 'forest',\n", 670 | " '20213.jpg': 'buildings',\n", 671 | " '6293.jpg': 'forest',\n", 672 | " '12271.jpg': 'mountain',\n", 673 | " '18118.jpg': 'forest',\n", 674 | " '4376.jpg': 'street',\n", 675 | " '12715.jpg': 'mountain',\n", 676 | " '4214.jpg': 'glacier',\n", 677 | " '736.jpg': 'buildings',\n", 678 | " '22659.jpg': 'buildings',\n", 679 | " '16548.jpg': 'mountain',\n", 680 | " '17549.jpg': 'glacier',\n", 681 | " '11566.jpg': 'buildings',\n", 682 | " '13326.jpg': 'street',\n", 683 | " '3584.jpg': 'sea',\n", 684 | " '21757.jpg': 'sea',\n", 685 | " '15619.jpg': 'sea',\n", 686 | " '2795.jpg': 'glacier',\n", 687 | " '7779.jpg': 'forest',\n", 688 | " '15357.jpg': 'mountain',\n", 689 | " '23147.jpg': 'mountain',\n", 690 | " '22715.jpg': 'sea',\n", 691 | " '17961.jpg': 'street',\n", 692 | " '2379.jpg': 'glacier',\n", 693 | " '1338.jpg': 'glacier',\n", 694 | " '15981.jpg': 'mountain',\n", 695 | " '7435.jpg': 'mountain',\n", 696 | " '5813.jpg': 'buildings',\n", 697 | " '22281.jpg': 'sea',\n", 698 | " '11769.jpg': 'forest',\n", 699 | " '10873.jpg': 'forest',\n", 700 | " '19239.jpg': 'buildings',\n", 701 | " '4685.jpg': 'mountain',\n", 702 | " '4588.jpg': 'sea',\n", 703 | " '4229.jpg': 'buildings',\n", 704 | " '19504.jpg': 'street',\n", 705 | " '5174.jpg': 'forest',\n", 706 | " '13614.jpg': 'glacier',\n", 707 | " '15642.jpg': 'glacier',\n", 708 | " '13416.jpg': 'glacier',\n", 709 | " '16406.jpg': 'glacier',\n", 710 | " '7835.jpg': 'glacier',\n", 711 | " '4085.jpg': 'sea',\n", 712 | " '7770.jpg': 'street',\n", 713 | " '1095.jpg': 'mountain',\n", 714 | " '20523.jpg': 'buildings',\n", 715 | " '16849.jpg': 'street',\n", 716 | " '1664.jpg': 'mountain',\n", 717 | " '23395.jpg': 'mountain',\n", 718 | " '11449.jpg': 'buildings',\n", 719 | " '161.jpg': 'street',\n", 720 | " '20809.jpg': 'street',\n", 721 | " '9855.jpg': 'glacier',\n", 722 | " '14084.jpg': 'street',\n", 723 | " '13434.jpg': 'buildings',\n", 724 | " '2200.jpg': 'glacier',\n", 725 | " '5527.jpg': 'forest',\n", 726 | " '14155.jpg': 'glacier',\n", 727 | " '5552.jpg': 'buildings',\n", 728 | " '21733.jpg': 'glacier',\n", 729 | " '2832.jpg': 'mountain',\n", 730 | " '16878.jpg': 'buildings',\n", 731 | " '4036.jpg': 'glacier',\n", 732 | " '23086.jpg': 'mountain',\n", 733 | " '20526.jpg': 'mountain',\n", 734 | " '12443.jpg': 'street',\n", 735 | " '22445.jpg': 'mountain',\n", 736 | " '3011.jpg': 'forest',\n", 737 | " '20104.jpg': 'glacier',\n", 738 | " '7988.jpg': 'forest',\n", 739 | " '17874.jpg': 'glacier',\n", 740 | " '11091.jpg': 'sea',\n", 741 | " '2554.jpg': 'mountain',\n", 742 | " '13104.jpg': 'street',\n", 743 | " '19842.jpg': 'forest',\n", 744 | " '826.jpg': 'buildings',\n", 745 | " '20784.jpg': 'forest',\n", 746 | " '20529.jpg': 'mountain',\n", 747 | " '17658.jpg': 'mountain',\n", 748 | " '15066.jpg': 'glacier',\n", 749 | " '24289.jpg': 'glacier',\n", 750 | " '22802.jpg': 'buildings',\n", 751 | " '3987.jpg': 'sea',\n", 752 | " '15698.jpg': 'buildings',\n", 753 | " '23394.jpg': 'glacier',\n", 754 | " '8776.jpg': 'forest',\n", 755 | " '12894.jpg': 'sea',\n", 756 | " '4336.jpg': 'forest',\n", 757 | " '18004.jpg': 'buildings',\n", 758 | " '14878.jpg': 'buildings',\n", 759 | " '14293.jpg': 'street',\n", 760 | " '19687.jpg': 'sea',\n", 761 | " '21252.jpg': 'forest',\n", 762 | " '19092.jpg': 'sea',\n", 763 | " '17213.jpg': 'buildings',\n", 764 | " '19744.jpg': 'glacier',\n", 765 | " '4329.jpg': 'forest',\n", 766 | " '17746.jpg': 'glacier',\n", 767 | " '13365.jpg': 'sea',\n", 768 | " '13239.jpg': 'sea',\n", 769 | " '14701.jpg': 'forest',\n", 770 | " '19685.jpg': 'buildings',\n", 771 | " '2313.jpg': 'street',\n", 772 | " '20219.jpg': 'street',\n", 773 | " '2022.jpg': 'street',\n", 774 | " '16941.jpg': 'buildings',\n", 775 | " '4353.jpg': 'glacier',\n", 776 | " '4315.jpg': 'mountain',\n", 777 | " '6777.jpg': 'street',\n", 778 | " '20453.jpg': 'mountain',\n", 779 | " '4324.jpg': 'glacier',\n", 780 | " '11965.jpg': 'mountain',\n", 781 | " '13694.jpg': 'street',\n", 782 | " '76.jpg': 'mountain',\n", 783 | " '24188.jpg': 'buildings',\n", 784 | " '23039.jpg': 'glacier',\n", 785 | " '11571.jpg': 'forest',\n", 786 | " '2352.jpg': 'sea',\n", 787 | " '13243.jpg': 'glacier',\n", 788 | " '9261.jpg': 'street',\n", 789 | " '7244.jpg': 'buildings',\n", 790 | " '2167.jpg': 'mountain',\n", 791 | " '2955.jpg': 'mountain',\n", 792 | " '19943.jpg': 'street',\n", 793 | " '20744.jpg': 'forest',\n", 794 | " '23539.jpg': 'forest',\n", 795 | " '19172.jpg': 'mountain',\n", 796 | " '9431.jpg': 'sea',\n", 797 | " '21451.jpg': 'forest',\n", 798 | " '19797.jpg': 'mountain',\n", 799 | " '14339.jpg': 'mountain',\n", 800 | " '20442.jpg': 'sea',\n", 801 | " '15848.jpg': 'mountain',\n", 802 | " '22297.jpg': 'street',\n", 803 | " '61.jpg': 'forest',\n", 804 | " '9254.jpg': 'mountain',\n", 805 | " '9402.jpg': 'glacier',\n", 806 | " '15786.jpg': 'street',\n", 807 | " '6900.jpg': 'mountain',\n", 808 | " '12575.jpg': 'sea',\n", 809 | " '13407.jpg': 'buildings',\n", 810 | " '3415.jpg': 'forest',\n", 811 | " '16789.jpg': 'glacier',\n", 812 | " '20340.jpg': 'forest',\n", 813 | " '3289.jpg': 'mountain',\n", 814 | " '17134.jpg': 'buildings',\n", 815 | " '15368.jpg': 'glacier',\n", 816 | " '20188.jpg': 'mountain',\n", 817 | " '5259.jpg': 'forest',\n", 818 | " '21235.jpg': 'glacier',\n", 819 | " '19654.jpg': 'street',\n", 820 | " '21925.jpg': 'street',\n", 821 | " '13109.jpg': 'mountain',\n", 822 | " '14427.jpg': 'street',\n", 823 | " '8279.jpg': 'street',\n", 824 | " '16412.jpg': 'mountain',\n", 825 | " '13606.jpg': 'glacier',\n", 826 | " '5723.jpg': 'street',\n", 827 | " '4473.jpg': 'mountain',\n", 828 | " '1800.jpg': 'forest',\n", 829 | " '873.jpg': 'glacier',\n", 830 | " '2112.jpg': 'buildings',\n", 831 | " '16883.jpg': 'forest',\n", 832 | " '21836.jpg': 'street',\n", 833 | " '18750.jpg': 'mountain',\n", 834 | " '9803.jpg': 'glacier',\n", 835 | " '21283.jpg': 'glacier',\n", 836 | " '19619.jpg': 'glacier',\n", 837 | " '6419.jpg': 'street',\n", 838 | " '8508.jpg': 'glacier',\n", 839 | " '21594.jpg': 'mountain',\n", 840 | " '18896.jpg': 'glacier',\n", 841 | " '1830.jpg': 'glacier',\n", 842 | " '4035.jpg': 'mountain',\n", 843 | " '16471.jpg': 'forest',\n", 844 | " '11791.jpg': 'glacier',\n", 845 | " '21974.jpg': 'glacier',\n", 846 | " '23558.jpg': 'forest',\n", 847 | " '16637.jpg': 'mountain',\n", 848 | " '5667.jpg': 'street',\n", 849 | " '17046.jpg': 'glacier',\n", 850 | " '5847.jpg': 'mountain',\n", 851 | " '12954.jpg': 'glacier',\n", 852 | " '19333.jpg': 'street',\n", 853 | " '15420.jpg': 'forest',\n", 854 | " '18049.jpg': 'buildings',\n", 855 | " '423.jpg': 'glacier',\n", 856 | " '12073.jpg': 'mountain',\n", 857 | " '16428.jpg': 'sea',\n", 858 | " '23468.jpg': 'mountain',\n", 859 | " '17386.jpg': 'sea',\n", 860 | " '7352.jpg': 'forest',\n", 861 | " '18892.jpg': 'mountain',\n", 862 | " '10669.jpg': 'street',\n", 863 | " '10885.jpg': 'mountain',\n", 864 | " '10021.jpg': 'forest',\n", 865 | " '22548.jpg': 'street',\n", 866 | " '18013.jpg': 'glacier',\n", 867 | " '14650.jpg': 'buildings',\n", 868 | " '21976.jpg': 'glacier',\n", 869 | " '23850.jpg': 'sea',\n", 870 | " '11832.jpg': 'forest',\n", 871 | " '19518.jpg': 'glacier',\n", 872 | " '4107.jpg': 'street',\n", 873 | " '6952.jpg': 'sea',\n", 874 | " '19190.jpg': 'forest',\n", 875 | " '8395.jpg': 'mountain',\n", 876 | " '13133.jpg': 'glacier',\n", 877 | " '16781.jpg': 'sea',\n", 878 | " '12335.jpg': 'forest',\n", 879 | " '2521.jpg': 'buildings',\n", 880 | " '8270.jpg': 'sea',\n", 881 | " '14484.jpg': 'mountain',\n", 882 | " '7511.jpg': 'mountain',\n", 883 | " '11972.jpg': 'street',\n", 884 | " '8249.jpg': 'street',\n", 885 | " '22573.jpg': 'glacier',\n", 886 | " '16429.jpg': 'forest',\n", 887 | " '3720.jpg': 'glacier',\n", 888 | " '11478.jpg': 'sea',\n", 889 | " '3349.jpg': 'buildings',\n", 890 | " '2982.jpg': 'glacier',\n", 891 | " '14042.jpg': 'buildings',\n", 892 | " '8649.jpg': 'buildings',\n", 893 | " '11916.jpg': 'sea',\n", 894 | " '18857.jpg': 'buildings',\n", 895 | " '20557.jpg': 'mountain',\n", 896 | " '22590.jpg': 'mountain',\n", 897 | " '5645.jpg': 'glacier',\n", 898 | " '7013.jpg': 'sea',\n", 899 | " '22174.jpg': 'buildings',\n", 900 | " '99.jpg': 'forest',\n", 901 | " '12012.jpg': 'street',\n", 902 | " '22403.jpg': 'sea',\n", 903 | " '9809.jpg': 'street',\n", 904 | " '5245.jpg': 'mountain',\n", 905 | " '22069.jpg': 'forest',\n", 906 | " '11564.jpg': 'street',\n", 907 | " '18058.jpg': 'forest',\n", 908 | " '11337.jpg': 'forest',\n", 909 | " '7983.jpg': 'glacier',\n", 910 | " '7943.jpg': 'glacier',\n", 911 | " '10979.jpg': 'glacier',\n", 912 | " '11104.jpg': 'street',\n", 913 | " '11210.jpg': 'buildings',\n", 914 | " '12267.jpg': 'forest',\n", 915 | " '19160.jpg': 'buildings',\n", 916 | " '12293.jpg': 'street',\n", 917 | " '13169.jpg': 'glacier',\n", 918 | " '2047.jpg': 'forest',\n", 919 | " '3707.jpg': 'mountain',\n", 920 | " '12254.jpg': 'buildings',\n", 921 | " '7796.jpg': 'forest',\n", 922 | " '11854.jpg': 'glacier',\n", 923 | " '8094.jpg': 'sea',\n", 924 | " '4751.jpg': 'street',\n", 925 | " '22482.jpg': 'sea',\n", 926 | " '23572.jpg': 'mountain',\n", 927 | " '23483.jpg': 'glacier',\n", 928 | " '428.jpg': 'sea',\n", 929 | " '12847.jpg': 'street',\n", 930 | " '23553.jpg': 'mountain',\n", 931 | " '5751.jpg': 'mountain',\n", 932 | " '2395.jpg': 'glacier',\n", 933 | " '14303.jpg': 'glacier',\n", 934 | " '2585.jpg': 'sea',\n", 935 | " '8154.jpg': 'forest',\n", 936 | " '1414.jpg': 'forest',\n", 937 | " '1847.jpg': 'mountain',\n", 938 | " '5732.jpg': 'forest',\n", 939 | " '16924.jpg': 'street',\n", 940 | " '5999.jpg': 'forest',\n", 941 | " '6141.jpg': 'glacier',\n", 942 | " '16836.jpg': 'street',\n", 943 | " '1008.jpg': 'street',\n", 944 | " '4170.jpg': 'mountain',\n", 945 | " '21002.jpg': 'street',\n", 946 | " '20193.jpg': 'buildings',\n", 947 | " '23440.jpg': 'forest',\n", 948 | " '1975.jpg': 'mountain',\n", 949 | " '15089.jpg': 'forest',\n", 950 | " '12722.jpg': 'street',\n", 951 | " '16791.jpg': 'mountain',\n", 952 | " '9144.jpg': 'glacier',\n", 953 | " '7995.jpg': 'buildings',\n", 954 | " '7743.jpg': 'street',\n", 955 | " '11308.jpg': 'mountain',\n", 956 | " '16678.jpg': 'street',\n", 957 | " '176.jpg': 'glacier',\n", 958 | " '16760.jpg': 'forest',\n", 959 | " '10549.jpg': 'forest',\n", 960 | " '8496.jpg': 'sea',\n", 961 | " '17534.jpg': 'buildings',\n", 962 | " '18969.jpg': 'sea',\n", 963 | " '633.jpg': 'street',\n", 964 | " '20278.jpg': 'glacier',\n", 965 | " '5178.jpg': 'mountain',\n", 966 | " '21616.jpg': 'buildings',\n", 967 | " '8440.jpg': 'sea',\n", 968 | " '19977.jpg': 'forest',\n", 969 | " '14506.jpg': 'forest',\n", 970 | " '17059.jpg': 'street',\n", 971 | " '19191.jpg': 'sea',\n", 972 | " '17172.jpg': 'glacier',\n", 973 | " '6027.jpg': 'street',\n", 974 | " '14017.jpg': 'street',\n", 975 | " '12932.jpg': 'street',\n", 976 | " '9710.jpg': 'mountain',\n", 977 | " '13895.jpg': 'street',\n", 978 | " '3835.jpg': 'street',\n", 979 | " '22146.jpg': 'buildings',\n", 980 | " '23425.jpg': 'sea',\n", 981 | " '17023.jpg': 'sea',\n", 982 | " '11087.jpg': 'forest',\n", 983 | " '3698.jpg': 'forest',\n", 984 | " '13330.jpg': 'sea',\n", 985 | " '20496.jpg': 'street',\n", 986 | " '18695.jpg': 'mountain',\n", 987 | " '9436.jpg': 'mountain',\n", 988 | " '5659.jpg': 'mountain',\n", 989 | " '23372.jpg': 'mountain',\n", 990 | " '4443.jpg': 'mountain',\n", 991 | " '19549.jpg': 'sea',\n", 992 | " '7329.jpg': 'sea',\n", 993 | " '9371.jpg': 'mountain',\n", 994 | " '14926.jpg': 'buildings',\n", 995 | " '18193.jpg': 'buildings',\n", 996 | " '16601.jpg': 'glacier',\n", 997 | " '16318.jpg': 'mountain',\n", 998 | " '22532.jpg': 'street',\n", 999 | " '20594.jpg': 'mountain',\n", 1000 | " '14508.jpg': 'mountain',\n", 1001 | " '6488.jpg': 'glacier',\n", 1002 | " '12023.jpg': 'mountain',\n", 1003 | " '12261.jpg': 'buildings',\n", 1004 | " '7514.jpg': 'glacier',\n", 1005 | " '4468.jpg': 'glacier',\n", 1006 | " '19006.jpg': 'forest',\n", 1007 | " '4804.jpg': 'glacier',\n", 1008 | " '2007.jpg': 'buildings',\n", 1009 | " '3252.jpg': 'mountain',\n", 1010 | " '12844.jpg': 'buildings',\n", 1011 | " '21270.jpg': 'sea',\n", 1012 | " '6965.jpg': 'glacier',\n", 1013 | " '22008.jpg': 'sea',\n", 1014 | " '10292.jpg': 'forest',\n", 1015 | " '17929.jpg': 'street',\n", 1016 | " '6094.jpg': 'sea',\n", 1017 | " '13467.jpg': 'mountain',\n", 1018 | " '2444.jpg': 'forest',\n", 1019 | " '19458.jpg': 'buildings',\n", 1020 | " '23197.jpg': 'forest',\n", 1021 | " '22554.jpg': 'street',\n", 1022 | " '10782.jpg': 'street',\n", 1023 | " '6906.jpg': 'sea',\n", 1024 | " '7070.jpg': 'sea',\n", 1025 | " '14082.jpg': 'sea',\n", 1026 | " '21830.jpg': 'mountain',\n", 1027 | " '14138.jpg': 'glacier',\n", 1028 | " '2499.jpg': 'sea',\n", 1029 | " '22056.jpg': 'forest',\n", 1030 | " '20912.jpg': 'street',\n", 1031 | " '2576.jpg': 'glacier',\n", 1032 | " '9596.jpg': 'street',\n", 1033 | " '22714.jpg': 'forest',\n", 1034 | " '19631.jpg': 'glacier',\n", 1035 | " '16724.jpg': 'mountain',\n", 1036 | " '182.jpg': 'street',\n", 1037 | " '20562.jpg': 'forest',\n", 1038 | " '15881.jpg': 'mountain',\n", 1039 | " '11159.jpg': 'street',\n", 1040 | " '3177.jpg': 'buildings',\n", 1041 | " '1084.jpg': 'buildings',\n", 1042 | " '4995.jpg': 'buildings',\n", 1043 | " '20258.jpg': 'glacier',\n", 1044 | " '8836.jpg': 'glacier',\n", 1045 | " '22905.jpg': 'street',\n", 1046 | " '23583.jpg': 'forest',\n", 1047 | " '15129.jpg': 'street',\n", 1048 | " '18399.jpg': 'mountain',\n", 1049 | " '19575.jpg': 'mountain',\n", 1050 | " '222.jpg': 'buildings',\n", 1051 | " '513.jpg': 'street',\n", 1052 | " '12099.jpg': 'glacier',\n", 1053 | " '21395.jpg': 'mountain',\n", 1054 | " '10406.jpg': 'mountain',\n", 1055 | " '7112.jpg': 'sea',\n", 1056 | " '13542.jpg': 'forest',\n", 1057 | " '24014.jpg': 'glacier',\n", 1058 | " '2972.jpg': 'sea',\n", 1059 | " '15253.jpg': 'street',\n", 1060 | " '13867.jpg': 'mountain',\n", 1061 | " '17342.jpg': 'glacier',\n", 1062 | " '23231.jpg': 'forest',\n", 1063 | " '8645.jpg': 'glacier',\n", 1064 | " '19748.jpg': 'mountain',\n", 1065 | " '19047.jpg': 'forest',\n", 1066 | " '19653.jpg': 'buildings',\n", 1067 | " '12851.jpg': 'glacier',\n", 1068 | " '2009.jpg': 'glacier',\n", 1069 | " '13136.jpg': 'mountain',\n", 1070 | " '16217.jpg': 'forest',\n", 1071 | " '7606.jpg': 'mountain',\n", 1072 | " '20445.jpg': 'mountain',\n", 1073 | " '1355.jpg': 'glacier',\n", 1074 | " '4118.jpg': 'forest',\n", 1075 | " '11121.jpg': 'mountain',\n", 1076 | " '3709.jpg': 'street',\n", 1077 | " '10034.jpg': 'glacier',\n", 1078 | " '13475.jpg': 'forest',\n", 1079 | " '15381.jpg': 'sea',\n", 1080 | " '1036.jpg': 'mountain',\n", 1081 | " '592.jpg': 'forest',\n", 1082 | " '9640.jpg': 'street',\n", 1083 | " '13831.jpg': 'mountain',\n", 1084 | " '23891.jpg': 'buildings',\n", 1085 | " '4592.jpg': 'forest',\n", 1086 | " '8359.jpg': 'glacier',\n", 1087 | " '10931.jpg': 'buildings',\n", 1088 | " '20548.jpg': 'mountain',\n", 1089 | " '14402.jpg': 'glacier',\n", 1090 | " '15623.jpg': 'sea',\n", 1091 | " '11949.jpg': 'forest',\n", 1092 | " '10124.jpg': 'mountain',\n", 1093 | " '11422.jpg': 'glacier',\n", 1094 | " '17271.jpg': 'buildings',\n", 1095 | " '9086.jpg': 'mountain',\n", 1096 | " '6800.jpg': 'forest',\n", 1097 | " '17071.jpg': 'forest',\n", 1098 | " '7866.jpg': 'sea',\n", 1099 | " '23887.jpg': 'street',\n", 1100 | " '21372.jpg': 'street',\n", 1101 | " '22365.jpg': 'buildings',\n", 1102 | " '19980.jpg': 'forest',\n", 1103 | " '2001.jpg': 'mountain',\n", 1104 | " '6581.jpg': 'buildings',\n", 1105 | " '19254.jpg': 'glacier',\n", 1106 | " '10253.jpg': 'glacier',\n", 1107 | " '10906.jpg': 'street',\n", 1108 | " '20323.jpg': 'street',\n", 1109 | " '12527.jpg': 'forest',\n", 1110 | " '17108.jpg': 'sea',\n", 1111 | " '9361.jpg': 'street',\n", 1112 | " '2030.jpg': 'street',\n", 1113 | " '23518.jpg': 'forest',\n", 1114 | " '22489.jpg': 'buildings',\n", 1115 | " '11454.jpg': 'mountain',\n", 1116 | " '4740.jpg': 'buildings',\n", 1117 | " '20551.jpg': 'glacier',\n", 1118 | " '8851.jpg': 'glacier',\n", 1119 | " '19984.jpg': 'mountain',\n", 1120 | " '17082.jpg': 'buildings',\n", 1121 | " '22981.jpg': 'glacier',\n", 1122 | " '4697.jpg': 'glacier',\n", 1123 | " '11322.jpg': 'forest',\n", 1124 | " '10858.jpg': 'forest',\n", 1125 | " '434.jpg': 'sea',\n", 1126 | " '21742.jpg': 'mountain',\n", 1127 | " '23789.jpg': 'forest',\n", 1128 | " '5000.jpg': 'street',\n", 1129 | " '6229.jpg': 'mountain',\n", 1130 | " '2583.jpg': 'sea',\n", 1131 | " '9247.jpg': 'glacier',\n", 1132 | " '19754.jpg': 'glacier',\n", 1133 | " '22485.jpg': 'glacier',\n", 1134 | " '6214.jpg': 'street',\n", 1135 | " '4246.jpg': 'buildings',\n", 1136 | " '9732.jpg': 'street',\n", 1137 | " '23878.jpg': 'buildings',\n", 1138 | " '20248.jpg': 'buildings',\n", 1139 | " '199.jpg': 'forest',\n", 1140 | " '4743.jpg': 'glacier',\n", 1141 | " '3246.jpg': 'glacier',\n", 1142 | " '17290.jpg': 'mountain',\n", 1143 | " '11166.jpg': 'mountain',\n", 1144 | " '19248.jpg': 'mountain',\n", 1145 | " '18727.jpg': 'forest',\n", 1146 | " '4657.jpg': 'sea',\n", 1147 | " '2974.jpg': 'buildings',\n", 1148 | " '12553.jpg': 'street',\n", 1149 | " '11818.jpg': 'sea',\n", 1150 | " '8190.jpg': 'sea',\n", 1151 | " '17100.jpg': 'forest',\n", 1152 | " '23494.jpg': 'glacier',\n", 1153 | " '18994.jpg': 'glacier',\n", 1154 | " '14722.jpg': 'street',\n", 1155 | " '17223.jpg': 'street',\n", 1156 | " '7472.jpg': 'forest',\n", 1157 | " '21577.jpg': 'forest',\n", 1158 | " '12978.jpg': 'forest',\n", 1159 | " '7975.jpg': 'sea',\n", 1160 | " '7958.jpg': 'street',\n", 1161 | " '2634.jpg': 'glacier',\n", 1162 | " '16987.jpg': 'forest',\n", 1163 | " '18563.jpg': 'glacier',\n", 1164 | " '8849.jpg': 'sea',\n", 1165 | " '20914.jpg': 'street',\n", 1166 | " '3472.jpg': 'glacier',\n", 1167 | " '11517.jpg': 'forest',\n", 1168 | " '9802.jpg': 'mountain',\n", 1169 | " '8677.jpg': 'glacier',\n", 1170 | " '8969.jpg': 'forest',\n", 1171 | " '13345.jpg': 'forest',\n", 1172 | " '1348.jpg': 'forest',\n", 1173 | " '19521.jpg': 'glacier',\n", 1174 | " '14682.jpg': 'street',\n", 1175 | " '9713.jpg': 'mountain',\n", 1176 | " '12756.jpg': 'street',\n", 1177 | " '2213.jpg': 'glacier',\n", 1178 | " '1125.jpg': 'glacier',\n", 1179 | " '324.jpg': 'street',\n", 1180 | " '16967.jpg': 'glacier',\n", 1181 | " '20656.jpg': 'glacier',\n", 1182 | " '17407.jpg': 'mountain',\n", 1183 | " '23356.jpg': 'glacier',\n", 1184 | " '130.jpg': 'glacier',\n", 1185 | " '21295.jpg': 'mountain',\n", 1186 | " '3544.jpg': 'mountain',\n", 1187 | " '4219.jpg': 'mountain',\n", 1188 | " '7776.jpg': 'mountain',\n", 1189 | " '19146.jpg': 'street',\n", 1190 | " '6353.jpg': 'glacier',\n", 1191 | " '4262.jpg': 'street',\n", 1192 | " '2711.jpg': 'street',\n", 1193 | " '15663.jpg': 'buildings',\n", 1194 | " '4722.jpg': 'forest',\n", 1195 | " '5408.jpg': 'street',\n", 1196 | " '4072.jpg': 'buildings',\n", 1197 | " '9314.jpg': 'forest',\n", 1198 | " '10415.jpg': 'street',\n", 1199 | " '16635.jpg': 'street',\n", 1200 | " '2305.jpg': 'forest',\n", 1201 | " '19651.jpg': 'glacier',\n", 1202 | " '20795.jpg': 'buildings',\n", 1203 | " '22739.jpg': 'glacier',\n", 1204 | " '15431.jpg': 'glacier',\n", 1205 | " '15337.jpg': 'mountain',\n", 1206 | " '12824.jpg': 'sea',\n", 1207 | " '7589.jpg': 'buildings',\n", 1208 | " '975.jpg': 'sea',\n", 1209 | " '23832.jpg': 'forest',\n", 1210 | " '22530.jpg': 'mountain',\n", 1211 | " '14793.jpg': 'mountain',\n", 1212 | " '4524.jpg': 'street',\n", 1213 | " '21803.jpg': 'glacier',\n", 1214 | " '5967.jpg': 'buildings',\n", 1215 | " '19648.jpg': 'forest',\n", 1216 | " '16729.jpg': 'street',\n", 1217 | " '20022.jpg': 'mountain',\n", 1218 | " '328.jpg': 'mountain',\n", 1219 | " '8078.jpg': 'street',\n", 1220 | " '3206.jpg': 'forest',\n", 1221 | " '11462.jpg': 'mountain',\n", 1222 | " '4080.jpg': 'mountain',\n", 1223 | " '2031.jpg': 'buildings',\n", 1224 | " '20645.jpg': 'glacier',\n", 1225 | " '520.jpg': 'buildings',\n", 1226 | " '18352.jpg': 'mountain',\n", 1227 | " '1935.jpg': 'buildings',\n", 1228 | " '12340.jpg': 'street',\n", 1229 | " '10005.jpg': 'mountain',\n", 1230 | " '17911.jpg': 'buildings',\n", 1231 | " '8888.jpg': 'sea',\n", 1232 | " '20700.jpg': 'sea',\n", 1233 | " ...}" 1234 | ] 1235 | }, 1236 | "execution_count": 16, 1237 | "metadata": {}, 1238 | "output_type": "execute_result" 1239 | } 1240 | ], 1241 | "source": [ 1242 | "pred_dict" 1243 | ] 1244 | }, 1245 | { 1246 | "cell_type": "code", 1247 | "execution_count": null, 1248 | "metadata": {}, 1249 | "outputs": [], 1250 | "source": [] 1251 | } 1252 | ], 1253 | "metadata": { 1254 | "kernelspec": { 1255 | "display_name": "Python 3", 1256 | "language": "python", 1257 | "name": "python3" 1258 | }, 1259 | "language_info": { 1260 | "codemirror_mode": { 1261 | "name": "ipython", 1262 | "version": 3 1263 | }, 1264 | "file_extension": ".py", 1265 | "mimetype": "text/x-python", 1266 | "name": "python", 1267 | "nbconvert_exporter": "python", 1268 | "pygments_lexer": "ipython3", 1269 | "version": "3.7.3" 1270 | } 1271 | }, 1272 | "nbformat": 4, 1273 | "nbformat_minor": 2 1274 | } 1275 | -------------------------------------------------------------------------------- /cnn-scratch-training.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 61, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "#Load libraries\n", 10 | "import os\n", 11 | "import numpy as np\n", 12 | "import torch\n", 13 | "import glob\n", 14 | "import torch.nn as nn\n", 15 | "from torchvision.transforms import transforms\n", 16 | "from torch.utils.data import DataLoader\n", 17 | "from torch.optim import Adam\n", 18 | "from torch.autograd import Variable\n", 19 | "import torchvision\n", 20 | "import pathlib" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 62, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "#checking for device\n", 30 | "device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 63, 36 | "metadata": {}, 37 | "outputs": [ 38 | { 39 | "name": "stdout", 40 | "output_type": "stream", 41 | "text": [ 42 | "cuda\n" 43 | ] 44 | } 45 | ], 46 | "source": [ 47 | "print(device)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": 64, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "#Transforms\n", 57 | "transformer=transforms.Compose([\n", 58 | " transforms.Resize((150,150)),\n", 59 | " transforms.RandomHorizontalFlip(),\n", 60 | " transforms.ToTensor(), #0-255 to 0-1, numpy to tensors\n", 61 | " transforms.Normalize([0.5,0.5,0.5], # 0-1 to [-1,1] , formula (x-mean)/std\n", 62 | " [0.5,0.5,0.5])\n", 63 | "])" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 65, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "#Dataloader\n", 73 | "\n", 74 | "#Path for training and testing directory\n", 75 | "train_path='/home/user/Desktop/pytorch_projects/scene_detection/seg_train/seg_train'\n", 76 | "test_path='/home/user/Desktop/pytorch_projects/scene_detection/seg_test/seg_test'\n", 77 | "\n", 78 | "train_loader=DataLoader(\n", 79 | " torchvision.datasets.ImageFolder(train_path,transform=transformer),\n", 80 | " batch_size=64, shuffle=True\n", 81 | ")\n", 82 | "test_loader=DataLoader(\n", 83 | " torchvision.datasets.ImageFolder(test_path,transform=transformer),\n", 84 | " batch_size=32, shuffle=True\n", 85 | ")" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 66, 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": [ 94 | "#categories\n", 95 | "root=pathlib.Path(train_path)\n", 96 | "classes=sorted([j.name.split('/')[-1] for j in root.iterdir()])" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 67, 102 | "metadata": {}, 103 | "outputs": [ 104 | { 105 | "name": "stdout", 106 | "output_type": "stream", 107 | "text": [ 108 | "['buildings', 'forest', 'glacier', 'mountain', 'sea', 'street']\n" 109 | ] 110 | } 111 | ], 112 | "source": [ 113 | "print(classes)" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 68, 119 | "metadata": {}, 120 | "outputs": [], 121 | "source": [ 122 | "#CNN Network\n", 123 | "\n", 124 | "\n", 125 | "class ConvNet(nn.Module):\n", 126 | " def __init__(self,num_classes=6):\n", 127 | " super(ConvNet,self).__init__()\n", 128 | " \n", 129 | " #Output size after convolution filter\n", 130 | " #((w-f+2P)/s) +1\n", 131 | " \n", 132 | " #Input shape= (256,3,150,150)\n", 133 | " \n", 134 | " self.conv1=nn.Conv2d(in_channels=3,out_channels=12,kernel_size=3,stride=1,padding=1)\n", 135 | " #Shape= (256,12,150,150)\n", 136 | " self.bn1=nn.BatchNorm2d(num_features=12)\n", 137 | " #Shape= (256,12,150,150)\n", 138 | " self.relu1=nn.ReLU()\n", 139 | " #Shape= (256,12,150,150)\n", 140 | " \n", 141 | " self.pool=nn.MaxPool2d(kernel_size=2)\n", 142 | " #Reduce the image size be factor 2\n", 143 | " #Shape= (256,12,75,75)\n", 144 | " \n", 145 | " \n", 146 | " self.conv2=nn.Conv2d(in_channels=12,out_channels=20,kernel_size=3,stride=1,padding=1)\n", 147 | " #Shape= (256,20,75,75)\n", 148 | " self.relu2=nn.ReLU()\n", 149 | " #Shape= (256,20,75,75)\n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " self.conv3=nn.Conv2d(in_channels=20,out_channels=32,kernel_size=3,stride=1,padding=1)\n", 154 | " #Shape= (256,32,75,75)\n", 155 | " self.bn3=nn.BatchNorm2d(num_features=32)\n", 156 | " #Shape= (256,32,75,75)\n", 157 | " self.relu3=nn.ReLU()\n", 158 | " #Shape= (256,32,75,75)\n", 159 | " \n", 160 | " \n", 161 | " self.fc=nn.Linear(in_features=75 * 75 * 32,out_features=num_classes)\n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " #Feed forwad function\n", 166 | " \n", 167 | " def forward(self,input):\n", 168 | " output=self.conv1(input)\n", 169 | " output=self.bn1(output)\n", 170 | " output=self.relu1(output)\n", 171 | " \n", 172 | " output=self.pool(output)\n", 173 | " \n", 174 | " output=self.conv2(output)\n", 175 | " output=self.relu2(output)\n", 176 | " \n", 177 | " output=self.conv3(output)\n", 178 | " output=self.bn3(output)\n", 179 | " output=self.relu3(output)\n", 180 | " \n", 181 | " \n", 182 | " #Above output will be in matrix form, with shape (256,32,75,75)\n", 183 | " \n", 184 | " output=output.view(-1,32*75*75)\n", 185 | " \n", 186 | " \n", 187 | " output=self.fc(output)\n", 188 | " \n", 189 | " return output\n", 190 | " \n", 191 | " \n" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 69, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [ 200 | "model=ConvNet(num_classes=6).to(device)" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 70, 206 | "metadata": {}, 207 | "outputs": [], 208 | "source": [ 209 | "#Optmizer and loss function\n", 210 | "optimizer=Adam(model.parameters(),lr=0.001,weight_decay=0.0001)\n", 211 | "loss_function=nn.CrossEntropyLoss()" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 71, 217 | "metadata": {}, 218 | "outputs": [], 219 | "source": [ 220 | "num_epochs=10" 221 | ] 222 | }, 223 | { 224 | "cell_type": "code", 225 | "execution_count": 72, 226 | "metadata": {}, 227 | "outputs": [], 228 | "source": [ 229 | "#calculating the size of training and testing images\n", 230 | "train_count=len(glob.glob(train_path+'/**/*.jpg'))\n", 231 | "test_count=len(glob.glob(test_path+'/**/*.jpg'))" 232 | ] 233 | }, 234 | { 235 | "cell_type": "code", 236 | "execution_count": 73, 237 | "metadata": {}, 238 | "outputs": [ 239 | { 240 | "name": "stdout", 241 | "output_type": "stream", 242 | "text": [ 243 | "14034 3000\n" 244 | ] 245 | } 246 | ], 247 | "source": [ 248 | "print(train_count,test_count)" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 75, 254 | "metadata": {}, 255 | "outputs": [ 256 | { 257 | "name": "stdout", 258 | "output_type": "stream", 259 | "text": [ 260 | "Epoch: 0 Train Loss: tensor(1.3346) Train Accuracy: 0.777967792503919 Test Accuracy: 0.7336666666666667\n", 261 | "Epoch: 1 Train Loss: tensor(0.6610) Train Accuracy: 0.8466581160039903 Test Accuracy: 0.72\n", 262 | "Epoch: 2 Train Loss: tensor(0.4469) Train Accuracy: 0.8867037195382642 Test Accuracy: 0.7073333333333334\n", 263 | "Epoch: 3 Train Loss: tensor(0.3311) Train Accuracy: 0.9115718968220037 Test Accuracy: 0.7053333333333334\n", 264 | "Epoch: 4 Train Loss: tensor(0.2717) Train Accuracy: 0.9249679350149637 Test Accuracy: 0.7256666666666667\n", 265 | "Epoch: 5 Train Loss: tensor(0.1466) Train Accuracy: 0.9590993301980903 Test Accuracy: 0.752\n", 266 | "Epoch: 6 Train Loss: tensor(0.1425) Train Accuracy: 0.9562491093059712 Test Accuracy: 0.755\n", 267 | "Epoch: 7 Train Loss: tensor(0.0998) Train Accuracy: 0.9713552800342027 Test Accuracy: 0.752\n", 268 | "Epoch: 8 Train Loss: tensor(0.1743) Train Accuracy: 0.9509762006555508 Test Accuracy: 0.7423333333333333\n", 269 | "Epoch: 9 Train Loss: tensor(0.1143) Train Accuracy: 0.9665811600399031 Test Accuracy: 0.744\n" 270 | ] 271 | } 272 | ], 273 | "source": [ 274 | "#Model training and saving best model\n", 275 | "\n", 276 | "best_accuracy=0.0\n", 277 | "\n", 278 | "for epoch in range(num_epochs):\n", 279 | " \n", 280 | " #Evaluation and training on training dataset\n", 281 | " model.train()\n", 282 | " train_accuracy=0.0\n", 283 | " train_loss=0.0\n", 284 | " \n", 285 | " for i, (images,labels) in enumerate(train_loader):\n", 286 | " if torch.cuda.is_available():\n", 287 | " images=Variable(images.cuda())\n", 288 | " labels=Variable(labels.cuda())\n", 289 | " \n", 290 | " optimizer.zero_grad()\n", 291 | " \n", 292 | " outputs=model(images)\n", 293 | " loss=loss_function(outputs,labels)\n", 294 | " loss.backward()\n", 295 | " optimizer.step()\n", 296 | " \n", 297 | " \n", 298 | " train_loss+= loss.cpu().data*images.size(0)\n", 299 | " _,prediction=torch.max(outputs.data,1)\n", 300 | " \n", 301 | " train_accuracy+=int(torch.sum(prediction==labels.data))\n", 302 | " \n", 303 | " train_accuracy=train_accuracy/train_count\n", 304 | " train_loss=train_loss/train_count\n", 305 | " \n", 306 | " \n", 307 | " # Evaluation on testing dataset\n", 308 | " model.eval()\n", 309 | " \n", 310 | " test_accuracy=0.0\n", 311 | " for i, (images,labels) in enumerate(test_loader):\n", 312 | " if torch.cuda.is_available():\n", 313 | " images=Variable(images.cuda())\n", 314 | " labels=Variable(labels.cuda())\n", 315 | " \n", 316 | " outputs=model(images)\n", 317 | " _,prediction=torch.max(outputs.data,1)\n", 318 | " test_accuracy+=int(torch.sum(prediction==labels.data))\n", 319 | " \n", 320 | " test_accuracy=test_accuracy/test_count\n", 321 | " \n", 322 | " \n", 323 | " print('Epoch: '+str(epoch)+' Train Loss: '+str(train_loss)+' Train Accuracy: '+str(train_accuracy)+' Test Accuracy: '+str(test_accuracy))\n", 324 | " \n", 325 | " #Save the best model\n", 326 | " if test_accuracy>best_accuracy:\n", 327 | " torch.save(model.state_dict(),'best_checkpoint.model')\n", 328 | " best_accuracy=test_accuracy\n", 329 | " \n", 330 | " \n" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": null, 336 | "metadata": {}, 337 | "outputs": [], 338 | "source": [] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": null, 343 | "metadata": {}, 344 | "outputs": [], 345 | "source": [] 346 | } 347 | ], 348 | "metadata": { 349 | "kernelspec": { 350 | "display_name": "Python 3", 351 | "language": "python", 352 | "name": "python3" 353 | }, 354 | "language_info": { 355 | "codemirror_mode": { 356 | "name": "ipython", 357 | "version": 3 358 | }, 359 | "file_extension": ".py", 360 | "mimetype": "text/x-python", 361 | "name": "python", 362 | "nbconvert_exporter": "python", 363 | "pygments_lexer": "ipython3", 364 | "version": "3.7.3" 365 | } 366 | }, 367 | "nbformat": 4, 368 | "nbformat_minor": 2 369 | } 370 | -------------------------------------------------------------------------------- /img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaurav67890/Pytorch_Tutorials/25afb854d4cd7ebf1ab1473a093b5ceb4c97c3a8/img.png -------------------------------------------------------------------------------- /out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gaurav67890/Pytorch_Tutorials/25afb854d4cd7ebf1ab1473a093b5ceb4c97c3a8/out.png --------------------------------------------------------------------------------