[404218]: / Code / Tensor Network vs FC Explainability / Dataset 3 / DS3 1TN 1FC TPU kkawchak.ipynb

Download this file

1265 lines (1265 with data), 131.0 kB

{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "V28"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "TPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8XnVMPBXmtRa"
      },
      "source": [
        "# TensorNetworks in Neural Networks.\n",
        "\n",
        "Here, we have a small toy example of how to use a TN inside of a fully connected neural network.\n",
        "\n",
        "First off, let's install tensornetwork"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7HGRsYNAFxME"
      },
      "source": [
        "# !pip install tensornetwork\n",
        "\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import tensorflow as tf\n",
        "# Import tensornetwork\n",
        "import tensornetwork as tn\n",
        "import random\n",
        "import time\n",
        "import pandas as pd\n",
        "# Set the backend to tesorflow\n",
        "# (default is numpy)\n",
        "tn.set_default_backend(\"tensorflow\")\n",
        "np.random.seed(42)\n",
        "random.seed(42)\n",
        "tf.random.set_seed(42)\n",
        "# Explainability code assistance aided by ChatGPT3.5\n",
        "# 2021 Kelly, D. TensorFlow Explainable AI tutorial https://www.youtube.com/watch?v=6xePkn3-LME"
      ],
      "execution_count": 46,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "g1OMCo5XmrYu"
      },
      "source": [
        "# TensorNetwork layer definition\n",
        "\n",
        "Here, we define the TensorNetwork layer we wish to use to replace the fully connected layer. Here, we simply use a 2 node Matrix Product Operator network to replace the normal dense weight matrix.\n",
        "\n",
        "We TensorNetwork's NCon API to keep the code short."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wvSMKtPufnLp"
      },
      "source": [
        "class TNLayer(tf.keras.layers.Layer):\n",
        "\n",
        "  def __init__(self):\n",
        "    super(TNLayer, self).__init__()\n",
        "    # Create the variables for the layer.\n",
        "    self.a_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
        "                                              stddev=1.0/32.0),\n",
        "                             name=\"a\", trainable=True)\n",
        "    self.b_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
        "                                              stddev=1.0/32.0),\n",
        "                             name=\"b\", trainable=True)\n",
        "    self.bias = tf.Variable(tf.zeros(shape=(32, 32)),\n",
        "                            name=\"bias\", trainable=True)\n",
        "\n",
        "  def call(self, inputs):\n",
        "    # Define the contraction.\n",
        "    # We break it out so we can parallelize a batch using\n",
        "    # tf.vectorized_map (see below).\n",
        "    def f(input_vec, a_var, b_var, bias_var):\n",
        "      # Reshape to a matrix instead of a vector.\n",
        "      input_vec = tf.reshape(input_vec, (32, 32))\n",
        "\n",
        "      # Now we create the network.\n",
        "      a = tn.Node(a_var)\n",
        "      b = tn.Node(b_var)\n",
        "      x_node = tn.Node(input_vec)\n",
        "      a[1] ^ x_node[0]\n",
        "      b[1] ^ x_node[1]\n",
        "      a[2] ^ b[2]\n",
        "\n",
        "      # The TN should now look like this\n",
        "      #   |     |\n",
        "      #   a --- b\n",
        "      #    \\   /\n",
        "      #      x\n",
        "\n",
        "      # Now we begin the contraction.\n",
        "      c = a @ x_node\n",
        "      result = (c @ b).tensor\n",
        "\n",
        "      # To make the code shorter, we also could've used Ncon.\n",
        "      # The above few lines of code is the same as this:\n",
        "      # result = tn.ncon([x, a_var, b_var], [[1, 2], [-1, 1, 3], [-2, 2, 3]])\n",
        "\n",
        "      # Finally, add bias.\n",
        "      return result + bias_var\n",
        "\n",
        "    # To deal with a batch of items, we can use the tf.vectorized_map\n",
        "    # function.\n",
        "    # https://www.tensorflow.org/api_docs/python/tf/vectorized_map\n",
        "    result = tf.vectorized_map(\n",
        "        lambda vec: f(vec, self.a_var, self.b_var, self.bias), inputs)\n",
        "    return tf.nn.relu(tf.reshape(result, (-1, 1024)))"
      ],
      "execution_count": 47,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "V-CVqIhPnhY_"
      },
      "source": [
        "# Smaller model\n",
        "These two models are effectively the same, but notice how the TN layer has nearly 10x fewer parameters."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bbKsmK8wIFTp",
        "outputId": "4aa4ba9b-53cb-48c8-bba7-4fe472e562e1",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        }
      },
      "source": [
        "Dense = tf.keras.layers.Dense\n",
        "tn_model = tf.keras.Sequential(\n",
        "    [\n",
        "     tf.keras.Input(shape=(2,)),\n",
        "     Dense(1024, activation=tf.nn.relu),\n",
        "     # Start Modified Layers\n",
        "     TNLayer(),\n",
        "     Dense(1024, activation=tf.nn.relu),\n",
        "     # Finish Modified Layers\n",
        "     Dense(1, activation=None)])\n",
        "tn_model.summary()"
      ],
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model: \"sequential_4\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " dense_12 (Dense)            (None, 1024)              3072      \n",
            "                                                                 \n",
            " tn_layer_4 (TNLayer)        (None, 1024)              5120      \n",
            "                                                                 \n",
            " dense_13 (Dense)            (None, 1024)              1049600   \n",
            "                                                                 \n",
            " dense_14 (Dense)            (None, 1)                 1025      \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 1058817 (4.04 MB)\n",
            "Trainable params: 1058817 (4.04 MB)\n",
            "Non-trainable params: 0 (0.00 Byte)\n",
            "_________________________________________________________________\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GWwoYp0WnsLA"
      },
      "source": [
        "# Training a model\n",
        "\n",
        "You can train the TN model just as you would a normal neural network model! Here, we give an example of how to do it in Keras."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qDFzOC7sDBJ-"
      },
      "source": [
        "# Generate points forming a spiral\n",
        "theta = np.linspace(0, 4*np.pi, 480)\n",
        "r = np.linspace(0, 1, 480)\n",
        "\n",
        "x = r * np.sin(theta)\n",
        "y = r * np.cos(theta)\n",
        "\n",
        "X = np.column_stack((x, y))\n",
        "Y = np.concatenate([np.ones((240)), -np.ones((240))])"
      ],
      "execution_count": 49,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "19TWP-1eKURB",
        "outputId": "056390f7-3006-4270-c532-1b6e47730390"
      },
      "execution_count": 50,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1712722209.545239\n",
            "Wed Apr 10 04:10:09 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "crc0q1vbIyTj",
        "outputId": "97ee9166-637e-4bec-f0c0-befec309046f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        }
      },
      "source": [
        "tn_model.compile(optimizer=\"adam\", loss=\"mean_squared_error\")\n",
        "tn_model.fit(X, Y, epochs=300, verbose=2)"
      ],
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/300\n",
            "15/15 - 1s - loss: 0.9653 - 934ms/epoch - 62ms/step\n",
            "Epoch 2/300\n",
            "15/15 - 0s - loss: 0.4853 - 101ms/epoch - 7ms/step\n",
            "Epoch 3/300\n",
            "15/15 - 0s - loss: 0.0948 - 106ms/epoch - 7ms/step\n",
            "Epoch 4/300\n",
            "15/15 - 0s - loss: 0.0515 - 103ms/epoch - 7ms/step\n",
            "Epoch 5/300\n",
            "15/15 - 0s - loss: 0.0381 - 105ms/epoch - 7ms/step\n",
            "Epoch 6/300\n",
            "15/15 - 0s - loss: 0.0351 - 103ms/epoch - 7ms/step\n",
            "Epoch 7/300\n",
            "15/15 - 0s - loss: 0.0333 - 105ms/epoch - 7ms/step\n",
            "Epoch 8/300\n",
            "15/15 - 0s - loss: 0.0373 - 98ms/epoch - 7ms/step\n",
            "Epoch 9/300\n",
            "15/15 - 0s - loss: 0.0290 - 104ms/epoch - 7ms/step\n",
            "Epoch 10/300\n",
            "15/15 - 0s - loss: 0.0285 - 97ms/epoch - 6ms/step\n",
            "Epoch 11/300\n",
            "15/15 - 0s - loss: 0.0244 - 96ms/epoch - 6ms/step\n",
            "Epoch 12/300\n",
            "15/15 - 0s - loss: 0.0271 - 94ms/epoch - 6ms/step\n",
            "Epoch 13/300\n",
            "15/15 - 0s - loss: 0.0319 - 98ms/epoch - 7ms/step\n",
            "Epoch 14/300\n",
            "15/15 - 0s - loss: 0.0225 - 100ms/epoch - 7ms/step\n",
            "Epoch 15/300\n",
            "15/15 - 0s - loss: 0.0239 - 97ms/epoch - 6ms/step\n",
            "Epoch 16/300\n",
            "15/15 - 0s - loss: 0.0209 - 95ms/epoch - 6ms/step\n",
            "Epoch 17/300\n",
            "15/15 - 0s - loss: 0.0210 - 98ms/epoch - 7ms/step\n",
            "Epoch 18/300\n",
            "15/15 - 0s - loss: 0.0220 - 92ms/epoch - 6ms/step\n",
            "Epoch 19/300\n",
            "15/15 - 0s - loss: 0.0221 - 89ms/epoch - 6ms/step\n",
            "Epoch 20/300\n",
            "15/15 - 0s - loss: 0.0269 - 93ms/epoch - 6ms/step\n",
            "Epoch 21/300\n",
            "15/15 - 0s - loss: 0.0191 - 94ms/epoch - 6ms/step\n",
            "Epoch 22/300\n",
            "15/15 - 0s - loss: 0.0186 - 98ms/epoch - 7ms/step\n",
            "Epoch 23/300\n",
            "15/15 - 0s - loss: 0.0183 - 94ms/epoch - 6ms/step\n",
            "Epoch 24/300\n",
            "15/15 - 0s - loss: 0.0163 - 93ms/epoch - 6ms/step\n",
            "Epoch 25/300\n",
            "15/15 - 0s - loss: 0.0172 - 94ms/epoch - 6ms/step\n",
            "Epoch 26/300\n",
            "15/15 - 0s - loss: 0.0157 - 94ms/epoch - 6ms/step\n",
            "Epoch 27/300\n",
            "15/15 - 0s - loss: 0.0156 - 105ms/epoch - 7ms/step\n",
            "Epoch 28/300\n",
            "15/15 - 0s - loss: 0.0158 - 102ms/epoch - 7ms/step\n",
            "Epoch 29/300\n",
            "15/15 - 0s - loss: 0.0178 - 104ms/epoch - 7ms/step\n",
            "Epoch 30/300\n",
            "15/15 - 0s - loss: 0.0179 - 95ms/epoch - 6ms/step\n",
            "Epoch 31/300\n",
            "15/15 - 0s - loss: 0.0118 - 94ms/epoch - 6ms/step\n",
            "Epoch 32/300\n",
            "15/15 - 0s - loss: 0.0112 - 93ms/epoch - 6ms/step\n",
            "Epoch 33/300\n",
            "15/15 - 0s - loss: 0.0104 - 92ms/epoch - 6ms/step\n",
            "Epoch 34/300\n",
            "15/15 - 0s - loss: 0.0128 - 90ms/epoch - 6ms/step\n",
            "Epoch 35/300\n",
            "15/15 - 0s - loss: 0.0093 - 92ms/epoch - 6ms/step\n",
            "Epoch 36/300\n",
            "15/15 - 0s - loss: 0.0132 - 89ms/epoch - 6ms/step\n",
            "Epoch 37/300\n",
            "15/15 - 0s - loss: 0.0210 - 91ms/epoch - 6ms/step\n",
            "Epoch 38/300\n",
            "15/15 - 0s - loss: 0.0180 - 90ms/epoch - 6ms/step\n",
            "Epoch 39/300\n",
            "15/15 - 0s - loss: 0.0191 - 94ms/epoch - 6ms/step\n",
            "Epoch 40/300\n",
            "15/15 - 0s - loss: 0.0128 - 91ms/epoch - 6ms/step\n",
            "Epoch 41/300\n",
            "15/15 - 0s - loss: 0.0115 - 89ms/epoch - 6ms/step\n",
            "Epoch 42/300\n",
            "15/15 - 0s - loss: 0.0102 - 92ms/epoch - 6ms/step\n",
            "Epoch 43/300\n",
            "15/15 - 0s - loss: 0.0065 - 89ms/epoch - 6ms/step\n",
            "Epoch 44/300\n",
            "15/15 - 0s - loss: 0.0103 - 94ms/epoch - 6ms/step\n",
            "Epoch 45/300\n",
            "15/15 - 0s - loss: 0.0098 - 95ms/epoch - 6ms/step\n",
            "Epoch 46/300\n",
            "15/15 - 0s - loss: 0.0072 - 90ms/epoch - 6ms/step\n",
            "Epoch 47/300\n",
            "15/15 - 0s - loss: 0.0098 - 92ms/epoch - 6ms/step\n",
            "Epoch 48/300\n",
            "15/15 - 0s - loss: 0.0101 - 91ms/epoch - 6ms/step\n",
            "Epoch 49/300\n",
            "15/15 - 0s - loss: 0.0078 - 99ms/epoch - 7ms/step\n",
            "Epoch 50/300\n",
            "15/15 - 0s - loss: 0.0107 - 89ms/epoch - 6ms/step\n",
            "Epoch 51/300\n",
            "15/15 - 0s - loss: 0.0124 - 91ms/epoch - 6ms/step\n",
            "Epoch 52/300\n",
            "15/15 - 0s - loss: 0.0073 - 97ms/epoch - 6ms/step\n",
            "Epoch 53/300\n",
            "15/15 - 0s - loss: 0.0078 - 90ms/epoch - 6ms/step\n",
            "Epoch 54/300\n",
            "15/15 - 0s - loss: 0.0074 - 94ms/epoch - 6ms/step\n",
            "Epoch 55/300\n",
            "15/15 - 0s - loss: 0.0076 - 91ms/epoch - 6ms/step\n",
            "Epoch 56/300\n",
            "15/15 - 0s - loss: 0.0078 - 91ms/epoch - 6ms/step\n",
            "Epoch 57/300\n",
            "15/15 - 0s - loss: 0.0101 - 90ms/epoch - 6ms/step\n",
            "Epoch 58/300\n",
            "15/15 - 0s - loss: 0.0071 - 100ms/epoch - 7ms/step\n",
            "Epoch 59/300\n",
            "15/15 - 0s - loss: 0.0062 - 100ms/epoch - 7ms/step\n",
            "Epoch 60/300\n",
            "15/15 - 0s - loss: 0.0072 - 100ms/epoch - 7ms/step\n",
            "Epoch 61/300\n",
            "15/15 - 0s - loss: 0.0118 - 99ms/epoch - 7ms/step\n",
            "Epoch 62/300\n",
            "15/15 - 0s - loss: 0.0158 - 97ms/epoch - 6ms/step\n",
            "Epoch 63/300\n",
            "15/15 - 0s - loss: 0.0099 - 93ms/epoch - 6ms/step\n",
            "Epoch 64/300\n",
            "15/15 - 0s - loss: 0.0081 - 94ms/epoch - 6ms/step\n",
            "Epoch 65/300\n",
            "15/15 - 0s - loss: 0.0075 - 92ms/epoch - 6ms/step\n",
            "Epoch 66/300\n",
            "15/15 - 0s - loss: 0.0208 - 90ms/epoch - 6ms/step\n",
            "Epoch 67/300\n",
            "15/15 - 0s - loss: 0.0092 - 94ms/epoch - 6ms/step\n",
            "Epoch 68/300\n",
            "15/15 - 0s - loss: 0.0055 - 91ms/epoch - 6ms/step\n",
            "Epoch 69/300\n",
            "15/15 - 0s - loss: 0.0056 - 96ms/epoch - 6ms/step\n",
            "Epoch 70/300\n",
            "15/15 - 0s - loss: 0.0069 - 92ms/epoch - 6ms/step\n",
            "Epoch 71/300\n",
            "15/15 - 0s - loss: 0.0138 - 100ms/epoch - 7ms/step\n",
            "Epoch 72/300\n",
            "15/15 - 0s - loss: 0.0300 - 99ms/epoch - 7ms/step\n",
            "Epoch 73/300\n",
            "15/15 - 0s - loss: 0.0158 - 97ms/epoch - 6ms/step\n",
            "Epoch 74/300\n",
            "15/15 - 0s - loss: 0.0342 - 92ms/epoch - 6ms/step\n",
            "Epoch 75/300\n",
            "15/15 - 0s - loss: 0.0079 - 100ms/epoch - 7ms/step\n",
            "Epoch 76/300\n",
            "15/15 - 0s - loss: 0.0099 - 94ms/epoch - 6ms/step\n",
            "Epoch 77/300\n",
            "15/15 - 0s - loss: 0.0055 - 93ms/epoch - 6ms/step\n",
            "Epoch 78/300\n",
            "15/15 - 0s - loss: 0.0083 - 92ms/epoch - 6ms/step\n",
            "Epoch 79/300\n",
            "15/15 - 0s - loss: 0.0050 - 90ms/epoch - 6ms/step\n",
            "Epoch 80/300\n",
            "15/15 - 0s - loss: 0.0106 - 93ms/epoch - 6ms/step\n",
            "Epoch 81/300\n",
            "15/15 - 0s - loss: 0.0114 - 95ms/epoch - 6ms/step\n",
            "Epoch 82/300\n",
            "15/15 - 0s - loss: 0.0091 - 93ms/epoch - 6ms/step\n",
            "Epoch 83/300\n",
            "15/15 - 0s - loss: 0.0065 - 97ms/epoch - 6ms/step\n",
            "Epoch 84/300\n",
            "15/15 - 0s - loss: 0.0051 - 100ms/epoch - 7ms/step\n",
            "Epoch 85/300\n",
            "15/15 - 0s - loss: 0.0059 - 94ms/epoch - 6ms/step\n",
            "Epoch 86/300\n",
            "15/15 - 0s - loss: 0.0052 - 92ms/epoch - 6ms/step\n",
            "Epoch 87/300\n",
            "15/15 - 0s - loss: 0.0063 - 91ms/epoch - 6ms/step\n",
            "Epoch 88/300\n",
            "15/15 - 0s - loss: 0.0070 - 91ms/epoch - 6ms/step\n",
            "Epoch 89/300\n",
            "15/15 - 0s - loss: 0.0047 - 90ms/epoch - 6ms/step\n",
            "Epoch 90/300\n",
            "15/15 - 0s - loss: 0.0047 - 95ms/epoch - 6ms/step\n",
            "Epoch 91/300\n",
            "15/15 - 0s - loss: 0.0066 - 103ms/epoch - 7ms/step\n",
            "Epoch 92/300\n",
            "15/15 - 0s - loss: 0.0046 - 100ms/epoch - 7ms/step\n",
            "Epoch 93/300\n",
            "15/15 - 0s - loss: 0.0049 - 100ms/epoch - 7ms/step\n",
            "Epoch 94/300\n",
            "15/15 - 0s - loss: 0.0074 - 98ms/epoch - 7ms/step\n",
            "Epoch 95/300\n",
            "15/15 - 0s - loss: 0.0086 - 109ms/epoch - 7ms/step\n",
            "Epoch 96/300\n",
            "15/15 - 0s - loss: 0.0071 - 105ms/epoch - 7ms/step\n",
            "Epoch 97/300\n",
            "15/15 - 0s - loss: 0.0050 - 96ms/epoch - 6ms/step\n",
            "Epoch 98/300\n",
            "15/15 - 0s - loss: 0.0042 - 99ms/epoch - 7ms/step\n",
            "Epoch 99/300\n",
            "15/15 - 0s - loss: 0.0132 - 114ms/epoch - 8ms/step\n",
            "Epoch 100/300\n",
            "15/15 - 0s - loss: 0.0129 - 107ms/epoch - 7ms/step\n",
            "Epoch 101/300\n",
            "15/15 - 0s - loss: 0.0081 - 103ms/epoch - 7ms/step\n",
            "Epoch 102/300\n",
            "15/15 - 0s - loss: 0.0102 - 93ms/epoch - 6ms/step\n",
            "Epoch 103/300\n",
            "15/15 - 0s - loss: 0.0064 - 99ms/epoch - 7ms/step\n",
            "Epoch 104/300\n",
            "15/15 - 0s - loss: 0.0123 - 103ms/epoch - 7ms/step\n",
            "Epoch 105/300\n",
            "15/15 - 0s - loss: 0.0120 - 107ms/epoch - 7ms/step\n",
            "Epoch 106/300\n",
            "15/15 - 0s - loss: 0.0106 - 97ms/epoch - 6ms/step\n",
            "Epoch 107/300\n",
            "15/15 - 0s - loss: 0.0114 - 98ms/epoch - 7ms/step\n",
            "Epoch 108/300\n",
            "15/15 - 0s - loss: 0.0060 - 102ms/epoch - 7ms/step\n",
            "Epoch 109/300\n",
            "15/15 - 0s - loss: 0.0072 - 92ms/epoch - 6ms/step\n",
            "Epoch 110/300\n",
            "15/15 - 0s - loss: 0.0042 - 101ms/epoch - 7ms/step\n",
            "Epoch 111/300\n",
            "15/15 - 0s - loss: 0.0077 - 106ms/epoch - 7ms/step\n",
            "Epoch 112/300\n",
            "15/15 - 0s - loss: 0.0087 - 95ms/epoch - 6ms/step\n",
            "Epoch 113/300\n",
            "15/15 - 0s - loss: 0.0075 - 100ms/epoch - 7ms/step\n",
            "Epoch 114/300\n",
            "15/15 - 0s - loss: 0.0042 - 99ms/epoch - 7ms/step\n",
            "Epoch 115/300\n",
            "15/15 - 0s - loss: 0.0036 - 99ms/epoch - 7ms/step\n",
            "Epoch 116/300\n",
            "15/15 - 0s - loss: 0.0048 - 97ms/epoch - 6ms/step\n",
            "Epoch 117/300\n",
            "15/15 - 0s - loss: 0.0055 - 100ms/epoch - 7ms/step\n",
            "Epoch 118/300\n",
            "15/15 - 0s - loss: 0.0045 - 99ms/epoch - 7ms/step\n",
            "Epoch 119/300\n",
            "15/15 - 0s - loss: 0.0048 - 100ms/epoch - 7ms/step\n",
            "Epoch 120/300\n",
            "15/15 - 0s - loss: 0.0069 - 94ms/epoch - 6ms/step\n",
            "Epoch 121/300\n",
            "15/15 - 0s - loss: 0.0086 - 103ms/epoch - 7ms/step\n",
            "Epoch 122/300\n",
            "15/15 - 0s - loss: 0.0156 - 101ms/epoch - 7ms/step\n",
            "Epoch 123/300\n",
            "15/15 - 0s - loss: 0.0126 - 106ms/epoch - 7ms/step\n",
            "Epoch 124/300\n",
            "15/15 - 0s - loss: 0.0253 - 104ms/epoch - 7ms/step\n",
            "Epoch 125/300\n",
            "15/15 - 0s - loss: 0.0062 - 97ms/epoch - 6ms/step\n",
            "Epoch 126/300\n",
            "15/15 - 0s - loss: 0.0053 - 93ms/epoch - 6ms/step\n",
            "Epoch 127/300\n",
            "15/15 - 0s - loss: 0.0087 - 102ms/epoch - 7ms/step\n",
            "Epoch 128/300\n",
            "15/15 - 0s - loss: 0.0106 - 95ms/epoch - 6ms/step\n",
            "Epoch 129/300\n",
            "15/15 - 0s - loss: 0.0085 - 95ms/epoch - 6ms/step\n",
            "Epoch 130/300\n",
            "15/15 - 0s - loss: 0.0082 - 94ms/epoch - 6ms/step\n",
            "Epoch 131/300\n",
            "15/15 - 0s - loss: 0.0062 - 94ms/epoch - 6ms/step\n",
            "Epoch 132/300\n",
            "15/15 - 0s - loss: 0.0069 - 99ms/epoch - 7ms/step\n",
            "Epoch 133/300\n",
            "15/15 - 0s - loss: 0.0053 - 92ms/epoch - 6ms/step\n",
            "Epoch 134/300\n",
            "15/15 - 0s - loss: 0.0035 - 98ms/epoch - 7ms/step\n",
            "Epoch 135/300\n",
            "15/15 - 0s - loss: 0.0052 - 96ms/epoch - 6ms/step\n",
            "Epoch 136/300\n",
            "15/15 - 0s - loss: 0.0060 - 95ms/epoch - 6ms/step\n",
            "Epoch 137/300\n",
            "15/15 - 0s - loss: 0.0043 - 98ms/epoch - 7ms/step\n",
            "Epoch 138/300\n",
            "15/15 - 0s - loss: 0.0056 - 92ms/epoch - 6ms/step\n",
            "Epoch 139/300\n",
            "15/15 - 0s - loss: 0.0043 - 91ms/epoch - 6ms/step\n",
            "Epoch 140/300\n",
            "15/15 - 0s - loss: 0.0041 - 93ms/epoch - 6ms/step\n",
            "Epoch 141/300\n",
            "15/15 - 0s - loss: 0.0112 - 102ms/epoch - 7ms/step\n",
            "Epoch 142/300\n",
            "15/15 - 0s - loss: 0.0128 - 97ms/epoch - 6ms/step\n",
            "Epoch 143/300\n",
            "15/15 - 0s - loss: 0.0104 - 104ms/epoch - 7ms/step\n",
            "Epoch 144/300\n",
            "15/15 - 0s - loss: 0.0057 - 95ms/epoch - 6ms/step\n",
            "Epoch 145/300\n",
            "15/15 - 0s - loss: 0.0033 - 96ms/epoch - 6ms/step\n",
            "Epoch 146/300\n",
            "15/15 - 0s - loss: 0.0040 - 102ms/epoch - 7ms/step\n",
            "Epoch 147/300\n",
            "15/15 - 0s - loss: 0.0059 - 95ms/epoch - 6ms/step\n",
            "Epoch 148/300\n",
            "15/15 - 0s - loss: 0.0154 - 102ms/epoch - 7ms/step\n",
            "Epoch 149/300\n",
            "15/15 - 0s - loss: 0.0193 - 108ms/epoch - 7ms/step\n",
            "Epoch 150/300\n",
            "15/15 - 0s - loss: 0.0095 - 105ms/epoch - 7ms/step\n",
            "Epoch 151/300\n",
            "15/15 - 0s - loss: 0.0047 - 98ms/epoch - 7ms/step\n",
            "Epoch 152/300\n",
            "15/15 - 0s - loss: 0.0044 - 94ms/epoch - 6ms/step\n",
            "Epoch 153/300\n",
            "15/15 - 0s - loss: 0.0057 - 101ms/epoch - 7ms/step\n",
            "Epoch 154/300\n",
            "15/15 - 0s - loss: 0.0089 - 98ms/epoch - 7ms/step\n",
            "Epoch 155/300\n",
            "15/15 - 0s - loss: 0.0145 - 95ms/epoch - 6ms/step\n",
            "Epoch 156/300\n",
            "15/15 - 0s - loss: 0.0067 - 92ms/epoch - 6ms/step\n",
            "Epoch 157/300\n",
            "15/15 - 0s - loss: 0.0053 - 97ms/epoch - 6ms/step\n",
            "Epoch 158/300\n",
            "15/15 - 0s - loss: 0.0033 - 102ms/epoch - 7ms/step\n",
            "Epoch 159/300\n",
            "15/15 - 0s - loss: 0.0042 - 98ms/epoch - 7ms/step\n",
            "Epoch 160/300\n",
            "15/15 - 0s - loss: 0.0040 - 99ms/epoch - 7ms/step\n",
            "Epoch 161/300\n",
            "15/15 - 0s - loss: 0.0049 - 105ms/epoch - 7ms/step\n",
            "Epoch 162/300\n",
            "15/15 - 0s - loss: 0.0071 - 96ms/epoch - 6ms/step\n",
            "Epoch 163/300\n",
            "15/15 - 0s - loss: 0.0084 - 109ms/epoch - 7ms/step\n",
            "Epoch 164/300\n",
            "15/15 - 0s - loss: 0.0199 - 101ms/epoch - 7ms/step\n",
            "Epoch 165/300\n",
            "15/15 - 0s - loss: 0.0097 - 110ms/epoch - 7ms/step\n",
            "Epoch 166/300\n",
            "15/15 - 0s - loss: 0.0063 - 100ms/epoch - 7ms/step\n",
            "Epoch 167/300\n",
            "15/15 - 0s - loss: 0.0046 - 101ms/epoch - 7ms/step\n",
            "Epoch 168/300\n",
            "15/15 - 0s - loss: 0.0058 - 103ms/epoch - 7ms/step\n",
            "Epoch 169/300\n",
            "15/15 - 0s - loss: 0.0045 - 98ms/epoch - 7ms/step\n",
            "Epoch 170/300\n",
            "15/15 - 0s - loss: 0.0060 - 100ms/epoch - 7ms/step\n",
            "Epoch 171/300\n",
            "15/15 - 0s - loss: 0.0061 - 97ms/epoch - 6ms/step\n",
            "Epoch 172/300\n",
            "15/15 - 0s - loss: 0.0032 - 103ms/epoch - 7ms/step\n",
            "Epoch 173/300\n",
            "15/15 - 0s - loss: 0.0047 - 98ms/epoch - 7ms/step\n",
            "Epoch 174/300\n",
            "15/15 - 0s - loss: 0.0038 - 99ms/epoch - 7ms/step\n",
            "Epoch 175/300\n",
            "15/15 - 0s - loss: 0.0041 - 97ms/epoch - 6ms/step\n",
            "Epoch 176/300\n",
            "15/15 - 0s - loss: 0.0082 - 98ms/epoch - 7ms/step\n",
            "Epoch 177/300\n",
            "15/15 - 0s - loss: 0.0035 - 106ms/epoch - 7ms/step\n",
            "Epoch 178/300\n",
            "15/15 - 0s - loss: 0.0073 - 97ms/epoch - 6ms/step\n",
            "Epoch 179/300\n",
            "15/15 - 0s - loss: 0.0082 - 96ms/epoch - 6ms/step\n",
            "Epoch 180/300\n",
            "15/15 - 0s - loss: 0.0048 - 96ms/epoch - 6ms/step\n",
            "Epoch 181/300\n",
            "15/15 - 0s - loss: 0.0030 - 101ms/epoch - 7ms/step\n",
            "Epoch 182/300\n",
            "15/15 - 0s - loss: 0.0049 - 99ms/epoch - 7ms/step\n",
            "Epoch 183/300\n",
            "15/15 - 0s - loss: 0.0080 - 97ms/epoch - 6ms/step\n",
            "Epoch 184/300\n",
            "15/15 - 0s - loss: 0.0063 - 97ms/epoch - 6ms/step\n",
            "Epoch 185/300\n",
            "15/15 - 0s - loss: 0.0067 - 104ms/epoch - 7ms/step\n",
            "Epoch 186/300\n",
            "15/15 - 0s - loss: 0.0034 - 99ms/epoch - 7ms/step\n",
            "Epoch 187/300\n",
            "15/15 - 0s - loss: 0.0047 - 97ms/epoch - 6ms/step\n",
            "Epoch 188/300\n",
            "15/15 - 0s - loss: 0.0090 - 98ms/epoch - 7ms/step\n",
            "Epoch 189/300\n",
            "15/15 - 0s - loss: 0.0120 - 92ms/epoch - 6ms/step\n",
            "Epoch 190/300\n",
            "15/15 - 0s - loss: 0.0115 - 98ms/epoch - 7ms/step\n",
            "Epoch 191/300\n",
            "15/15 - 0s - loss: 0.0109 - 100ms/epoch - 7ms/step\n",
            "Epoch 192/300\n",
            "15/15 - 0s - loss: 0.0065 - 99ms/epoch - 7ms/step\n",
            "Epoch 193/300\n",
            "15/15 - 0s - loss: 0.0076 - 101ms/epoch - 7ms/step\n",
            "Epoch 194/300\n",
            "15/15 - 0s - loss: 0.0116 - 95ms/epoch - 6ms/step\n",
            "Epoch 195/300\n",
            "15/15 - 0s - loss: 0.0098 - 100ms/epoch - 7ms/step\n",
            "Epoch 196/300\n",
            "15/15 - 0s - loss: 0.0062 - 91ms/epoch - 6ms/step\n",
            "Epoch 197/300\n",
            "15/15 - 0s - loss: 0.0067 - 95ms/epoch - 6ms/step\n",
            "Epoch 198/300\n",
            "15/15 - 0s - loss: 0.0046 - 97ms/epoch - 6ms/step\n",
            "Epoch 199/300\n",
            "15/15 - 0s - loss: 0.0048 - 98ms/epoch - 7ms/step\n",
            "Epoch 200/300\n",
            "15/15 - 0s - loss: 0.0047 - 99ms/epoch - 7ms/step\n",
            "Epoch 201/300\n",
            "15/15 - 0s - loss: 0.0047 - 99ms/epoch - 7ms/step\n",
            "Epoch 202/300\n",
            "15/15 - 0s - loss: 0.0033 - 93ms/epoch - 6ms/step\n",
            "Epoch 203/300\n",
            "15/15 - 0s - loss: 0.0033 - 100ms/epoch - 7ms/step\n",
            "Epoch 204/300\n",
            "15/15 - 0s - loss: 0.0039 - 91ms/epoch - 6ms/step\n",
            "Epoch 205/300\n",
            "15/15 - 0s - loss: 0.0055 - 92ms/epoch - 6ms/step\n",
            "Epoch 206/300\n",
            "15/15 - 0s - loss: 0.0038 - 100ms/epoch - 7ms/step\n",
            "Epoch 207/300\n",
            "15/15 - 0s - loss: 0.0030 - 99ms/epoch - 7ms/step\n",
            "Epoch 208/300\n",
            "15/15 - 0s - loss: 0.0032 - 97ms/epoch - 6ms/step\n",
            "Epoch 209/300\n",
            "15/15 - 0s - loss: 0.0047 - 105ms/epoch - 7ms/step\n",
            "Epoch 210/300\n",
            "15/15 - 0s - loss: 0.0045 - 98ms/epoch - 7ms/step\n",
            "Epoch 211/300\n",
            "15/15 - 0s - loss: 0.0033 - 95ms/epoch - 6ms/step\n",
            "Epoch 212/300\n",
            "15/15 - 0s - loss: 0.0056 - 98ms/epoch - 7ms/step\n",
            "Epoch 213/300\n",
            "15/15 - 0s - loss: 0.0026 - 96ms/epoch - 6ms/step\n",
            "Epoch 214/300\n",
            "15/15 - 0s - loss: 0.0035 - 96ms/epoch - 6ms/step\n",
            "Epoch 215/300\n",
            "15/15 - 0s - loss: 0.0040 - 98ms/epoch - 7ms/step\n",
            "Epoch 216/300\n",
            "15/15 - 0s - loss: 0.0036 - 102ms/epoch - 7ms/step\n",
            "Epoch 217/300\n",
            "15/15 - 0s - loss: 0.0077 - 95ms/epoch - 6ms/step\n",
            "Epoch 218/300\n",
            "15/15 - 0s - loss: 0.0094 - 96ms/epoch - 6ms/step\n",
            "Epoch 219/300\n",
            "15/15 - 0s - loss: 0.0058 - 95ms/epoch - 6ms/step\n",
            "Epoch 220/300\n",
            "15/15 - 0s - loss: 0.0038 - 96ms/epoch - 6ms/step\n",
            "Epoch 221/300\n",
            "15/15 - 0s - loss: 0.0047 - 95ms/epoch - 6ms/step\n",
            "Epoch 222/300\n",
            "15/15 - 0s - loss: 0.0068 - 95ms/epoch - 6ms/step\n",
            "Epoch 223/300\n",
            "15/15 - 0s - loss: 0.0043 - 97ms/epoch - 6ms/step\n",
            "Epoch 224/300\n",
            "15/15 - 0s - loss: 0.0074 - 97ms/epoch - 6ms/step\n",
            "Epoch 225/300\n",
            "15/15 - 0s - loss: 0.0040 - 94ms/epoch - 6ms/step\n",
            "Epoch 226/300\n",
            "15/15 - 0s - loss: 0.0029 - 99ms/epoch - 7ms/step\n",
            "Epoch 227/300\n",
            "15/15 - 0s - loss: 0.0084 - 95ms/epoch - 6ms/step\n",
            "Epoch 228/300\n",
            "15/15 - 0s - loss: 0.0078 - 99ms/epoch - 7ms/step\n",
            "Epoch 229/300\n",
            "15/15 - 0s - loss: 0.0054 - 100ms/epoch - 7ms/step\n",
            "Epoch 230/300\n",
            "15/15 - 0s - loss: 0.0051 - 99ms/epoch - 7ms/step\n",
            "Epoch 231/300\n",
            "15/15 - 0s - loss: 0.0045 - 95ms/epoch - 6ms/step\n",
            "Epoch 232/300\n",
            "15/15 - 0s - loss: 0.0010 - 95ms/epoch - 6ms/step\n",
            "Epoch 233/300\n",
            "15/15 - 0s - loss: 0.0073 - 90ms/epoch - 6ms/step\n",
            "Epoch 234/300\n",
            "15/15 - 0s - loss: 0.0065 - 104ms/epoch - 7ms/step\n",
            "Epoch 235/300\n",
            "15/15 - 0s - loss: 0.0033 - 91ms/epoch - 6ms/step\n",
            "Epoch 236/300\n",
            "15/15 - 0s - loss: 0.0029 - 100ms/epoch - 7ms/step\n",
            "Epoch 237/300\n",
            "15/15 - 0s - loss: 0.0036 - 92ms/epoch - 6ms/step\n",
            "Epoch 238/300\n",
            "15/15 - 0s - loss: 0.0031 - 98ms/epoch - 7ms/step\n",
            "Epoch 239/300\n",
            "15/15 - 0s - loss: 0.0081 - 92ms/epoch - 6ms/step\n",
            "Epoch 240/300\n",
            "15/15 - 0s - loss: 0.0078 - 100ms/epoch - 7ms/step\n",
            "Epoch 241/300\n",
            "15/15 - 0s - loss: 0.0066 - 99ms/epoch - 7ms/step\n",
            "Epoch 242/300\n",
            "15/15 - 0s - loss: 0.0105 - 92ms/epoch - 6ms/step\n",
            "Epoch 243/300\n",
            "15/15 - 0s - loss: 0.0138 - 98ms/epoch - 7ms/step\n",
            "Epoch 244/300\n",
            "15/15 - 0s - loss: 0.0036 - 96ms/epoch - 6ms/step\n",
            "Epoch 245/300\n",
            "15/15 - 0s - loss: 0.0118 - 92ms/epoch - 6ms/step\n",
            "Epoch 246/300\n",
            "15/15 - 0s - loss: 0.0036 - 94ms/epoch - 6ms/step\n",
            "Epoch 247/300\n",
            "15/15 - 0s - loss: 0.0059 - 97ms/epoch - 6ms/step\n",
            "Epoch 248/300\n",
            "15/15 - 0s - loss: 0.0029 - 93ms/epoch - 6ms/step\n",
            "Epoch 249/300\n",
            "15/15 - 0s - loss: 0.0038 - 94ms/epoch - 6ms/step\n",
            "Epoch 250/300\n",
            "15/15 - 0s - loss: 0.0045 - 90ms/epoch - 6ms/step\n",
            "Epoch 251/300\n",
            "15/15 - 0s - loss: 0.0037 - 92ms/epoch - 6ms/step\n",
            "Epoch 252/300\n",
            "15/15 - 0s - loss: 0.0019 - 98ms/epoch - 7ms/step\n",
            "Epoch 253/300\n",
            "15/15 - 0s - loss: 0.0029 - 97ms/epoch - 6ms/step\n",
            "Epoch 254/300\n",
            "15/15 - 0s - loss: 0.0041 - 88ms/epoch - 6ms/step\n",
            "Epoch 255/300\n",
            "15/15 - 0s - loss: 0.0031 - 91ms/epoch - 6ms/step\n",
            "Epoch 256/300\n",
            "15/15 - 0s - loss: 0.0038 - 89ms/epoch - 6ms/step\n",
            "Epoch 257/300\n",
            "15/15 - 0s - loss: 0.0064 - 86ms/epoch - 6ms/step\n",
            "Epoch 258/300\n",
            "15/15 - 0s - loss: 0.0093 - 99ms/epoch - 7ms/step\n",
            "Epoch 259/300\n",
            "15/15 - 0s - loss: 0.0039 - 92ms/epoch - 6ms/step\n",
            "Epoch 260/300\n",
            "15/15 - 0s - loss: 0.0041 - 100ms/epoch - 7ms/step\n",
            "Epoch 261/300\n",
            "15/15 - 0s - loss: 0.0043 - 95ms/epoch - 6ms/step\n",
            "Epoch 262/300\n",
            "15/15 - 0s - loss: 0.0037 - 90ms/epoch - 6ms/step\n",
            "Epoch 263/300\n",
            "15/15 - 0s - loss: 0.0028 - 94ms/epoch - 6ms/step\n",
            "Epoch 264/300\n",
            "15/15 - 0s - loss: 0.0042 - 96ms/epoch - 6ms/step\n",
            "Epoch 265/300\n",
            "15/15 - 0s - loss: 0.0037 - 94ms/epoch - 6ms/step\n",
            "Epoch 266/300\n",
            "15/15 - 0s - loss: 0.0036 - 93ms/epoch - 6ms/step\n",
            "Epoch 267/300\n",
            "15/15 - 0s - loss: 0.0019 - 95ms/epoch - 6ms/step\n",
            "Epoch 268/300\n",
            "15/15 - 0s - loss: 0.0042 - 89ms/epoch - 6ms/step\n",
            "Epoch 269/300\n",
            "15/15 - 0s - loss: 0.0089 - 90ms/epoch - 6ms/step\n",
            "Epoch 270/300\n",
            "15/15 - 0s - loss: 0.0214 - 88ms/epoch - 6ms/step\n",
            "Epoch 271/300\n",
            "15/15 - 0s - loss: 0.0072 - 92ms/epoch - 6ms/step\n",
            "Epoch 272/300\n",
            "15/15 - 0s - loss: 0.0039 - 101ms/epoch - 7ms/step\n",
            "Epoch 273/300\n",
            "15/15 - 0s - loss: 0.0038 - 93ms/epoch - 6ms/step\n",
            "Epoch 274/300\n",
            "15/15 - 0s - loss: 0.0047 - 93ms/epoch - 6ms/step\n",
            "Epoch 275/300\n",
            "15/15 - 0s - loss: 0.0082 - 93ms/epoch - 6ms/step\n",
            "Epoch 276/300\n",
            "15/15 - 0s - loss: 0.0035 - 100ms/epoch - 7ms/step\n",
            "Epoch 277/300\n",
            "15/15 - 0s - loss: 0.0031 - 91ms/epoch - 6ms/step\n",
            "Epoch 278/300\n",
            "15/15 - 0s - loss: 0.0041 - 100ms/epoch - 7ms/step\n",
            "Epoch 279/300\n",
            "15/15 - 0s - loss: 0.0027 - 93ms/epoch - 6ms/step\n",
            "Epoch 280/300\n",
            "15/15 - 0s - loss: 0.0028 - 96ms/epoch - 6ms/step\n",
            "Epoch 281/300\n",
            "15/15 - 0s - loss: 0.0041 - 103ms/epoch - 7ms/step\n",
            "Epoch 282/300\n",
            "15/15 - 0s - loss: 0.0038 - 96ms/epoch - 6ms/step\n",
            "Epoch 283/300\n",
            "15/15 - 0s - loss: 0.0035 - 97ms/epoch - 6ms/step\n",
            "Epoch 284/300\n",
            "15/15 - 0s - loss: 0.0033 - 99ms/epoch - 7ms/step\n",
            "Epoch 285/300\n",
            "15/15 - 0s - loss: 0.0041 - 89ms/epoch - 6ms/step\n",
            "Epoch 286/300\n",
            "15/15 - 0s - loss: 0.0027 - 95ms/epoch - 6ms/step\n",
            "Epoch 287/300\n",
            "15/15 - 0s - loss: 0.0026 - 86ms/epoch - 6ms/step\n",
            "Epoch 288/300\n",
            "15/15 - 0s - loss: 0.0053 - 90ms/epoch - 6ms/step\n",
            "Epoch 289/300\n",
            "15/15 - 0s - loss: 0.0097 - 93ms/epoch - 6ms/step\n",
            "Epoch 290/300\n",
            "15/15 - 0s - loss: 0.0126 - 89ms/epoch - 6ms/step\n",
            "Epoch 291/300\n",
            "15/15 - 0s - loss: 0.0082 - 92ms/epoch - 6ms/step\n",
            "Epoch 292/300\n",
            "15/15 - 0s - loss: 0.0075 - 92ms/epoch - 6ms/step\n",
            "Epoch 293/300\n",
            "15/15 - 0s - loss: 0.0068 - 100ms/epoch - 7ms/step\n",
            "Epoch 294/300\n",
            "15/15 - 0s - loss: 0.0034 - 98ms/epoch - 7ms/step\n",
            "Epoch 295/300\n",
            "15/15 - 0s - loss: 0.0042 - 87ms/epoch - 6ms/step\n",
            "Epoch 296/300\n",
            "15/15 - 0s - loss: 0.0099 - 88ms/epoch - 6ms/step\n",
            "Epoch 297/300\n",
            "15/15 - 0s - loss: 0.0305 - 91ms/epoch - 6ms/step\n",
            "Epoch 298/300\n",
            "15/15 - 0s - loss: 0.0055 - 92ms/epoch - 6ms/step\n",
            "Epoch 299/300\n",
            "15/15 - 0s - loss: 0.0077 - 89ms/epoch - 6ms/step\n",
            "Epoch 300/300\n",
            "15/15 - 0s - loss: 0.0122 - 87ms/epoch - 6ms/step\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.src.callbacks.History at 0x7fab042b1660>"
            ]
          },
          "metadata": {},
          "execution_count": 51
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "n-aNP4n3sqG_",
        "outputId": "dcc0bae3-205c-4832-dcf9-64736a78fdbe",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        }
      },
      "source": [
        "# Plotting code, feel free to ignore.\n",
        "h = 1.0\n",
        "x_min, x_max = X[:, 0].min() - 5, X[:, 0].max() + 5\n",
        "y_min, y_max = X[:, 1].min() - 5, X[:, 1].max() + 5\n",
        "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
        "                     np.arange(y_min, y_max, h))\n",
        "\n",
        "# here \"model\" is your model's prediction (classification) function\n",
        "Z = tn_model.predict(np.c_[xx.ravel(), yy.ravel()])\n",
        "\n",
        "# Put the result into a color plot\n",
        "Z = Z.reshape(xx.shape)\n",
        "plt.contourf(xx, yy, Z)\n",
        "plt.axis('off')\n",
        "\n",
        "# Plot also the training points\n",
        "plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)"
      ],
      "execution_count": 52,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "5/5 [==============================] - 0s 3ms/step\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x7faaa478a500>"
            ]
          },
          "metadata": {},
          "execution_count": 52
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "s_ukr55OORqE",
        "outputId": "e4b4a529-b194-4078-8c98-05cc05873fe3"
      },
      "execution_count": 53,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1712722240.4929676\n",
            "Wed Apr 10 04:10:40 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "o8HTyvcHchzQ",
        "outputId": "2c6af65a-08cc-4e84-b788-453c8988eaaf"
      },
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1712722240.4985774\n",
            "Wed Apr 10 04:10:40 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Function to compute saliency map\n",
        "@tf.function\n",
        "def compute_saliency(input_image):\n",
        "    with tf.GradientTape() as tape:\n",
        "        tape.watch(input_image)\n",
        "        predictions = tn_model(input_image)\n",
        "    grads = tape.gradient(predictions, input_image)\n",
        "    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
        "    return saliency_map\n",
        "\n",
        "# Function to compute saliency map using Gradient\n",
        "@tf.function\n",
        "def compute_gradient_saliency(input_image):\n",
        "    with tf.GradientTape() as tape:\n",
        "        tape.watch(input_image)\n",
        "        predictions = tn_model(input_image)\n",
        "    grads = tape.gradient(predictions, input_image)\n",
        "    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
        "    return saliency_map\n",
        "\n",
        "# Compute saliency map for the entire grid\n",
        "def compute_saliency_map_grid():\n",
        "    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
        "    input_image = np.c_[xx.ravel(), yy.ravel()]\n",
        "    saliency_map = compute_saliency(tf.constant(input_image, dtype=tf.float32)).numpy()\n",
        "    saliency_map = saliency_map.reshape(xx.shape)\n",
        "    return xx, yy, saliency_map\n",
        "\n",
        "# Compute and plot saliency map for the entire grid\n",
        "xx, yy, saliency_map = compute_saliency_map_grid()\n",
        "\n",
        "# Compute saliency maps for all data points\n",
        "def compute_saliency_maps():\n",
        "    saliency_maps = []\n",
        "    for data_point in X:\n",
        "        saliency_map = compute_gradient_saliency(tf.constant(data_point[None, :], dtype=tf.float32)).numpy()\n",
        "        saliency_maps.append(saliency_map)\n",
        "    return saliency_maps\n",
        "\n",
        "# Find the indices of the data points with the highest saliency values\n",
        "def find_top_indices(saliency_maps, top_k):\n",
        "    top_indices = np.argsort(np.max(saliency_maps, axis=1))[-top_k:]\n",
        "    return top_indices\n",
        "\n",
        "def plot_most_diagnostic(top_indices, top_k, normalized_saliency_values):\n",
        "    plt.figure(figsize=(8, 6))\n",
        "    plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)\n",
        "    plt.scatter(X[top_indices, 0], X[top_indices, 1], marker='o', s=200, facecolors='none', edgecolors='r', linewidths=2)\n",
        "    for i, index in enumerate(top_indices):\n",
        "        plt.annotate(f'{normalized_saliency_values.iloc[index][\"Saliency\"]:.4f}', (X[index, 0], X[index, 1]), xytext=(X[index, 0]+0.35, X[index, 1]+0.25), arrowprops=dict(facecolor='black', arrowstyle='->'))\n",
        "    plt.title(f'Saliency Most Diagnostic Data Points (Top {top_k})')\n",
        "    plt.xlabel('Feature 1')\n",
        "    plt.ylabel('Feature 2')\n",
        "    plt.grid(True)\n",
        "    plt.axis('equal')\n",
        "    plt.show()\n",
        "\n",
        "# Compute saliency maps for all data points\n",
        "saliency_maps = compute_saliency_maps()\n",
        "\n",
        "# Find the indices of the data points with the highest saliency values\n",
        "top_k = 5  # Number of top diagnostic data points to select\n",
        "top_indices = find_top_indices(saliency_maps, top_k)\n",
        "\n",
        "# Create a DataFrame to store the saliency values\n",
        "saliency_df = pd.DataFrame(data=saliency_maps, columns=[\"Saliency\"])\n",
        "\n",
        "# Save the saliency values to a CSV file\n",
        "saliency_df.to_csv(\"saliency_values.csv\", index=False)\n",
        "\n",
        "print(\"Saliency values saved to saliency_values.csv\")\n",
        "\n",
        "# Normalizing the saliency values\n",
        "normalized_saliency = (saliency_df - saliency_df.min()) / (saliency_df.max() - saliency_df.min())\n",
        "\n",
        "# Saving the normalized saliency values to a new CSV file\n",
        "normalized_saliency.to_csv(\"normalized_saliency_values.csv\", index=False)\n",
        "\n",
        "# Plot the most diagnostic data points\n",
        "plot_most_diagnostic(top_indices, top_k, normalized_saliency)\n",
        "\n",
        "print(\"Normalized saliency values saved to normalized_saliency_values.csv\")\n",
        "print(\"Normalized Saliency Top-k:\")\n",
        "print(normalized_saliency.nlargest(top_k, 'Saliency'))\n",
        "print(\"Normalized Saliency Max:\", normalized_saliency.max())\n",
        "print(\"Normalized Saliency Min:\", normalized_saliency.min())\n",
        "print(\"Normalized Saliency Mean:\", normalized_saliency.mean())\n",
        "print(\"Normalized Saliency Median:\", normalized_saliency.median())\n",
        "print(\"Normalized Saliency Mode:\", normalized_saliency.mode())\n",
        "sum_normalized_values = normalized_saliency.sum()\n",
        "print(\"Normalized Saliency Sum:\", sum_normalized_values)\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"Normalized Saliency Standard Deviation:\", normalized_saliency.std())\n",
        "print(\"Normalized Saliency Skewness:\", normalized_saliency.skew())\n",
        "print(\"Normalized Saliency Kurtosis:\", normalized_saliency.kurtosis())\n",
        "print(\"Normalized Saliency Variance:\", normalized_saliency.var())\n",
        "coefficient_variation = (normalized_saliency.std() / normalized_saliency.mean()) * 100\n",
        "print(\"Normalized Saliency Coefficient of Variation:\", coefficient_variation)\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "cumulative_sum = normalized_saliency.cumsum()\n",
        "print(\"Cumulative Sum of Normalized Saliency Values:\", cumulative_sum)\n",
        "mean_cumulative_sum = cumulative_sum / len(normalized_saliency)\n",
        "print(\"Mean of Cumulative Sum of Normalized Saliency Values:\", mean_cumulative_sum)\n",
        "rms = np.sqrt(np.mean(normalized_saliency**2))\n",
        "print(\"Normalized Saliency Root Mean Square:\", rms)\n",
        "q1 = normalized_saliency.quantile(0.25)\n",
        "q2 = normalized_saliency.quantile(0.75)\n",
        "iqr = q2 - q1\n",
        "print(\"Normalized Saliency 25th Percentile:\", q1)\n",
        "print(\"Normalized Saliency 75th Percentile:\", q2)\n",
        "print(\"Normalized Saliency Interquartile Range:\", iqr)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1918
        },
        "id": "95xed6YyDClf",
        "outputId": "8a958cd4-b91b-44ae-ac72-8e580bf1113e"
      },
      "execution_count": 55,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Saliency values saved to saliency_values.csv\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x600 with 1 Axes>"
            ],
            "image/png": "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e0T7m2++mS1btvDggw9yww038OWXXx4xrvett97ijDPOoKSkhDlz5vDEE08wZMgQli5dCsDll1+Oy+Xiww8/bLCfw+Hg448/5m9/+5uqHq+TTz6Z7t27e5NugA8//JCwsDDOOOOMI9rX1NQwfvx43n33XS677DKefvppIiIimDFjhjfxBVi2bBmXXHIJUVFRPPnkkzzxxBOMHz+eVatWeX/vLbfcAsC9997Lu+++y7vvvkv//v19xtyUyy+/HMBnwvf8888zdOhQHn74YR5//HH0ej0XXHABX3/9dYN2M2bM4IUXXuD000/nySefJCQkpNHnpN6FF15IZWUl8+fP58ILL+Stt97yDn2od/XVVzN37lyGDRvGc889x7hx45g/fz4XX3yxt01BQQGTJ09m37593HPPPbzwwgtcdtll3t7ZuLg47x9y5557rve5O++885qMbd68eVx++eUYDAYefvhh5s2bR0pKCt9//32zz5UvjT3nH330ETabjRtuuIEXXniBKVOm8MILL3DFFVd421x33XVMmjQJwBv/u+++671f7TlqiYyMDABiYmJUv46b4+t8v/vuu5hMJsaOHet9fNdddx0A119/PS+//DJ/+9vf+Ne//sUdd9xBSEgIO3bsaPZ3rl69GoBhw4a16LG/9dZbXHjhheh0OubPn88111zDp59+ykknnURZWVmDtm63m6lTp5KQkMBTTz3F8OHDefDBB3nwwQdV/S6bzYbVaiUiIoLo6GhuuukmqqqqGm07fPhw72MSokmKEKLVvvvuO0Wn0yk6nU4ZM2aMctdddynffvut4nA4jmhrs9mO2DZlyhSld+/eDbaNGzdOGTdunPd2VlaWAihvvvmmd9upp56qHHfccUptba13m8fjUU444QQlPT3du+3NN99UAGXixImKx+Pxbr/99tsVnU6nlJWVKYqiKGVlZUp4eLgyatQopaampkE8f95vzJgxyqhRoxrc/+mnnyqA8sMPPzTyDP3hwQcfVAClsLBQueOOO5S0tDTvfccff7wyc+ZMRVEUBVBuuukm730LFy5UAOU///mPd5vD4VDGjBmjhIWFKRUVFYqiKMqtt96qWK1WxeVyNRnDRx99pCrWxmJuTGlpqQIo5557rnfb9OnTlZ49ezZo99dz73A4lIEDByoTJkzwbtu4caMCKLfddluDtjNmzFAA5cEH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77//zu7du3n77bcbTMBrbHhNU49B7Tk6Gi15HR+N5s5TUlISN954IzfeeCMFBQUMGzaMxx57jNNOO63JfeoX08jKymLQoEGqYqh/LLt27TriitCuXbuOeKwej4fMzExvbzHA7t27AVq12mT9cLP6Cit/lpWVRWxsbKP3CVFPeo6FOAo//PBDo7029WM96y8r1vf4/LlteXl5q7584+PjGT9+PK+++qo3+f6z1iyPOnnyZMLDw5k/f/4R5dj++vhOO+00YmNjefLJJ/nxxx9bXde0T58+LFy4kPnz5zNy5Mgm251++unk5eU1qJLhcrl44YUXCAsL814+Ly4ubrCfVqv1fpnXDw8IDQ0FOGK2fGssXryYN954gzFjxnDqqac22U6n06HRaHC73d5t+/btO2IVs/pk71//+leD7Uez0uLpp58OwMKFCxtsX7BgAYC3EkZpaekR57k+qa1/7iwWC6DuuZs2bRparZaHH374iJ7bo+ktb+w5b+y9pShKoxUgmjr/as/R0VD7Oj5aoaGhjVaD+OvwkPj4eJKTk30OnamvZ7xhwwbVMYwYMYL4+HheeeWVBsf/5ptv2LFjR6MVWF588UXvz4qi8OKLL2IwGJp9b9XW1jbao/3II4+gKApTp0494r6NGzc2qNEsRGOk51iIo3DzzTdjs9k499xz6devHw6Hg9WrV/Phhx/Sq1cvZs6cCdQln/W9mtdddx1VVVW8/vrrxMfHN5rg+vLSSy9x0kkncdxxx3HNNdfQu3dv8vPzWbNmDQcPHmTLli0tOp7VauW5557j6quv5vjjj+fSSy8lKiqKLVu2YLPZGtRiNRgMXHzxxbz44ovodLoGE4xa6tZbb/XZ5tprr+XVV19lxowZbNy4kV69evHxxx+zatUqFi5c6B17evXVV1NSUsKECRPo3r072dnZvPDCCwwZMsTbazpkyBB0Oh1PPvkk5eXlmEwmb+3p5nz88ceEhYXhcDi8q7WtWrWKwYMHe4fONOWMM85gwYIFTJ06lUsvvZSCggJeeukl0tLS+O2337zthg8fzt/+9jcWLlxIcXExo0eP5scff/T2oLWm13vw4MFMnz6d1157jbKyMsaNG8e6det4++23mTZtGqeccgoAb7/9Nv/6178499xz6dOnD5WVlbz++utYrVZvgh0SEsKAAQP48MMP6du3L9HR0QwcOLDR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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Normalized saliency values saved to normalized_saliency_values.csv\n",
            "Normalized Saliency Top-k:\n",
            "     Saliency\n",
            "239  1.000000\n",
            "240  0.716820\n",
            "241  0.607649\n",
            "242  0.268784\n",
            "238  0.081736\n",
            "Normalized Saliency Max: Saliency    1.0\n",
            "dtype: float32\n",
            "Normalized Saliency Min: Saliency    0.0\n",
            "dtype: float32\n",
            "Normalized Saliency Mean: Saliency    0.009598\n",
            "dtype: float32\n",
            "Normalized Saliency Median: Saliency    0.002149\n",
            "dtype: float32\n",
            "Normalized Saliency Mode:    Saliency\n",
            "0  0.000014\n",
            "Normalized Saliency Sum: Saliency    4.607172\n",
            "dtype: float32\n",
            "#\n",
            "#\n",
            "#\n",
            "Normalized Saliency Standard Deviation: Saliency    0.063869\n",
            "dtype: float32\n",
            "Normalized Saliency Skewness: Saliency    12.534398\n",
            "dtype: float32\n",
            "Normalized Saliency Kurtosis: Saliency    167.829376\n",
            "dtype: float32\n",
            "Normalized Saliency Variance: Saliency    0.004079\n",
            "dtype: float32\n",
            "Normalized Saliency Coefficient of Variation: Saliency    665.423523\n",
            "dtype: float32\n",
            "#\n",
            "#\n",
            "#\n",
            "Cumulative Sum of Normalized Saliency Values:      Saliency\n",
            "0    0.000015\n",
            "1    0.000030\n",
            "2    0.000044\n",
            "3    0.000058\n",
            "4    0.000072\n",
            "..        ...\n",
            "475  4.583261\n",
            "476  4.588209\n",
            "477  4.594139\n",
            "478  4.600782\n",
            "479  4.607173\n",
            "\n",
            "[480 rows x 1 columns]\n",
            "Mean of Cumulative Sum of Normalized Saliency Values:          Saliency\n",
            "0    3.205336e-08\n",
            "1    6.173653e-08\n",
            "2    9.141970e-08\n",
            "3    1.211029e-07\n",
            "4    1.507860e-07\n",
            "..            ...\n",
            "475  9.548461e-03\n",
            "476  9.558769e-03\n",
            "477  9.571122e-03\n",
            "478  9.584962e-03\n",
            "479  9.598277e-03\n",
            "\n",
            "[480 rows x 1 columns]\n",
            "Normalized Saliency Root Mean Square: Saliency    0.064521\n",
            "dtype: float32\n",
            "Normalized Saliency 25th Percentile: Saliency    0.001237\n",
            "Name: 0.25, dtype: float64\n",
            "Normalized Saliency 75th Percentile: Saliency    0.006022\n",
            "Name: 0.75, dtype: float64\n",
            "Normalized Saliency Interquartile Range: Saliency    0.004786\n",
            "dtype: float64\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/numpy/core/fromnumeric.py:3502: FutureWarning: In a future version, DataFrame.mean(axis=None) will return a scalar mean over the entire DataFrame. To retain the old behavior, use 'frame.mean(axis=0)' or just 'frame.mean()'\n",
            "  return mean(axis=axis, dtype=dtype, out=out, **kwargs)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "wfZCzuq9KY9b",
        "outputId": "f191405c-3846-42c9-b12a-3fbb1173e061"
      },
      "execution_count": 56,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1712722241.7646184\n",
            "Wed Apr 10 04:10:41 2024\n"
          ]
        }
      ]
    }
  ]
}