1262 lines (1262 with data), 132.5 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": 35,
"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": 36,
"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": "889405c0-6bc0-424b-88e1-29119af121c9",
"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",
" TNLayer(),\n",
" TNLayer(),\n",
" Dense(1024, activation=tf.nn.relu),\n",
" # Finish Modified Layers\n",
" Dense(1, activation=None)])\n",
"tn_model.summary()"
],
"execution_count": 37,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model: \"sequential_3\"\n",
"_________________________________________________________________\n",
" Layer (type) Output Shape Param # \n",
"=================================================================\n",
" dense_9 (Dense) (None, 1024) 3072 \n",
" \n",
" tn_layer_9 (TNLayer) (None, 1024) 5120 \n",
" \n",
" tn_layer_10 (TNLayer) (None, 1024) 5120 \n",
" \n",
" tn_layer_11 (TNLayer) (None, 1024) 5120 \n",
" \n",
" dense_10 (Dense) (None, 1024) 1049600 \n",
" \n",
" dense_11 (Dense) (None, 1) 1025 \n",
" \n",
"=================================================================\n",
"Total params: 1069057 (4.08 MB)\n",
"Trainable params: 1069057 (4.08 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": 38,
"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": "1f0abd62-6c6a-4fb8-af38-9c341f3e0bc1"
},
"execution_count": 39,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since beginning of run: 1712725123.5663962\n",
"Wed Apr 10 04:58:43 2024\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "crc0q1vbIyTj",
"outputId": "947a7e5e-dd87-421a-fa00-a8d59fbf92e0",
"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": 40,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/300\n",
"15/15 - 2s - loss: 1.0028 - 2s/epoch - 112ms/step\n",
"Epoch 2/300\n",
"15/15 - 0s - loss: 1.0001 - 128ms/epoch - 9ms/step\n",
"Epoch 3/300\n",
"15/15 - 0s - loss: 1.0006 - 121ms/epoch - 8ms/step\n",
"Epoch 4/300\n",
"15/15 - 0s - loss: 1.0004 - 121ms/epoch - 8ms/step\n",
"Epoch 5/300\n",
"15/15 - 0s - loss: 1.0003 - 124ms/epoch - 8ms/step\n",
"Epoch 6/300\n",
"15/15 - 0s - loss: 1.0003 - 133ms/epoch - 9ms/step\n",
"Epoch 7/300\n",
"15/15 - 0s - loss: 1.0004 - 125ms/epoch - 8ms/step\n",
"Epoch 8/300\n",
"15/15 - 0s - loss: 1.0002 - 130ms/epoch - 9ms/step\n",
"Epoch 9/300\n",
"15/15 - 0s - loss: 1.0007 - 126ms/epoch - 8ms/step\n",
"Epoch 10/300\n",
"15/15 - 0s - loss: 1.0002 - 120ms/epoch - 8ms/step\n",
"Epoch 11/300\n",
"15/15 - 0s - loss: 0.9926 - 123ms/epoch - 8ms/step\n",
"Epoch 12/300\n",
"15/15 - 0s - loss: 0.3493 - 125ms/epoch - 8ms/step\n",
"Epoch 13/300\n",
"15/15 - 0s - loss: 0.0426 - 126ms/epoch - 8ms/step\n",
"Epoch 14/300\n",
"15/15 - 0s - loss: 0.0337 - 122ms/epoch - 8ms/step\n",
"Epoch 15/300\n",
"15/15 - 0s - loss: 0.0160 - 119ms/epoch - 8ms/step\n",
"Epoch 16/300\n",
"15/15 - 0s - loss: 0.0122 - 121ms/epoch - 8ms/step\n",
"Epoch 17/300\n",
"15/15 - 0s - loss: 0.0129 - 118ms/epoch - 8ms/step\n",
"Epoch 18/300\n",
"15/15 - 0s - loss: 0.0122 - 118ms/epoch - 8ms/step\n",
"Epoch 19/300\n",
"15/15 - 0s - loss: 0.0151 - 129ms/epoch - 9ms/step\n",
"Epoch 20/300\n",
"15/15 - 0s - loss: 0.0142 - 118ms/epoch - 8ms/step\n",
"Epoch 21/300\n",
"15/15 - 0s - loss: 0.0095 - 124ms/epoch - 8ms/step\n",
"Epoch 22/300\n",
"15/15 - 0s - loss: 0.0068 - 120ms/epoch - 8ms/step\n",
"Epoch 23/300\n",
"15/15 - 0s - loss: 0.0198 - 118ms/epoch - 8ms/step\n",
"Epoch 24/300\n",
"15/15 - 0s - loss: 0.0266 - 124ms/epoch - 8ms/step\n",
"Epoch 25/300\n",
"15/15 - 0s - loss: 0.0132 - 124ms/epoch - 8ms/step\n",
"Epoch 26/300\n",
"15/15 - 0s - loss: 0.0030 - 125ms/epoch - 8ms/step\n",
"Epoch 27/300\n",
"15/15 - 0s - loss: 0.0118 - 129ms/epoch - 9ms/step\n",
"Epoch 28/300\n",
"15/15 - 0s - loss: 0.0099 - 120ms/epoch - 8ms/step\n",
"Epoch 29/300\n",
"15/15 - 0s - loss: 0.0041 - 115ms/epoch - 8ms/step\n",
"Epoch 30/300\n",
"15/15 - 0s - loss: 0.0074 - 117ms/epoch - 8ms/step\n",
"Epoch 31/300\n",
"15/15 - 0s - loss: 0.0056 - 116ms/epoch - 8ms/step\n",
"Epoch 32/300\n",
"15/15 - 0s - loss: 0.0028 - 125ms/epoch - 8ms/step\n",
"Epoch 33/300\n",
"15/15 - 0s - loss: 0.0055 - 129ms/epoch - 9ms/step\n",
"Epoch 34/300\n",
"15/15 - 0s - loss: 0.0132 - 127ms/epoch - 8ms/step\n",
"Epoch 35/300\n",
"15/15 - 0s - loss: 0.0056 - 122ms/epoch - 8ms/step\n",
"Epoch 36/300\n",
"15/15 - 0s - loss: 0.0063 - 126ms/epoch - 8ms/step\n",
"Epoch 37/300\n",
"15/15 - 0s - loss: 0.0140 - 130ms/epoch - 9ms/step\n",
"Epoch 38/300\n",
"15/15 - 0s - loss: 0.0172 - 124ms/epoch - 8ms/step\n",
"Epoch 39/300\n",
"15/15 - 0s - loss: 0.0059 - 127ms/epoch - 8ms/step\n",
"Epoch 40/300\n",
"15/15 - 0s - loss: 0.0077 - 121ms/epoch - 8ms/step\n",
"Epoch 41/300\n",
"15/15 - 0s - loss: 0.0097 - 126ms/epoch - 8ms/step\n",
"Epoch 42/300\n",
"15/15 - 0s - loss: 0.0054 - 122ms/epoch - 8ms/step\n",
"Epoch 43/300\n",
"15/15 - 0s - loss: 0.0041 - 126ms/epoch - 8ms/step\n",
"Epoch 44/300\n",
"15/15 - 0s - loss: 0.0047 - 142ms/epoch - 9ms/step\n",
"Epoch 45/300\n",
"15/15 - 0s - loss: 0.0049 - 128ms/epoch - 9ms/step\n",
"Epoch 46/300\n",
"15/15 - 0s - loss: 0.0025 - 123ms/epoch - 8ms/step\n",
"Epoch 47/300\n",
"15/15 - 0s - loss: 0.0105 - 130ms/epoch - 9ms/step\n",
"Epoch 48/300\n",
"15/15 - 0s - loss: 0.0069 - 130ms/epoch - 9ms/step\n",
"Epoch 49/300\n",
"15/15 - 0s - loss: 0.0128 - 125ms/epoch - 8ms/step\n",
"Epoch 50/300\n",
"15/15 - 0s - loss: 0.0161 - 120ms/epoch - 8ms/step\n",
"Epoch 51/300\n",
"15/15 - 0s - loss: 0.0165 - 127ms/epoch - 8ms/step\n",
"Epoch 52/300\n",
"15/15 - 0s - loss: 0.0064 - 126ms/epoch - 8ms/step\n",
"Epoch 53/300\n",
"15/15 - 0s - loss: 0.0048 - 121ms/epoch - 8ms/step\n",
"Epoch 54/300\n",
"15/15 - 0s - loss: 0.0031 - 120ms/epoch - 8ms/step\n",
"Epoch 55/300\n",
"15/15 - 0s - loss: 0.0035 - 123ms/epoch - 8ms/step\n",
"Epoch 56/300\n",
"15/15 - 0s - loss: 0.0053 - 123ms/epoch - 8ms/step\n",
"Epoch 57/300\n",
"15/15 - 0s - loss: 0.0116 - 129ms/epoch - 9ms/step\n",
"Epoch 58/300\n",
"15/15 - 0s - loss: 0.0035 - 125ms/epoch - 8ms/step\n",
"Epoch 59/300\n",
"15/15 - 0s - loss: 0.0045 - 139ms/epoch - 9ms/step\n",
"Epoch 60/300\n",
"15/15 - 0s - loss: 0.0042 - 129ms/epoch - 9ms/step\n",
"Epoch 61/300\n",
"15/15 - 0s - loss: 0.0054 - 127ms/epoch - 8ms/step\n",
"Epoch 62/300\n",
"15/15 - 0s - loss: 0.0055 - 124ms/epoch - 8ms/step\n",
"Epoch 63/300\n",
"15/15 - 0s - loss: 0.0045 - 123ms/epoch - 8ms/step\n",
"Epoch 64/300\n",
"15/15 - 0s - loss: 0.0037 - 122ms/epoch - 8ms/step\n",
"Epoch 65/300\n",
"15/15 - 0s - loss: 0.0030 - 128ms/epoch - 9ms/step\n",
"Epoch 66/300\n",
"15/15 - 0s - loss: 0.0146 - 120ms/epoch - 8ms/step\n",
"Epoch 67/300\n",
"15/15 - 0s - loss: 0.0035 - 124ms/epoch - 8ms/step\n",
"Epoch 68/300\n",
"15/15 - 0s - loss: 0.0024 - 130ms/epoch - 9ms/step\n",
"Epoch 69/300\n",
"15/15 - 0s - loss: 0.0026 - 130ms/epoch - 9ms/step\n",
"Epoch 70/300\n",
"15/15 - 0s - loss: 0.0025 - 122ms/epoch - 8ms/step\n",
"Epoch 71/300\n",
"15/15 - 0s - loss: 0.0104 - 120ms/epoch - 8ms/step\n",
"Epoch 72/300\n",
"15/15 - 0s - loss: 0.0061 - 120ms/epoch - 8ms/step\n",
"Epoch 73/300\n",
"15/15 - 0s - loss: 0.0027 - 121ms/epoch - 8ms/step\n",
"Epoch 74/300\n",
"15/15 - 0s - loss: 0.0065 - 128ms/epoch - 9ms/step\n",
"Epoch 75/300\n",
"15/15 - 0s - loss: 0.0012 - 117ms/epoch - 8ms/step\n",
"Epoch 76/300\n",
"15/15 - 0s - loss: 0.0061 - 126ms/epoch - 8ms/step\n",
"Epoch 77/300\n",
"15/15 - 0s - loss: 0.0047 - 127ms/epoch - 8ms/step\n",
"Epoch 78/300\n",
"15/15 - 0s - loss: 0.0076 - 128ms/epoch - 9ms/step\n",
"Epoch 79/300\n",
"15/15 - 0s - loss: 0.0024 - 121ms/epoch - 8ms/step\n",
"Epoch 80/300\n",
"15/15 - 0s - loss: 0.0056 - 119ms/epoch - 8ms/step\n",
"Epoch 81/300\n",
"15/15 - 0s - loss: 0.0083 - 125ms/epoch - 8ms/step\n",
"Epoch 82/300\n",
"15/15 - 0s - loss: 0.0144 - 127ms/epoch - 8ms/step\n",
"Epoch 83/300\n",
"15/15 - 0s - loss: 0.0022 - 120ms/epoch - 8ms/step\n",
"Epoch 84/300\n",
"15/15 - 0s - loss: 0.0047 - 127ms/epoch - 8ms/step\n",
"Epoch 85/300\n",
"15/15 - 0s - loss: 0.0032 - 119ms/epoch - 8ms/step\n",
"Epoch 86/300\n",
"15/15 - 0s - loss: 0.0035 - 120ms/epoch - 8ms/step\n",
"Epoch 87/300\n",
"15/15 - 0s - loss: 0.0057 - 131ms/epoch - 9ms/step\n",
"Epoch 88/300\n",
"15/15 - 0s - loss: 0.0076 - 121ms/epoch - 8ms/step\n",
"Epoch 89/300\n",
"15/15 - 0s - loss: 0.0014 - 118ms/epoch - 8ms/step\n",
"Epoch 90/300\n",
"15/15 - 0s - loss: 0.0049 - 136ms/epoch - 9ms/step\n",
"Epoch 91/300\n",
"15/15 - 0s - loss: 0.0063 - 130ms/epoch - 9ms/step\n",
"Epoch 92/300\n",
"15/15 - 0s - loss: 0.0027 - 126ms/epoch - 8ms/step\n",
"Epoch 93/300\n",
"15/15 - 0s - loss: 0.0041 - 128ms/epoch - 9ms/step\n",
"Epoch 94/300\n",
"15/15 - 0s - loss: 0.0040 - 121ms/epoch - 8ms/step\n",
"Epoch 95/300\n",
"15/15 - 0s - loss: 0.0072 - 127ms/epoch - 8ms/step\n",
"Epoch 96/300\n",
"15/15 - 0s - loss: 0.0034 - 125ms/epoch - 8ms/step\n",
"Epoch 97/300\n",
"15/15 - 0s - loss: 0.0022 - 118ms/epoch - 8ms/step\n",
"Epoch 98/300\n",
"15/15 - 0s - loss: 0.0041 - 128ms/epoch - 9ms/step\n",
"Epoch 99/300\n",
"15/15 - 0s - loss: 0.0038 - 119ms/epoch - 8ms/step\n",
"Epoch 100/300\n",
"15/15 - 0s - loss: 0.0046 - 134ms/epoch - 9ms/step\n",
"Epoch 101/300\n",
"15/15 - 0s - loss: 0.0094 - 123ms/epoch - 8ms/step\n",
"Epoch 102/300\n",
"15/15 - 0s - loss: 0.0112 - 126ms/epoch - 8ms/step\n",
"Epoch 103/300\n",
"15/15 - 0s - loss: 0.0010 - 123ms/epoch - 8ms/step\n",
"Epoch 104/300\n",
"15/15 - 0s - loss: 0.0086 - 119ms/epoch - 8ms/step\n",
"Epoch 105/300\n",
"15/15 - 0s - loss: 0.0022 - 119ms/epoch - 8ms/step\n",
"Epoch 106/300\n",
"15/15 - 0s - loss: 0.0078 - 122ms/epoch - 8ms/step\n",
"Epoch 107/300\n",
"15/15 - 0s - loss: 0.0071 - 123ms/epoch - 8ms/step\n",
"Epoch 108/300\n",
"15/15 - 0s - loss: 0.0040 - 119ms/epoch - 8ms/step\n",
"Epoch 109/300\n",
"15/15 - 0s - loss: 0.0028 - 116ms/epoch - 8ms/step\n",
"Epoch 110/300\n",
"15/15 - 0s - loss: 0.0024 - 126ms/epoch - 8ms/step\n",
"Epoch 111/300\n",
"15/15 - 0s - loss: 0.0039 - 123ms/epoch - 8ms/step\n",
"Epoch 112/300\n",
"15/15 - 0s - loss: 0.0032 - 124ms/epoch - 8ms/step\n",
"Epoch 113/300\n",
"15/15 - 0s - loss: 0.0041 - 124ms/epoch - 8ms/step\n",
"Epoch 114/300\n",
"15/15 - 0s - loss: 0.0023 - 121ms/epoch - 8ms/step\n",
"Epoch 115/300\n",
"15/15 - 0s - loss: 0.0031 - 123ms/epoch - 8ms/step\n",
"Epoch 116/300\n",
"15/15 - 0s - loss: 0.0070 - 124ms/epoch - 8ms/step\n",
"Epoch 117/300\n",
"15/15 - 0s - loss: 0.0028 - 124ms/epoch - 8ms/step\n",
"Epoch 118/300\n",
"15/15 - 0s - loss: 0.0043 - 120ms/epoch - 8ms/step\n",
"Epoch 119/300\n",
"15/15 - 0s - loss: 0.0047 - 127ms/epoch - 8ms/step\n",
"Epoch 120/300\n",
"15/15 - 0s - loss: 0.0094 - 127ms/epoch - 8ms/step\n",
"Epoch 121/300\n",
"15/15 - 0s - loss: 0.0030 - 116ms/epoch - 8ms/step\n",
"Epoch 122/300\n",
"15/15 - 0s - loss: 0.0028 - 119ms/epoch - 8ms/step\n",
"Epoch 123/300\n",
"15/15 - 0s - loss: 0.0046 - 129ms/epoch - 9ms/step\n",
"Epoch 124/300\n",
"15/15 - 0s - loss: 0.0048 - 123ms/epoch - 8ms/step\n",
"Epoch 125/300\n",
"15/15 - 0s - loss: 0.0023 - 129ms/epoch - 9ms/step\n",
"Epoch 126/300\n",
"15/15 - 0s - loss: 0.0035 - 128ms/epoch - 9ms/step\n",
"Epoch 127/300\n",
"15/15 - 0s - loss: 0.0062 - 117ms/epoch - 8ms/step\n",
"Epoch 128/300\n",
"15/15 - 0s - loss: 0.0075 - 120ms/epoch - 8ms/step\n",
"Epoch 129/300\n",
"15/15 - 0s - loss: 0.0039 - 123ms/epoch - 8ms/step\n",
"Epoch 130/300\n",
"15/15 - 0s - loss: 0.0035 - 126ms/epoch - 8ms/step\n",
"Epoch 131/300\n",
"15/15 - 0s - loss: 0.0016 - 123ms/epoch - 8ms/step\n",
"Epoch 132/300\n",
"15/15 - 0s - loss: 0.0048 - 118ms/epoch - 8ms/step\n",
"Epoch 133/300\n",
"15/15 - 0s - loss: 0.0034 - 121ms/epoch - 8ms/step\n",
"Epoch 134/300\n",
"15/15 - 0s - loss: 0.0032 - 121ms/epoch - 8ms/step\n",
"Epoch 135/300\n",
"15/15 - 0s - loss: 0.0027 - 128ms/epoch - 9ms/step\n",
"Epoch 136/300\n",
"15/15 - 0s - loss: 0.0038 - 120ms/epoch - 8ms/step\n",
"Epoch 137/300\n",
"15/15 - 0s - loss: 0.0021 - 116ms/epoch - 8ms/step\n",
"Epoch 138/300\n",
"15/15 - 0s - loss: 0.0038 - 121ms/epoch - 8ms/step\n",
"Epoch 139/300\n",
"15/15 - 0s - loss: 0.0016 - 119ms/epoch - 8ms/step\n",
"Epoch 140/300\n",
"15/15 - 0s - loss: 0.0022 - 123ms/epoch - 8ms/step\n",
"Epoch 141/300\n",
"15/15 - 0s - loss: 0.0081 - 119ms/epoch - 8ms/step\n",
"Epoch 142/300\n",
"15/15 - 0s - loss: 0.0087 - 126ms/epoch - 8ms/step\n",
"Epoch 143/300\n",
"15/15 - 0s - loss: 0.0048 - 122ms/epoch - 8ms/step\n",
"Epoch 144/300\n",
"15/15 - 0s - loss: 0.0037 - 122ms/epoch - 8ms/step\n",
"Epoch 145/300\n",
"15/15 - 0s - loss: 0.0024 - 122ms/epoch - 8ms/step\n",
"Epoch 146/300\n",
"15/15 - 0s - loss: 0.0030 - 121ms/epoch - 8ms/step\n",
"Epoch 147/300\n",
"15/15 - 0s - loss: 0.0048 - 123ms/epoch - 8ms/step\n",
"Epoch 148/300\n",
"15/15 - 0s - loss: 0.0070 - 119ms/epoch - 8ms/step\n",
"Epoch 149/300\n",
"15/15 - 0s - loss: 0.0119 - 125ms/epoch - 8ms/step\n",
"Epoch 150/300\n",
"15/15 - 0s - loss: 0.0059 - 127ms/epoch - 8ms/step\n",
"Epoch 151/300\n",
"15/15 - 0s - loss: 0.0024 - 130ms/epoch - 9ms/step\n",
"Epoch 152/300\n",
"15/15 - 0s - loss: 0.0041 - 120ms/epoch - 8ms/step\n",
"Epoch 153/300\n",
"15/15 - 0s - loss: 0.0023 - 123ms/epoch - 8ms/step\n",
"Epoch 154/300\n",
"15/15 - 0s - loss: 0.0022 - 131ms/epoch - 9ms/step\n",
"Epoch 155/300\n",
"15/15 - 0s - loss: 0.0016 - 126ms/epoch - 8ms/step\n",
"Epoch 156/300\n",
"15/15 - 0s - loss: 0.0028 - 127ms/epoch - 8ms/step\n",
"Epoch 157/300\n",
"15/15 - 0s - loss: 0.0053 - 118ms/epoch - 8ms/step\n",
"Epoch 158/300\n",
"15/15 - 0s - loss: 0.0036 - 120ms/epoch - 8ms/step\n",
"Epoch 159/300\n",
"15/15 - 0s - loss: 0.0021 - 121ms/epoch - 8ms/step\n",
"Epoch 160/300\n",
"15/15 - 0s - loss: 0.0039 - 124ms/epoch - 8ms/step\n",
"Epoch 161/300\n",
"15/15 - 0s - loss: 0.0064 - 119ms/epoch - 8ms/step\n",
"Epoch 162/300\n",
"15/15 - 0s - loss: 0.0040 - 127ms/epoch - 8ms/step\n",
"Epoch 163/300\n",
"15/15 - 0s - loss: 0.0062 - 132ms/epoch - 9ms/step\n",
"Epoch 164/300\n",
"15/15 - 0s - loss: 0.0090 - 124ms/epoch - 8ms/step\n",
"Epoch 165/300\n",
"15/15 - 0s - loss: 0.0038 - 122ms/epoch - 8ms/step\n",
"Epoch 166/300\n",
"15/15 - 0s - loss: 0.0023 - 132ms/epoch - 9ms/step\n",
"Epoch 167/300\n",
"15/15 - 0s - loss: 0.0030 - 134ms/epoch - 9ms/step\n",
"Epoch 168/300\n",
"15/15 - 0s - loss: 0.0021 - 119ms/epoch - 8ms/step\n",
"Epoch 169/300\n",
"15/15 - 0s - loss: 0.0020 - 126ms/epoch - 8ms/step\n",
"Epoch 170/300\n",
"15/15 - 0s - loss: 0.0057 - 125ms/epoch - 8ms/step\n",
"Epoch 171/300\n",
"15/15 - 0s - loss: 0.0028 - 119ms/epoch - 8ms/step\n",
"Epoch 172/300\n",
"15/15 - 0s - loss: 7.6292e-04 - 131ms/epoch - 9ms/step\n",
"Epoch 173/300\n",
"15/15 - 0s - loss: 0.0012 - 127ms/epoch - 8ms/step\n",
"Epoch 174/300\n",
"15/15 - 0s - loss: 0.0017 - 122ms/epoch - 8ms/step\n",
"Epoch 175/300\n",
"15/15 - 0s - loss: 0.0092 - 119ms/epoch - 8ms/step\n",
"Epoch 176/300\n",
"15/15 - 0s - loss: 0.0064 - 128ms/epoch - 9ms/step\n",
"Epoch 177/300\n",
"15/15 - 0s - loss: 0.0027 - 121ms/epoch - 8ms/step\n",
"Epoch 178/300\n",
"15/15 - 0s - loss: 0.0041 - 122ms/epoch - 8ms/step\n",
"Epoch 179/300\n",
"15/15 - 0s - loss: 0.0016 - 120ms/epoch - 8ms/step\n",
"Epoch 180/300\n",
"15/15 - 0s - loss: 0.0031 - 118ms/epoch - 8ms/step\n",
"Epoch 181/300\n",
"15/15 - 0s - loss: 0.0049 - 124ms/epoch - 8ms/step\n",
"Epoch 182/300\n",
"15/15 - 0s - loss: 0.0048 - 117ms/epoch - 8ms/step\n",
"Epoch 183/300\n",
"15/15 - 0s - loss: 0.0063 - 121ms/epoch - 8ms/step\n",
"Epoch 184/300\n",
"15/15 - 0s - loss: 0.0030 - 124ms/epoch - 8ms/step\n",
"Epoch 185/300\n",
"15/15 - 0s - loss: 0.0027 - 122ms/epoch - 8ms/step\n",
"Epoch 186/300\n",
"15/15 - 0s - loss: 0.0020 - 123ms/epoch - 8ms/step\n",
"Epoch 187/300\n",
"15/15 - 0s - loss: 0.0016 - 129ms/epoch - 9ms/step\n",
"Epoch 188/300\n",
"15/15 - 0s - loss: 0.0032 - 121ms/epoch - 8ms/step\n",
"Epoch 189/300\n",
"15/15 - 0s - loss: 0.0013 - 113ms/epoch - 8ms/step\n",
"Epoch 190/300\n",
"15/15 - 0s - loss: 0.0045 - 125ms/epoch - 8ms/step\n",
"Epoch 191/300\n",
"15/15 - 0s - loss: 0.0137 - 123ms/epoch - 8ms/step\n",
"Epoch 192/300\n",
"15/15 - 0s - loss: 0.0059 - 116ms/epoch - 8ms/step\n",
"Epoch 193/300\n",
"15/15 - 0s - loss: 0.0076 - 123ms/epoch - 8ms/step\n",
"Epoch 194/300\n",
"15/15 - 0s - loss: 0.0185 - 115ms/epoch - 8ms/step\n",
"Epoch 195/300\n",
"15/15 - 0s - loss: 0.0067 - 114ms/epoch - 8ms/step\n",
"Epoch 196/300\n",
"15/15 - 0s - loss: 0.0024 - 133ms/epoch - 9ms/step\n",
"Epoch 197/300\n",
"15/15 - 0s - loss: 0.0025 - 121ms/epoch - 8ms/step\n",
"Epoch 198/300\n",
"15/15 - 0s - loss: 0.0030 - 127ms/epoch - 8ms/step\n",
"Epoch 199/300\n",
"15/15 - 0s - loss: 0.0034 - 120ms/epoch - 8ms/step\n",
"Epoch 200/300\n",
"15/15 - 0s - loss: 0.0026 - 122ms/epoch - 8ms/step\n",
"Epoch 201/300\n",
"15/15 - 0s - loss: 0.0023 - 126ms/epoch - 8ms/step\n",
"Epoch 202/300\n",
"15/15 - 0s - loss: 0.0016 - 124ms/epoch - 8ms/step\n",
"Epoch 203/300\n",
"15/15 - 0s - loss: 0.0021 - 129ms/epoch - 9ms/step\n",
"Epoch 204/300\n",
"15/15 - 0s - loss: 0.0030 - 124ms/epoch - 8ms/step\n",
"Epoch 205/300\n",
"15/15 - 0s - loss: 0.0012 - 123ms/epoch - 8ms/step\n",
"Epoch 206/300\n",
"15/15 - 0s - loss: 0.0022 - 120ms/epoch - 8ms/step\n",
"Epoch 207/300\n",
"15/15 - 0s - loss: 0.0032 - 125ms/epoch - 8ms/step\n",
"Epoch 208/300\n",
"15/15 - 0s - loss: 0.0054 - 125ms/epoch - 8ms/step\n",
"Epoch 209/300\n",
"15/15 - 0s - loss: 0.0056 - 123ms/epoch - 8ms/step\n",
"Epoch 210/300\n",
"15/15 - 0s - loss: 0.0068 - 120ms/epoch - 8ms/step\n",
"Epoch 211/300\n",
"15/15 - 0s - loss: 0.0018 - 129ms/epoch - 9ms/step\n",
"Epoch 212/300\n",
"15/15 - 0s - loss: 0.0041 - 121ms/epoch - 8ms/step\n",
"Epoch 213/300\n",
"15/15 - 0s - loss: 0.0014 - 125ms/epoch - 8ms/step\n",
"Epoch 214/300\n",
"15/15 - 0s - loss: 0.0014 - 123ms/epoch - 8ms/step\n",
"Epoch 215/300\n",
"15/15 - 0s - loss: 0.0019 - 122ms/epoch - 8ms/step\n",
"Epoch 216/300\n",
"15/15 - 0s - loss: 8.8976e-04 - 125ms/epoch - 8ms/step\n",
"Epoch 217/300\n",
"15/15 - 0s - loss: 0.0011 - 118ms/epoch - 8ms/step\n",
"Epoch 218/300\n",
"15/15 - 0s - loss: 0.0070 - 128ms/epoch - 9ms/step\n",
"Epoch 219/300\n",
"15/15 - 0s - loss: 0.0012 - 115ms/epoch - 8ms/step\n",
"Epoch 220/300\n",
"15/15 - 0s - loss: 0.0080 - 120ms/epoch - 8ms/step\n",
"Epoch 221/300\n",
"15/15 - 0s - loss: 0.0063 - 133ms/epoch - 9ms/step\n",
"Epoch 222/300\n",
"15/15 - 0s - loss: 0.0015 - 128ms/epoch - 9ms/step\n",
"Epoch 223/300\n",
"15/15 - 0s - loss: 8.1355e-04 - 124ms/epoch - 8ms/step\n",
"Epoch 224/300\n",
"15/15 - 0s - loss: 7.8061e-04 - 128ms/epoch - 9ms/step\n",
"Epoch 225/300\n",
"15/15 - 0s - loss: 6.2975e-04 - 123ms/epoch - 8ms/step\n",
"Epoch 226/300\n",
"15/15 - 0s - loss: 3.7408e-04 - 132ms/epoch - 9ms/step\n",
"Epoch 227/300\n",
"15/15 - 0s - loss: 6.6087e-04 - 131ms/epoch - 9ms/step\n",
"Epoch 228/300\n",
"15/15 - 0s - loss: 0.0024 - 125ms/epoch - 8ms/step\n",
"Epoch 229/300\n",
"15/15 - 0s - loss: 0.0059 - 130ms/epoch - 9ms/step\n",
"Epoch 230/300\n",
"15/15 - 0s - loss: 0.0017 - 123ms/epoch - 8ms/step\n",
"Epoch 231/300\n",
"15/15 - 0s - loss: 0.0081 - 122ms/epoch - 8ms/step\n",
"Epoch 232/300\n",
"15/15 - 0s - loss: 0.0070 - 123ms/epoch - 8ms/step\n",
"Epoch 233/300\n",
"15/15 - 0s - loss: 9.5469e-04 - 128ms/epoch - 9ms/step\n",
"Epoch 234/300\n",
"15/15 - 0s - loss: 0.0050 - 122ms/epoch - 8ms/step\n",
"Epoch 235/300\n",
"15/15 - 0s - loss: 0.0146 - 123ms/epoch - 8ms/step\n",
"Epoch 236/300\n",
"15/15 - 0s - loss: 9.6042e-04 - 124ms/epoch - 8ms/step\n",
"Epoch 237/300\n",
"15/15 - 0s - loss: 0.0034 - 121ms/epoch - 8ms/step\n",
"Epoch 238/300\n",
"15/15 - 0s - loss: 0.0023 - 123ms/epoch - 8ms/step\n",
"Epoch 239/300\n",
"15/15 - 0s - loss: 0.0060 - 133ms/epoch - 9ms/step\n",
"Epoch 240/300\n",
"15/15 - 0s - loss: 0.0089 - 122ms/epoch - 8ms/step\n",
"Epoch 241/300\n",
"15/15 - 0s - loss: 0.0049 - 125ms/epoch - 8ms/step\n",
"Epoch 242/300\n",
"15/15 - 0s - loss: 0.0060 - 128ms/epoch - 9ms/step\n",
"Epoch 243/300\n",
"15/15 - 0s - loss: 0.0076 - 123ms/epoch - 8ms/step\n",
"Epoch 244/300\n",
"15/15 - 0s - loss: 0.0015 - 127ms/epoch - 8ms/step\n",
"Epoch 245/300\n",
"15/15 - 0s - loss: 0.0021 - 120ms/epoch - 8ms/step\n",
"Epoch 246/300\n",
"15/15 - 0s - loss: 0.0032 - 131ms/epoch - 9ms/step\n",
"Epoch 247/300\n",
"15/15 - 0s - loss: 0.0054 - 121ms/epoch - 8ms/step\n",
"Epoch 248/300\n",
"15/15 - 0s - loss: 0.0054 - 131ms/epoch - 9ms/step\n",
"Epoch 249/300\n",
"15/15 - 0s - loss: 0.0012 - 127ms/epoch - 8ms/step\n",
"Epoch 250/300\n",
"15/15 - 0s - loss: 0.0011 - 121ms/epoch - 8ms/step\n",
"Epoch 251/300\n",
"15/15 - 0s - loss: 0.0015 - 117ms/epoch - 8ms/step\n",
"Epoch 252/300\n",
"15/15 - 0s - loss: 0.0014 - 126ms/epoch - 8ms/step\n",
"Epoch 253/300\n",
"15/15 - 0s - loss: 0.0052 - 119ms/epoch - 8ms/step\n",
"Epoch 254/300\n",
"15/15 - 0s - loss: 0.0053 - 117ms/epoch - 8ms/step\n",
"Epoch 255/300\n",
"15/15 - 0s - loss: 0.0023 - 123ms/epoch - 8ms/step\n",
"Epoch 256/300\n",
"15/15 - 0s - loss: 0.0037 - 124ms/epoch - 8ms/step\n",
"Epoch 257/300\n",
"15/15 - 0s - loss: 0.0072 - 121ms/epoch - 8ms/step\n",
"Epoch 258/300\n",
"15/15 - 0s - loss: 0.0087 - 119ms/epoch - 8ms/step\n",
"Epoch 259/300\n",
"15/15 - 0s - loss: 0.0013 - 122ms/epoch - 8ms/step\n",
"Epoch 260/300\n",
"15/15 - 0s - loss: 0.0026 - 127ms/epoch - 8ms/step\n",
"Epoch 261/300\n",
"15/15 - 0s - loss: 0.0045 - 123ms/epoch - 8ms/step\n",
"Epoch 262/300\n",
"15/15 - 0s - loss: 6.6526e-04 - 119ms/epoch - 8ms/step\n",
"Epoch 263/300\n",
"15/15 - 0s - loss: 0.0021 - 126ms/epoch - 8ms/step\n",
"Epoch 264/300\n",
"15/15 - 0s - loss: 0.0030 - 123ms/epoch - 8ms/step\n",
"Epoch 265/300\n",
"15/15 - 0s - loss: 9.3595e-04 - 123ms/epoch - 8ms/step\n",
"Epoch 266/300\n",
"15/15 - 0s - loss: 6.3789e-04 - 124ms/epoch - 8ms/step\n",
"Epoch 267/300\n",
"15/15 - 0s - loss: 4.2253e-04 - 119ms/epoch - 8ms/step\n",
"Epoch 268/300\n",
"15/15 - 0s - loss: 6.2567e-04 - 125ms/epoch - 8ms/step\n",
"Epoch 269/300\n",
"15/15 - 0s - loss: 9.7277e-04 - 122ms/epoch - 8ms/step\n",
"Epoch 270/300\n",
"15/15 - 0s - loss: 0.0033 - 124ms/epoch - 8ms/step\n",
"Epoch 271/300\n",
"15/15 - 0s - loss: 5.2958e-04 - 121ms/epoch - 8ms/step\n",
"Epoch 272/300\n",
"15/15 - 0s - loss: 2.5744e-04 - 126ms/epoch - 8ms/step\n",
"Epoch 273/300\n",
"15/15 - 0s - loss: 1.8595e-04 - 125ms/epoch - 8ms/step\n",
"Epoch 274/300\n",
"15/15 - 0s - loss: 2.3927e-04 - 120ms/epoch - 8ms/step\n",
"Epoch 275/300\n",
"15/15 - 0s - loss: 2.5330e-04 - 121ms/epoch - 8ms/step\n",
"Epoch 276/300\n",
"15/15 - 0s - loss: 1.0728e-04 - 125ms/epoch - 8ms/step\n",
"Epoch 277/300\n",
"15/15 - 0s - loss: 1.2487e-04 - 117ms/epoch - 8ms/step\n",
"Epoch 278/300\n",
"15/15 - 0s - loss: 7.4955e-05 - 124ms/epoch - 8ms/step\n",
"Epoch 279/300\n",
"15/15 - 0s - loss: 1.4544e-04 - 135ms/epoch - 9ms/step\n",
"Epoch 280/300\n",
"15/15 - 0s - loss: 3.6122e-04 - 114ms/epoch - 8ms/step\n",
"Epoch 281/300\n",
"15/15 - 0s - loss: 0.0015 - 115ms/epoch - 8ms/step\n",
"Epoch 282/300\n",
"15/15 - 0s - loss: 2.5714e-04 - 128ms/epoch - 9ms/step\n",
"Epoch 283/300\n",
"15/15 - 0s - loss: 2.1323e-04 - 126ms/epoch - 8ms/step\n",
"Epoch 284/300\n",
"15/15 - 0s - loss: 1.7831e-04 - 121ms/epoch - 8ms/step\n",
"Epoch 285/300\n",
"15/15 - 0s - loss: 1.1596e-04 - 120ms/epoch - 8ms/step\n",
"Epoch 286/300\n",
"15/15 - 0s - loss: 9.6663e-05 - 127ms/epoch - 8ms/step\n",
"Epoch 287/300\n",
"15/15 - 0s - loss: 1.3600e-04 - 127ms/epoch - 8ms/step\n",
"Epoch 288/300\n",
"15/15 - 0s - loss: 4.0516e-04 - 123ms/epoch - 8ms/step\n",
"Epoch 289/300\n",
"15/15 - 0s - loss: 3.5272e-04 - 121ms/epoch - 8ms/step\n",
"Epoch 290/300\n",
"15/15 - 0s - loss: 2.1676e-04 - 134ms/epoch - 9ms/step\n",
"Epoch 291/300\n",
"15/15 - 0s - loss: 1.1491e-04 - 125ms/epoch - 8ms/step\n",
"Epoch 292/300\n",
"15/15 - 0s - loss: 7.0292e-05 - 124ms/epoch - 8ms/step\n",
"Epoch 293/300\n",
"15/15 - 0s - loss: 4.3489e-05 - 122ms/epoch - 8ms/step\n",
"Epoch 294/300\n",
"15/15 - 0s - loss: 4.2125e-05 - 120ms/epoch - 8ms/step\n",
"Epoch 295/300\n",
"15/15 - 0s - loss: 4.0471e-05 - 123ms/epoch - 8ms/step\n",
"Epoch 296/300\n",
"15/15 - 0s - loss: 4.0233e-05 - 127ms/epoch - 8ms/step\n",
"Epoch 297/300\n",
"15/15 - 0s - loss: 4.3036e-05 - 130ms/epoch - 9ms/step\n",
"Epoch 298/300\n",
"15/15 - 0s - loss: 2.8966e-05 - 123ms/epoch - 8ms/step\n",
"Epoch 299/300\n",
"15/15 - 0s - loss: 2.9677e-05 - 123ms/epoch - 8ms/step\n",
"Epoch 300/300\n",
"15/15 - 0s - loss: 3.0819e-05 - 124ms/epoch - 8ms/step\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<keras.src.callbacks.History at 0x7ccdc07b28f0>"
]
},
"metadata": {},
"execution_count": 40
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "n-aNP4n3sqG_",
"outputId": "633213a7-3c3e-411f-d361-c1617e11407c",
"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": 41,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"5/5 [==============================] - 0s 6ms/step\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7ccd9c322620>"
]
},
"metadata": {},
"execution_count": 41
},
{
"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": "fbf34099-38cf-4fac-d57e-4b8090cd5e7f"
},
"execution_count": 42,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since end of run: 1712725163.699069\n",
"Wed Apr 10 04:59:23 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": "335eada0-1966-403b-f3f3-e5265d31c661"
},
"execution_count": 43,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since beginning of run: 1712725163.7044997\n",
"Wed Apr 10 04:59:23 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": 1843
},
"id": "95xed6YyDClf",
"outputId": "245c46b5-29f0-431b-edcf-5d2bb2bc6808"
},
"execution_count": 44,
"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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nuOBBx7gu+++qzCud8GCBVxxxRVkZ2czefJkXn75Zbp3786KFSsAuPPOO7HZbCxdurTcfhaLhWXLlnH99der6vG66KKLaN68uTPpBli6dCmBgYFcccUVFdoXFxczcOBAPv74Y26//XZeffVVQkJCGDVqlDPxBVi5ciW33norYWFhvPLKK7z88ssMHDiQtWvXOu93/PjxADz11FN8/PHHfPzxx3To0MFlzFW58847AVwmfLNnz6ZHjx5MmzaN6dOno9frufHGG/nhhx/KtRs1ahRvv/02l19+Oa+88gp+fn6VPidlbrrpJgoKCpgxYwY33XQTCxYscA59KHP33XczZcoUevbsyZtvvsmAAQOYMWMGt9xyi7NNeno6Q4YM4ciRI0yaNIm3336b22+/3dk7GxUV5fxD7tprr3U+d9ddd12VsU2dOpU777wTg8HAtGnTmDp1KgkJCfz666/VPleuVPacf/HFF5hMJh544AHefvtthg4dyttvv82IESOcbe677z4GDx4M4Iz/448/dt6u9hzVxKFDhwCIiIhQ/Tqujqvz/fHHH2M0Grnwwgudj+++++4D4P7772fu3Llcf/31vPvuuzz++OP4+fmxZ8+eau9z3bp1APTs2bNGj33BggXcdNNN6HQ6ZsyYwT333MOXX37JBRdcQG5ubrm2drudYcOGERMTw8yZM+nVqxfPPfcczz33nKr7MplMBAcHExISQnh4OA8++CCFhYWVtu3Vq5fzMQlRJUUIUWs///yzotPpFJ1Op/Tr10+ZOHGi8tNPPykWi6VCW5PJVGHb0KFDlTZt2pTbNmDAAGXAgAHO35OTkxVA+eijj5zbLr30UqVLly5KSUmJc5vD4VD69++vtGvXzrnto48+UgBl0KBBisPhcG5/9NFHFZ1Op+Tm5iqKoii5ublKUFCQ0rdvX6W4uLhcPGfu169fP6Vv377lbv/yyy8VQFm9enUlz9C/nnvuOQVQMjIylMcff1xJTEx03nbuuecqo0ePVhRFUQDlwQcfdN42a9YsBVA++eQT5zaLxaL069dPCQwMVPLz8xVFUZSHH35YCQ4OVmw2W5UxfPHFF6pirSzmyuTk5CiAcu211zq3jRw5UmnZsmW5dv899xaLRencubNyySWXOLdt2bJFAZRHHnmkXNtRo0YpgPLcc89ViGvMmDHl2l577bVKRESE8/dt27YpgHL33XeXa/f4448rgPLrr78qiqIoX331lQIomzZtquKZUJSMjIwKcfw3njIHDhxQtFqtcu211yp2u71c2zNfT5WpzXNe2XtrxowZikajUY4ePerc9uCDDypVfe2pOUdVGTlypBIQEKBkZGQoGRkZysGDB5Xp06crGo1G6dq1q6Io6l/HiqLU+nwriqIEBAQoI0eOrBBjSEhIufeVWs8884wCKAUFBVW22bRpU7nPKIvFokRHRyudO3cu93ny/fffK4AyZcoU57aRI0cqgPLQQw85tzkcDuWKK65QfHx8qnwdlJk0aZLy5JNPKkuXLlWWLFniPN7555+vWK3WCu2nT5+uAEpaWprap0A0QdJzLMRZGDx4MOvXr+fqq69m+/btzJw5k6FDh9KsWbMKQxz8/PycP+fl5ZGZmcmAAQM4fPgweXl5qu8zOzubX3/91dmLlJmZSWZmJllZWQwdOpQDBw5UuHR57733lruEfOGFF2K32zl69ChQ2utaUFDApEmTKvT+nrnfiBEj2LBhg7NHDODTTz8lISGBAQMGqH4Mt912GwcPHmTTpk3O/6saUrF8+XJiY2Odk4GgdFzv+PHjKSws5LfffgMgNDSUoqKicpfbPS0wMBAovWRdnTPPfU5ODnl5eVx44YXlLmmX9dCPHTu23L7VTeq8//77y/1+4YUXkpWV5by8vHz5cgAmTJhQrt1jjz0G4OwVLRsW9P3332O1Wqt9LGp8/fXXOBwOpkyZglZb/mvmbEu+Vfacn/n8FhUVkZmZSf/+/VEUha1bt6o6rppzVJ2ioiKioqKIiooiMTGRp556in79+jmv5Kh9HVfH1fmuTmhoKBs2bODUqVOqHk+ZrKws9Hq983lXY/PmzaSnpzN27NhynydXXHEFSUlJlfbGn3klq6xijcVi4Zdffqn2vmbMmMHLL7/MTTfdxC233MKCBQt46aWXWLt2baXDYsLCwgDIzMxU/XhE0yPJsRBn6dxzz+XLL78kJyeHjRs3MnnyZAoKCrjhhhvYvXu3s93atWsZNGgQAQEBhIaGEhUVxVNPPQVQo+T44MGDKIrCs88+6/wyLvtXdhnyv5MBW7RoUe73si+InJwc4N/Lv507d672vm+++WaMRiOffvqpM+7vv/+e22+/vUZJT48ePUhKSmLx4sV8+umnxMbGcskll1Ta9ujRo7Rr165CklU2HKIswR87dizt27fnsssuo3nz5owZM8aZcHpK2aVbVzPfv//+e8477zx8fX0JDw93DlM487wfPXoUrVZL69aty+2bmJhY5XFdndeyY/73GLGxsYSGhjqfuwEDBnD99dczdepUIiMjGT58+FmVTTt06BBarZaOHTvWav/qVPacHzt2jFGjRhEeHk5gYCBRUVHOP9bUvrfUnKPq+Pr6snLlSlauXMnvv//O8ePHWbt2LW3atAHUv46r4+p8V2fmzJns3LmThIQE+vTpw/PPP8/hw4dVPbaaKnss55xzToXbkpKSKjxWrVbrfJ7KtG/fHkB12cUzPfroo2i12koTa+X0OGapyy2qI8mxEG7i4+PDueeey/Tp05k7dy5Wq5UvvvgCKE0WLr30UjIzM3njjTf44YcfWLlyJY8++ihAjUp/lbV9/PHHnV/G//3332RIp9NVeiylBhNeoPTL+Morr3Qmx8uWLcNsNtdqhvptt93G0qVLWbx4MTfffHOFpKGmoqOj2bZtG99++y1XX301q1ev5rLLLmPkyJFnddzqlI01ry6B/eOPP5wz/d99912WL1/OypUrue2222r8/P+X2vPqKhHQaDQsW7aM9evXM27cOE6ePMmYMWPo1atXlWM368t/n3O73c7gwYP54YcfePLJJ/n6669ZuXKlcwKrmveWO86RTqdj0KBBDBo0iAsvvJDmzZvX7gG6uI/KqInxpptu4vDhw7z99tvEx8fz6quv0qlTJ3788cdq94uIiMBms7m8OtKQ+Pn5ERERQXZ2doXbyv6QOLMSihD/JaXchPCA3r17A5CSkgLAd999h9ls5ttvvy3X+7N69eoaH7ush8VgMNRqBnllyuqR7ty5s9pED0qHVgwfPpxNmzbx6aef0qNHDzp16lTj+7ztttuYMmUKKSkp5SZG/VfLli35559/cDgc5RLosmoXLVu2dG7z8fHhqquu4qqrrsLhcDB27Fjee+89nn32WRITE93eW1QW99ChQ6ts83//93/4+vry008/YTQands/+uijcu1atmyJw+EgOTmZdu3aObcfPHiw1vGVHfPAgQPlJh6mpaWRm5tb7rkDOO+88zjvvPN46aWXWLx4MbfffjufffYZd999d42eu7Zt2+JwONi9ezfdu3evdfyV+e9zvmPHDvbv38/ChQvLTcCrbHhNVY9B7Tk6GzV5HZ+N6s5TXFwcY8eOZezYsaSnp9OzZ09eeuklLrvssir3KVtMIzk5ma5du6qKoeyx7Nu3r8IVoX379lV4rA6Hg8OHDzt7iwH2798PUKvVJsuGm5VVWDlTcnIykZGRld4mRBnpORbiLKxevbrSXpuysZ5llxXLenzObJuXl1erL9/o6GgGDhzIe++950y+z1Sb5VGHDBlCUFAQM2bMqFCO7b+P77LLLiMyMpJXXnmF3377rdZ1Tdu2bcusWbOYMWMGffr0qbLd5ZdfTmpqarkqGTabjbfffpvAwEDn5fOsrKxy+2m1WueXednwgICAAIAKs+VrY/HixXzwwQf069ePSy+9tMp2Op0OjUaD3W53bjty5EiFVczKkr1333233PazWWnx8ssvB2DWrFnltr/xxhsAzkoYOTk5Fc5zWVJb9tz5+/sD6p67a665Bq1Wy7Rp0yr03J5Nb3llz3ll7y1FUSqtAFHV+Vd7js6G2tfx2QoICKi0GsR/h4dER0cTHx/vcuhMWT3jzZs3q46hd+/eREdHM2/evHLH//HHH9mzZ0+lFVjmzJnj/FlRFObMmYPBYKj2vVVSUlJpj/YLL7yAoigMGzaswm1btmwpV6NZiMpIz7EQZ+Ghhx7CZDJx7bXXkpSUhMViYd26dSxdupRWrVoxevRooDT5LOvVvO+++ygsLOT9998nOjq60gTXlXfeeYcLLriALl26cM8999CmTRvS0tJYv349J06cYPv27TU6XnBwMG+++SZ333035557LrfddhthYWFs374dk8lUrharwWDglltuYc6cOeh0unITjGrq4Ycfdtnm3nvv5b333mPUqFFs2bKFVq1asWzZMtauXcusWbOcY0/vvvtusrOzueSSS2jevDlHjx7l7bffpnv37s5e0+7du6PT6XjllVfIy8vDaDQ6a09XZ9myZQQGBmKxWJyrta1du5Zu3bo5h85U5YorruCNN95g2LBh3HbbbaSnp/POO++QmJjIP//842zXq1cvrr/+embNmkVWVhbnnXcev/32m7MHrTa93t26dWPkyJH873//Izc3lwEDBrBx40YWLlzINddcw8UXXwzAwoULeffdd7n22mtp27YtBQUFvP/++wQHBzsTbD8/Pzp27MjSpUtp37494eHhdO7cudJx6omJiTz99NO88MILXHjhhVx33XUYjUY2bdpEfHy8qiV81T7nSUlJtG3blscff5yTJ08SHBzM//3f/1U6DrdXr14AjB8/nqFDh6LT6bjllltUn6OzofZ1fLZ69erFL7/84lx4pHXr1pxzzjk0b96cG264gW7duhEYGMgvv/zCpk2beP3116s9Xps2bejcuTO//PKL6oUzDAYDr7zyCqNHj2bAgAHceuutpKWlMXv2bFq1auUcTlbG19eXFStWMHLkSPr27cuPP/7IDz/8wFNPPVVtD29qaio9evTg1ltvdfZw//TTTyxfvpxhw4YxfPjwcu3T09P5559/ePDBB1U9DtGE1Xl9DCEakR9//FEZM2aMkpSUpAQGBio+Pj5KYmKi8tBDD1UoFfTtt98qXbt2VXx9fZVWrVopr7zyijJ//nwFUJKTk53t1JRyUxRFOXTokDJixAglNjZWMRgMSrNmzZQrr7xSWbZsmbNNWSm3/5boWr16daUlzb799lulf//+ip+fnxIcHKz06dNHWbJkSYXHvXHjRgVQhgwZovq5clWiqwz/KeWmKIqSlpamjB49WomMjFR8fHyULl26VHg+li1bpgwZMkSJjo5WfHx8lBYtWij33XefkpKSUq7d+++/r7Rp00bR6XQuy7qVxVz2z9fXV2nevLly5ZVXKvPnzy9XSq9MZaXcPvzwQ6Vdu3aK0WhUkpKSlI8++qhC+TNFUZSioiLlwQcfVMLDw5XAwEDlmmuuUfbt26cAyssvv1whrv8+l2Xn+8zXk9VqVaZOnaq0bt1aMRgMSkJCgjJ58uRysf/999/KrbfeqrRo0UIxGo1KdHS0cuWVVyqbN28ud/x169YpvXr1Unx8fMqVG6vssSiKosyfP1/p0aOHYjQalbCwMGXAgAHKypUrq3y+a/uc7969Wxk0aJASGBioREZGKvfcc4+yffv2Cu8bm82mPPTQQ0pUVJSi0WjKxaz2HFWmrJSbK2pex4pSdSk3Ned77969ykUXXaT4+fkpgDJy5EjFbDYrTzzxhNKtWzclKChICQgIULp166a8++67LmNWFEV54403lMDAwEpL5ilKxVJuZZYuXeo8/+Hh4crtt9+unDhxolybsufu0KFDypAhQxR/f38lJiZGee655yqUAfyvnJwc5Y477lASExMVf39/xWg0Kp06dVKmT59eaTnNuXPnKv7+/uXK5glRGY2inOWMECFEk7N9+3a6d+/OokWL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uXOnOHr0qBBCiBUrVojrr78+0P7w4cPCaDSKe+65R5SWlop169YJlUol3n///Ug9haAwOaa4cOONNwoAp3x99NFHgTYAxIsvvhj43u/3iwceeEBkZGQInU4n5syZIw4cODD4wVOvGhoaxI9//GORkJAgzGazWLRoUY8PPRUVFT36+tixY+KCCy4QVqtV6HQ6UVBQIO655x7R0tISoWdA3/Tss8+K3NxcodVqxfTp08V//vOfwM9mzZolbrzxxh7tX3/9dTF69Gih1WrFhAkTxL/+9a9BjpiCEUz/3nXXXYG2GRkZ4tJLLxU7duyIQNTUl48++ui0f2O7+/PGG28Us2bNOuWcKVOmCK1WK/Lz83v8/Y12khBCRGTImoiIiIgoynC3CiIiIiKiLkyOiYiIiIi6MDkmIiIiIurC5JiIiIiIqAuTYyIiIiKiLkyOiYiIiIi6MDkmIiIiIurC5JiIiIiIqAuTYyIiIiKiLkyOiYii1E033QRJkk75KisrC8n1X3rpJVgslpBcq782b96MK664AllZWZAkCf/4xz8iGg8REZNjIqIotmDBAlRVVfX4GjFiRKTDOoXH4+nXeW1tbZg8eTLWrVsX4oiIiPqHyTERURTT6XSw2Ww9vlQqFQDgrbfewtlnnw29Xo/8/HysXLkSXq83cO7TTz+NSZMmwWQyIScnB7feeiscDgcA4OOPP8aiRYvQ0tISGJF++OGHAeC0I7gWiwUvvfQSAODIkSOQJAl//etfMWvWLOj1eqxfvx4A8MILL2DcuHHQ6/UYO3YsnnvuuV6f3yWXXIJHH30UV199dQj+tYiIBk4d6QCIiCh4n3zyCW644QY888wzOP/881FeXo6lS5cCAB566CEAgCzLeOaZZzBixAgcPnwYt956K+69914899xzmDlzJv7nf/4HDz74IA4cOAAASEhICCqGFStW4KmnnkJhYWEgQX7wwQfx29/+FoWFhdi5cyeWLFkCk8mEG2+8MbT/AEREYcLkmIgoir3zzjs9ktZLLrkEf/vb37By5UqsWLEikHTm5+dj1apVuPfeewPJ8V133RU4Ly8vD48++iiWLVuG5557DlqtFklJSZAkCTabrV+x3XXXXfjud78b+P6hhx7CU089FTg2YsQI7N+/H7///e+ZHBNRzGByTEQUxS666CL87ne/C3xvMpkAALt378aWLVvw2GOPBX7m8/nQ0dEBp9MJo9GIDz/8EGvWrMFXX30Fu90Or9fb4+cDNW3atMD/t7W1oby8HIsXL8aSJUsCx71eL5KSkgb8WEREg4XJMRFRFDOZTCgoKDjluMPhwMqVK3uM3HbT6/U4cuQILr/8ctxyyy147LHHYLVa8emnn2Lx4sVwu929JseSJEEI0ePY6RbcdSfq3fEAwB//+EcUFRX1aNc9R5qIKBYwOSYiikFnn302Dhw4cNrEGQC2b98Ov9+Pp556CrLcufb69ddf79FGq9XC5/Odcm5aWhqqqqoC3x86dAhOp7PXeDIyMpCVlYXDhw9j4cKFwT4dIqKoweSYiCgGPfjgg7j88suRm5uL73//+5BlGbt378aXX36JRx99FAUFBfB4PHj22WdxxRVXYMuWLXj++ed7XCMvLw8OhwMbN27E5MmTYTQaYTQaMXv2bPz2t7/FjBkz4PP5cN9990Gj0fQZ08qVK3HnnXciKSkJCxYsgMvlwrZt29DU1ITly5ef9hyHw9Fj3+aKigrs2rULVqsVubm5A/tHIiLqB27lRkQUg+bPn4933nkHGzZswDnnnINzzz0Xv/71rzF8+HAAwOTJk/H000/j8ccfx8SJE7F+/XqsWbOmxzVmzpyJZcuW4Uc/+hHS0tLwxBNPAACeeuop5OTk4Pzzz8e1116Ln//854rmKN9888144YUX8OKLL2LSpEmYNWsWXnrppV73Zd62bRsKCwtRWFgIAFi+fDkKCwvx4IMP9vefhohoQCTx7YllRERERERDFEeOiYiIiIi6MDkmIiIiIurC5JiIiIiIqAuTYyIiIiKiLkyOiYiIiIi6MDkmIiIiIurC5JiIiIiIqAuTYyIiIiKiLkyOiYiIiIi6MDkmIiIiIurC5JiIiIiIqMv/B88OgjoF2nblAAAAAElFTkSuQmCC\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",
"240 1.000000\n",
"239 0.705391\n",
"68 0.117473\n",
"69 0.110555\n",
"70 0.067430\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.005923\n",
"dtype: float32\n",
"Normalized Saliency Median: Saliency 0.00072\n",
"dtype: float32\n",
"Normalized Saliency Mode: Saliency\n",
"0 0.0\n",
"Normalized Saliency Sum: Saliency 2.842853\n",
"dtype: float32\n",
"#\n",
"#\n",
"#\n",
"Normalized Saliency Standard Deviation: Saliency 0.056313\n",
"dtype: float32\n",
"Normalized Saliency Skewness: Saliency 15.581776\n",
"dtype: float32\n",
"Normalized Saliency Kurtosis: Saliency 252.639679\n",
"dtype: float32\n",
"Normalized Saliency Variance: Saliency 0.003171\n",
"dtype: float32\n",
"Normalized Saliency Coefficient of Variation: Saliency 950.818176\n",
"dtype: float32\n",
"#\n",
"#\n",
"#\n",
"Cumulative Sum of Normalized Saliency Values: Saliency\n",
"0 0.000000\n",
"1 0.000000\n",
"2 0.000000\n",
"3 0.000000\n",
"4 0.000000\n",
".. ...\n",
"475 2.841541\n",
"476 2.841959\n",
"477 2.842417\n",
"478 2.842727\n",
"479 2.842854\n",
"\n",
"[480 rows x 1 columns]\n",
"Mean of Cumulative Sum of Normalized Saliency Values: Saliency\n",
"0 0.000000\n",
"1 0.000000\n",
"2 0.000000\n",
"3 0.000000\n",
"4 0.000000\n",
".. ...\n",
"475 0.005920\n",
"476 0.005921\n",
"477 0.005922\n",
"478 0.005922\n",
"479 0.005923\n",
"\n",
"[480 rows x 1 columns]\n",
"Normalized Saliency Root Mean Square: 0.056565475\n",
"Normalized Saliency 25th Percentile: Saliency 0.000144\n",
"Name: 0.25, dtype: float64\n",
"Normalized Saliency 75th Percentile: Saliency 0.001536\n",
"Name: 0.75, dtype: float64\n",
"Normalized Saliency Interquartile Range: Saliency 0.001392\n",
"dtype: float64\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": "685198da-c044-4907-ff45-2a4d3263fc6c"
},
"execution_count": 45,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since end of run: 1712725165.4389307\n",
"Wed Apr 10 04:59:25 2024\n"
]
}
]
}
]
}