{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PyTorch Intro\n",
    "PyTorch Official Tutorial: https://pytorch.org/tutorials/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torchvision\n",
    "from torchvision import transforms\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "import pdb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import loader # a module (.py file) we created. Read for more information\n",
    "\n",
    "basic_transformer = transforms.Compose([transforms.ToTensor()])\n",
    "\n",
    "batch_size = 32\n",
    "\n",
    "trainloader, validloader = loader.get_data_loader(basic_transformer, basic_transformer, batch_size)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 3, 30, 30])\n",
      "torch.Size([32])\n",
      "tensor([3, 4, 2, 4, 3, 1, 3, 3, 4, 0, 0, 3, 0, 0, 0, 3, 0, 1, 3, 3, 3, 3, 2, 1,\n",
      "        1, 0, 2, 4, 0, 2, 2, 4])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nq5tzWSxpY0oAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x137641fdac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nExIoFD8hgfK/Zeh8tSpIESwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1376464f240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nISLl/wGPiMPK1oTdVwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x137643585f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x13764370a90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# [32, 3, 30, 30] = [batch size, channels, height, width]\n",
    "for x, y in trainloader:\n",
    "    print(x.shape)\n",
    "    print(y.shape)\n",
    "    print(y)\n",
    "    break\n",
    "\n",
    "# vis\n",
    "for i in range(4):\n",
    "    plt.imshow(np.transpose(x[i,:], (1,2,0))) # 30 x 30 x 3\n",
    "    plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class CNN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(CNN, self).__init__()\n",
    "        \n",
    "        # define the layers\n",
    "        # kernel size = 3 means (3,3) kernel\n",
    "        # rgb -> 3 -> in channel\n",
    "        # number of feature maps = 16\n",
    "        # number of filters = 3 x 16\n",
    "        self.l1 = nn.Conv2d(kernel_size=3, in_channels=3, out_channels=16)\n",
    "        self.pool = nn.MaxPool2d(kernel_size=2, stride=2) \n",
    "        # MaxPool2d, AvgPool2d. \n",
    "        # The first 2 = 2x2 kernel size, \n",
    "        # The second 2 means the stride=2\n",
    "        \n",
    "        self.l2 = nn.Conv2d(kernel_size=3, in_channels=16, out_channels=32)\n",
    "        \n",
    "        # FC layer\n",
    "        self.fc1 = nn.Linear(32 * 6 * 6, 5)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # define the data flow through the deep learning layers\n",
    "        x = self.pool(F.relu(self.l1(x))) # bs x 16 x 14 x 14\n",
    "        x = self.pool(F.relu(self.l2(x))) # bs x 32 x 6 x 6\n",
    "        # print(x.shape)\n",
    "        x = x.reshape(-1, 32*6*6) # [bs x 1152]# CRUCIAL: \n",
    "        # print(x.shape)\n",
    "        x = self.fc1(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 5])\n"
     ]
    }
   ],
   "source": [
    "m = CNN()\n",
    "pred = m(x)\n",
    "print(pred.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.1389, -0.1451, -0.0188,  0.1282,  0.0480],\n",
      "        [ 0.0837, -0.1823, -0.0440,  0.1306,  0.0502],\n",
      "        [ 0.0972, -0.1101, -0.0358,  0.0636, -0.0235],\n",
      "        [ 0.0963, -0.1282, -0.0590,  0.0743,  0.0378],\n",
      "        [ 0.0903, -0.1250,  0.0056,  0.0623,  0.0411],\n",
      "        [ 0.1539, -0.1484, -0.0230,  0.1110,  0.0798],\n",
      "        [ 0.1376, -0.1103, -0.0608,  0.1110,  0.0820],\n",
      "        [ 0.1142, -0.1438, -0.0356,  0.1158,  0.0724],\n",
      "        [ 0.1224, -0.1528, -0.0405,  0.0931,  0.0686],\n",
      "        [ 0.1317, -0.1428, -0.0551,  0.1094,  0.0748],\n",
      "        [ 0.0518, -0.0676, -0.0102,  0.0811, -0.0141],\n",
      "        [ 0.1016, -0.1283, -0.0497,  0.1051,  0.0614],\n",
      "        [ 0.0732, -0.1549, -0.0186,  0.1048,  0.0533],\n",
      "        [ 0.1063, -0.0692, -0.0035,  0.0940, -0.0044],\n",
      "        [ 0.1001, -0.1026, -0.0428,  0.1036,  0.0403],\n",
      "        [ 0.1442, -0.1446, -0.0355,  0.1190,  0.0485],\n",
      "        [ 0.0880, -0.1035, -0.0244,  0.0735,  0.0138],\n",
      "        [ 0.1369, -0.0970, -0.0386,  0.1251,  0.0291],\n",
      "        [ 0.0835, -0.1019, -0.0264,  0.0888,  0.0636],\n",
      "        [ 0.1267, -0.1036, -0.0540,  0.0873,  0.0554],\n",
      "        [ 0.1432, -0.1275, -0.0224,  0.1252,  0.0886],\n",
      "        [ 0.0985, -0.1454, -0.0625,  0.0864,  0.0945],\n",
      "        [ 0.1226, -0.1272, -0.0195,  0.0849,  0.0290],\n",
      "        [ 0.1117, -0.1112, -0.0201,  0.1037,  0.0056],\n",
      "        [ 0.1661, -0.1728, -0.0139,  0.1423,  0.0711],\n",
      "        [ 0.0902, -0.1262, -0.0275,  0.0879,  0.0407],\n",
      "        [ 0.1202, -0.1127, -0.0048,  0.1271,  0.0285],\n",
      "        [ 0.1135, -0.1468, -0.0286,  0.0741,  0.0678],\n",
      "        [ 0.1235, -0.1544,  0.0003,  0.1102,  0.0477],\n",
      "        [ 0.1101, -0.1680, -0.0343,  0.1219,  0.0501],\n",
      "        [ 0.1351, -0.1058, -0.0293,  0.1328,  0.0722],\n",
      "        [ 0.0958, -0.1386, -0.0311,  0.1073,  0.0655]],\n",
      "       grad_fn=<AddmmBackward>)\n"
     ]
    }
   ],
   "source": [
    "print(pred)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "criterion = nn.CrossEntropyLoss()\n",
    "num_epoches = 10\n",
    "import tqdm\n",
    "\n",
    "import torch.optim as optim\n",
    "\n",
    "\n",
    "USE_CUDA = torch.cuda.is_available()\n",
    "\n",
    "if USE_CUDA:\n",
    "    m = m.cuda()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:21<00:00, 18.37it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:07<00:00, 53.70it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:08<00:00, 46.07it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:08<00:00, 48.68it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:08<00:00, 48.44it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:07<00:00, 53.69it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:06<00:00, 56.31it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:06<00:00, 56.63it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:07<00:00, 53.78it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████| 391/391 [00:07<00:00, 55.18it/s]\n"
     ]
    }
   ],
   "source": [
    "for epoch_id in range(num_epoches):\n",
    "    optimizer = optim.SGD(m.parameters(), lr=0.01 * 0.95 ** epoch_id)\n",
    "    for x, y in tqdm.tqdm(trainloader):\n",
    "        if USE_CUDA:\n",
    "            x, y = x.cuda(), y.cuda()\n",
    "        optimizer.zero_grad() # clear (reset) the gradient for the optimizer\n",
    "        pred = m(x)\n",
    "        loss = criterion(pred, y)\n",
    "        loss.backward() # calculating the gradient\n",
    "        optimizer.step() # backpropagation: optimize the model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Testing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████| 79/79 [00:01<00:00, 66.07it/s]\n"
     ]
    }
   ],
   "source": [
    "all_gt = []\n",
    "all_pred = []\n",
    "\n",
    "for x, y in tqdm.tqdm(validloader):\n",
    "    if USE_CUDA:\n",
    "        x, y = x.cuda(), y.cuda()\n",
    "    all_gt += list(y.detach().cpu().numpy().reshape(-1))\n",
    "    pred = torch.argmax(m(x), dim=1)\n",
    "    all_pred += list(pred.detach().cpu().numpy().reshape(-1))\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
      "[3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 0, 3, 3, 3, 3, 3, 3, 1, 3, 1, 3, 2, 0, 2, 3, 3, 4, 3, 4, 3, 3, 3, 3, 1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 4, 3, 1, 3, 3, 0, 3, 1, 3, 4, 3, 3, 3, 1, 3, 3, 2, 4, 3, 1, 1, 4, 3, 3, 4, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 3, 3, 3, 3, 0, 3, 3, 3, 4, 1, 3, 1, 2, 3, 3, 3, 1, 3, 1, 3, 2, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 1, 3, 0, 4, 3, 1, 3, 3, 3, 3, 3, 3, 3, 0, 4, 3, 3, 3, 3, 4, 3, 3, 1, 3, 3, 2, 4, 0, 1, 3, 3, 3, 3, 1, 0, 3, 3, 3, 3, 1, 3, 0, 3, 3, 3, 3, 3, 3, 1, 4, 3, 2, 1, 4, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 1, 0, 3, 3, 1, 2, 3, 4, 3, 3, 3, 1, 4, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4, 3, 0, 3, 3, 3, 3, 2, 1, 3, 3, 3, 0, 2, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 4, 2, 3, 3, 1, 3, 1, 3, 4, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 4, 1, 3, 4, 1, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 4, 1, 1, 4, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 1, 3, 4, 1, 3, 3, 1, 3, 0, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 1, 3, 3, 4, 3, 1, 3, 3, 3, 0, 3, 3, 1, 3, 3, 1, 4, 2, 2, 4, 2, 1, 2, 2, 2, 3, 2, 2, 4, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 2, 2, 4, 2, 2, 2, 2, 4, 3, 2, 3, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 4, 1, 2, 4, 2, 2, 2, 4, 2, 2, 4, 1, 4, 2, 2, 4, 1, 2, 3, 0, 4, 2, 2, 2, 2, 2, 4, 2, 3, 2, 4, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 0, 2, 2, 2, 1, 2, 4, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, 3, 2, 2, 2, 2, 0, 2, 4, 2, 1, 4, 2, 3, 2, 1, 2, 2, 2, 2, 2, 0, 2, 4, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 4, 2, 4, 2, 2, 4, 1, 0, 2, 3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 4, 2, 1, 2, 2, 4, 4, 0, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 4, 4, 2, 0, 2, 2, 0, 2, 2, 2, 4, 4, 2, 4, 2, 2, 1, 1, 2, 3, 2, 2, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 0, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 4, 2, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 1, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 2, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 3, 0, 0, 0, 4, 2, 0, 0, 2, 3, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 4, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 3, 0, 1, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 3, 3, 0, 4, 0, 4, 0, 4, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 2, 0, 4, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 4, 0, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 3, 4, 4, 3, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2, 4, 4, 3, 4, 4, 4, 4, 2, 4, 4, 3, 2, 2, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 3, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 2, 0, 3, 0, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 0, 3, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 2, 0, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 2, 2, 4, 2, 2, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 3, 4, 2, 2, 2, 2, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 3, 4, 4, 4, 4, 4, 2, 4, 4, 4, 0, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 4, 4, 3, 4, 4, 2, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 3, 2, 4, 4, 0, 0, 4, 4, 4, 2, 2, 3, 4, 3, 4, 4, 3, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 3, 2, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 3, 0, 2, 4, 2, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 0, 3, 2, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1]\n"
     ]
    }
   ],
   "source": [
    "print(all_gt)\n",
    "print(all_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy is: 0.796\n"
     ]
    }
   ],
   "source": [
    "acc = np.sum(np.array(all_gt) == np.array(all_pred)) / len(all_gt)\n",
    "print(\"Accuracy is:\", acc)"
   ]
  }
 ],
 "metadata": {
  "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.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
