Skip to content
Snippets Groups Projects
network-test.ipynb 118 KiB
Newer Older
  • Learn to ignore specific revisions
  • johannes bilk's avatar
    johannes bilk committed
    {
     "cells": [
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "# Testing the Network\n",
        "\n",
        "## Importing the Basics"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 1,
       "metadata": {},
       "outputs": [],
       "source": [
        "import numpy as np\n",
        "from matplotlib import pyplot as plt\n",
    
        "from nn.module import Sequential\n",
    
    johannes bilk's avatar
    johannes bilk committed
        "from nn.optim import SGD, SGDMomentum, NesterovMomentum, AdaGrad, AdaDelta, RMSprop, Adam\n",
    
        "from nn.scheduler import ExponentialLR, SteppedLR, CyclicalLR\n",
    
    johannes bilk's avatar
    johannes bilk committed
        "from nn.loss import CrossEntropyLoss, MSELoss, NLLLoss, MAELoss, FocalLoss\n",
    
        "from data import Data\n",
    
    johannes bilk's avatar
    johannes bilk committed
        "from nn.observable import NetworkObservables\n",
    
        "from metric import ConfusionMatrix\n",
        "from utility import ModelIO, Progressbar\n",
        "from nn import (\n",
        "    Linear, Dropout, Flatten, Convolution2D, Unsqueeze,\n",
        "    BatchNorm1D, BatchNorm2D,\n",
        "    Tanh, SoftMax, Sigmoid, SoftPlus, Relu, Elu, LeakyRelu, SoftSign, Identity\n",
        ")"
    
    johannes bilk's avatar
    johannes bilk committed
    34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
       ]
      },
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Generating Test Data\n",
        "\n",
        "Simple data set of 9x9 matrices with one somewhere down or along the matrix. This is for testing purposses only.\n",
        "\n",
        "### Generating Data"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 2,
       "metadata": {},
       "outputs": [],
       "source": [
        "categories = 4\n",
        "data = Data(trainAmount=6400, evalAmount=3200, batchSize=128, kFold=4, dataPath='datafiles')\n",
        "data.generateTestData(categories)"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 3,
       "metadata": {},
       "outputs": [
        {
         "data": {
          "text/plain": [
           "<matplotlib.image.AxesImage at 0x118f56fd0>"
          ]
         },
         "execution_count": 3,
         "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": [
        "plt.imshow(data.trainSet.data[0])"
       ]
      },
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Creating a Sequential\n",
        "\n",
        "This contains a list of layers, that are worked through one by one. Here I add a learning layer and after it an activation layer."
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 4,
       "metadata": {},
       "outputs": [],
       "source": [
        "convolution = False\n",
        "dropout = 0.35\n",
        "norming = False\n",
        "numLayers = 5"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 5,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "(0) Flatten\n",
          "(1) Linear    input size: 81    output size: 81\n",
          "(2) Dropout    size: 81    probability: 0.35\n",
          "(3) Tanh\n",
          "(4) Linear    input size: 81    output size: 81\n",
          "(5) Dropout    size: 81    probability: 0.35\n",
          "(6) Tanh\n",
          "(7) Linear    input size: 81    output size: 81\n",
          "(8) Dropout    size: 81    probability: 0.35\n",
          "(9) Tanh\n",
          "(10) Linear    input size: 81    output size: 81\n",
          "(11) Dropout    size: 81    probability: 0.35\n",
          "(12) Tanh\n",
          "(13) Linear    input size: 81    output size: 4\n",
          "(14) SoftMax\n",
          "\n"
         ]
        }
       ],
       "source": [
        "neurons = 81\n",
        "network = Sequential()\n",
        "if convolution is True:\n",
        "    neurons = 147\n",
        "    network.append(Unsqueeze((1,9,9)))\n",
        "    network.append(Convolution2D(1,3))\n",
        "    network.append(Tanh())\n",
        "    if norming == True:\n",
        "        network.append(BatchNorm2D((3,7,7)))\n",
        "\n",
        "for i in range(numLayers-1):\n",
        "    if i == 0:\n",
        "        network.append(Flatten())\n",
        "    network.append(Linear(neurons,neurons))\n",
        "    network.append(Dropout(neurons,dropout))\n",
        "    network.append(Tanh())\n",
        "    if norming == True:\n",
        "        network.append(BatchNorm1D(neurons))\n",
        "\n",
        "network.append(Linear(neurons,categories))\n",
        "network.append(SoftMax())\n",
        "print(network)"
       ]
      },
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Loss and Optimizer\n",
        "\n",
        "Picking the loss function and initilizing the optimizer by handing over a list of layers."
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 6,
       "metadata": {},
       "outputs": [],
       "source": [
        "loss = 'entropy'\n",
        "optimizer = 'rmsprop'\n",
        "learningRate = 0.001\n",
        "momentum = 0.9\n",
        "schedulerName = 'expo'\n",
        "schedulerBool = False\n",
        "decay = 0.9\n",
        "stepSize = 10"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 7,
       "metadata": {},
       "outputs": [],
       "source": [
        "if loss == 'entropy':\n",
        "    lossFunc = CrossEntropyLoss()\n",
        "elif loss == 'nllloss':\n",
        "    lossFunc = NLLLoss()\n",
        "elif loss == 'focal':\n",
        "    lossFunc = FocalLoss()\n",
        "\n",
        "if optimizer == 'sgd':\n",
        "    optim = SGD(network, learningRate)\n",
        "elif optimizer == 'momentum':\n",
        "    optim = SGDMomentum(network, learningRate, momentum)\n",
        "elif optimizer == 'nesterov':\n",
        "    optim = NesterovMomentum(network, learningRate, momentum)\n",
        "elif optimizer == 'adagrad':\n",
        "    optim = AdaGrad(network, learningRate)\n",
        "elif optimizer == 'adadelta':\n",
        "    optim = AdaDelta(network, learningRate)\n",
        "elif optimizer == 'rmsprop':\n",
        "    optim = RMSprop(network, learningRate)\n",
        "elif optimizer == 'adam':\n",
        "    optim = Adam(network, learningRate)\n",
        "\n",
        "\n",
        "if schedulerBool == True:\n",
        "    if schedulerName == 'expo':\n",
        "        scheduler = ExponentialLR(optim, decay)\n",
        "    elif schedulerName == 'stepped':\n",
        "        scheduler = SteppedLR(optim, decay, stepSize)\n",
        "    elif schedulerName == 'else':\n",
        "        scheduler = CyclicalLR(optim, 1/5, 15, 5)"
       ]
      },
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Running over Data"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 8,
       "metadata": {},
       "outputs": [],
       "source": [
        "epochs = 100"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 9,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "epoch 001/100 |\u001b[0m\u001b[31m\u001b[0m\u001b[0m\u001b[31m \u001b[0m                                                 | 00%\r"
         ]
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "losses: \u001b[1m\u001b[37m0.49729\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[37m0.09867\u001b[0m    accuracy: \u001b[1m\u001b[37m0.48438\u001b[0m    \n",
          "losses: \u001b[1m\u001b[37m0.41132\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[37m0.0802\u001b[0m     accuracy: \u001b[1m\u001b[37m0.5\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.38994\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.10748\u001b[0m    accuracy: \u001b[1m\u001b[31m0.40625\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.37619\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.07496\u001b[0m    accuracy: \u001b[1m\u001b[31m0.57031\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.36574\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.07514\u001b[0m    accuracy: \u001b[1m\u001b[31m0.51562\u001b[0m    \n",
          "losses: \u001b[1m\u001b[33m0.36658\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.0731\u001b[0m     accuracy: \u001b[1m\u001b[31m0.55469\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.35791\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.07275\u001b[0m    accuracy: \u001b[1m\u001b[31m0.54688\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.27411\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.03907\u001b[0m    accuracy: \u001b[1m\u001b[31m0.86719\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.19936\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.02833\u001b[0m    accuracy: \u001b[1m\u001b[31m0.95312\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.17114\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.08936\u001b[0m    accuracy: \u001b[1m\u001b[31m0.78906\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.13173\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00382\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.09931\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00169\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.08937\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00319\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.0929\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00211\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.08361\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00102\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.07231\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00137\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.06781\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00089\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.06132\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00067\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[33m0.06359\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00066\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.06332\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00142\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.05916\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00089\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.05291\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00521\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.05816\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00108\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.05007\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.005\u001b[0m      accuracy: \u001b[1m\u001b[31m0.97656\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.04786\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00032\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.04677\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00044\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.04867\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00305\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.05613\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00043\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.04576\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00033\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.04427\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00144\u001b[0m    accuracy: \u001b[1m\u001b[31m0.98438\u001b[0m    \n",
          "losses: \u001b[1m\u001b[33m0.0448\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.0015\u001b[0m     accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.04478\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00316\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.03432\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00054\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.0372\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.10686\u001b[0m    accuracy: \u001b[1m\u001b[31m0.72656\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.03999\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.01986\u001b[0m    accuracy: \u001b[1m\u001b[31m0.92188\u001b[0m    \n",
          "losses: \u001b[1m\u001b[33m0.03515\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.13962\u001b[0m    accuracy: \u001b[1m\u001b[31m0.70312\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.03808\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00076\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.03753\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00015\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.03672\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00081\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.03007\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00013\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.03121\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00025\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.03534\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00065\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.02849\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.00012\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.03147\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00066\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.03631\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00025\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.02836\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00031\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.03343\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m0.0001\u001b[0m     accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.03032\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00087\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.03198\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00046\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.02753\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00086\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.02652\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00037\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.02677\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00031\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.02311\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.01916\u001b[0m    accuracy: \u001b[1m\u001b[31m0.9375\u001b[0m     \n",
          "losses: \u001b[1m\u001b[31m0.02575\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00021\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.02486\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00073\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.02223\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00306\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.02786\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00021\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.02345\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00023\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.02363\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00086\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.02441\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00011\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.02292\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00538\u001b[0m    accuracy: \u001b[1m\u001b[31m0.97656\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.02007\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.0002\u001b[0m     accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.02292\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00031\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.022\u001b[0m      learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00015\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.02332\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00018\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.02117\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00093\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.02278\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00408\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.01921\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00293\u001b[0m    accuracy: \u001b[1m\u001b[31m0.98438\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.0217\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00021\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.01917\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00027\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.02403\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00034\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.01793\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00516\u001b[0m    accuracy: \u001b[1m\u001b[31m0.97656\u001b[0m    \n",
          "losses: \u001b[1m\u001b[33m0.0206\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00036\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.02188\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00142\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.01368\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00051\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.01971\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00017\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01667\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.0001\u001b[0m     accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01897\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.0002\u001b[0m     accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01696\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00014\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01589\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.04701\u001b[0m    accuracy: \u001b[1m\u001b[31m0.875\u001b[0m      \n",
          "losses: \u001b[1m\u001b[31m0.01759\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m9e-05\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01656\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.05435\u001b[0m    accuracy: \u001b[1m\u001b[31m0.85156\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.01878\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00018\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01652\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00012\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.01365\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00144\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[33m0.01495\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.01523\u001b[0m    accuracy: \u001b[1m\u001b[31m0.96094\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.01864\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00022\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01784\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00014\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01584\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00097\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[31m0.01781\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00013\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.0147\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00028\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01458\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.0001\u001b[0m     accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01514\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00011\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01568\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00033\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01703\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00037\u001b[0m    accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
          "losses: \u001b[1m\u001b[32m0.01226\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00012\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[33m0.01413\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[33m0.00012\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[32m0.01076\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00019\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01424\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[32m7e-05\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
          "losses: \u001b[1m\u001b[31m0.01674\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      validation: \u001b[1m\u001b[31m0.00083\u001b[0m    accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n"
         ]
        }
       ],
       "source": [
        "metrics = NetworkObservables(epochs)\n",
        "for i in range(epochs):\n",
        "    data.trainMode()\n",
        "    network.train()\n",
        "    length = len(data.trainSet)\n",
        "    bar = Progressbar(f'epoch {str(i+1).zfill(len(str(epochs)))}/{epochs}', length)\n",
        "    for item in data.train:\n",
        "        inputs = item['data']\n",
        "        labels = item['labels']\n",
        "        prediction = network(inputs)\n",
        "        loss = lossFunc(prediction, labels)\n",
        "        metrics.update('losses', loss, len(inputs) * (data.kFold - 1))\n",
        "        gradient = lossFunc.backward()\n",
        "        optim.step(gradient)\n",
        "        bar.step()\n",
        "    metrics.update('learningRate', optim.learningRate)\n",
        "    data.evalMode()\n",
        "    network.eval()\n",
        "    for item in data.train:\n",
        "        inputs = item['data']\n",
        "        labels = item['labels']\n",
        "        prediction = network(inputs)\n",
        "        loss = lossFunc(prediction, labels)\n",
        "        metrics.update('validation', loss, len(inputs))\n",
        "        accuracy = np.sum(prediction.argmax(1) == labels.argmax(1)) / len(prediction)\n",
        "        bar.step()\n",
        "    if schedulerBool:\n",
        "        scheduler.step()\n",
        "    metrics.update('accuracy', accuracy)\n",
        "    metrics.print()\n",
        "    metrics.step()\n",
        "    data.fold()"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 10,
       "metadata": {},
       "outputs": [
        {
         "data": {
          "image/png": "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",
          "text/plain": [
           "<Figure size 640x480 with 2 Axes>"
          ]
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ],
       "source": [
        "fig, ax = plt.subplots()\n",
        "ax3 = ax.twinx()\n",
        "lns1 = ax.plot(metrics.losses.values, label='Train Loss')\n",
        "lns2 = ax.plot(metrics.validation.values, label='Eval Loss')\n",
        "lns3 = ax.plot(metrics.accuracy.values, label='Accuracy')\n",
        "lns4 = ax3.plot(metrics.learningRate.values, label='learning rate', color='tab:gray', ls='--')\n",
        "\n",
        "lns = lns1+lns2+lns3+lns4\n",
        "labs = [lab.get_label() for lab in lns]\n",
        "ax.legend(lns, labs)\n",
        "\n",
        "ax.grid(ls=':')"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 11,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "evaluation |\u001b[0m\u001b[31m⣿⣿⣿⣿\u001b[0m\u001b[0m\u001b[31m \u001b[0m                                             | 08%\r"
         ]
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "evaluation |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| done ✔[0m\u001b[0m\u001b[32m \u001b[0m | 96%\n"
         ]
        }
       ],
       "source": [
        "confusion = ConfusionMatrix(categories)\n",
        "network.eval()\n",
        "length = len(data.eval)\n",
        "bar = Progressbar('evaluation', length)\n",
        "for item in data.eval:\n",
        "    inputs = item['data']\n",
        "    labels = item['labels']\n",
        "    prediction = network(inputs)\n",
        "    confusion.update(prediction, labels)\n",
        "    bar.step()\n",
        "confusion.percentages()\n",
        "confusion.calcScores()"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 12,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "━━━━━━━━━━━━━━━━━━━━━━━━ evaluation ━━━━━━━━━━━━━━━━━━━━━━━━\n",
          "————————————————————— confusion matrix —————————————————————\n",
          "              Class 0     Class 1     Class 2     Class 3   \n",
          "····························································\n",
          "     Class 0    3171         0           29          0      \n",
          "                24%          0%          0%          0%     \n",
          "····························································\n",
          "     Class 1     0          3190         0           10     \n",
          "                 0%         24%          0%          0%     \n",
          "····························································\n",
          "     Class 2     0           0          3200         0      \n",
          "                 0%          0%         25%          0%     \n",
          "····························································\n",
          "     Class 3     0           0           0          3200    \n",
          "                 0%          0%          0%         25%     \n",
          "\n",
          "———————————————————————————————— scores ———————————————————————————————\n",
          "                accuracy       precision      sensitivity      miss rate    \n",
          "·······································································\n",
          "     Class 0     0.998            1.0            0.991           0.009      \n",
          "     Class 1     0.999            1.0            0.997           0.003      \n",
          "     Class 2     0.998           0.991            1.0             0.0       \n",
          "     Class 3     0.999           0.997            1.0             0.0       \n",
          "·······································································\n",
          "       total     0.998           0.997           0.997           0.003      \n"
         ]
        }
       ],
       "source": [
        "print(confusion)"
       ]
      },
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Saving and Loading a Sequential\n",
        "\n",
        "Sequentilas can be converted to dictionaries and then saved as a json file. This allows us to load them and re-use them. Also json is a raw text format, which is neat."
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 13,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "(0) Flatten\n",
          "(1) Linear    input size: 81    output size: 81\n",
          "(2) Dropout    size: 81    probability: 0.35\n",
          "(3) Tanh\n",
          "(4) Linear    input size: 81    output size: 81\n",
          "(5) Dropout    size: 81    probability: 0.35\n",
          "(6) Tanh\n",
          "(7) Linear    input size: 81    output size: 81\n",
          "(8) Dropout    size: 81    probability: 0.35\n",
          "(9) Tanh\n",
          "(10) Linear    input size: 81    output size: 81\n",
          "(11) Dropout    size: 81    probability: 0.35\n",
          "(12) Tanh\n",
          "(13) Linear    input size: 81    output size: 4\n",
          "(14) SoftMax\n",
          "\n"
         ]
        }
       ],
       "source": [
        "saver = ModelIO()\n",
        "saver.save(network, 'test')\n",
        "newNetwork = saver.load('test')\n",
        "print(newNetwork)"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 14,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "evaluation |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| done ✔[0m\u001b[0m\u001b[32m \u001b[0m | 96%\n"
         ]
        }
       ],
       "source": [
        "newConfusion = ConfusionMatrix(categories)\n",
        "newNetwork.eval()\n",
        "length = len(data.eval)\n",
        "bar = Progressbar('evaluation', length)\n",
        "for item in data.eval:\n",
        "    inputs = item['data']\n",
        "    labels = item['labels']\n",
        "    prediction = newNetwork(inputs)\n",
        "    newConfusion.update(prediction, labels)\n",
        "    bar.step()\n",
        "newConfusion.percentages()\n",
        "newConfusion.calcScores()"
       ]
      },
      {
       "cell_type": "code",
       "execution_count": 15,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "━━━━━━━━━━━━━━━━━━━━━━━━ evaluation ━━━━━━━━━━━━━━━━━━━━━━━━\n",
          "————————————————————— confusion matrix —————————————————————\n",
          "              Class 0     Class 1     Class 2     Class 3   \n",
          "····························································\n",
          "     Class 0    3171         0           29          0      \n",
          "                24%          0%          0%          0%     \n",
          "····························································\n",
          "     Class 1     0          3190         0           10     \n",
          "                 0%         24%          0%          0%     \n",
          "····························································\n",
          "     Class 2     0           0          3200         0      \n",
          "                 0%          0%         25%          0%     \n",
          "····························································\n",
          "     Class 3     0           0           0          3200    \n",
          "                 0%          0%          0%         25%     \n",
          "\n",
          "———————————————————————————————— scores ———————————————————————————————\n",
          "                accuracy       precision      sensitivity      miss rate    \n",
          "·······································································\n",
          "     Class 0     0.998            1.0            0.991           0.009      \n",
          "     Class 1     0.999            1.0            0.997           0.003      \n",
          "     Class 2     0.998           0.991            1.0             0.0       \n",
          "     Class 3     0.999           0.997            1.0             0.0       \n",
          "·······································································\n",
          "       total     0.998           0.997           0.997           0.003      \n"
         ]
        }
       ],
       "source": [
        "print(newConfusion)"
       ]
      },
      {
       "attachments": {},
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Comment\n",
        "\n",
        "The network works in principle and thanks to numpy, which is running on openblas, it even utilises multiple cores. I've added jupyter widgets to set network parameters."
       ]
      }
     ],
     "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.11.3"
      },
      "vscode": {
       "interpreter": {
        "hash": "1a1af0ee75eeea9e2e1ee996c87e7a2b11a0bebd85af04bb136d915cefc0abce"
       }
      }
     },
     "nbformat": 4,
     "nbformat_minor": 2
    }