{
 "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 machineLearning.nn.module import Sequential\n",
    "from machineLearning.nn.optim import SGD, SGDMomentum, NesterovMomentum, AdaGrad, AdaDelta, RMSprop, Adam\n",
    "from machineLearning.nn.scheduler import ExponentialLR, SteppedLR, CyclicalLR\n",
    "from machineLearning.nn.loss import CrossEntropyLoss, MSELoss, NLLLoss, MAELoss, FocalLoss\n",
    "from machineLearning.data import Data\n",
    "from machineLearning.metric import ConfusionMatrix, Observables\n",
    "from machineLearning import ModelIO, Progressbar\n",
    "from machineLearning.nn.layer import (\n",
    "    Linear, Dropout, Flatten, Convolution2D, Unsqueeze,\n",
    "    BatchNorm1D, BatchNorm2D,\n",
    "    Tanh, SoftMax, Sigmoid, SoftPlus, Relu, Elu, LeakyRelu, SoftSign, Identity\n",
    ")"
   ]
  },
  {
   "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 0x110c6be10>"
      ]
     },
     "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 = 25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 01/25 |\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.49783\u001b[0m    validation: \u001b[1m\u001b[37m0.11506\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[37m0.42969\u001b[0m    \n",
      "losses: \u001b[1m\u001b[37m0.36106\u001b[0m    validation: \u001b[1m\u001b[37m0.06091\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[37m0.67969\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.18852\u001b[0m    validation: \u001b[1m\u001b[32m0.01031\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
      "losses: \u001b[1m\u001b[32m0.14419\u001b[0m    validation: \u001b[1m\u001b[32m0.00889\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.98438\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.11856\u001b[0m    validation: \u001b[1m\u001b[31m0.01607\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.92969\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.09844\u001b[0m    validation: \u001b[1m\u001b[32m0.00594\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.98438\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.09182\u001b[0m    validation: \u001b[1m\u001b[31m0.01217\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.96094\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.08258\u001b[0m    validation: \u001b[1m\u001b[32m0.00286\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.07819\u001b[0m    validation: \u001b[1m\u001b[32m0.0013\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
      "losses: \u001b[1m\u001b[32m0.06822\u001b[0m    validation: \u001b[1m\u001b[31m0.05505\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.75\u001b[0m       \n",
      "losses: \u001b[1m\u001b[33m0.07041\u001b[0m    validation: \u001b[1m\u001b[33m0.00818\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.97656\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.06531\u001b[0m    validation: \u001b[1m\u001b[32m0.00068\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
      "losses: \u001b[1m\u001b[32m0.05731\u001b[0m    validation: \u001b[1m\u001b[31m0.24424\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.54688\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.05509\u001b[0m    validation: \u001b[1m\u001b[33m0.00272\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
      "losses: \u001b[1m\u001b[31m0.06028\u001b[0m    validation: \u001b[1m\u001b[33m0.00111\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.05005\u001b[0m    validation: \u001b[1m\u001b[31m0.00281\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.96875\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.04327\u001b[0m    validation: \u001b[1m\u001b[33m0.00086\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
      "losses: \u001b[1m\u001b[31m0.05088\u001b[0m    validation: \u001b[1m\u001b[31m0.00298\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.98438\u001b[0m    \n",
      "losses: \u001b[1m\u001b[33m0.04503\u001b[0m    validation: \u001b[1m\u001b[31m0.01248\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.94531\u001b[0m    \n",
      "losses: \u001b[1m\u001b[33m0.04383\u001b[0m    validation: \u001b[1m\u001b[31m0.10052\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.69531\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.04183\u001b[0m    validation: \u001b[1m\u001b[32m0.00046\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n",
      "losses: \u001b[1m\u001b[32m0.04016\u001b[0m    validation: \u001b[1m\u001b[33m0.00072\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.03981\u001b[0m    validation: \u001b[1m\u001b[31m0.00156\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.99219\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.03785\u001b[0m    validation: \u001b[1m\u001b[31m0.0235\u001b[0m     learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m0.92969\u001b[0m    \n",
      "losses: \u001b[1m\u001b[32m0.03316\u001b[0m    validation: \u001b[1m\u001b[32m0.00013\u001b[0m    learningRate: \u001b[1m\u001b[37m0.001\u001b[0m      accuracy: \u001b[1m\u001b[31m1.0\u001b[0m        \n"
     ]
    }
   ],
   "source": [
    "metrics = Observables(epochs)\n",
    "metrics.addOberservable('losses', 'descending')\n",
    "metrics.addOberservable('validation', 'descending')\n",
    "metrics.addOberservable('accuracy', 'ascending')\n",
    "metrics.addOberservable('learningRate')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "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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ExoaytixYzGba4IHEyZMYN++faxevZply5axfv16HnroIff7K1asYMKECTzyyCPs3buX9957j3/84x+8++67HvbceeedpKWl8eGHH5KZmcmCBQvo3bt3w0QQPkBWVpYARFZWVst9yPo3hZgRLpfVM4RwOlvus9owheUW8enGo+KWORtE0rPL3Eufv64Q0xbsED9m5Amb3aG1mYqW5PQB+Tv6W0chbJbmO++Gt+V5F9zbfOdUeBeVZ4TI2aO1FYpmpKHP75SUFDFlyhT3a4fDIRISEsSsWbNq3f/OO+8UN954o8e21NRU8fDDDwshhHA6nSIuLk688cYb7veLi4tFYGCgWLBggRBCiP379wtAbN261b3PihUrhE6nE9nZ2UIIIe655x5x++23e3zO7NmzRefOnYXT5S+sWLFCREREiMLCwnpda134dcTMbrezdetW7HY7XPknGPuKfGPDP+D7P6vIWSOICjVx34hkvnrsctY9fTVPjulFcnQIVTYHS3ed4v55W0l9JY3Jc9P4548H+fbXU+w4cYa8UjNOp9K7JfGo7y1JdbQs4VIwmprvvGdHzHzot9lquvs6dit8fBPMvRwOfN/00yndNaEu3cvKyigtLXUvFovlvGOtVivbt29nzJgx7m16vZ4xY8awadOmWj9v06ZNHvsDjB071r3/0aNHyc3N9dgnIiKC1NRU9z6bNm0iMjKSoUOHuvcZM2YMer2ezZvl/cxisRAUFOTxOcHBwZw8eZLjx48D8M033zB06FBef/11OnXqRK9evXjqqacanNfNfzv/I5Ortm/fHl115+QRU2Sn4u/+BL+8J/uz3PAW6P3af200SdGhTBvTkz+O7sGurGKW7szm2905FFZYSauAtGMHPPYPMOiIjwgmITKIhMhgOrmWBNfSKTKYYJNBo6vxfc6r7y1FdVNjl5TmPW/CYDAEQmUBFB6GmB7Ne/4WotV093U2/j/I2yPL3/8Ful8LhsbnTFS6a0Nduvfr18/j9YwZM5g5c6bHtoKCAhwOB7GxsR7bY2NjycjIqPXzcnNza90/NzfX/X71tgvt07FjR4/3jUYjUVFR7n3Gjh3Lk08+yf33388111zDoUOHeOuttwDIyckhOTmZI0eOsGHDBoKCgliyZAkFBQU89thjFBYWMm/evFrtrw2/dswMBgM9epxzcx/2B3nz/+Zx2PaR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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                                              | 06%\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    3197         0           3           0      \n",
      "                24%          0%          0%          0%     \n",
      "····························································\n",
      "     Class 1     0          3200         0           0      \n",
      "                 0%         25%          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      1.0             1.0            0.999           0.001      \n",
      "     Class 1      1.0             1.0             1.0             0.0       \n",
      "     Class 2      1.0            0.999            1.0             0.0       \n",
      "     Class 3      1.0             1.0             1.0             0.0       \n",
      "·······································································\n",
      "       total      1.0             1.0             1.0             0.0       \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": [
    "ModelIO.save(network, 'test')\n",
    "newNetwork = ModelIO.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    3197         0           3           0      \n",
      "                24%          0%          0%          0%     \n",
      "····························································\n",
      "     Class 1     0          3200         0           0      \n",
      "                 0%         25%          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      1.0             1.0            0.999           0.001      \n",
      "     Class 1      1.0             1.0             1.0             0.0       \n",
      "     Class 2      1.0            0.999            1.0             0.0       \n",
      "     Class 3      1.0             1.0             1.0             0.0       \n",
      "·······································································\n",
      "       total      1.0             1.0             1.0             0.0       \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
}