{ "cells": [ { "cell_type": "markdown", "id": "5796054b", "metadata": {}, "source": [ "\n", "

\n", " \n", "\n", "

\n", "\n", "### Interactive Simple Machine Learning Artificial Neural Network (ANN)\n", "\n", "\n", "#### Michael Pyrcz, Professor, The University of Texas at Austin \n", "\n", "##### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig) | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)" ] }, { "cell_type": "markdown", "id": "e41c1943", "metadata": {}, "source": [ "#### Neural Networks\n", "\n", "Machine learning method for supervised learning for classification and regression analysis. Here are some key aspects of support vector machines.\n", "\n", "**Basic Design** *\"...a computing system made up of a number of simple, highly interconnected processing elements, which process information by their dynamic state response to external inputs.\"* Caudill (1989). \n", "\n", "**Nature-inspire Computing** based on the neuronal structure in the brain, including many interconnected simple, processing units, known as nodes that are capable of complicated emergent pattern detection due to a large number of nodes and interconnectivity.\n", "\n", "**Training and Testing** just like and other predictive model (e.g. linear regression, decision trees and support vector machines) we perform training to fit parameters and testing to tune hyperparameters. Here we observe the error with training and testing datasets, but do not demonstrate tuning of the hyperparameters. \n", "\n", "**Parameters** are the weights applied to each connection and a bias term applied to each node. For a single node in an artificial neural network, this includes the slope terms, $\\beta_i$, and the bias term, $\\beta_{0}$.\n", "\n", "\\begin{equation}\n", "Y = \\sum_{i=1}^m \\beta_i X + \\beta_0\n", "\\end{equation}\n", "\n", "it can be seen that the number of parameters increases rapidly as we increase the number of nodes and the connectivity between the nodes.\n", "\n", "**Layers** the typical artificial neural net is structured with an **input layer**, with one node for each $m$ predictor feature, $X_1,\\ldots,X_m$. There is an **ouput layer**, with one node for each $r$ response feature, $Y_1,\\ldots,Y_r$. There may be one or more layers of nodes between the input and output layers, known as **hidden layer(s)**. \n", "\n", "**Connections** are the linkages between the nodes in adjacent layers. For example, in a fully connected artificial neural network, all the input nodes are connected to all of the nodes in the first layer, then all of the nodes in the first layer are connected to the next layer and so forth. Each connection includes a weight parameter as indicated above.\n", "\n", "**Nodes** receive the weighted signal from the connected previous layer nodes, sum and then apply this result to the **activation** function in the node. Some example activation functions include:\n", "\n", "* **Binary** the node fires or not. This is represented by a Heaviside step function.\n", "\n", "* **Identify** the input is passed to the output $f(x) = x$\n", "\n", "* **Linear** the node passes a signal that increases linearly with the weighted input.\n", "\n", "* **Logistic** also known as sigmoid or soft step $f(x) = \\frac{1}{1+e^{-x}}$\n", "\n", "the node output is the nonlinear activiation function applied to the linearly weighted inputs. This is fed to all nodes in the next layer.\n", "\n", "**Training Cycles** - the presentation of a batch of data, forward application of the current prediction model to make estimates, calculation of error and then backpropagation of error to correct the artificial neural network parameters to reduce the error over all of the batches.\n", "\n", "**Batch** is the set of training data for each training cycle of forward prediction and back propagation of error, drawn to train for each iteration. There is a trade-off, a larger batch results in more computational time per iteration, but a more accurate estimate of the error to adjust the weights. Smaller batches result in a nosier estimate of the error, but faster epochs, this results in faster learning and even possibly more robust models.\n", "\n", "**Epochs** - is a set of training cycles, batches covering all available training data. \n", "\n", "**Local Minimums** - if one calculated the error hypersurface over the range of model parameters it would be hyparabolic, there is a global minimium error solution. But this error hyper surface is rough and it is possible to be stuck in a local minimum. **Learning Rate** and **Mommentum** coefficients are introduced to avoid getting stuck in local minimums.\n", "\n", "* **Mommentum** is a hyperparameter to control the use of information from the weight update over the last epoch for consideration in the current epoch. This can be accomplished with an update vector, $v_i$, a mommentum parameter, $\\alpha$, to calculate the current weight update, $v_{i+1}$ given the new update $\\theta_{i+1}$.\n", "\n", "\\begin{equation}\n", "v_{i+1} = \\alpha v_i + \\theta_{i+1}\n", "\\end{equation}\n", "\n", "* **Learning Rate** is a hyperparameter that controls the adjustment of the weights in response to the gradient indicated by backpropagation of error \n", "\n", "##### Applications to subsurface modeling\n", "\n", "We demonstrate the estimation of normal score transformed porosity from depth. This would be useful for building a vertical trend model. \n", "\n", "* modeling the complicated relationship between porosity and depth.\n", "\n", "#### Limitations of Neural Network Estimation\n", "\n", "Since we demonstrate the use of an artificial neural network to estimate porosity from sparsely sampled data over depth, we should comment on limitations of our artificial neural networks for this estimation problem:\n", "\n", "* does not honor the well data\n", "\n", "* does not honor the histogram of the data\n", "\n", "* does not honor spatial correlation \n", "\n", "* does not honor the multivariate relationship\n", "\n", "* generally low interpretability models\n", "\n", "* requires a large number of data for effective training\n", "\n", "* high model complexity with high model variance\n", "\n", "#### Import Required Packages\n", "\n", "We will also need some standard packages. These should have been installed with Anaconda 3." ] }, { "cell_type": "code", "execution_count": 1, "id": "877ffa62", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from matplotlib.ticker import (MultipleLocator, AutoMinorLocator, AutoLocator) # control of axes ticks\n", "plt.rc('axes', axisbelow=True) # set axes and grids in the background for all plots\n", "from ipywidgets import interactive # widgets and interactivity\n", "from ipywidgets import widgets \n", "from ipywidgets import Layout\n", "from ipywidgets import Label\n", "from ipywidgets import VBox, HBox\n", "import math\n", "seed = 13" ] }, { "cell_type": "markdown", "id": "a27fea49", "metadata": {}, "source": [ "If you get a package import error, you may have to first install some of these packages. This can usually be accomplished by opening up a command window on Windows and then typing 'python -m pip install [package-name]'. More assistance is available with the respective package docs. \n", "\n", "#### Declare Functions\n", "\n", "I just added a convenience function for adding major and minor gridlines." ] }, { "cell_type": "code", "execution_count": 2, "id": "8abbc843", "metadata": {}, "outputs": [], "source": [ "def add_grid():\n", " plt.gca().grid(True, which='major',linewidth = 1.0); plt.gca().grid(True, which='minor',linewidth = 0.2) # add y grids\n", " plt.gca().tick_params(which='major',length=7); plt.gca().tick_params(which='minor', length=4)\n", " plt.gca().xaxis.set_minor_locator(AutoMinorLocator()); plt.gca().yaxis.set_minor_locator(AutoMinorLocator()) # turn on minor ticks \n", "\n", "def calculate_angle_rads(x1, y1, x2, y2):\n", " dx = x2 - x1 # Calculate the differences\n", " dy = y2 - y1\n", " angle_rads = math.atan2(dy, dx) # Calculate the angle in radians\n", " #angle_degrees = math.degrees(angle_radians) # Convert the angle to degrees\n", " return angle_rads\n", " \n", "def offset(pto, distance, angle_deg): # modified from ChatGPT 4.o generated\n", " angle_rads = math.radians(angle_deg) # Convert angle from degrees to radians\n", " x_new = pto[0] + distance * math.cos(angle_rads) # Calculate the new coordinates\n", " y_new = pto[1] + distance * math.sin(angle_rads)\n", " return np.array((x_new, y_new))\n", "\n", "def offsetx(xo, distance, angle_deg): # modified from ChatGPT 4.o generated\n", " angle_rads = math.radians(angle_deg) # Convert angle from degrees to radians\n", " x_new = xo + distance * math.cos(angle_rads) # Calculate the new coordinates\n", " return np.array((xo, x_new))\n", "\n", "def offset_arrx(xo, distance, angle_deg,size): # modified from ChatGPT 4.o generated\n", " angle_rads = math.radians(angle_deg) # Convert angle from degrees to radians\n", " x_new = xo + distance * math.cos(angle_rads) # Calculate the new coordinates\n", " x_arr = x_new + size * math.cos(angle_rads+2.48) # Calculate the new coordinates\n", " return np.array((x_new, x_arr))\n", "\n", "def offsety(yo, distance, angle_deg): # modified from ChatGPT 4.o generated\n", " angle_rads = math.radians(angle_deg) # Convert angle from degrees to radians\n", " y_new = yo + distance * math.sin(angle_rads) # Calculate the new coordinates\n", " return np.array((yo, y_new))\n", "\n", "def offset_arry(yo, distance, angle_deg,size): # modified from ChatGPT 4.o generated\n", " angle_rads = math.radians(angle_deg) # Convert angle from degrees to radians\n", " y_new = yo + distance * math.sin(angle_rads) # Calculate the new coordinates\n", " y_arr = y_new + size * math.sin(angle_rads+2.48) # Calculate the new coordinates\n", " return np.array((y_new, y_arr))\n", "\n", "def lint(x1, y1, x2, y2, t):\n", " # Calculate the interpolated coordinates\n", " x = x1 + t * (x2 - x1)\n", " y = y1 + t * (y2 - y1)\n", " return np.array((x, y))\n", "\n", "def lintx(x1, y1, x2, y2, t):\n", " # Calculate the interpolated coordinates\n", " x = x1 + t * (x2 - x1)\n", " return x\n", "\n", "def linty(x1, y1, x2, y2, t):\n", " # Calculate the interpolated coordinates\n", " y = y1 + t * (y2 - y1)\n", " return y\n", "\n", "def lint_intx(x1, y1, x2, y2, ts, te):\n", " # Calculate the interpolated coordinates\n", " xs = x1 + ts * (x2 - x1)\n", " xe = x1 + te * (x2 - x1)\n", " return np.array((xs,xe))\n", "\n", "def lint_inty(x1, y1, x2, y2, ts, te):\n", " # Calculate the interpolated coordinates\n", " ys = y1 + ts * (y2 - y1)\n", " ye = y1 + te * (y2 - y1)\n", " return np.array((ys,ye))\n", "\n", "def lint_int_arrx(x1, y1, x2, y2, ts, te, size):\n", " # Calculate the interpolated coordinates\n", " xe = x1 + te * (x2 - x1)\n", " line_angle_rads = calculate_angle_rads(x1, y1, x2, y2)\n", " x_arr = xe + size * math.cos(line_angle_rads+2.48) # Calculate the new coordinates\n", " return np.array((xe,x_arr))\n", "\n", "def lint_int_arry(x1, y1, x2, y2, ts, te, size):\n", " # Calculate the interpolated coordinates\n", " ye = y1 + te * (y2 - y1)\n", " line_angle_rads = calculate_angle_rads(x1, y1, x2, y2)\n", " y_arr = ye + size * math.sin(line_angle_rads+2.48) # Calculate the new coordinates\n", " return np.array((ye,y_arr))\n", "\n", "def as_si(x, ndp): # from xnx on StackOverflow https://stackoverflow.com/questions/31453422/displaying-numbers-with-x-instead-of-e-scientific-notation-in-matplotlib \n", " s = '{x:0.{ndp:d}e}'.format(x=x, ndp=ndp)\n", " m, e = s.split('e')\n", " return r'{m:s}\\times 10^{{{e:d}}}'.format(m=m, e=int(e))" ] }, { "cell_type": "markdown", "id": "7913b84d", "metadata": {}, "source": [ "#### The Simple ANN\n", "\n", "I wrote this code to specify a simple ANN:\n", "\n", "- three input nodes, 2 hidden nodes and 1 output node\n", "\n", "and to train the ANN by interatively performing the forward calculation and backpropagation. I calculate:\n", "\n", "- the error and then propagate it to each node\n", "- solve for the partial derivatives of the error with respect to each weight and bias\n", "\n", "all weights, biases and partial derivatives for all epoch are recorded in vectors for plotting" ] }, { "cell_type": "code", "execution_count": 3, "id": "183d883f", "metadata": {}, "outputs": [], "source": [ "x1 = 0.5; x2 = 0.2; x3 = 0.7; y = 0.3 # training data\n", "lr = 0.2 # learning rate\n", "\n", "np.random.seed(seed=seed)\n", "\n", "nepoch = 1000\n", "\n", "y4 = np.zeros(nepoch); y5 = np.zeros(nepoch); y6 = np.zeros(nepoch)\n", "\n", "w14 = np.zeros(nepoch); w24 = np.zeros(nepoch); w34 = np.zeros(nepoch)\n", "w15 = np.zeros(nepoch); w25 = np.zeros(nepoch); w35 = np.zeros(nepoch)\n", "w46 = np.zeros(nepoch); w56 = np.zeros(nepoch)\n", "\n", "dw14 = np.zeros(nepoch); dw24 = np.zeros(nepoch); dw34 = np.zeros(nepoch)\n", "dw15 = np.zeros(nepoch); dw25 = np.zeros(nepoch); dw35 = np.zeros(nepoch)\n", "dw46 = np.zeros(nepoch); dw56 = np.zeros(nepoch)\n", "\n", "db4 = np.zeros(nepoch); db5 = np.zeros(nepoch); db6 = np.zeros(nepoch)\n", "\n", "b4 = np.zeros(nepoch); b5 = np.zeros(nepoch); b6 = np.zeros(nepoch)\n", "y4 = np.zeros(nepoch); y5 = np.zeros(nepoch); y6 = np.zeros(nepoch)\n", "d4 = np.zeros(nepoch); d5 = np.zeros(nepoch); d6 = np.zeros(nepoch)\n", "\n", "# initialize the weights - Xavier Weight Initialization \n", "lower, upper = -(1.0 / np.sqrt(3.0)), (1.0 / np.sqrt(3.0)) # lower and upper bound for the weights, uses inputs to node\n", "#lower, upper = -(sqrt(6.0) / sqrt(3.0 + 2.0)), (sqrt(6.0) / sqrt(3.0 + 2.0)) # Normalized Xavier weights, integrates ouputs also\n", "w14[0] = lower + np.random.random() * (upper - lower); \n", "w24[0] = lower + np.random.random() * (upper - lower); \n", "w34[0] = lower + np.random.random() * (upper - lower);\n", "w15[0] = lower + np.random.random() * (upper - lower); \n", "w25[0] = lower + np.random.random() * (upper - lower); \n", "w35[0] = lower + np.random.random() * (upper - lower);\n", "\n", "lower, upper = -(1.0 / np.sqrt(2.0)), (1.0 / np.sqrt(2.0))\n", "#lower, upper = -(sqrt(6.0) / sqrt(2.0 + 1.0)), (sqrt(6.0) / sqrt(2.0 + 1.0)) # Normalized Xavier weights, integrates ouputs also\n", "\n", "w46[0] = lower + np.random.random() * (upper - lower); \n", "w56[0] = lower + np.random.random() * (upper - lower); \n", "\n", "#b4[0] = np.random.random(); b5[0] = np.random.random(); b6[0] = np.random.random()\n", "b4[0] = (np.random.random()-0.5)*0.5; b5[0] = (np.random.random()-0.5)*0.5; b6[0] = (np.random.random()-0.5)*0.5; # small random value \n", "\n", "\n", "for i in range(0,nepoch):\n", "\n", "# forward pass of model\n", " y4[i] = w14[i]*x1 + w24[i]*x2 + w34[i]*x3 + b4[i]; \n", " y4[i] = 1.0/(1 + math.exp(-1*y4[i]))\n", " \n", " y5[i] = w15[i]*x1 + w25[i]*x2 + w35[i]*x3 + b5[i]\n", " y5[i] = 1.0/(1 + math.exp(-1*y5[i]))\n", " \n", " y6[i] = w46[i]*y4[i] + w56[i]*y5[i] + b6[i]\n", "# y6[i] = 1.0/(1 + math.exp(-1*y6[i])) # sgimoid / logistic activation at o6 \n", "\n", "# back propagate the error through the nodes\n", "# d6[i] = y6[i]*(1-y6[i])*(y-y6[i]) # sgimoid / logistic activation at o6 \n", " d6[i] = (y-y6[i]) # identity activation o at o6\n", " d5[i] = y5[i]*(1-y5[i])*w56[i]*d6[i]; d4[i] = y4[i]*(1-y4[i])*w46[i]*d6[i]\n", "\n", "# calculate the change in weights\n", " if i < nepoch - 1:\n", " dw14[i] = lr*d4[i]*x1; dw24[i] = lr*d4[i]*x2; dw34[i] = lr*d4[i]*x3\n", " dw15[i] = lr*d5[i]*x1; dw25[i] = lr*d5[i]*x2; dw35[i] = lr*d5[i]*x3\n", " dw46[i] = lr*d6[i]*y4[i]; dw56[i] = lr*d6[i]*y5[i] \n", " \n", " db4[i] = lr*d4[i]; db5[i] = lr*d5[i]; db6[i] = lr*d6[i];\n", "\n", " w14[i+1] = w14[i] + dw14[i]; w24[i+1] = w24[i] + dw24[i]; w34[i+1] = w34[i] + dw34[i] \n", " w15[i+1] = w15[i] + dw15[i]; w25[i+1] = w25[i] + dw25[i]; w35[i+1] = w35[i] + dw35[i] \n", " w46[i+1] = w46[i] + dw46[i]; w56[i+1] = w56[i] + dw56[i]\n", "\n", " b4[i+1] = b4[i] + db4[i]; b5[i+1] = b5[i] + db5[i]; b6[i+1] = b6[i] + db6[i] " ] }, { "cell_type": "markdown", "id": "cf37b61d", "metadata": {}, "source": [ "#### Interactive Artificial Neural Network (ANN)\n", "\n", "The interactive inputs include:\n", "\n", "* **$n_{epoch}$** - number of cycles through the data, coupled forward prediction and back propagation\n", "\n", "* **$\\eta$** - learning rate, applied to the weight and bias derivatives\n", "\n", "* **$S$** - random number seed\n", "\n", "* **Weights** - show the network weights\n", "\n", "* **Forward Pass** - show the contributions and node outputs\n", "\n", "* **Back Propogation** - show the error partial derivatives" ] }, { "cell_type": "code", "execution_count": 4, "id": "d270c12b", "metadata": {}, "outputs": [], "source": [ "# widgets and dashboard\n", "l = widgets.Text(value=' Machine Learning Simple Artificial Neural Network, Prof. Michael Pyrcz, The University of Texas at Austin',layout=Layout(width='950px', height='30px'))\n", "\n", "nepoch = widgets.IntSlider(min=0, max = 100, value=0, step = 1, description = '$n_{epoch}$',orientation='horizontal', style = {'description_width': 'initial'},\n", " continuous_update=False,layout=Layout(width='300px', height='30px'))\n", "\n", "lr = widgets.FloatLogSlider(min=-2, max = 0, value=0.1, step = 1.0, description = '$\\eta$',orientation='horizontal', style = {'description_width': 'initial'},\n", " continuous_update=False,layout=Layout(width='300px', height='30px'),readout_format='.2f')\n", "\n", "seed = widgets.IntSlider(min=0, max = 100, value=1, step = 1, description = '$S$',orientation='horizontal', style = {'description_width': 'initial'},\n", " continuous_update=False,layout=Layout(width='300px', height='30px'))\n", "\n", "weights = widgets.Checkbox(value=True,description='Weights',disabled=False,layout=Layout(width='300px', height='30px'))\n", "\n", "forward = widgets.Checkbox(value=True,description='Forward Pass',disabled=False,layout=Layout(width='300px', height='30px'))\n", "\n", "back = widgets.Checkbox(value=True,description='Back Propogation',disabled=False,layout=Layout(width='300px', height='30px'))\n", "\n", "ui1 = widgets.HBox([nepoch,lr,seed],)\n", "ui2 = widgets.HBox([weights,forward,back],)\n", "ui = widgets.VBox([l,ui1,ui2],)\n", "\n", "def run_plot(nepoch,lr,weights,forward,back,seed): # make data, fit models and plot\n", " min_lw = 0.5; node_r = 0.2; min_node_r = 0.20\n", " lw = 2.0 - min_lw; min_alpha = 0.1\n", " alpha = 1.0 - min_alpha\n", " iepoch = nepoch\n", " np.random.seed(seed=seed)\n", " x1 = 0.5; x2 = 0.2; x3 = 0.7; y = 0.3 # training data\n", " \n", " np.random.seed(seed=seed)\n", " \n", " nepoch = 1000\n", " \n", " y4 = np.zeros(nepoch); y5 = np.zeros(nepoch); y6 = np.zeros(nepoch)\n", " \n", " w14 = np.zeros(nepoch); w24 = np.zeros(nepoch); w34 = np.zeros(nepoch)\n", " w15 = np.zeros(nepoch); w25 = np.zeros(nepoch); w35 = np.zeros(nepoch)\n", " w46 = np.zeros(nepoch); w56 = np.zeros(nepoch)\n", " \n", " dw14 = np.zeros(nepoch); dw24 = np.zeros(nepoch); dw34 = np.zeros(nepoch)\n", " dw15 = np.zeros(nepoch); dw25 = np.zeros(nepoch); dw35 = np.zeros(nepoch)\n", " dw46 = np.zeros(nepoch); dw56 = np.zeros(nepoch)\n", " \n", " db4 = np.zeros(nepoch); db5 = np.zeros(nepoch); db6 = np.zeros(nepoch)\n", " \n", " b4 = np.zeros(nepoch); b5 = np.zeros(nepoch); b6 = np.zeros(nepoch)\n", " y4 = np.zeros(nepoch); y5 = np.zeros(nepoch); y6 = np.zeros(nepoch)\n", " y4in = np.zeros(nepoch); y5in = np.zeros(nepoch); y6in = np.zeros(nepoch)\n", " d4 = np.zeros(nepoch); d5 = np.zeros(nepoch); d6 = np.zeros(nepoch)\n", " d1 = np.zeros(nepoch); d2 = np.zeros(nepoch); d3 = np.zeros(nepoch)\n", " \n", " # initialize the weights - Xavier Weight Initialization \n", " lower, upper = -(1.0 / np.sqrt(3.0)), (1.0 / np.sqrt(3.0)) # lower and upper bound for the weights, uses inputs to node\n", " #lower, upper = -(sqrt(6.0) / sqrt(3.0 + 2.0)), (sqrt(6.0) / sqrt(3.0 + 2.0)) # Normalized Xavier weights, integrates ouputs also\n", " w14[0] = lower + np.random.random() * (upper - lower); \n", " w24[0] = lower + np.random.random() * (upper - lower); \n", " w34[0] = lower + np.random.random() * (upper - lower);\n", " w15[0] = lower + np.random.random() * (upper - lower); \n", " w25[0] = lower + np.random.random() * (upper - lower); \n", " w35[0] = lower + np.random.random() * (upper - lower);\n", " \n", " lower, upper = -(1.0 / np.sqrt(2.0)), (1.0 / np.sqrt(2.0))\n", " #lower, upper = -(sqrt(6.0) / sqrt(2.0 + 1.0)), (sqrt(6.0) / sqrt(2.0 + 1.0)) # Normalized Xavier weights, integrates ouputs also\n", "\n", " w46[0] = lower + np.random.random() * (upper - lower); \n", " w56[0] = lower + np.random.random() * (upper - lower); \n", "\n", " #b4[0] = np.random.random(); b5[0] = np.random.random(); b6[0] = np.random.random()\n", " b4[0] = (np.random.random()-0.5)*0.5; b5[0] = (np.random.random()-0.5)*0.5; b6[0] = (np.random.random()-0.5)*0.5; # small random value \n", "\n", " for i in range(0,nepoch):\n", " \n", " # forward pass of model\n", " y4in[i] = w14[i]*x1 + w24[i]*x2 + w34[i]*x3 + b4[i]; \n", " y4[i] = 1.0/(1 + math.exp(-1*y4in[i]))\n", " \n", " y5in[i] = w15[i]*x1 + w25[i]*x2 + w35[i]*x3 + b5[i]\n", " y5[i] = 1.0/(1 + math.exp(-1*y5in[i]))\n", " \n", " y6in[i] = w46[i]*y4[i] + w56[i]*y5[i] + b6[i]\n", " y6[i] = y6in[i]\n", " # y6[i] = 1.0/(1 + math.exp(-1*y6in[i])) # sgimoid / logistic activation at o6 \n", " \n", " # back propagate the error through the nodes\n", " # d6[i] = y6[i]*(1-y6[i])*(y-y6[i]) # sgimoid / logistic activation at o6 \n", " d6[i] = (y-y6[i]) # identity activation o at o6\n", " d5[i] = y5[i]*(1-y5[i])*w56[i]*d6[i]; d4[i] = y4[i]*(1-y4[i])*w46[i]*d6[i]\n", " d1[i] = w14[i]*d4[i] + w15[i]*d5[i]; d2[i] = w24[i]*d4[i] + w25[i]*d5[i]; d3[i] = w34[i]*d4[i] + w35[i]*d5[i] # identity and 2 paths\n", " \n", " # calculate the change in weights\n", " if i < nepoch - 1:\n", " dw14[i] = lr*d4[i]*x1; dw24[i] = lr*d4[i]*x2; dw34[i] = lr*d4[i]*x3 \n", " dw15[i] = lr*d5[i]*x1; dw25[i] = lr*d5[i]*x2; dw35[i] = lr*d5[i]*x3\n", " dw46[i] = lr*d6[i]*y4[i]; dw56[i] = lr*d6[i]*y5[i] \n", " \n", " db4[i] = lr*d4[i]; db5[i] = lr*d5[i]; db6[i] = lr*d6[i];\n", " \n", " w14[i+1] = w14[i] + dw14[i]; w24[i+1] = w24[i] + dw24[i]; w34[i+1] = w34[i] + dw34[i] \n", " w15[i+1] = w15[i] + dw15[i]; w25[i+1] = w25[i] + dw25[i]; w35[i+1] = w35[i] + dw35[i] \n", " w46[i+1] = w46[i] + dw46[i]; w56[i+1] = w56[i] + dw56[i]\n", " \n", " b4[i+1] = b4[i] + db4[i]; b5[i+1] = b5[i] + db5[i]; b6[i+1] = b6[i] + db6[i] \n", " \n", " dx = -0.21; dy = -0.09; edge = 1.0\n", " \n", " o6x = 17; o6y =5; h5x = 10; h5y = 3.5; h4x = 10; h4y = 6.5\n", " i1x = 3; i1y = 9.0; i2x = 3; i2y = 5; i3x = 3; i3y = 1.0; buffer = 0.5\n", " \n", " max_x = np.max(np.abs([x1,x2,x3]))\n", " max_y = np.max(np.abs([y4[iepoch],y5[iepoch],y6[iepoch]]))\n", " max_dO = np.max(np.abs([d1[iepoch],d2[iepoch],d3[iepoch]]))\n", " max_d = np.max(np.abs([d1[iepoch],d2[iepoch],d3[iepoch],d4[iepoch],d5[iepoch],d6[iepoch]]))\n", " max_d_trans = 1.0/abs(math.log(max_d)+0.00001)\n", " max_signal = np.max(np.abs([x1*w14[iepoch],x2*w24[iepoch],x3*w34[iepoch],\n", " x1*w15[iepoch],x2*w25[iepoch],x3*w35[iepoch],\n", " y4[iepoch],y5[iepoch],y6[iepoch]]))\n", " \n", " plt.subplot(111)\n", " plt.gca().set_axis_off()\n", " \n", " if (weights == True and forward == False and back == False) or (weights == False and forward == True and back == False):\n", " \n", " circle_i1 = plt.Circle((i1x,i1y), node_r*abs(x1)/max_x+min_node_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_1$',(i1x+dx,i1y+dy),zorder=110) \n", " circle_i1b = plt.Circle((i1x,i1y), node_r*1.5*abs(x1)/max_x+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i1); plt.gca().add_patch(circle_i1b)\n", " \n", " circle_i2 = plt.Circle((i2x,i2y), node_r*abs(x2)/max_x+min_node_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_2$',(i2x+dx,i2y+dy),zorder=110) \n", " circle_i2b = plt.Circle((i2x,i2y), node_r*1.5*abs(x2)/max_x+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i2); plt.gca().add_patch(circle_i2b)\n", " \n", " circle_i3 = plt.Circle((i3x,i3y), node_r*abs(x3)/max_x+min_node_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_3$',(i3x+dx,i3y+dy),zorder=110) \n", " circle_i3b = plt.Circle((i3x,i3y), node_r*1.5*abs(x3)/max_x+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i3); plt.gca().add_patch(circle_i3b)\n", " \n", " circle_h4 = plt.Circle((h4x,h4y), node_r*abs(y4[iepoch])/max_y+min_node_r,fill=True,facecolor = 'red',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$H_4$',(h4x+dx,h4y+dy),zorder=110)\n", " circle_h4o = plt.Circle((h4x,h4y), node_r*abs(y4[iepoch])/max_y+min_node_r,fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105) \n", " circle_h4b = plt.Circle((h4x,h4y), node_r*1.5*abs(y4[iepoch])/max_y+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_h4); plt.gca().add_patch(circle_h4b); plt.gca().add_patch(circle_h4o)\n", " \n", " circle_h5 = plt.Circle((h5x,h5y), node_r*abs(y5[iepoch])/max_y+min_node_r, fill=True,facecolor = 'blue',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$H_5$',(h5x+dx,h5y+dy),zorder=110)\n", " circle_h5o = plt.Circle((h5x,h5y), node_r*abs(y5[iepoch])/max_y+min_node_r, fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105) \n", " circle_h5b = plt.Circle((h5x,h5y), node_r*1.5*abs(y5[iepoch])/max_y+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10);\n", " plt.gca().add_patch(circle_h5); plt.gca().add_patch(circle_h5b); plt.gca().add_patch(circle_h5o)\n", " \n", " circle_o6 = plt.Circle((o6x,o6y), node_r*abs(y6[iepoch])/max_y+min_node_r,fill=True,facecolor = 'orange',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$O_6$',(o6x+dx,o6y+dy),zorder=110)\n", " circle_o6o = plt.Circle((o6x,o6y), node_r*abs(y6[iepoch])/max_y+min_node_r,fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105)\n", " circle_o6b = plt.Circle((o6x,o6y), node_r*1.5*abs(y6[iepoch])/max_y+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10);\n", " plt.gca().add_patch(circle_o6); plt.gca().add_patch(circle_o6b); plt.gca().add_patch(circle_o6o)\n", " \n", " if weights == False and forward == False and back == True:\n", " i1_r = (1.0/abs(math.log(abs(d1[iepoch]))+0.00001)/max_d_trans)*node_r+min_node_r\n", " circle_i1 = plt.Circle((i1x,i1y), i1_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_1$',(i1x+dx,i1y+dy),zorder=110) \n", " circle_i1b = plt.Circle((i1x,i1y), i1_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i1); plt.gca().add_patch(circle_i1b)\n", "\n", " i2_r = (1.0/abs(math.log(abs(d2[iepoch]))+0.00001)/max_d_trans)*node_r+min_node_r\n", " circle_i2 = plt.Circle((i2x,i2y), i2_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_2$',(i2x+dx,i2y+dy),zorder=110) \n", " circle_i2b = plt.Circle((i2x,i2y), i2_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i2); plt.gca().add_patch(circle_i2b)\n", " \n", " i3_r = (1.0/abs(math.log(abs(d3[iepoch]))+0.00001)/max_d_trans)*node_r+min_node_r\n", " circle_i3 = plt.Circle((i3x,i3y), i3_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_3$',(i3x+dx,i3y+dy),zorder=110) \n", " circle_i3b = plt.Circle((i3x,i3y), i3_r*1.5*abs(x3)/max_x+min_node_r, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i3); plt.gca().add_patch(circle_i3b)\n", " \n", " h4_r = (1.0/abs(math.log(abs(d4[iepoch]))+0.00001)/max_d_trans)*node_r+min_node_r\n", " circle_h4 = plt.Circle((h4x,h4y), h4_r,fill=True,facecolor = 'red',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$H_4$',(h4x+dx,h4y+dy),zorder=110)\n", " circle_h4o = plt.Circle((h4x,h4y), h4_r,fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105) \n", " circle_h4b = plt.Circle((h4x,h4y), h4_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_h4); plt.gca().add_patch(circle_h4b); plt.gca().add_patch(circle_h4o)\n", " \n", " h5_r = (1.0/abs(math.log(abs(d5[iepoch]))+0.00001)/max_d_trans)*node_r+min_node_r\n", " circle_h5 = plt.Circle((h5x,h5y), h5_r, fill=True,facecolor = 'blue',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$H_5$',(h5x+dx,h5y+dy),zorder=110)\n", " circle_h5o = plt.Circle((h5x,h5y), h5_r, fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105) \n", " circle_h5b = plt.Circle((h5x,h5y), h5_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10);\n", " plt.gca().add_patch(circle_h5); plt.gca().add_patch(circle_h5b); plt.gca().add_patch(circle_h5o)\n", " \n", " h6_r = (1.0/abs(math.log(abs(d6[iepoch]))+0.00001)/max_d_trans)*node_r+min_node_r\n", " circle_o6 = plt.Circle((o6x,o6y), h6_r,fill=True,facecolor = 'orange',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$O_6$',(o6x+dx,o6y+dy),zorder=110)\n", " circle_o6o = plt.Circle((o6x,o6y), h6_r,fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105)\n", " circle_o6b = plt.Circle((o6x,o6y), h6_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10);\n", " plt.gca().add_patch(circle_o6); plt.gca().add_patch(circle_o6b); plt.gca().add_patch(circle_o6o)\n", " \n", " if (weights == True and forward == True and back == True) or (weights == False and forward == False and back == False):\n", "\n", " circle_i1 = plt.Circle((i1x,i1y), node_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_1$',(i1x+dx,i1y+dy),zorder=110) \n", " circle_i1b = plt.Circle((i1x,i1y), node_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i1); plt.gca().add_patch(circle_i1b)\n", " \n", " circle_i2 = plt.Circle((i2x,i2y), node_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_2$',(i2x+dx,i2y+dy),zorder=110) \n", " circle_i2b = plt.Circle((i2x,i2y), node_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i2); plt.gca().add_patch(circle_i2b)\n", " \n", " circle_i3 = plt.Circle((i3x,i3y), node_r, fill=False, edgecolor = 'black',lw=2,zorder=100); plt.annotate(r' $I_3$',(i3x+dx,i3y+dy),zorder=110) \n", " circle_i3b = plt.Circle((i3x,i3y), node_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_i3); plt.gca().add_patch(circle_i3b)\n", " \n", " circle_h4 = plt.Circle((h4x,h4y), node_r,fill=True,facecolor = 'red',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$H_4$',(h4x+dx,h4y+dy),zorder=110)\n", " circle_h4o = plt.Circle((h4x,h4y), node_r,fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105) \n", " circle_h4b = plt.Circle((h4x,h4y), node_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10)\n", " plt.gca().add_patch(circle_h4); plt.gca().add_patch(circle_h4b); plt.gca().add_patch(circle_h4o)\n", " \n", " circle_h5 = plt.Circle((h5x,h5y), node_r, fill=True,facecolor = 'blue',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$H_5$',(h5x+dx,h5y+dy),zorder=110)\n", " circle_h5o = plt.Circle((h5x,h5y), node_r, fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105) \n", " circle_h5b = plt.Circle((h5x,h5y), node_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10);\n", " plt.gca().add_patch(circle_h5); plt.gca().add_patch(circle_h5b); plt.gca().add_patch(circle_h5o)\n", " \n", " circle_o6 = plt.Circle((o6x,o6y), node_r,fill=True,facecolor = 'orange',alpha=0.5,edgecolor = 'black',lw=2,zorder=100); plt.annotate(r'$O_6$',(o6x+dx,o6y+dy),zorder=110)\n", " circle_o6o = plt.Circle((o6x,o6y), node_r,fill=False,alpha=1.0,edgecolor = 'black',lw=2,zorder=105)\n", " circle_o6b = plt.Circle((o6x,o6y), node_r*1.5, fill=True, facecolor = 'white',edgecolor = None,lw=1,zorder=10);\n", " plt.gca().add_patch(circle_o6); plt.gca().add_patch(circle_o6b); plt.gca().add_patch(circle_o6o)\n", " \n", " plt.plot([i1x-edge,i1x],[i1y,i1y],color='grey',lw=1.0,zorder=1)\n", " plt.plot([i2x-edge,i2x],[i2y,i2y],color='grey',lw=1.0,zorder=1)\n", " plt.plot([i3x-edge,i3x],[i3y,i3y],color='grey',lw=1.0,zorder=1)\n", " \n", " plt.annotate(r'$x_1$ = ' + str(np.round(x1,2)),(i1x-buffer-1.6,i1y-0.05),size=8,zorder=200,color='grey',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0,ha='left') \n", " plt.annotate(r'$x_2$ = ' + str(np.round(x2,2)),(i2x-buffer-1.6,i2y-0.05),size=8,zorder=200,color='grey',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", " plt.annotate(r'$x_3$ = ' + str(np.round(x3,2)),(i3x-buffer-1.6,i3y-0.05),size=8,zorder=200,color='grey',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", " \n", " min_wt = np.min(np.abs([w14[iepoch],w24[iepoch],w34[iepoch],w15[iepoch],w25[iepoch],w35[iepoch],w46[iepoch],w56[iepoch]]))\n", " max_wt = np.max(np.abs([w14[iepoch],w24[iepoch],w34[iepoch],w15[iepoch],w25[iepoch],w35[iepoch],w46[iepoch],w56[iepoch]]))\n", " \n", " min_dwt = np.min(np.abs([dw14[iepoch],dw24[iepoch],dw34[iepoch],dw15[iepoch],dw25[iepoch],dw35[iepoch],dw46[iepoch],dw56[iepoch]]))\n", " max_dwt = np.max(np.abs([dw14[iepoch],dw24[iepoch],dw34[iepoch],dw15[iepoch],dw25[iepoch],dw35[iepoch],dw46[iepoch],dw56[iepoch]]))\n", " \n", " if (weights == True and forward == False and back == False):\n", " plt.plot([i1x,h4x],[i1y,h4y],color='orangered',alpha = alpha*abs(w14[iepoch]/max_wt)+min_alpha,lw=lw*abs(w14[iepoch]/max_wt)+min_lw,zorder=1)\n", " plt.plot([i2x,h4x],[i2y,h4y],color='red',alpha = alpha*abs(w24[iepoch]/max_wt)+min_alpha,lw=lw*abs(w24[iepoch]/max_wt)+min_lw,zorder=1)\n", " plt.plot([i3x,h4x],[i3y,h4y],color='darkred',alpha = alpha*abs(w34[iepoch]/max_wt)+min_alpha,lw=lw*abs(w34[iepoch]/max_wt)+min_lw,zorder=1)\n", " \n", " plt.plot([i1x,h5x],[i1y,h5y],color='dodgerblue',alpha = alpha*abs(w15[iepoch]/max_wt)+min_alpha,lw=lw*abs(w15[iepoch]/max_wt)+min_lw,zorder=1)\n", " plt.plot([i2x,h5x],[i2y,h5y],color='blue',alpha = alpha*abs(w25[iepoch]/max_wt)+min_alpha,lw=lw*abs(w25[iepoch]/max_wt)+min_lw,zorder=1)\n", " plt.plot([i3x,h5x],[i3y,h5y],color='darkblue',alpha = alpha*abs(w35[iepoch]/max_wt)+min_alpha,lw=lw*abs(w35[iepoch]/max_wt)+min_lw,zorder=1)\n", " \n", " plt.plot([h4x,o6x],[h4y,o6y],color='orange',alpha = alpha*abs(w46[iepoch]/max_wt)+min_alpha,lw=lw*abs(w46[iepoch]/max_wt)+min_lw,zorder=1)\n", " plt.plot([h5x,o6x],[h5y,o6y],color='darkorange',alpha = alpha*abs(w56[iepoch]/max_wt)+min_alpha,lw=lw*abs(w56[iepoch]/max_wt)+min_lw,zorder=1)\n", " \n", " if (weights == False and forward == True and back == False):\n", " plt.plot([i1x,h4x],[i1y,h4y],color='orangered',alpha = alpha*abs(x1*w14[iepoch]/max_signal)+min_alpha,lw=lw*abs(x1*w14[iepoch]/max_signal)+min_lw,zorder=1)\n", " plt.plot([i2x,h4x],[i2y,h4y],color='red',alpha = alpha*abs(x2*w24[iepoch]/max_signal)+min_alpha,lw=lw*abs(x2*w24[iepoch]/max_signal)+min_lw,zorder=1)\n", " plt.plot([i3x,h4x],[i3y,h4y],color='darkred',alpha = alpha*abs(x3*w34[iepoch]/max_signal)+min_alpha,lw=lw*abs(x3*w34[iepoch]/max_signal)+min_lw,zorder=1)\n", " \n", " plt.plot([i1x,h5x],[i1y,h5y],color='dodgerblue',alpha = alpha*abs(x1*w15[iepoch]/max_signal)+min_alpha,lw=lw*abs(x1*w15[iepoch]/max_signal)+min_lw,zorder=1)\n", " plt.plot([i2x,h5x],[i2y,h5y],color='blue',alpha = alpha*abs(x2*w25[iepoch]/max_signal)+min_alpha,lw=lw*abs(x2*w25[iepoch]/max_signal)+min_lw,zorder=1)\n", " plt.plot([i3x,h5x],[i3y,h5y],color='darkblue',alpha = alpha*abs(x3*w35[iepoch]/max_signal)+min_alpha,lw=lw*abs(x3*w35[iepoch]/max_signal)+min_lw,zorder=1)\n", " \n", " plt.plot([h4x,o6x],[h4y,o6y],color='orange',alpha = alpha*abs(y4[iepoch]*w46[iepoch]/max_signal)+min_alpha,lw=lw*abs(y4[iepoch]*w46[iepoch]/max_signal)+min_lw,zorder=1)\n", " plt.plot([h5x,o6x],[h5y,o6y],color='darkorange',alpha = alpha*abs(y5[iepoch]*w56[iepoch]/max_signal)+min_alpha,lw=lw*abs(y5[iepoch]*w56[iepoch]/max_signal)+min_lw,zorder=1)\n", "\n", " if (weights == False and forward == False and back == True):\n", "\n", " plt.plot([i1x,h4x],[i1y,h4y],color='orangered',alpha = alpha*abs(dw14[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw14[iepoch]/max_dwt)+min_lw,zorder=1)\n", " plt.plot([i2x,h4x],[i2y,h4y],color='red',alpha = alpha*abs(dw24[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw24[iepoch]/max_dwt)+min_lw,zorder=1)\n", " plt.plot([i3x,h4x],[i3y,h4y],color='darkred',alpha = alpha*abs(dw34[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw34[iepoch]/max_dwt)+min_lw,zorder=1)\n", " \n", " plt.plot([i1x,h5x],[i1y,h5y],color='dodgerblue',alpha = alpha*abs(dw15[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw15[iepoch]/max_dwt)+min_lw,zorder=1)\n", " plt.plot([i2x,h5x],[i2y,h5y],color='blue',alpha = alpha*abs(dw25[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw25[iepoch]/max_dwt)+min_lw,zorder=1)\n", " plt.plot([i3x,h5x],[i3y,h5y],color='darkblue',alpha = alpha*abs(dw35[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw35[iepoch]/max_dwt)+min_lw,zorder=1)\n", " \n", " plt.plot([h4x,o6x],[h4y,o6y],color='orange',alpha = alpha*abs(dw46[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw46[iepoch]/max_dwt)+min_lw,zorder=1)\n", " plt.plot([h5x,o6x],[h5y,o6y],color='darkorange',alpha = alpha*abs(dw56[iepoch]/max_dwt)+min_alpha,lw=lw*abs(dw56[iepoch]/max_dwt)+min_lw,zorder=1)\n", " \n", " if (weights == True and forward == True and back == True) or (weights == False and forward == False and back == False):\n", " \n", " plt.plot([i1x,h4x],[i1y,h4y],color='orangered',lw=lw+min_lw,zorder=1)\n", " plt.plot([i2x,h4x],[i2y,h4y],color='red',lw=lw+min_lw,zorder=1)\n", " plt.plot([i3x,h4x],[i3y,h4y],color='darkred',lw=lw+min_lw,zorder=1)\n", " \n", " plt.plot([i1x,h5x],[i1y,h5y],color='dodgerblue',lw=lw+min_lw,zorder=1)\n", " plt.plot([i2x,h5x],[i2y,h5y],color='blue',lw=lw+min_lw,zorder=1)\n", " plt.plot([i3x,h5x],[i3y,h5y],color='darkblue',lw=lw+min_lw,zorder=1)\n", " \n", " plt.plot([h4x,o6x],[h4y,o6y],color='orange',lw=lw+min_lw,zorder=1)\n", " plt.plot([h5x,o6x],[h5y,o6y],color='darkorange',lw=lw+min_lw,zorder=1)\n", " \n", " if forward == True:\n", " \n", " plt.plot(offsetx(i1x,2,-20),offsety(i1y,2,-20)+0.1,color='orangered',lw=1.0,zorder=1)\n", " plt.plot(offset_arrx(i1x,2,-20,0.2),offset_arry(i1y,2,-20,0.2)+0.1,color='orangered',lw=1.0,zorder=1)\n", " plt.annotate(r'$I_{1}$ = ' + str(np.round(x1,2)),(lintx(i1x,i1y,h4x,h4y,0.1),linty(i1x,i1y,h4x,h4y,0.1)),size=8,zorder=200,color='orangered',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-20)\n", " \n", " plt.plot(offsetx(i2x,2,12),offsety(i2y,2,12)+0.1,color='red',lw=1.0,zorder=1)\n", " plt.plot(offset_arrx(i2x,2,12,0.2),offset_arry(i2y,2,12,0.2)+0.1,color='red',lw=1.0,zorder=1)\n", " plt.annotate(r'$I_{2}$ = ' + str(np.round(x2,2)),(lintx(i2x,i2y,h4x,h4y,0.1),linty(i2x,i2y,h4x,h4y,0.1)+0.24),size=8,zorder=200,color='red',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12)\n", " \n", " plt.plot(offsetx(i3x,2,38),offsety(i3y,2,38)+0.1,color='darkred',lw=1.0,zorder=1)\n", " plt.plot(offset_arrx(i3x,2,38,0.2),offset_arry(i3y,2,38,0.2)+0.1,color='darkred',lw=1.0,zorder=1)\n", " plt.annotate(r'$I_{3}$ = ' + str(np.round(x3,2)),(lintx(i3x,i3y,h4x,h4y,0.08)-0.2,linty(i3x,i3y,h4x,h4y,0.08)+0.2),size=8,zorder=200,color='darkred',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=38)\n", " \n", " plt.plot(offsetx(h4x,2,-12),offsety(h4y,2,-12)+0.1,color='orange',lw=1.0,zorder=1)\n", " plt.plot(offset_arrx(h4x,2,-12,0.2),offset_arry(h4y,2,-12,0.2)+0.1,color='orange',lw=1.0,zorder=1)\n", " plt.annotate(r'$H_{4}$ = ' + str(np.round(y4[iepoch],2)),(lintx(h4x,h4y,o6x,o6y,0.08),linty(h4x,h4y,o6x,o6y,0.08)-0.0),size=8,zorder=200,color='orange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12)\n", " \n", " plt.annotate(r'$H_{4_{in}}$ = ' + str(np.round(y4in[iepoch],2)),(lintx(h4x,h4y,o6x,o6y,0.08)-0.5,linty(h4x,h4y,o6x,o6y,0.08)+0.5),size=8,zorder=200,color='orange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12)\n", " \n", " plt.plot(offsetx(h5x,2,12),offsety(h5y,2,12)+0.1,color='darkorange',lw=1.0,zorder=1)\n", " plt.plot(offset_arrx(h5x,2,12,0.2),offset_arry(h5y,2,12,0.2)+0.1,color='darkorange',lw=1.0,zorder=1)\n", " plt.annotate(r'$H_{5}$ = ' + str(np.round(y5[iepoch],2)),(lintx(h5x,h5y,o6x,o6y,0.07),linty(h5x,h5y,o6x,o6y,0.07)+0.25),size=8,zorder=200,color='darkorange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12)\n", "\n", " plt.annotate(r'$H_{5_{in}}$ = ' + str(np.round(y5in[iepoch],2)),(lintx(h5x,h5y,o6x,o6y,0.08)-0.5,linty(h5x,h5y,o6x,o6y,0.08)+0.5),size=8,zorder=200,color='darkorange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12)\n", " \n", " plt.plot([o6x+edge,o6x],[o6y,o6y],color='grey',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\hat{y}$ = ' + str(np.round(y6[iepoch],2)),(o6x+buffer+0.7,o6y-0.05),size=8,zorder=300,color='grey',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", "\n", "# plt.annotate(r'$\\frac{\\partial P}{\\partial \\hat{y}}$ = ' + str(np.round(d6[iepoch],2)),(o6x,o6y-1.2),size=10,\n", "# bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),zorder=200)\n", "\n", " plt.annotate(r'$y$ = ' + str(np.round(y,2)),(o6x+buffer+0.7,o6y+0.5),size=8,zorder=300,color='grey',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", "\n", " plt.plot([h4x,h4x-0.5],[h4y,h4y+1.0],color='red',zorder=5)\n", " plt.annotate(r'$b_{4}$ = ' + str(np.round(b4[iepoch],2)),(h4x-0.7,h4y+1.2),size=8,zorder=200,color='red',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", " \n", " plt.plot([h5x,h5x-0.5],[h5y,h5y+1.0],color='blue',zorder=5)\n", " plt.annotate(r'$b_{5}$ = ' + str(np.round(b5[iepoch],2)),(h5x-0.7,h5y+1.2),size=8,zorder=200,color='blue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", " \n", " plt.plot([o6x,o6x-0.5],[o6y,o6y+1.0],color='orange',zorder=5)\n", " plt.annotate(r'$b_{6}$ = ' + str(np.round(b6[iepoch],2)),(o6x-0.7,o6y+1.2),size=8,zorder=200,color='orange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", " \n", " plt.plot([o6x+edge,o6x],[o6y,o6y],color='grey',lw=1.0,zorder=1)\n", " plt.annotate(r'$y$ = ' + str(np.round(y,2)),(o6x+buffer+0.7,o6y-0.05),size=8,zorder=200,color='grey',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=0) \n", " \n", " if back == True:\n", " \n", " plt.annotate(r'$\\frac{\\partial P}{\\partial O_{6_{in}}}$ = ' + str(np.round(d6[iepoch],2)),(o6x-0.5,o6y-1.2),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial H_{4_{in}}}$ = ' + str(np.round(d4[iepoch],2)),(h4x-0.5,h4y-0.7),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial H_{5_{in}}}$ = ' + str(np.round(d5[iepoch],2)),(h5x-0.5,h5y-0.7),size=10,zorder=100)\n", " \n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\hat{y}}$ = ' + str(np.round(d6[iepoch],2)),(o6x,o6y-1.8),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial H_{4_{out}}}$ = ' + str(np.round(w46[iepoch]*d6[iepoch],2)),(h4x,h4y-1.2),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial H_{5_{out}}}$ = ' + str(np.round(w56[iepoch]*d6[iepoch],2)),(h5x,h5y-1.2),size=10,zorder=100)\n", " \n", " plt.annotate(r'$\\frac{\\partial P}{\\partial X_1}$ = ' + r'${0:s}$'.format(as_si(d1[iepoch],2)),(i1x-2.0,i1y-0.9),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial X_2}$ = ' + r'${0:s}$'.format(as_si(d2[iepoch],2)),(i2x-2.0,i2y-0.9),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial X_3}$ = ' + r'${0:s}$'.format(as_si(d3[iepoch],2)),(i3x-2.0,i3y-0.9),size=10,zorder=100)\n", " \n", " plt.annotate(r'$\\frac{\\partial P}{\\partial I_1}$ = ' + r'${0:s}$'.format(as_si(d1[iepoch],2)),(i1x-1.5,i1y-1.4),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial I_2}$ = ' + r'${0:s}$'.format(as_si(d2[iepoch],2)),(i2x-1.5,i2y-1.4),size=10,zorder=100)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial I_3}$ = ' + r'${0:s}$'.format(as_si(d3[iepoch],2)),(i3x-1.5,i3y-1.4),size=10,zorder=100)\n", "\n", " plt.plot(lint_intx(h4x, h4y, o6x, o6y,0.4,0.6),lint_inty(h4x,h4y,o6x,o6y,0.4,0.6)-0.1,color='orange',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(o6x,o6y,h4x,h4y,0.4,0.6,0.2),lint_int_arry(o6x,o6y,h4x,h4y,0.4,0.6,0.2)-0.1,color='orange',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{4,6}} =$' + r'${0:s}$'.format(as_si(dw46[iepoch]/lr,2)),(lintx(h4x,h4y,o6x,o6y,0.5)-0.6,linty(h4x,h4y,o6x,o6y,0.5)-0.72),size=7,zorder=200,color='orange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-11)\n", " \n", " plt.plot(lint_intx(h5x, h5y, o6x, o6y,0.4,0.6),lint_inty(h5x,h5y,o6x,o6y,0.4,0.6)-0.1,color='darkorange',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(o6x,o6y,h5x,h5y,0.4,0.6,0.2),lint_int_arry(o6x,o6y,h5x,h5y,0.4,0.6,0.2)-0.1,color='darkorange',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{5,6}} =$' + r'${0:s}$'.format(as_si(dw56[iepoch]/lr,2)),(lintx(h5x,h5y,o6x,o6y,0.5)-0.4,linty(h5x,h5y,o6x,o6y,0.5)-0.6),size=7,zorder=200,color='darkorange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12)\n", "\n", " plt.plot(lint_intx(i1x, i1y, h4x, h4y,0.4,0.6),lint_inty(i1x,i1y,h4x,h4y,0.4,0.6)-0.1,color='orangered',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(h4x,h4y,i1x,i1y,0.4,0.6,0.2),lint_int_arry(h4x,h4y,i1x,i1y,0.4,0.6,0.2)-0.1,color='orangered',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{1,4}} =$' + r'${0:s}$'.format(as_si(dw14[iepoch]/lr,2)),(lintx(i1x,i1y,h4x,h4y,0.5)-0.6,linty(i1x,i1y,h4x,h4y,0.5)-1.0),size=7,zorder=200,color='orangered',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-20)\n", " \n", " plt.plot(lint_intx(i2x, i2y, h4x, h4y,0.3,0.5),lint_inty(i2x,i2y,h4x,h4y,0.3,0.5)-0.1,color='red',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(h4x,h4y,i2x,i2y,0.5,0.7,0.2),lint_int_arry(h4x,h4y,i2x,i2y,0.5,0.7,0.2)-0.12,color='red',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{2,4}} =$' + r'${0:s}$'.format(as_si(dw24[iepoch]/lr,2)),(lintx(i2x,i2y,h4x,h4y,0.5)-1.05,linty(i2x,i2y,h4x,h4y,0.5)-0.7),size=7,zorder=200,color='red',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12)\n", " \n", " plt.plot(lint_intx(i3x, i3y, h4x, h4y,0.2,0.4),lint_inty(i3x,i3y,h4x,h4y,0.2,0.4)-0.1,color='darkred',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(h4x,h4y,i3x,i3y,0.5,0.8,0.2),lint_int_arry(h4x,h4y,i3x,i3y,0.5,0.8,0.2)-0.12,color='darkred',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{3,4}} =$' + r'${0:s}$'.format(as_si(dw34[iepoch]/lr,2)),(lintx(i3x,i3y,h4x,h4y,0.5)-1.7,linty(i3x,i3y,h4x,h4y,0.5)-1.7),size=7,zorder=200,color='darkred',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=38)\n", " \n", " plt.plot(lint_intx(i3x, i3y, h5x, h5y,0.4,0.6),lint_inty(i3x,i3y,h5x,h5y,0.4,0.6)-0.1,color='darkblue',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(h5x,h5y,i3x,i3y,0.4,0.6,0.2),lint_int_arry(h5x,h5y,i3x,i3y,0.4,0.6,0.2)-0.12,color='darkblue',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{3,5}} =$' + r'${0:s}$'.format(as_si(dw35[iepoch]/lr,2)),(lintx(i3x,i3y,h5x,h5y,0.5)-0.4,linty(i3x,i3y,h5x,h5y,0.5)-0.6),size=7,zorder=200,color='darkblue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=20)\n", " \n", " plt.plot(lint_intx(i2x, i2y, h5x, h5y,0.3,0.5),lint_inty(i2x,i2y,h5x,h5y,0.3,0.5)-0.1,color='blue',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(h5x,h5y,i2x,i2y,0.3,0.7,0.2),lint_int_arry(h5x,h5y,i2x,i2y,0.3,0.7,0.2)-0.12,color='blue',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{2,5}} =$' + r'${0:s}$'.format(as_si(dw25[iepoch]/lr,2)),(lintx(i2x,i2y,h5x,h5y,0.5)-1.2,linty(i2x,i2y,h5x,h5y,0.5)-0.65),size=7,zorder=200,color='blue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12)\n", " \n", " plt.plot(lint_intx(i1x, i1y, h5x, h5y,0.2,0.4),lint_inty(i1x,i1y,h5x,h5y,0.2,0.4)-0.1,color='dodgerblue',lw=1.0,zorder=1)\n", " plt.plot(lint_int_arrx(h5x,h5y,i1x,i1y,0.2,0.8,0.2),lint_int_arry(h5x,h5y,i1x,i1y,0.2,0.8,0.2)-0.12,color='dodgerblue',lw=1.0,zorder=1)\n", " plt.annotate(r'$\\frac{\\partial P}{\\partial \\lambda_{1,5}} =$' + r'${0:s}$'.format(as_si(dw15[iepoch]/lr,2)),(lintx(i1x,i1y,h5x,h5y,0.5)-2.2,linty(i1x,i1y,h4x,h4y,0.5)-0.2),size=7,zorder=200,color='dodgerblue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-36,xycoords = 'data',va=\"top\",ha=\"left\")\n", " \n", " if forward == False:\n", " \n", " plt.annotate(r'$\\lambda_{1,4}$ = ' + str(np.round(w14[iepoch],2)),((i1x+h4x)*0.45,(i1y+h4y)*0.5+0.7),size=8,zorder=200,color='orangered',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-18,xycoords = 'data',va=\"top\",ha=\"left\") \n", " plt.annotate(r'$\\lambda_{2,4}$ = ' + str(np.round(w24[iepoch],2)),((i2x+h4x)*0.45-0.3,(i2y+h4y)*0.5-0.03),size=8,zorder=200,color='red',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12) \n", " plt.annotate(r'$\\lambda_{3,4}$ = ' + str(np.round(w34[iepoch],2)),((i3x+h4x)*0.45-1.2,(i3y+h4y)*0.5-1.1),size=8,zorder=200,color='darkred',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=38) \n", " \n", " plt.annotate(r'$\\lambda_{1,5}$ = ' + str(np.round(w15[iepoch],2)),((i1x+h5x)*0.55-2.5,(i1y+h5y)*0.5+0.7),size=8,zorder=200,color='dodgerblue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-36) \n", " plt.annotate(r'$\\lambda_{2,5}$ = ' + str(np.round(w25[iepoch],2)),((i2x+h5x)*0.55-1.5,(i2y+h5y)*0.5+0.05),size=8,zorder=200,color='blue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12) \n", " plt.annotate(r'$\\lambda_{3,5}$ = ' + str(np.round(w35[iepoch],2)),((i3x+h5x)*0.55-1.0,(i3y+h5y)*0.5+0.1),size=8,zorder=200,color='darkblue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=18) \n", " \n", " plt.annotate(r'$\\lambda_{4,6}$ = ' + str(np.round(w46[iepoch],2)),((h4x+o6x)*0.47,(h4y+o6y)*0.47+0.39),size=8,zorder=200,color='orange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12) \n", " plt.annotate(r'$\\lambda_{5,6}$ = ' + str(np.round(w56[iepoch],2)),((h5x+o6x)*0.47,(h5y+o6y)*0.47+0.26),size=8,zorder=200,color='darkorange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12) \n", " \n", " if forward == True:\n", " \n", " plt.annotate(r'$\\lambda_{1,4} \\times X_1$ = ' + str(np.round(x1*w14[iepoch],2)),((i1x+h4x)*0.45,(i1y+h4y)*0.5+0.70),size=8,zorder=200,color='orangered',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-18,xycoords = 'data',va=\"top\",ha=\"left\") \n", " plt.annotate(r'$\\lambda_{2,4} \\times X_2$ = ' + str(np.round(x2*w24[iepoch],2)),((i2x+h4x)*0.45-0.3,(i2y+h4y)*0.5+0.70),size=8,zorder=200,color='red',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=10,xycoords = 'data',va=\"top\",ha=\"left\") \n", " plt.annotate(r'$\\lambda_{3,4} \\times X_3$ = ' + str(np.round(x3*w34[iepoch],2)),((i3x+h4x)*0.45-1.4,(i3y+h4y)*0.5-1.3),size=8,zorder=200,color='darkred',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=36,xycoords = 'data',va=\"bottom\",ha=\"left\") \n", " \n", " plt.annotate(r'$\\lambda_{1,5} \\times X_1$ = ' + str(np.round(x1*w15[iepoch],2)),((i1x+h5x)*0.55-2.5,(i1y+h5y)*0.5+1.9),size=8,zorder=200,color='dodgerblue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-36,xycoords = 'data',va=\"top\",ha=\"left\") \n", " plt.annotate(r'$\\lambda_{2,5} \\times X_2$ = ' + str(np.round(x2*w25[iepoch],2)),((i2x+h5x)*0.55-1.5,(i2y+h5y)*0.5+0.7),size=8,zorder=200,color='blue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12,xycoords = 'data',va=\"top\",ha=\"left\") \n", " plt.annotate(r'$\\lambda_{3,5} \\times X_3$ = ' + str(np.round(x3*w35[iepoch],2)),((i3x+h5x)*0.55-1.0,(i3y+h5y)*0.5+1.1),size=8,zorder=200,color='darkblue',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=18,xycoords = 'data',va=\"top\",ha=\"left\") \n", " \n", " plt.annotate(r'$\\lambda_{4,6} \\times Y_4$ = ' + str(np.round(y4[iepoch]*w46[iepoch],2)),((h4x+o6x)*0.47,(h4y+o6y)*0.47+1.0),size=8,zorder=200,color='orange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=-12,xycoords = 'data',va=\"top\",ha=\"left\") \n", " plt.annotate(r'$\\lambda_{5,6} \\times Y_5$ = ' + str(np.round(y5[iepoch]*w56[iepoch],2)),((h5x+o6x)*0.47,(h5y+o6y)*0.47+1.0),size=8,zorder=200,color='darkorange',\n", " bbox=dict(boxstyle=\"round,pad=0.0\", edgecolor='white', facecolor='white', alpha=1.0),rotation=12,xycoords = 'data',va=\"top\",ha=\"left\") \n", " \n", "\n", " \n", " plt.plot([0.5,20,20,0.5,0.5],[-1,-1,10,10,-1],color='black')\n", " #plt.scatter(0,10,color='yellow')\n", " \n", " plt.subplots_adjust(left=0.0, bottom=0.0, right=1.5, top=1.0, wspace=0.2, hspace=0.2); plt.show()\n", " \n", "# connect the function to make the samples and plot to the widgets \n", "interactive_plot = widgets.interactive_output(run_plot, {'nepoch':nepoch,'lr':lr,'weights':weights,'forward':forward,'back':back,'seed':seed})\n", "interactive_plot.clear_output(wait = True) # reduce flickering by delaying plot updating " ] }, { "cell_type": "markdown", "id": "554bb4ff", "metadata": {}, "source": [ "### Interactive Machine Learning Norms Demonstation \n", "\n", "#### Michael Pyrcz, Professor, The University of Texas at Austin \n", "\n", "Interactive artificial neural network dashboard built from scratch to demonstrate, parameter initialization and training. \n", "\n", "### The Inputs\n", "\n", "* **$n_{epoch}$** - number of training cycles, **$\\eta$** - learning rate, **$S$** - random number seed\n", "* **Weights** - show the network weights, **Forward Pass** - show the contributions and node outputs, **Back Propogation** - show the partial derivatives" ] }, { "cell_type": "code", "execution_count": 5, "id": "873fbf10", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "216f8e52f67c4bcb97fc44095878244e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(Text(value=' Machine Learning Simple Artificial Neu…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "171d9decfc7c4081aa909f60fe582969", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(ui, interactive_plot) # display the interactive plot" ] }, { "cell_type": "markdown", "id": "3d3a38fd", "metadata": {}, "source": [ "Note, I am still making improvements. For now it is best to select weights, forward pass or back propogation and not a combination of two of the choices." ] }, { "cell_type": "markdown", "id": "d1b27996", "metadata": {}, "source": [ "#### Comments\n", "\n", "This was an interactive demonstration of an artifial neural network. Providing students an opportunity to play with machine learning, deep learning for experiential learning.\n", " \n", "#### The Author:\n", "\n", "### Michael Pyrcz, Professor, The University of Texas at Austin \n", "*Novel Data Analytics, Geostatistics and Machine Learning Subsurface Solutions*\n", "\n", "With over 17 years of experience in subsurface consulting, research and development, Michael has returned to academia driven by his passion for teaching and enthusiasm for enhancing engineers' and geoscientists' impact in subsurface resource development. \n", "\n", "For more about Michael check out these links:\n", "\n", "#### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig) | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n", "\n", "#### Want to Work Together?\n", "\n", "I hope this content is helpful to those that want to learn more about subsurface modeling, data analytics and machine learning. Students and working professionals are welcome to participate.\n", "\n", "* Want to invite me to visit your company for training, mentoring, project review, workflow design and / or consulting? I'd be happy to drop by and work with you! \n", "\n", "* Interested in partnering, supporting my graduate student research or my Subsurface Data Analytics and Machine Learning consortium (co-PIs including Profs. Foster, Torres-Verdin and van Oort)? My research combines data analytics, stochastic modeling and machine learning theory with practice to develop novel methods and workflows to add value. We are solving challenging subsurface problems!\n", "\n", "* I can be reached at mpyrcz@austin.utexas.edu.\n", "\n", "I'm always happy to discuss,\n", "\n", "*Michael*\n", "\n", "Michael Pyrcz, Ph.D., P.Eng. Professor, Cockrell School of Engineering and The Jackson School of Geosciences, The University of Texas at Austin\n", "\n", "#### More Resources Available at: [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig) | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1) \n", " " ] }, { "cell_type": "code", "execution_count": 6, "id": "dd58c977", "metadata": {}, "outputs": [ { "data": { "image/png": "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yL9Tk1tuuUV33XWXfvzjH2v16tV68MEHtW7dOo0aNUo//PBDYLt77rlH99xzj8477zytWrVKN998s2688UZ99tlndd7Htddeq1dffVX333+/3nzzTf3tb3/Tueeeq4yMDEm+Q/DOPPNMderUSZs2bQpcavLtt99q2LBhWrlypWbNmqW1a9fqiSeeUFJSko4ePVrneBYvXqyysjLNmDFD5557rnr06KG///3vsiwraLv7779fV199tVJTU7V48WKtXLlS06ZN09dff13vcQ8cOFCnn356tXVevHixOnTooPPPP1+Sr3lv27at5s+fr3Xr1mnBggWKjIzUiBEjtGfPHknS4MGDA1n33ntv4L5vvPHGGh93qLWWpEOHDunqq6/WNddco9WrVwdeHy+88EKdf18AABoT/WJo6BfpF5tzvzh58mTl5+dry5YtknyTvFOmTNH8+fN11VVXac2aNZo/f35gsr6goCDo97dt26Zf//rX+vnPf65169ZV+6FC+/btNWnSJD333HNVJoAXLVqk6OhoXX311ZKkI0eOSJJmz56tNWvWaNGiRTrhhBM0duzYwPlRO3furHXr1kmSbrjhhsDfu7rJWkmaMWOG8vPz9eKLLwZdn5mZqVWrVumaa64JnObg4Ycf1pVXXql+/frpxRdf1D/+8Q/l5OTorLPO0u7du+vzpwWOswC0CD/88IM1evRoS5IlyYqKirJGjRplzZs3z8rJyQnadsyYMdaYMWMCPy9YsMCSZK1duzZou5tuusmSZC1atChw3bRp0yxJ1ooVKwLXlZSUWO3bt7ckWdu2bQtcn5GRYbndbmvWrFmB66644grL4/FY+/fvD7qviRMnWrGxsVZmZqZlWZa1d+/eKvc9YsQIKzU11SooKAhcl52dbaWkpFihvp0NGjTIuv322+vcbsyYMVb//v1rvP2TTz6xJFm33npr0PXvv/++Jcm6++67LcuyrCNHjlgej8e6/PLLg7bbtGmTJSmoDtU95vj4eOuOO+6odawXXHCB1aNHj2pvk2TNnj078POMGTOsqKgoa/fu3bVmVqe8vNw66aSTrC5dulilpaWWZVnW7NmzLUnW22+/Hdjuq6++stxut3X11VfbNu4nn3zSkmTt2bMncJ3/b/vLX/6yxvsoLS21iouLrd69e1t33nln4Pq0tLQqf2s//2PyC7XWluV73kiy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np6uf/3rX3rhhRd00UUXBU2IT5gwQZGRkfryyy+rfez+CWegvtgzFWghJkyYoK5du2ry5Mnq06ePysvLtX37dv3+979XfHy8fvGLX9T4u9OmTdMf//hHXXPNNXrooYd00kknae3atXrjjTckSRER9n3uMnv2bL3++usaN26c7r//fqWkpOif//yn1qxZo0cffVRJSUk1/u6DDz6o8847Tz/+8Y/1y1/+UmVlZXrkkUcUFxcXWCWyJitWrFBycrLGjRsX8lizs7P18ssvV7m+ffv2GjNmjH72s5/pqaeeUkREhCZOnKh9+/bpvvvuU7du3XTnnXdK8h1uNGvWLM2bN09t2rTRRRddpAMHDmju3Lnq3LlzrX/brKwsjRs3TldddZX69OmjhIQEpaWlad26dbr44osD25122ml65ZVXtHDhQg0ZMkQRERE1NgYPPPCA1q5dqx/96Ee6++67ddpppykzM1Pr1q3TrFmz1KdPn2p/79lnn1WbNm30q1/9qsohe5J03XXX6Q9/+IN27NihgQMH6u6779aDDz6ogoICXXnllUpKStLu3bv1ww8/aO7cufUetyS53e7A/SQmJuriiy+u8nyZNGmSFi9erD59+mjAgAHaunWrHnvssSp7CJx44omKiYnRP//5T/Xt21fx8fFKTU2t9j+Rp5xySki1BgDA6egX6RfpF1tGv5iZmanNmzdL8p0reM+ePVq2bJk2btyoyy67LPD3k6QrrrhC//znP3X++efrF7/4hYYPH66oqCgdOHBA69ev15QpU3TRRRc1eCwzZszQTTfdpPT0dI0aNarK5OykSZP04IMPavbs2RozZoz27NmjBx54QL169VJpaWlgu4SEBPXo0UOrVq3SOeeco5SUFLVr167WPbPHjx+vrl276tZbb9WhQ4eqTOT27NlTDzzwgO655x599dVXOu+889SmTRt99913+uCDDxQXFxf0twJCZnoFLAD2WL58uXXVVVdZvXv3tuLj462oqCire/fu1rXXXltlJc7Kq7Nalm+lw4svvtiKj4+3EhISrEsuucT617/+ZUmyVq1aFdhu2rRpVlxcXJX7r2k10+pWm/z444+tyZMnW0lJSVZ0dLQ1cODAKqtkVrdSqWX5Vo0cMGCAFR0dbXXv3t2aP39+ldU0qzN69Oig1Sfr4l9ls7qL/29XVlZmPfLII9bJJ59sRUVFWe3atbOuueYa65tvvgnKKi8vtx566CGra9euVnR0tDVgwADr9ddftwYOHBi0gmXlx1xYWGjdfPPN1oABA6zExEQrJibGOuWUU6zZs2dbeXl5gd87cuSIdemll1rJycmWy+UK+luomhUxv/nmG2vGjBlWp06drKioKCs1NdW67LLLrO+++67av8WOHTssSbWuEvvpp59akoJWynz++eetYcOGWV6v14qPj7dOP/30oHrWd9yWZVmfffZZoA5vvfVWlduPHj1q3XDDDVaHDh2s2NhYa/To0dbGjRurfc4vXbrU6tOnjxUVFRV0f9U9n0KtdU2vg2nTptW4Ei0AAE2FfpF+kX6x+feLPXr0CDw+l8tlxcfHW6eccop17bXXWm+88Ua1v1NSUmI9/vjj1sCBAwN/6z59+lg33XST9fnnnwdlV34tVrytutdHVlaWFRMTY0my/u///q/K7UVFRdavfvUrq0uXLpbX67UGDx5svfrqq9U+3n//+9/W6aefbnk8HktS4P4WLVpkSbL27t1bJf/uu++2JFndunWzysrKqh37q6++ao0bN85KTEy0PB6P1aNHD+vSSy+1/v3vf1e7PVAXl2VVWuoNAI55+OGHde+992r//v22nhy+qR06dEhdunTRq6++GvJKro1t79696tOnj2bPnq27777b9HAAAAAahH6x8dAvAoAzcZg/AEnS008/LUnq06ePSkpK9M477+jJJ5/UNddc06wbY8m3eqt/RU8TduzYoaVLl2rUqFFKTEzUnj179OijjyoxMVE33HCDsXEBAADUB/1i46FfBIDmg8lUAJKk2NhY/fGPf9S+fftUVFSk7t2766677tK9995remjNXlxcnLZs2aJnn31WmZmZSkpK0tixY/W73/1OHTt2ND08AACAkNAvNh76RQBoPjjMHwAAAAAAAABCYN+SiwAAAAAAAADQgjGZCgAAAAAAAAAhYDIVAAAAAAAAAELAAlSVlJeXKz09XQkJCXK5XKaHAwAAYIxlWcrJyVFqaqoiIvgMvrmjzwUAAPAJp89lMrWS9PR0devWzfQwAAAAHOObb75R165dTQ8DYaLPBQAACNaQPpfJ1EoSEhIkSTt37gy72czNzZUkxcfHhz0uu/OcPLbMzEz997//1Zlnnqnk5GTHjMvuPKdmSdTAdJZEDUxnSdTAdJZEDUxnSb7m8tRTTw30R2je7OxzJec+d538eud9zXweNTCfRw3M51ED83nUwHxeOH0uk6mV+A95SkhIUGJiYlhZ/t2E7XrS2Jnn5LGVl5crNjZWiYmJ1MBAlkQNTGdJ1MB0lkQNTGdJ1MB0lnR88o1DwlsGO/tcybnPXSe/3nlfM59HDcznUQPzedTAfB41MJ8XTp/Lya8AAAAAAAAAIARMpgIAAAAAAABACDjMvwaFhYWBczE0VH5+vk2jsT/PyWMrKCgIfI2MDO8p6uTH6dQsiRqYzpKogeksiRqYzpKogeksydcPoeWxo8+VnPvcdfLrnfc183nUwHweNTCfRw3M51ED83nh9LmtejJ1wYIFWrBgQdB1ZWVlhkYDAAAA2IM+FwAAoHG06snUmTNnaubMmUHXZWdnKykpSV6v17YT5NqV0xh5ThxbaWmpJCkmJoYaGMqiBuazqIH5LGpgPosamM/yer225KDpNVWfKznzuWt3ll15vK+Zz6MG5vOogfk8amA+jxqYzwunz+WcqQAAAAAAAAAQAiZTAQAAAAAAACAETKYCAAAAAAAAQAha9TlTa2PHKqdOXrXMyWNjVTuzWRI1MJ0lUQPTWRI1MJ0lUQPTWVJ4q5zCuezocyXnPned/Hrnfc18HjUwn0cNzOdRA/N51MB8Xjh9bqueTGWVUwAAALRE9LkAAACNo1VPpjbVKqdOXLWsMbLsymNVO/NZ1MB8FjUwn0UNzGdRA/NZ4axyCrOaqs+VnPnctTvLrjze18znUQPzedTAfB41MJ9HDcznhdPncs5UAAAAAAAAAAgBk6kAAAAAAAAAEAImUwEAAAAAAAAgBK36nKm1sWOVUyevWubksbGqndksiRqYzpKogeksiRqYzpKogeksKbxVTuFcdvS5knOfu05+vfO+Zj6PGpjPowbm86iB+TxqYD4vnD63VU+mssopAAAAWiL6XAAAgMbRqidTm2qVUyeuWtYYWXblsaqd+SxqYD6LGpjPogbms6iB+axwVjmFWU3V50rOfO7anWVXHu9r5vOogfk8amA+jxqYz6MG5vPC6XM5ZyoAAAAAAAAAhIDJVAAAAAAAAAAIAZOpAAAAAAAAABCCVn3O1NrYscqpk1ctc/LYWNXObJZEDUxnSdTAdJZEDUxnSdTAdJYU3iqncC47+lzJuc9dJ7/eeV8zn0cNzOdRA/N51MB8HjUwnxdOn9uqJ1NZ5RQAAAAtEX0uAABA42jVk6lNtcqpE1cta4wsu/JY1c58FjUwn0UNzGdRA/NZ1MB8VjirnMKspupzJWc+d+3OsiuP9zXzedTAfB41MJ9HDcznUQPzeeH0uc32nKnz5s3TsGHDlJCQoA4dOmjq1Knas2eP6WEBAAAAYaPXBQAAcKZmO5m6YcMGzZw5U5s3b9Zbb72l0tJSjR8/Xnl5eaaHBgAAAISFXhcAAMCZmu1h/uvWrQv6edGiRerQoYO2bt2qH/3oR4ZGBQAAAISPXhcAAMCZmu1kamVZWVmSpJSUlBq3KSoqUlFRUa052dnZkqTc3FxlZmaGNSb/KmP+c2GEy848J48tJycn6Gs4nPw4nZolUQPTWRI1MJ0lUQPTWRI1MJ0lyZYV32GPunrdpu5zJec+d538eud9zXweNTCfRw3M51ED83nUwHxeOH2uy7IsK+wRGGZZlqZMmaKjR49q48aNNW43Z84czZ07N6TMJUuWKDY21q4hAgAANDv5+fm66qqrlJWVpcTERNPDabVC6XXpcwEAAEIXTp/bIiZTZ86cqTVr1ug///mPunbtWuN2oX5i361bN+3atUupqalhjcs/Y25Xs2pnnpPHlpOTo23btmnw4MFKSEhwzLjsznNqlkQNTGdJ1MB0lkQNTGdJ1MB0liSlp6erf//+TKYaFkqv29R9ruTc566TX++8r5nPowbm86iB+TxqYD6PGpjPC6fPbfaH+d9+++1avXq13nvvvVonUiXJ4/HI4/GElBsfH6/k5OSwxhYZGRnIsoOdeU4em19CQgI1MJBVETUwk1URNTCTVRE1MJNVETUwkyUdPywc5oTa6zZ1nys597nr5Ne7H+9rZvMkamA6T6IGpvMkamA6T6IGJvPC6XOb7WSqZVm6/fbbtXLlSr377rvq1auX6SEBAAAAtqDXBQAAcKZmO5k6c+ZMLVmyRKtWrVJCQoIOHTokSUpKSlJMTIzh0QEAAAANR68LAADgTM12MnXhwoWSpLFjxwZdv2jRIl1//fVh5xcWFoa9gq3/XA52sTPPyWMrKCgIfPXvwt1QTn6cTs2SqIHpLIkamM6SqIHpLIkamM6SfP0QzGjMXteOPldy7nPXya933tfM51ED83nUwHweNTCfRw3M54XT5zbbyVQ71s1asGCBFixYEHRdWVlZ2LkAAABAOMLtdelzAQAAGkeznUy1w8yZMzVz5syg67Kzs5WUlCSv12vbCXLtXojDzjwnjq20tFSSFBMTQw0MZVED81nUwHwWNTCfRQ3MZ3m9Xlty0PSaqs+VnPnctTvLrjze18znUQPzedTAfB41MJ9HDcznhdPnRoR97wAAAAAAAADQCjCZCgAAAAAAAAAhYDIVAAAAAAAAAELQqs+ZWhs7Vjl18qplTh4bq9qZzZKogeksiRqYzpKogeksiRqYzpLCW+UUzmVHnys597nr5Nc772vm86iB+TxqYD6PGpjPowbm88Lpc1v1ZCqrnAIAAKAlos8FAABoHK16MrWpVjl14qpljZFlVx6r2pnPogbms6iB+SxqYD6LGpjPCmeVU5jVVH2u5Mznrt1ZduXxvmY+jxqYz6MG5vOogfk8amA+L5w+l3OmAgAAAAAAAEAImEwFAAAAAAAAgBAwmQoAAAAAAAAAIWjV50ytjR2rnDp51TInj41V7cxmSdTAdJZEDUxnSdTAdJZEDUxnSeGtcgrnsqPPlZz73HXy6533NfN51MB8HjUwn0cNzOdRA/N54fS5rXoylVVOAQAA0BLR5wIAADSOVj2Z2lSrnDpx1bLGyLIrj1XtzGdRA/NZ1MB8FjUwn0UNzGeFs8opzGqqPldy5nPX7iy78nhfM59HDcznUQPzedTAfB41MJ8XTp/LOVMBAAAAAAAAIARMpgIAAAAAAABACJhMBQAAAAAAAIAQtOpzptbGjlVOnbxqmZPHxqp2ZrMkamA6S6IGprMkamA6S6IGprOk8FY5hXPZ0edKzn3uOvn1zvua+TxqYD6PGpjPowbm86iB+bxw+txWPZnKKqcAAABoiehzAQAAGkernkxtqlVOnbhqWWNk2ZXHqnbms6iB+SxqYD6LGpjPogbms8JZ5RRmNVWfKznzuWt3ll15vK+Zz6MG5vOogfk8amA+jxqYzwunz23W50x97733NHnyZKWmpsrlcunVV181PSQAAAAgbPS5AAAAztSsJ1Pz8vI0cOBAPf3006aHAgAAANiGPhcAAMCZmvVh/hMnTtTEiRMbJTs/P195eXlhZfh/3+Vy2TEkW/OcPrbCwkLl5eUpKirKMeOyO8+pWf48amAuy59HDcxl+fOogbksfx41aKIsy5JKS6tcivbvD3tMaJjG7HMBAADQcM16MrW+ioqKVFRUVOs22dnZkqS+ffs2xZAAAEAz5JYUJSm6hq+13VbfrxW/j6zhUtttdd0edezxVKd3g/9CaGr16XNzc3OVmZkZ9n36V9T1n/etJWbZnZeTkxP0NRxOfpxOHhs1MJ9HDcznUQPzedTAfF5ubm6Df7dVTabOmzdPc+fONT0MAABQDy5JXkmeY5eK39d2XX22re26aFWd4GzW50lCi1SfPnfHjh36/PPPG3lEqM22bdtMD6HVowbmUQPzqIF51MAc/8RsQ7gsy7JsHIsxLpdLK1eu1NSpU2vcJtRP7Lt166YtW7aoU6dOYY2poKBAkm91NjvYmefkseXm5mr79u0aNGhQ2Cu0OflxOjVLogamsyRqYDpLoga1Ki+Xq6hIroICuQoL5SoslAoLVZyZqYiiInnKy4Nuq3Kp7bYKFxUUSAUFcpeUhP040XAuSVlZWUpMTDQ9lFbL7j53165dSk1NDXtc/v+ExMbGttgsu/NycnK0bds2DR48WAkJCY4Zl915Th4bNTCfRw3M51ED83nUwHxeenq6+vfv36A+t1XtmerxeOTxeELatn379urSpUtY9+ffZTjc/4Q3Rp6Tx5aZmSmv16uOHTsqOTnZMeOyO8+pWRI1MJ0lUQPTWVILqEF5uZSfL+XlVb3k5ga+LzpyRMrPl6ekpMptNf7usQlYAM5Rnz43Pj4+7Pc1SYqMjAzktdSsxsiTpISEhLBr4OTH6eSx+VEDs3kSNTCdJ1ED03kSNTCZ5z/9UYPGEfa9AwCA8JWX+yYqc3Kk7Gzf14qXCtdFHzkiV06Ob1Kz4jYVJz1DPGwltKkX1JvbLUVHS1FRdX4tdbulqChFxsTUvn1k5PGvlb8/diksLZUiI+WNj69xmyqXWrY5cOiQNHCg6b8mAAAA4BjNejI1NzdXX3zxReDnvXv3avv27UpJSVH37t0NjgwA0GqUlkpZWVJmpu9r5e+zsxWdkSGXf4/OmiZJj63CHoroRnswzZDXK3k8xy81/FzqdsvyeBQVF1f371R3XaWJzbySEikqSnFt2viurzjpGRUlRYR+VtVCG/dcLvWfSN+mT//LCwttyUH90ecCAAA4U7OeTN2yZYvGjRsX+HnWrFmSpGnTpmnx4sVhZRcWFoa1spcU3slsGzvPyWPzn7+voKAgsAt3Qzn5cTo1S6IGprMkatBkWcf2BnVlZ8t1bPLT/73r++/Ve/duRb75pkoKC4NvOzZJ6srOliuESdDWMPlpRUTI8nqlmBgpNlbyemXFxAR9VUxMleusmBjf78TEBH7f/zXfsrTzyy/Vb8gQxbZt69s+Ovr4BGdUlORyhTS+xjpfk1U5r6TEd2lAlh3sfr0XMplqjNP7XMm5z10n/7vHv+/m86iB+TxqYD6PGpjPowbm88Lpc5v1ZOrYsWMVzvpZCxYs0IIFC4KuKysrC3dYAICmVFYmZWbKffCgXJmZchcWynX0qJSZKVdmplxHjvi+Zmb6rvdPiGZn+74vL6821ispqWkfSaOyXC4pNlZWXJwUF+ebBIyNVZnXKys2VhGJib7r4+J828XGHt/Of33FnytNgCoqSvnHmkK7JiyLc3KUGRGh0j59ZIV5Yn6guaHPBQAAcKZmPZkarpkzZ2rmzJlB12VnZyspKUler9e2E+TaeXJiu/OcOLbS0lJJvpWlqYGZLGpgPqvV1SAuzne4+9Gj0pEjvq+hfp+V5cuwbTQO4fVKCQlSYqLvq/+SmKgSr1dWfLyi27Y9vk18vO9ybNIz6Pu4OLliYiSXS5X34yywc3GsY3uJ8jpoOVler9eWHDS9pupzJWc+d+3OsiuP9zXzedTAfB41MJ9HDcznUQPzeeH0ua16MhUAYDPL8p37MyPDd/nhh+q/PzYZGpuREdiLVDXsIdqsREZKSUm+S3Ky72tiokpiYmQlJCg6JaXKxGi1P8fH+w5hr0HRsQnQaJubEgAAAABA7ZhMBQBUr7zct9dnpcnQqPR0uTIyfIsmVTdhWlwc8l2EvkRPE0lMDEyElsbF6YfSUqX06qXo9u2PT45WnCit/H1sbLXn8GTyEwAAAABaBiZTAaA1KC2Vvv++7j1GK+89Ws359TwGhh8qy+ORKyVFatNG8n+t/H2bNtVPhCYkSG53ICs3M1Pvb9igMWPGKDo52dhjAgAAAAA4B5OpNbBjlVMnr1rm5LGxqp3ZLIkamM6S6qhBYaFvUaVjF2VkHP/Z/32F62IzMhRx7LyizYHldkvJybLatJHl/3rse/mvq3C7jt2eFx0txcQ0fPGjY3/z4z/yOjCZJVED01lSeKucwrns6HMl5z53nfx6533NfB41MJ9HDcznUQPzedTAfF44fW6rnkxllVMARh07v2jlyU9XRobiDx7UaZ9+quRFixSVkxO8TV6e6ZGHxHK7ZaWkyGrbVkpJCXxvpaQEJkiLYmNVnpQkT+fOgQlSxcdXe6h8nWz+hxoAmjP6XAAAgMbRqidTm2qVUyeuWtYYWXblsaqd+Sxq0ACWJWVnK/6776oeMl/T14wMqaio2jiPpITwR2Ufr1dq21Zq21albdrISklRVMeOUrt2gesrf+9KTJSrjknR0txcuSXFOq2e4nXghCxqYD4rnFVOYVZT9bmSM5+7dmfZlcf7mvk8amA+jxqYz6MG5vOogfm8cPrcVj2ZCgDVKi+Xjh6te1K0wvdxGRlyHfsH0fESEmqcAK3x+wqHzhceOzQ0isWUAAAAAACtDJOpAFq20lLfQkrVTIZGp6f7zjmanR1829GjvgnVemjAQenhc7l8CyjVMSFaEBsrq21bxXbr5luIyePkJaQAAAAAAHAuJlMBNA+FhdKRI4o4cMA3OXrs56DL0aNVr8vOrjEyugmHXye3O2gCtDgxUenFxerUr5+8XbpUP2Hapk3Q6vM1KfMvMsKepAAAAAAAhIXJ1BrYscqpk1ctc/LYWNXObJbUiDWwLCk3V66jRwMX+b8/cuT49ZmZwbcdPSrXsTE1cJ32JmV5PEGLLaniwkv+r5WuU2Ji0KJLOTk52vHBB/IMH66EhBrOnlpp9fma8DpoGN6LzGZJ1MB0lhTeKqdwLjv6XMm5z10nv955XzOfRw3M51ED83nUwHweNTCfF06f26onU1nlFKgny5IKC+XKypIyM+XKygpclJXlmwSt+HNWljxHjsiVna2I7GzfpGhzOa/oMdaxQ+SrTH5WmhAtiItTeZs2vr1I4+Iatho9AAA2oc8FAABoHK16MrWpVjl14qpljZFlVx6r2jVilmVJeXm+Q9+PTYhWd4n67jsN/eILtfN4FJWbG3x7cbFt421yiYlBh8uXJCfLSklRdOfOVQ+hP/bV5fWGdD5U/6H0rGLecrKogfksamA+K5xVTmFWU/W5kjOfu3Zn2ZXH+5r5PGrQdHmWVfUiSYWFpSorkzyeGMXFxduyDwI1qB9eB+bzqIH5vHD63FY9mQo0G6WlUk6ObxI0Ozv4++xsRR0+LFdOju88ohWur3LJyQlpYSWPpC6N/6gazEpOluvY4fN1Xtq0Of59dPBZUouOTYBGcy5RAGj13G43e24CsFVZmVRUFPolKytSRUW+A5wqXl9S4vvvQOVLWVnN1xUWeuU/IKy67ar7/bIy338Vyst9E58Vv5aXx0mq/raavtYsWdKUam9xuep3keIC30dE+JYTcLulyMj6fe//WfIqIkLyemv+nago338rKn6t7rqyskhFR0sJCdVvF2pOZCQHvQFOw2QqYDfL8nU9ubnVX/LypNxcRWVk+L4vLg6+vbpJ0DrOC9Is12Z3u+s/GZqSotxj3Yzdn2wBAFo3y7/LFIBmqby89onK4mLf14yMSG3b1klHj0YpMrJ+k52VLwUFMYHJTn9+xUv9P5+x82gAu/+r3zSzeRX3YA2N3eOy8+9mTz1dLsnjkTyeOEVHW/J6/T83/FJWFq2vv+6ugwejlJJS/9+PiLDloQHNFpOpaJ3KynyL9xQU+CYq8/ODv6/487HJT+XmKjozU67c3LonS0PonJrlBGhlcXFScnKtl0KvV1ZysmI6dQqeJE1IaNhHrDYsmAEAQGUudvsBQmZZ1U8e+i9Hj0aouNg34RLKpGRtWUVFUn5+jIqLfZOWNW0T+mn54yWNsOkv4bYpB6jZsWUrVFjokn2Tx7GSTm/wb0dG+iZVvV4pOjo28H3FrxUv9bnOstyKjvb9dzKU342KYs9dND0mU2tgxyqnTl61zFFjsyxf91NUJBUWqigjQ3EHD6pk+3blu92+BY+O3aaiIt+q7vn5vq8FBVV+VkGBXMcmQz15eVJBgcp9XZhchYW+r0VFDRpqdN2bNCtWXJyspCRZSUnSsa9WcrKKY2J0IC9Pnfv0UXSHDrKSk4/fXmF7RUXVeR/+50ZZbGzwDXl5DRqzU18HrGLesrIkamA6S6IGprOk8FY5bYkWLlyosrIyeTwe/fSnPzU9nAazo8+VnPvcdfLrvb7vaxXb5OJiqbjYFZh4zMoqUkmJSy5XftD1/u38e0wWFVX93rdt8Pf5+VEqLnaptLSswuSm61je8e99v1PXzEVsHbfXF5OWgJP4Tw3h+y+d3bupxtT7Nzwe69jErhWYZI2OthQV5ZHHYykmpvTYdb5tj0/MWseuk7ze49/7r6+caVkl8ngsJSXlB11fMdMd4tsVfa75vHD63FY9mdpqVzk9tlemq6TEN7HoPy6luDjo+8o/V7nN9/GYXMXFcuXkyFVUpKgKJwZyHZv8DEyGVryu8u0VTqoTL6mjub9Os2AlJMhKSJCOfS2Li1N5QoLcycmyEhMD11sJCVJiYtXv4+N9izHVMBmak5OjTz/4QInDhysiIaGJHx0AAM4UExOj66+/vln0i622zw1ReblvctHf3paWumr8OScnSiUlvvPq+veO9N/u/7mkxFXh/JauCpOawROSeXmROnx4hGJi2qisLDKwp2VNk6HFxZJl1TRxGWfzX6VV/9ewyfknXypOyERFlR87jDsiaELHd+5MS5GRvr19IyP9l+qu811fXl4it1uKiYkKXFfxvJ8Vt6143lC3+/j5R4+fi9RSUVHRsXOJegK31fXVd7GCrrMsKTc3Tx999LFOO22AYmNjZVmuaherqm7xqsrXFRT4JkOio73Hzu3qUlnZ8fPB+r/3XareVl7u/9l3W2FhsUpLXXK7owK/UznH99o//h7hfw/wvXccv62oqFwlJVJZWYRKSiq+x7iObXf8/QTh8X84VHXPXbs/iKl7otftrjrJ6p/E9U3O+r53uyOVmztMnTsnKy4ussIEcMVz5lb82fd6P35O3eM/l5VFKTpaio+PqHD+XavS+XiDf+ZUDeFp8L+YjzzyiO666y599NFH6tu3r6JC2EPNaUJa5bS8/PjHLhXP/B3C9+7sbKm0VDFRUQ36/crfewoKpJISRfmPq6l8qTTZWeOlvFx2n22ype2xabu4OCk+/vjX+HiVxsRIcXGKTE4Ovj0pyTfRWdMlPl6uiIigfyYKju1d4mUF7RaTRQ3MZ1ED81nUwHxWOKucOsmDDz4ol8ulIUOGaMiQIerQoUO9M7744gsVFBToT3/6k6KionTrrbc2wkjtE1KfW43jEws1X/y3Z2dHqLTUd4hnXYvi1HV7Xl6USkslt9sTtE3wZEXFycvg7yv+XFQUo+Ji17EJjOq3rd+8sp17WUZJ6mRjHkIRFaUKe6uVq7y8QElJXsXEuMM676RlFcrjkZKSvDVuc3xPt8qHJfu7+eNdfW6ub48rO97Dc3NLjmXZc3Kx3NzyY3nhvx4yM0t05EiuBgyIUnJyeB8K2DkuX559f7fc3IJjWbXX07Jqfo+reAqMo0d9e6FHRMSEda7foiIpL69UP/yQLY8nUaWlkTWefgP1V1bmCpw5sPbTMkRKSrXpXuu/N6/bXXWxs+OLnsUoKkryet01Lormv1T+ufJt5eVRcruluDhPSL9XV15xsUtut5SUFFfn79V1+odw+twGT6aOHj1akjRnzhx98sknioqK0qmnnqrTTjtNp512moYNG6aOHRt//8JnnnlGjz32mA4ePKj+/fvriSee0FlnnRVWZq6k2N69fR1cCCuf16T+T+faNb/p6mYmOlqKjT1+iYk5/v2xCdASj0dWXJyiU1KqTI4GXSpeHxtb7cc+hccmQFlICQCAxnXffffpm2++0datW/XUU08pPT1dJ598su66666QM2JiYhQZGamysrImXayqMXrdYcMSA4ePV77U76HZOclo59nkOSTcJN+5FP2Hy7rCXijH45GkQkVH1z5pWdOl8h5YmZnZ2rBhg8aMGaPk5OSwHmturu9DP9p5hMPlUmAP5Lha5paPTxyHf5+ZmbnasGFjra+Dus6N7L9kZhaosFBVJnkrHJRar+sKCsqPTeZGBF1fUhL+48ZxFZeRqcrOf0ftXi0m9A9gXC7fv0kV98qv+FVKbPAoQp5MtSwr6MT8Z555piTplVdekeQ7b8HOnTv18ccf69///rdmz56t888/Xw8++GCDB1eX5cuX64477tAzzzyjM888U3/5y180ceJE7d69W927d29wbpzExzBOUd2ZrCtOeFY38Vnh58KICCk2Vt42bWr/nZiYkE5uUnRsAjSajgkAAMdq27atTj75ZJ166qlBl6lTp2rq1KmSpL/+9a8hZVXcq3XKlCkN2qu1oRqr1/3+e47tayl8h4i7gvaArLgnZOXrqttL8viEZZE8Hikx0dPgSc/oaF9LnZvrOze+XTsNMGkJND2Xq+L7Q81yc327+tv1+qxpD+3y8tAmZyten5VVqKIiyeXyNnhyN/g669jPrnp++AgTKu71Xb2G90MhT6bGx8dr0KBBgcOjhgwZon79+ini2Md8sbGxGj58uIYPHx74nSFDhjTqZOof/vAH3XDDDbrxxhslSU888YTeeOMNLVy4UPPmzWu0+23pLP/HYtHRsvz7ch/bn9vy79d9bHLTOvbuWhIZKcvjUVR8vOTx+K73emX5Twri9QZtH/i+0jaWx6OsoiL9d8sWjRo7VskpKWE9Fv/iCmV1vbOHeOLhvGOLJtmx4q9Ts/x5hYWFysvLC/sUHo0xNrvynJrlz6MG5rL8edTAXJY/jxqYy5LsXzSgqRw6dEi7du3S9u3bdccdd2j48OHavXu3iouL1b9/f61fv14/+9nPQsqqvFfrwYMH1bt373rt1dpQjdfr5om9N+vmP2zQd545S1FREVUOc/Sfy84/kVhx0rLy99HRkmUV6Ntv9+qUU3opKSkmsOdk5QlP//fBh6cH31ZUlCuXy84Jy/COmiovP95SO/09l39bzOZRA/N5zbkG/vfdUN6qjr+v2XPOcH9eXFx8YHHA4wv5+d4Da9ubt+JtmZkF+uKL/erUqUdgsvf4ebuDz+RY+efKp4UoLi4/dl7e4+fzRigatii2JLmsEI9TeuaZZ7Rt2zZt3bpVu3btUllZmbxerwYMGBCYXB08eLAGDhwY+J2SkpJGO5dqcXGxYmNj9dJLL+miiy4KXP+LX/xC27dv14YNG6r8TlFRkYrqWMU9OztbXbt1a9iYJJUeu5TU8/v6/E6xTZfqskob9MgBAEBLlpWVpcTEhh8KZVKvXr20d+9eSb4FFj/55JOgD//9IiIilJKSot69e1fZo7Xyqav++te/hjwZ21D17XVD7XO7NbDPBQAAaIka0ueGvGdqxZPsFxUVKSYmRnfeeaeOHDmiLVu26O9//7uKioqCVgltzEWpfvjhB5WVlVVpbjt27KhDhw5V+zvz5s3T3Llz68wervpPhjb8zKoAAABoLBX3bElISKh2ItW/3cGDB+vco1VSo0+kSvXvdUPtcwEAABCeBi1A5Tl20ozLLrtMAwYMkCSVlZVp165d9o0sRJV3/a58bteKfvvb32rWrFm15vk/sd+yZYs6dQpvpc2CY2fyjYmxZykqO/OcPLbc3Fxt375dgwYNCvuwJSc/TqdmSdTAdJZEDUxnSdTAdJZEDUxnSb7D5YcOHWpLVlOaPXu2Bg4cGHTEVCiioqI0aNAgDRo0SHPnztWbb74p6fgerSaE2us2dZ8rOfe56+TXO+9r5vOogfk8amA+jxqYz6MG5vPC6XMbNJlaHbfbHZhYbQrt2rWT2+2u8sn8999/X+UTfD+PxxOYCK5L+/bt1aVLl7DGGO55hxozz8ljy8zMlNfrVceOHW1YYdO5j9OpWRI1MJ0lUQPTWRI1MJ0lUQPTWZKCjjhqTpKSkvT6669r/vz5ysjI0PDhw9W/f3/169dP/fr10wUXXFBnRqh7tDaW+va6Td3nSs597jr59c77mvk8amA+jxqYz6MG5vOogfm8cPrcZruUZ3R0tIYMGaK33nor6Pq33npLo0aNMjQqAAAAmDZr1iz9/e9/1wcffKCsrCwtW7ZMF110kUpKSrR06dJqf8eyLM2ePVuvvPKKvvzyyyYecVX0ugAAAM4U8p6pP/3pTzVkyBANHTpUp512miT7VmtrqFmzZunaa6/V0KFDNXLkSP31r3/V/v37dfPNNxsdFwAAAMxbunSp/vOf/yg2NlaDBw/WbbfdVusCA3bs0Wonel0AAADnCXkydc+ePXrxxReVk5OjyEjfr82dO1djx47V4MGDNWjQIMXGxjbaQKtz+eWXKyMjQw888IAOHjyoU089Vf/617/Uo0ePsLMLCwsDuw83VH5+ftjjaKw8J4/Nfw6MgoKCwHOtoZz8OJ2aJVED01kSNTCdJVED01kSNTCdJfn6oebqgQce0AcffKBbbrlFa9as0apVq/TUU0/pgQce0Lnnnltle5fLVeWco1999ZV27typnTt3aunSpU0+mdpYva4dfa7k3Oeuk1/vvK+Zz6MG5vOogfk8amA+jxqYzwunzw25Yu+9954k6fPPP9fWrVu1bds2bd26Vffff78yMzPldrt18sknN/kiVLfeeqtuvfXWBv3uggULtGDBgqDrmuu5wQAAAHDchg0b9NJLLyklJUWPPfaY3n33XWVlZWnixInVTqZWVN89WhtTQ3td+lwAAIDGUe/p7969e6t379664oorAtft3btXW7Zs0Ycffmjr4BrbzJkzNXPmzKDrsrOzlZSUJK/Xa9sJcu3KaYw8J46ttLRUkm91NmpgJosamM+iBuazqIH5LGpgPsvr9dqSY8KMGTNUXl4uSYqLi9Mjjzyik08+uc7fq+8erU7VVH2u5Mznrt1ZduXxvmY+jxqYz6MG5vOogfk8amA+L5w+N7x9iY/p1auXevXqpZ/85Cd2xAEAAABhufrqqwPfv/jii3r++ef14Ycf6rnnnqv198LZoxUAAAAtny2TqQAAAIBTxcXF6ZZbbglp24bu0QoAAIDWIcL0AAAAAADTLMuS5NujtV27dpJ8e7QmJiaGtEcrAAAAWgf2TK2BHaucOnnVMiePjVXtzGZJ1MB0lkQNTGdJ1MB0lkQNTGdJ4a1y2tz490atqD57tDYndvS5knOfu05+vfO+Zj6PGpjPowbm86iB+TxqYD4vnD63VU+mssopAAAAWiL6XAAAgMbRqidTm2qVUyeuWtYYWXblsaqd+SxqYD6LGpjPogbms6iB+axwVjmFWU3V50rOfO7anWVXHu9r5vOogfk8amA+jxqYz6MG5vPC6XM5ZyoAAAAAAAAAhIDJVAAAAAAAAAAIAZOpAAAAAAAAABCCVn3O1NrYscqpk1ctc/LYWNXObJZEDUxnSdTAdJZEDUxnSdTAdJYU3iqncC47+lzJuc9dJ7/eeV8zn0cNzOdRA/N51MB8HjUwnxdOn9uqJ1NZ5RQAAAAtEX0uAABA42jVk6lNtcqpE1cta4wsu/JY1c58FjUwn0UNzGdRA/NZ1MB8VjirnMKspupzJWc+d+3OsiuP9zXzedTAfB41MJ9HDcznUQPzeeH0uZwzFQAAAAAAAABCwGQqAAAAAAAAAISAyVQAAAAAAAAACEGrPmdqbexY5dTJq5Y5eWysamc2S6IGprMkamA6S6IGprMkamA6SwpvlVM4lx19ruTc566TX++8r5nPowbm86iB+TxqYD6PGpjPC6fPbdWTqaxyCgAAgJaIPhcAAKBxtOrJ1KZa5dSJq5Y1RpZdeaxqZz6LGpjPogbms6iB+SxqYD4rnFVOYVZT9bmSM5+7dmfZlcf7mvk8amA+jxqYz6MG5vOogfm8cPrcZnvO1N/97ncaNWqUYmNjlZycbHo4AAAAgG3odQEAAJyp2U6mFhcX6yc/+YluueUW00MBAAAAbEWvCwAA4EzN9jD/uXPnSpIWL15sdiAAAACAzeh1AQAAnKnZTqY2RFFRkYqKimrdJjs7W5KUm5urzMzMsO7Pv8qY/1wY4bIzz8ljy8nJCfoaDic/TqdmSdTAdJZEDUxnSdTAdJZEDUxnSbJlxXc0jabucyXnPned/Hrnfc18HjUwn0cNzOdRA/N51MB8Xjh9bquaTJ03b17gU/667NixQ59//nkjjwi12bZtm+khtHrUwDxqYB41MI8amONvWOF89LnNC+9r5lED86iBedTAPGpgTjh9rqMmU+fMmVNnE5iWlqahQ4c2KP+3v/2tZs2aVes22dnZ6tatmwYOHKjU1NQG3Y+fvzCxsbFh5TRGnpPHlpOTo23btmnw4MFKSEhwzLjsznNqlkQNTGdJ1MB0lkQNTGdJ1MB0liSlp6fbkgOfxux1m7rPlZz73HXy6533NfN51MB8HjUwn0cNzOdRA/N54fS5jppMve2223TFFVfUuk3Pnj0bnO/xeOTxeELaNj4+PuyVUyMjIwNZdrAzz8lj80tISKAGBrIqogZmsiqiBmayKqIGZrIqogZmsqTjh4XDHo3Z6zZ1nys597nr5Ne7H+9rZvMkamA6T6IGpvMkamA6T6IGJvPC6XMdNZnarl07tWvXzvQwAAAAANvR6wIAADR/jppMrY/9+/fryJEj2r9/v8rKyrR9+3ZJ0kknnWT7HjEAAABAU6LXBQAAcKZmO5l6//3367nnngv8fPrpp0uS1q9fr7Fjx4adX1hYGPYKtnYv2mBnnpPHVlBQEPjq34W7oZz8OJ2aJVED01kSNTCdJVED01kSNTCdJfn6IZjRmL2uHX2u5NznrpNf77yvmc+jBubzqIH5PGpgPo8amM8Lp89ttpOpixcv1uLFi8PKWLBggRYsWBB0XVlZWViZAAAAQLjC7XXpcwEAABpHs51MtcPMmTM1c+bMoOuys7OVlJQkr9dr2yFUdh+KZWeeE8dWWloqSYqJiaEGhrKogfksamA+ixqYz6IG5rO8Xq8tOWh6TdXnSs587tqdZVce72vm86iB+TxqYD6PGpjPowbm88LpcyPCvncAAAAAAAAAaAWYTAUAAAAAAACAEDCZCgAAAAAAAAAhaNXnTK2NHaucOnnVMiePjVXtzGZJ1MB0lkQNTGdJ1MB0lkQNTGdJ4a1yCueyo8+VnPvcdfLrnfc183nUwHweNTCfRw3M51ED83nh9LmtejKVVU4BAADQEtHnAgAANI5WPZnaVKucOnHVssbIsiuPVe3MZ1ED81nUwHwWNTCfRQ3MZ4WzyinMaqo+V3Lmc9fuLLvyeF8zn0cNzOdRA/N51MB8HjUwnxdOn8s5UwEAAAAAAAAgBEymAgAAAAAAAEAImEwFAAAAAAAAgBC06nOm1saOVU6dvGqZk8fGqnZmsyRqYDpLogamsyRqYDpLogams6TwVjmFc9nR50rOfe46+fXO+5r5PGpgPo8amM+jBubzQq2BZVkqKSmRZVk1buPv14qKimwZm515psbmcrkUGRmpiIia9yENp89t1ZOprHIKAACAlog+FwCA5q2kpEQHDx6sdSJVUuB2l8tly/3amWd6bPHx8UpJSbHt/v1a9WRqU61y6sRVyxojy648VrUzn0UNzGdRA/NZ1MB8FjUwnxXOKqcwq6n6XMmZz127s+zK433NfB41MJ9HDcznUQPzeXXVwLIs7d+/X9HR0UpNTa11D0v/h6VutzvscdmdZ2pslmUpPz9f33//vaKjo9W5c+cq24TT57bqyVQAAAAAAADASUpLS5Wfn6/U1FTFxsbWui2TqdWLiYmRJH3//ffq0KGDbWOQWIAKAAAAAAAAcAz/pGF0dLThkTRv/onokpISW3OZTAUAAAAAAAAcxu5zfbY2jfX34zD/GtixyqmTV45z8thYWdBslkQNTGdJ1MB0lkQNTGdJ1MB0lhTeKqdwLjv6XMm5z10nv955XzOfRw3M51ED83nUwHxeXTUoKipSeXm5ysrK6lxAsry83LZx2Z1nemxlZWUqLy9XXl5e4Dy1fuH0ua16MpVVTgEAANAS0ecCAAA0jlY9mdpUq5w6ceW4xsiyK4+VBc1nUQPzWdTAfBY1MJ9lRw0sy1JpaamKi4tlWVbYe1/4+U9gb0eeySy3263IyMgaD4EKZ5VTmNVUfa7kzPcPu7PsyuPfFvN51MB8HjUwn0cNzOfVVYPIyEhFRETI7XaHvHCSnQss2Z1namxut1sRERGKi4ur0teG0+c2y8nUffv26cEHH9Q777yjQ4cOKTU1Vddcc43uueceTs4LAAAkScXFxTp48KDy8/MDhwRFRNhzung780xnxcbGqnPnzvRQDkKvCwAAWqLrr79eaWlpuuaaa/Tb3/7W9HAarFlOpn766acqLy/XX/7yF5100knauXOnfvrTnyovL0+PP/646eEBAADDysvLtXfvXrndbqWmpsrtdsvlctn2qbj/cGk78kxlWZal4uJiHT58WHv37lXv3r1tm2xGeOh1AQBAc/bCCy/o73//u8466yzdd999kqQdO3bou+++065duwyPLnzNcjL1vPPO03nnnRf4+YQTTtCePXu0cOFCGkwAAKDi4mKVl5erW7duio2NtXXCUmoZk6mS79CyqKgoff311youLuawfoeg1wUAAM3Z+PHjdd555+m6667T0qVLNWTIEJ1//vlyuVz60Y9+pPfee8/0EMPSLCdTq5OVlaWUlJRatykqKlJRUVGt22RnZ0uScnNzlZmZGdaY/Cu9VV4xzAl5Th5bTk5O0NdwOPlxOjVLogamsyRqYDpLogams6TwauCfTC0vL1dpaWng8HfLsmwZm515prP8f6fs7Owqq5raseI77FFXr9vUfa7k3PcPJ7/n8m+L+TxqYD6PGpjPowbm8+qqgb+XLS0trfP+nNjn+nuWn/70p1q7dq2uvPJKXXrppTrrrLM0derUKo8pIyNDp512mv73v/+pZ8+eIY3t8ssv1xlnnKE777yzxu39/w+wu891WXb9tQ368ssvNXjwYP3+97/XjTfeWON2c+bM0dy5c0PKXLJkiWJjY+0aIgAAaEKRkZHq1KmTunXrxjkm61BcXKxvvvlGhw4dqtLY5ufn66qrrlJWVpYSExMNjRCh9Lr0uQAAtBzNuZfNzc3V9OnTlZeXpz59+ig2NlYPPfSQpk6dqt///vc68cQTq/zOfffdp8zMTD311FMh38/OnTt14YUXavv27TX2qY3V5zpqMjWUJjAtLU1Dhw4N/Jyenq4xY8ZozJgx+tvf/lbr74b6iX23bt20a9cupaamhj74avg/tbCrWbUzz8ljy8nJ0bZt2zR48GAlJCQ4Zlx25zk1S6IGprMkamA6S6IGprOk8GrgPxdojx495PV6WYCqFoWFhfr666/Vvn37Ks16enq6+vfvz2SqTRqz123qPldy7vuHk99z+bfFfB41MJ9HDcznUQPzeXXVoHIvWxun9bkLFy5Udna27rrrLl155ZWaNGmSrr76avXu3Vt79uypkltQUKDu3btr9erVGjlyZL3GNnz4cM2YMUM333xztds3Vp/rqMP8b7vtNl1xxRW1blNxd9/09HSNGzdOI0eO1F//+tc68z0ejzweT0hjiY+PV3Jyckjb1iQyMjKQZQc785w8Nr+EhARqYCCrImpgJqsiamAmqyJqYCaroobUoLCwUBkZGYqMjFRkZCTnTK1FZGSkIiIilJiYWKVZ9x8WDns0Zq/b1H2u5Nz3Dye/5/rxb4vZPIkamM6TqIHpPIkamM6Taq5BxV42IiJSGRk1ZzRFn9u2rRTq3Or333+vQYMGKS8vT/v379ekSZN09OhRtW3bttq9bN966y1FRkbqrLPOCly3dOlSTZ8+XV9++aW6dOkiSbrxxhv1wQcf6N133w2cRmDKlCl68cUXddttt1U7lsbqcx01mdquXTu1a9cupG2//fZbjRs3TkOGDNGiRYtYfRYAAACORq8LAADqKyND6tChti3smUStLe/776X27UP77WuvvVbTpk3TY489ptmzZys5OVkbNmxQ//79q93+vffeCzoqR5KuuOIKzZ8/X/PmzdPTTz+tuXPn6o033tB///tfJSUlBbYbPny45s2bp6KiopA/VLaDoyZTQ5Wenq6xY8eqe/fuevzxx3X48OHAbZ06dTI4MgAAAPssWLBAjz32mA4cOKDp06dr1apV+uCDD2o9MX9Fl156qUaNGqVZs2Y17kBhK3pdAADQXJ188snatGmTpON7uZ599tk6++yzq91+3759VU4/5HK59Lvf/U6XXnqpUlNT9ac//UkbN24M7KXq16VLFxUVFenQoUPq0aNHIzya6jXLydQ333xTX3zxhb744gt17do16Da7TgFbWFgY9gq2/vNp2MXOPCePraCgIPDVvxt9Qzn5cTo1S6IGprMkamA6S6IGprOk8GpQVFSk8vJylZWVqaysLHB+JbvYmVdT1s6dO3XHHXdoxYoVGjx4sB5//HFNmjRJ3bp1CzSmdWXdc889OvfcczV9+vQazwXl//vk5eVVOTF/5VVP0TQau9e1o8+VnPv+4eT3XP5tMZ9HDcznUQPzedTAfF5dNajcy9q/92n9+MZR/98LpWfOz89Xampqlf524sSJ6tevn+bOnau1a9eqT58+VfL8pw3Iycmptj9urD63WU6mXn/99br++uvDzlmwYIEWLFgQdF1N/zkBAADNWHm57xgpuw6V9jdyoebV50RTx7z22msaPHiwLrjgAhUUFOi5557Ta6+9Vq+MAQMGqGfPnlqyZEmNJ+aH89jR69LnAgCAplbfyfnS0lK1a9dOR48erXLbG2+8oU8//VRlZWXq2LFjtb9/5MgRSVL7UM9BYJNmOZlql5kzZ2rmzJlB12VnZyspKUler9e2kwrbvRCHnXlOHJv/04KYmBhqYCiLGpjPogbms6iB+axwauA/2bzb7fadPP/wYbkrHRYUjnrvGxDCiaYqnuT/xBNP1FdffSXJ91ji4+Pl9Xo1evTooN+p7uT8P/vZz5SWlqaNGzcqKSlJF154oZYvX16l56l4vxEREYqLi6tyYv66Vo+FczVVnys58/3D7iy78vi3xXweNTCfRw3M51ED83l11aBiL9uhg1vff19zVtMsQOUOab+AykfQhDK2wYMH64UXXgjaZtu2bbriiiv0l7/8RcuWLdOcOXP00ksvBW73b/vJJ5+oa9euNU62Nlafy5nsAQAAHGbTpk064YQT9Nhjj+ngwYO67LLLqpyYX/KdnP+UU07RvHnzJEkPPPCA3nzzTa1duzZwcv7hw4frgw8+UFFRUZM+BgAAAIQvIsL3mbzJS30OsHrhhRd09tlna+7cuSGdnmjChAnatWtXYO/Uffv26YILLtBvfvMbXXvttXrggQe0YsUKbd26tcrvbty4UePHjw99cDZhMhUAAMBh4uPjtW/fPo0ePVqdOnVSRkZGlRPzS8dPzv+3v/1NDz/8sJ566imtWbMm6OT8FU/MDwAAADSm8ePH68UXX9QHH3ygpUuXSpJGjBihLVu2SJKmTZumhQsXBrY/7bTTNHToUL344os6cuSIJk6cqAsvvFB33323JGnIkCGaPHmy7rnnnqD7KSws1MqVK/XTn/60iR7Zca36MH8AAAAn+uijjyT5mkvJtzhBTYciTZo0Kejk/P379w+6PSYmRpL9izAAAAAAlXXo0EGSdMstt+j111/XVVddpfvuu08PP/ywzjzzTMXHx+uWW24J+p377rtPv/rVr/TTn/5Un3zySZXMVatWSQo+//uzzz6rESNG6IwzzmjER1M9JlNrYMcqp05eOc7JY2NlQbNZEjUwnSVRA9NZEjUwnSWFV4PKK6CWt2mj8m+/VYRNC1D5VxINOS85WTUtgVrdKqfbtm3TSSedJK/Xq7KyMrVt21ZHjhypdgGhiifnb9++fZW8w4cPS5JSUlKadJVTOJcdfa7k3PcPJ7/n8m+L+TxqYD6PGpjPowbm8+qqQeVetjbV9ZLhCCcvNzdXV1xxhXJzc9W/f3/FxMSovLxcEydO1L333qucnBy9/vrrVR7ThAkTtGfPHu3fv1/dunULaWxut1tPPPFErX+fxupzW/VkKqucAgDQSvhPNmXTZKr8jZxdeZXs2LFDAwYMCPw8aNAgLVmypMp2/pPzL1y4UMuXL9ecOXO0bNmyoG127dqlrl27ql27do0yVjgTfS4AAGhq//jHPzR69Gj95je/0ZVXXqkLLrhAkvTBBx8oMzNTvXv3rnEC/+c//3m97svE4f1+rXoytalWOXXiynGNkWVXHisLms+iBuazqIH5LGpgPiucGlRcAbXiyqB2rXLaGHkVs3bs2KELL7wwcN3EiRN1zz33KDs7W23atJHkOzn/hRdeqN/85jeaNm2aTj31VA0bNkwffvihhg8fHsj673//q/Hjx9c41sZa5RRmNVWfKznz/cPuLLvy+LfFfB41MJ9HDcznUQPzeXXVoKZetjZO6HO/++47DRo0SLm5udq/f78mTZqkgwcP6qabbtL69et18cUX67PPPlPfvn2bZGyN1eeyABUAAICDlJeX6+OPP9bAgQMD11U8Mb+kGk/OP2nSJN13332B3zN5Yn4AAAC0Ltdee60ef/xxTZgwQXPnzpXH49Fll12mp59+Wr169dL/+3//Tw899JDpYYatVe+ZCgAA4DQRERHKy8urcn3FE/OnpKRUe3L+lStXBv1s8sT8AAAAaF1OPvlkbdq0KfBzWVmZ/vvf/wb2JL3yyit15ZVXmhqebZhMBQAAaAbOP/98ff755/r2229rPTF/RVFRUXrqqacaeWQAAABA68Fkag3sWOXUySvHOXlsrCxoNkuiBqazJGpgOkuiBqazpPBqUHkFVCetchpO1m233Sap5oWEKmfdcMMNtW7vv60xVjmFc9nR50rOff9w8nsu/7aYz6MG5vOogfk8amA+r64aVO5la9NS+tzGyGusPrdVT6ayyikAAABaIvpcAACAxtGqJ1ObapVTJ64c1xhZduWxsqD5LGpgPosamM+iBuazwqlBTSugOmGVU6dlNdYqpzCrqfpcyZnvH3Zn2ZXHvy3m86iB+TxqYD6PGpjPq6sGNfWytWktfW598hqrz41o8G8CAAA4nGVZpofgePyNAAAAnIk+LTyN9fdjMhUAALQ4UVFRkuw/V1ZL5P8b+f9mAAAAMMu/52VxcbHhkTRvjdXnturD/AEAQMvkdruVnJys77//XpLk8XjkcrlsO8TIf+5JO/JMZVmWpfz8fH3//fdKTk62/fArAAAANExkZKRiY2N1+PBhRUVFKSKi5n0h7ewl7c4zNbbG7nOZTK2BHaucOnnlOCePjZUFzWZJ1MB0lkQNTGdJ1MB0lhR+DeLj41VcXKxDhw4FDvFxuVy2jM3OPNNZ8fHxio+Pr7bvCWeVUziXHX2u5Nz3Dye/5/Jvi/k8amA+jxqYz6MG5vNCqUFiYqIOHjyovXv31prVWvrchuQ1Vp/bqidTWeUUAICWy+VyqW3btmrTpo1ycnIk2begkr/5siPPVJbL5QosboCWhz4XAIDmLSoqSt26dVNJSUmt5/60s5e0O8/U2Bq7z23Vk6lNtcqpE1eOa4wsu/JYWdB8FjUwn0UNzGdRA/NZdtbA30jZNTb/p9t25Dk1S7Kv8UXTa6o+V3Lm+4fdWXbl8W+L+TxqYD6PGpjPowbm8+ysgd39n5N7Uzvzwulz2RUBAAAAAAAAAELAZCoAAAAAAAAAhIDJVAAAAAAAAAAIQas+Z2p1/Cf1zcnJUXZ2dlhZ/nM5lJeXhz0uu/OcPLbs7Gzl5+crOzs77JMFO/lxOjVLogamsyRqYDpLogamsyRqYDpLUmDhrtoWPUDzYWefKzn3uevk1zvva+bzqIH5PGpgPo8amM+jBubzwulzmUytJCMjQ5J06qmnGh4JAACAM2RkZCgpKcn0MBAm+lwAAIBgDelzmUytJCUlRZK0f/9+W/7TMGzYMKWlpYWd0xh5Th1bdna2unXrpm+++UaJiYmOGVdj5Dk1ixqYz6IG5rOogfksamA+KysrS927dw/0R2je7O5zJec+d536eud9zXweNTCfRw3M51ED83nUwHxeOH0uk6mV+HevTkpKsuUJ7Xa7bclpjDwnj02SEhMTqYGhLD9qYC7LjxqYy/KjBuay/KiBuSy/cA8/gzPY3edKzn3uOvn1LvG+5oQ8amA+jxqYz6MG5vOogfm8hvS5dMYAAAAAAAAAEAImUwEAAAAAAAAgBEymAgAAAAAAAEAImExtZDNnznRsnpPHZicnP06nZtmNGphHDcyjBuZRA8B+Tn3uOvn1bicnP04nj81OTn6cTh6bnZz8OJ08Njs5+XE6eWx2cvLjdPLYGsplWZZlehBOkp2draSkJGVlZdm+eANCQw3MowbmUQPzqIF51MA8atCyUE/zqIF51MA8amAeNTCPGpgXTg3YMxUAAAAAAAAAQsBkKgAAAAAAAACEgMnUSjwej2bPni2Px2N6KK0WNTCPGphHDcyjBuZRA/OoQctCPc2jBuZRA/OogXnUwDxqYF44NeCcqQAAAAAAAAAQAvZMBQAAAAAAAIAQMJkKAAAAAAAAACFgMhUAAAAAAAAAQsBkKgAAAAAAAACEgMnUWlx44YXq3r27vF6vOnfurGuvvVbp6emmh9Vq7Nu3TzfccIN69eqlmJgYnXjiiZo9e7aKi4tND61V+d3vfqdRo0YpNjZWycnJpofTKjzzzDPq1auXvF6vhgwZoo0bN5oeUqvy3nvvafLkyUpNTZXL5dKrr75qekityrx58zRs2DAlJCSoQ4cOmjp1qvbs2WN6WK3KwoULNWDAACUmJioxMVEjR47U2rVrTQ8LNqPPNYs+1xnoc5sefa5Z9Lnm0euaZ0evy2RqLcaNG6cXX3xRe/bs0YoVK/Tll1/q0ksvNT2sVuPTTz9VeXm5/vKXv2jXrl364x//qD//+c+6++67TQ+tVSkuLtZPfvIT3XLLLaaH0iosX75cd9xxh+655x59+OGHOuusszRx4kTt37/f9NBajby8PA0cOFBPP/206aG0Shs2bNDMmTO1efNmvfXWWyotLdX48eOVl5dnemitRteuXTV//nxt2bJFW7Zs0dlnn60pU6Zo165dpocGG9HnmkWf6wz0uU2LPtc8+lzz6HXNs6PXdVmWZTXiGFuU1atXa+rUqSoqKlJUVJTp4bRKjz32mBYuXKivvvrK9FBancWLF+uOO+5QZmam6aG0aCNGjNDgwYO1cOHCwHV9+/bV1KlTNW/ePIMja51cLpdWrlypqVOnmh5Kq3X48GF16NBBGzZs0I9+9CPTw2m1UlJS9Nhjj+mGG24wPRQ0Evpc8+hzzaHPbRr0uc5Cn+sM9LrOUN9elz1TQ3TkyBH985//1KhRo2gwDcrKylJKSorpYQCNori4WFu3btX48eODrh8/frz+97//GRoVYFZWVpYk8d5vSFlZmZYtW6a8vDyNHDnS9HDQSOhznYE+Fy0ZfS5QPXpdsxra6zKZWoe77rpLcXFxatu2rfbv369Vq1aZHlKr9eWXX+qpp57SzTffbHooQKP44YcfVFZWpo4dOwZd37FjRx06dMjQqABzLMvSrFmzNHr0aJ166qmmh9OqfPzxx4qPj5fH49HNN9+slStXql+/fqaHBZvR5zoHfS5aOvpcoCp6XXPC7XVb3WTqnDlz5HK5ar1s2bIlsP2vf/1rffjhh3rzzTfldrt13XXXiTMjhKe+NZCk9PR0nXfeefrJT36iG2+80dDIW46G1ABNx+VyBf1sWVaV64DW4LbbbtNHH32kpUuXmh5Kq3PKKado+/bt2rx5s2655RZNmzZNu3fvNj0s1IE+1zz6XPPoc52NPhc4jl7XnHB73chGHJsj3Xbbbbriiitq3aZnz56B79u1a6d27drp5JNPVt++fdWtWzdt3ryZQ93CUN8apKena9y4cRo5cqT++te/NvLoWof61gBNo127dnK73VU+nf/++++rfIoPtHS33367Vq9erffee09du3Y1PZxWJzo6WieddJIkaejQoUpLS9Of/vQn/eUvfzE8MtSGPtc8+lzz6HOdiT4XCEava1a4vW6rm0z1N40N4f+kvqioyM4htTr1qcG3336rcePGaciQIVq0aJEiIlrd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a9fK5XJp9erVkqQvvvhC06dPV+/evRUbG6suXbpo8uTJ+vjjjwO/U98+XAq91vX9f0l9zJkzR/3799fTTz+twsLCwPXFxcV66KGHAmNr3769pk+frsOHDwf9fs+ePTVp0iS98sorOv300+X1egN7i1Y8zP/w4cOKjo7WfffdV2UMn376qVwul5588snAtrfeeqv69eun+Ph4dejQQWeffbY2btwY+J19+/YFJkvnzp0b+Hv776/yYf533HGH4uLilJ2dXeX+L7/8cnXs2DHo/zXLly/XyJEjFRcXp/j4eE2YMKHWU3gAdWEyFUCz9uWXX+qqq67SP/7xD73++uu64YYb9Nhjj+mmm26qsu2hQ4d09dVX65prrtHq1as1ceJE/fa3v9ULL7xQZdu7775bX3/9tf72t7/pr3/9qz7//HNNnjxZZWVldY6poKBAS5cu1bBhw3TqqadqxowZysnJ0UsvvRS03bfffqthw4Zp5cqVmjVrltauXasnnnhCSUlJOnr0qAYPHqxFixZJku69915t2rRJmzZt0o033ljt/c6YMUP79++vchqETz/9VB988IGmT59er7/bM888ozPPPFOdOnUK3HflUy9UtGfPHo0aNUq7du3Sk08+qVdeeUX9+vXT9ddfX2Vvl3D/xgAAoP5Gjhyp999/Xz//+c/1/vvvV/nwuTZ5eXkaN26c1q9fr0ceeUQvvviiOnbsqMsvv7za7UtKSnTxxRfrggsu0KpVqwJ91913361p06ZpxowZWrlypU455RRdf/312rp1a+B369tTVPT2229rypQpSkhI0LJly/TYY4/pxRdfDPRUoVixYoW6dOliy1FFt9xyi+666y79+Mc/1urVq/Xggw9q3bp1GjVqlH744YfAdvfcc4/uuecenXfeeVq1apVuvvlm3Xjjjfrss8/qvI9rr71Wr776qu6//369+eab+tvf/qZzzz1XGRkZkurf09XVo9Zl8eLFKisr04wZM3TuueeqR48e+vvf/y7LsoK2u//++3X11VcrNTVVixcv1sqVKzVt2jR9/fXX9R73wIEDdfrpp1db58WLF6tDhw46//zzJfkme9u2bav58+dr3bp1WrBggSIjIzVixIjAB/v17cOl0Gst1e//JfU1efJk5efna8uWLZJ8k7xTpkzR/PnzddVVV2nNmjWaP39+YLK+oKAg6Pe3bdumX//61/r5z3+udevWVfuhQvv27TVp0iQ999xzVSaAFy1apOjoaF199dWSpCNHjkiSZs+erTVr1mjRokU64YQTNHbs2MD5UTt37qx169ZJkm644YbA37u6yVrJ9/+e/Px8vfjii0HXZ2ZmatWqVbrmmmsCpzl4+OGHdeWVV6pfv3568cUX9Y9//EM5OTk666yztHv37vr8aYHjLABoJqZNm2bFxcXVeHtZWZlVUlJiPf/885bb7baOHDkSuG3MmDGWJOv9998P+p1+/fpZEyZMCPy8fv16S5J1/vnnB2334osvWpKsTZs21TnO559/3pJk/fnPf7Ysy7JycnKs+Ph466yzzgrabsaMGVZUVJS1e/fuGrPS0tIsSdaiRYuq3DZ79myr4tt4SUmJ1bFjR+uqq64K2u7//b//Z0VHR1s//PBDtfdR29/tggsusHr06FHt70myZs+eHfj5iiuusDwej7V///6g7SZOnGjFxsZamZmZlmXZ8zcGAAD198MPP1ijR4+2JFmSrKioKGvUqFHWvHnzrJycnKBtx4wZY40ZMybw84IFCyxJ1tq1a4O2u+mmm6r0KtOmTbMkWStWrAhcV1JSYrVv396SZG3bti1wfUZGhuV2u61Zs2YFrgu1p9i7d2+V+x4xYoSVmppqFRQUBK7Lzs62UlJSrFD/+zto0CDr9ttvr3O7MWPGWP3796/x9k8++cSSZN16661B17///vuWJOvuu++2LMuyjhw5Ynk8Huvyyy8P2m7Tpk2WpKA6VPeY4+PjrTvuuKPWsdanpwulR61JeXm5ddJJJ1ldunSxSktLLcs63rO+/fbbge2++uory+12W1dffbVt437yySctSdaePXsC1/n/tr/85S9rvI/S0lKruLjY6t27t3XnnXcGrq9PHx5qrS0r9P+X1KRHjx7WBRdcUOPtCxcutCRZy5cvtyzLspYuXVrl9Vjx8T3zzDNB2W63O+hvWPG2adOmBX5evXq1Jcl68803A9eVlpZaqamp1iWXXFLj+EpLS62SkhLrnHPOsS666KLA9YcPH65SU79FixZZkqy9e/cGrhs8eLA1atSooO2eeeYZS5L18ccfW5ZlWfv377ciIyOrvJ5zcnKsTp06WZdddlmN4wRqw56pAJq1Dz/8UBdeeKHatm0rt9utqKgoXXfddSorK6vySX6nTp00fPjwoOsG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7lsKrQ8PtdaNbe7cudq9e7d+8YtfBPYMnzRpkjIyMlRWVqahQ4dWuZxyyikNvr++fftqxIgRWrRokZYsWVLllApS9X/vjz76qMrpOhr6/5709HT961//0gsvvKCLLrooaEJ8woQJioyM1JdfflntY/dPOAP1xZ6pAJqtH//4x4qOjtaVV16p//f//p8KCwu1cOHCkFYZbQxr165Venq6HnnkEY0dO7bK7aeeeqqefvppPfvss5o0aZIeeOABrV27Vj/60Y90991367TTTlNmZqbWrVunWbNmqU+fPjrxxBMVExOjf/7zn+rbt6/i4+OVmppa6392rrzySs2aNUtXXnmlioqKqpy7qT5/t9NOO02vvPKKFi5cqCFDhigiIqLGpmP27Nl6/fXXNW7cON1///1KSUnRP//5T61Zs0aPPvqokpKS6vX3BAAA9powYYK6du2qyZMnq0+fPiovL9f27dv1+9//XvHx8frFL35R4+9OmzZNf/zjH3XNNdfooYce0kknnaS1a9fqjTfekCRFRNi3n044PcWDDz6o8847Tz/+8Y/1y1/+UmVlZXrkkUcUFxcXWFW8JitWrFBycrLGjRsX8lizs7OrPRqpffv2GjNmjH72s5/pqaeeUkREhCZOnKh9+/bpvvvuU7du3XTnnXdK8h2ePmvWLM2bN09t2rTRRRddpAMHDmju3Lnq3LlzrX/brKwsjRs3TldddZX69OmjhIQEpaWlad26dbr44osD29WnpwulR63Os88+qzZt2uhXv/pVlVM8SNJ1112nP/zhD9qxY4cGDhyou+++Ww8++KAKCgp05ZVXKikpSbt379YPP/yguXPn1nvckuR2uwP3k5iYqIsvvrjK82XSpElavHix+vTpowEDBmjr1q167LHHquxRWp8+/JRTTgmp1nbJzMzU5s2bJfnOFbxnzx4tW7ZMGzdu1GWXXRb4+0nSFVdcoX/+8586//zz9Ytf/ELDhw9XVFSUDhw4oPXr12vKlCm66KKLGjyWGTNm6KabblJ6erpGjRpVZXJ20qRJevDBBzV79myNGTNGe/bs0QMPPKBevXqptLQ0sF1CQoJ69OihVatW6ZxzzlFKSoratWtX657Z48ePV9euXXXrrbfq0KFDVSZye/bsqQceeED33HOPvvrqK5133nlq06aNvvvuO33wwQeKi4sL+lsBITO5+hUA1Me0adOsuLi4oOtee+01a+DAgZbX67W6dOli/frXv7bWrl1rSbLWr18f2K6m1VanTZsWtEKof6X5l156KWi76lZOrWzq1KlWdHS09f3339e4zRVXXGFFRkZahw4dsizLsr755htrxowZVqdOnayoqCgrNTXVuuyyy6zvvvsu8DtLly61+vTpY0VFRQWtcFl5FdGKrrrqKkuSdeaZZ1Z7e6h/tyNHjliXXnqplZycbLlcrqD7UzWrbX788cfW5MmTraSkJCs6OtoaOHBglb9ZOH9jAADQcMuXL7euuuoqq3fv3lZ8fLwVFRVlde/e3br22murrNw+ZsyYoFXkLcu3MvbFF19sxcfHWwkJCdYll1xi/etf/7IkWatWrQpsV13P5s+srh+rbnXyUHqKmnqH1atXWwMGDLCio6Ot7t27W/Pnz6+1b/IbPXp00GrldfGvyl7dxf+3Kysrsx555BHr5JNPtqKioqx27dpZ11xzjfXNN98EZZWXl1sPPfSQ1bVrVys6OtoaMGCA9frrr1sDBw4MWvG88mMuLCy0br75ZmvAgAFWYmKiFRMTY51yyinW7Nmzrby8vMDv1benC6VHrWjHjh2WJOuOO+6o8e/16aefWpKCVlZ//vnnrWHDhller9eKj4+3Tj/99KB61nfclmVZn332WaAOb731VpXbjx49at1www1Whw4drNjYWGv06NHWxo0bq33O16cPD7XWof6/pCY9evQIPD6Xy2XFx8dbp5xyinXttddab7zxRrW/U1JSYj3++OOB/j8+Pt7q06ePddNNN1mff/55UHbl12LF26p7fWRlZVkxMTGWJOv//u//qtxeVFRk/epXv7K6dOlieb1ea/Dgwdarr75a7eP997//bZ1++umWx+OxJAXub9GiRZYka+/evVXy7777bkuS1a1bN6usrKzasb/66qvWuHHjrMTERMvj8Vg9evSwLr30Uuvf//53tdsDdXFZVqWl3gAAAAAACMHDDz+se++9V/v377d9Yc2mdOjQIXXp0kWvvvqqJk+ebHo4kqS9e/eqT58+mj17tu6++27TwwEAHMNh/gAAAACAOj399NOSpD59+qikpETvvPOOnnzySV1zzTXNeiJVkjp16hRYAd6EHTt2aOnSpRo1apQSExO1Z88ePfroo0pMTNQNN9xgbFwAgKqYTAUAAAAA1Ck2NlZ//OMf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iIiISDn2ukTUkBkkSZJED4KIyNsMHz4cYWFheOmll1yu/+qrr/Cvf/0Lubm5MJvNgkZHRERERFR37HWJqCHjnqlERALs378fQ4cORUxMjMvl2rVr6Nmzp7O5vOOOO5Camip2sEREREREtcBel4gaMk6mEhF52OnTp5GVlYXY2NgKt+3bt8/lHFJHjx5Fly5dPDk8IiIiIqI6Y69LRA0dJ1OJiDxs7969MBqNiImJcbnearXi4MGDzgYzPz8fZrMZfn5+AkZJRERERFR77HWJqKHjZCoRkYft27cP0dHRCAoKcrn+8OHDKCoqcv4V/9ChQ+jevbvz9pdfftmj4yQiIiIiqi32ukTU0HEylYjIw+bNm4djx45VuL5Xr16QJAm33norAOC3335Djx49AABnz56FyWTCyZMnkZCQgPnz5+Opp57y6LiJiIiIiGrCXpeIGjpOphIR6VT5BvPAgQPo1asXDh48iPvvvx//7//9PxQUFAgeIRERERFR3bDXJaL6ipOpREQ6tW3bNvTu3RuAa4M5aNAgWK1W+Pr6Ch4hEREREVHdsNclovqKk6lERDpTUlKC2NhYjBkzBi1atAAApKWlISoqCufOnUPbtm1x9OhRdO7cWfBIiYiIiIhqh70uEdV3BkmSJNGDICIiIiIiIiIiItI77plKREREREREREREpAAnU4mIiIiIiIiIiIgU4GQqERERERERERERkQKcTCUiIiIiIiIiIiJSgJOpRERERERERERERApwMpWIiIiIiIiIiIhIAU6mEhERERERERERESnAyVQiIiIiIiIiIiIiBTiZSkRERERERERERKQAJ1OJiIiIiIiIiIiIFOBkKhEREREREREREZECnEwlIiIiIiIiIiIiUoCTqUREREREREREREQKcDKViIiIiIiIiIiISAFOphIREREREREREREpwMlUIiIiIiIiIiIiIgU4mUpERERERERERESkACdTiYiIiIiIiIiIiBTgZCoRERERERERERGRApxMJSIiIiIiIiIiIlKAk6lECixZsgQGg8F5MZvNaNGiBSZNmoQTJ0647XnT09MxZ84cpKamVrhtzpw5MBgMLteVlJTg8ccfR4sWLWAymRATEwMAaNu2LR566CFNx2YwGDBnzpxq73P27FkYDAa8+eab1d7PHePzlJpe45tvvgmDwYCzZ8/WOnvz5s0wGAzYvHmz87rVq1fX+H2vzIgRI/D4449XyHZcTCYTmjRpgnHjxmHPnj21zgeU1btt27ZISkqq9LY9e/bAYDBgyZIlzutmzZqF2NhY2O32Wo8nNjZW0fuvOtV9v939vi0oKMCcOXNc6u/g2CbV5X1FRETuwX6xIvaLMvaLZdgvakuv/eLQoUOd7xuj0Yjg4GB06NABd999N77++us61Urp8w4dOtQt2Q6vvfYavv/++wrXV/ZZpIbLLHoARPXJ4sWL0blzZxQVFWH79u149dVXsWnTJhw7dgyNGjXS/PnS09Mxd+5ctG3b1tnoOjzyyCMYM2aMy3WLFi3C+++/jwULFiAuLg5BQUEAgO+++w4hISGaj08reh+fKLGxsdixYwe6du3qvG716tVYuHBhrRrkFStWYPv27fj0008r3Pbaa69h2LBhKC0txf79+zF37lwMGTIEqampiI6O1uJlqPLss8/i3//+Nz755BNMnTpV8eNSU1Oxf/9+AMBHH32EZ599tk7PX933293v24KCAsydOxcAKjSFiYmJ2LFjB1q0aOG25yciorphv+geeh+fKOwX2S/qtV+85ZZb8PnnnwMA8vPzcebMGXz//fe4++67MWjQIPzwww8IDQ3V9DnfffddTfMq89prr2HixIlITk52ub6yzyI1XJxMJaqF7t27Iz4+HoD8w8pms2H27Nn4/vvva/WDWwutWrVCq1atXK47dOgQAgICMGPGDJfrb731Vk8Ordb0Pr7S0lLnHiaeFBISgttuu011zmuvvYY77rgDLVu2rHBbdHS08zkGDRqEsLAwTJkyBZ999pmzMRMpNDQUDzzwAF5//XU89NBDFfauqcqHH34IQG4iU1JS8Msvv6B///6ajk3k+7ZJkyZo0qSJsOcnIqKqsV90D72Pj/2iOOwXKye6XwwICKjw3nzkkUewePFiTJs2DY899hiWLVumyXMVFBTAYrEIncjU6rNI9QMP8ydSwdEoX7p0yeX6PXv2YPz48QgPD4e/vz9uvfVWLF++vMLjL1y4gMceewxRUVHw9fVFZGQkJk6ciEuXLmHz5s3o3bs3AGDq1KnOwyQcf/G8+bAtg8GADz/8EIWFhc77Og5/qezwkpycHDz77LNo164dfH190bJlSzz99NPIz8+vcL9HH30UjRs3RlBQEMaMGYPff/9dzbetgpvH5zhEYunS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l9fywsLCMGvWLLzwwgt48MEHcd999yEzMxNz586Fv78/Zs+eXe33joiI3If9ojLsF9kvAuwXHRpCv1hYWOg8V25hYSFOnz6N77//HqtWrcKQIUPw3nvvOe87YMAAPPbYY5g6dSr27NmDwYMHIzAwEBcvXsTPP/+MHj164IknnqjzWKZNm4Zly5ZhxowZaNWqFUaOHOlye1JSEr799ls8+eSTmDhxIs6dO4dXXnkFLVq0wIkTJ1zu26NHD2zevBk//PADWrRogeDg4Ar1K69z587o168f5s2bh3PnzuGDDz5wub022yjSETHrXhHVL46VEG9ezVSS5FU1W7duLUVHR0tWq1WSJEk6cOCAdM8990hNmzaVfHx8pObNm0vDhw+X3nvvPZfHnjt3Tpo2bZrUvHlzycfHR4qMjJTuuece6dKlS877LF26VOrcubPk4+PjslKjmtVZJUmS8vLypH/84x9Sp06dJF9fXyk0NFTq0aOH9Mwzz0gZGRnO+2VlZUnTpk2TwsLCJIvFIt1+++3SsWPHarU6a1UXxyqcVa3O+tVXX1Wad/PqnVu2bJESExOl8PBwycfHR2rZsqWUmJjo8vjr169LDz/8sNS0aVPJYrFIAwcOlLZt21Zhxceqnrsme/bske644w4pIiJCMplMUkREhHTHHXdIe/furXDfqlYorWos5VeELC4ulh555BGpSZMmksFgqLDy682ys7OloKAg6b//+79drq/pdfbt21dq1KiRlJWVJUmS/L2fNm2a1LJlS8nHx0dq0qSJ1L9/f+mf//yn8zFK652RkSE98cQTUuvWrSWz2SwFBwdLAwcOrHIsH330keTj4+PyvrzZlStXJF9fXyk5ObnK+zhWMC2/Uubq1aulIUOGSIGBgZLFYpG6du3qXFVUkqr/flf2uZIk+XseEBAgAZD+7//+r8LtxcXF0rPPPiu1bNlS8vf3l2JjY6Xvv/9emjJlitSmTRuX+/7000/SrbfeKvn5+UkAnM938+qsDh9++KHUs2dP52d6woQJ0uHDh13uU9V2orJtChERKcd+kf1iTdgvsl90aOj94pAhQ1zqGhgYKN1yyy3SxIkTpa+++spldfvyPv74Y6lv375SYGCgFBAQILVv31568MEHpT179rhkd+vWrcrnLf/5cLDZbFJUVJQEQHrxxRcrfezrr78utW3bVvLz85O6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a9euIS0tDTabDampqQCADh06aL5HDBERERGRJ7HXJSIiItKnejuZ+tJLL+GTTz5x/v/WW28FAGzatAlDhw5VnV9UVKR6BVutF23QMk/PYyssLHR+dezCXVd6fp16zQJYA9FZAGsgOgtgDURnAayB6CxA7odIDHf2ulr0uYB+37t6/rxzuyY+jzUQn8caiM9jDcTnsQbi89T0ufV2MnXJkiVYsmSJqoyFCxdi4cKFLtfZbDZVmUREREREaqntddnnEhEREblHvZ1M1cL06dMxffp0l+tycnIQGhoKf39/zQ6h0vpQLC3z9Dg2q9UKAAgICGANBGWxBuKzWAPxWayB+CzWQHyWv7+/JjnkeZ7qcwF9vne1ztIqj9s18Xmsgfg81kB8HmsgPo81EJ+nps81qn52IiIiIiIiIiIiIi/AyVQiIiIiIiIiIiIiBTiZSkRERERERERERKSAV58ztTparHKq51XL9Dw2rmonNgtgDURnAayB6CyANRCdBbAGorMAdauckn5p0ecC+n3v6vnzzu2a+DzWQHweayA+jzUQn8caiM9T0+d69WQqVzklIiIiooaIfS4RERGRe3j1ZKqnVjnV46pl7sjSKo+r2onPYg3EZ7EG4rNYA/FZrIH4LDWrnJJYnupzAX2+d7XO0iqP2zXxeayB+DzWQHweayA+jzUQn6emz+U5U4mIiIiIiIiIiIgU4GQqERERERERERERkQKcTCUiIiIiIiIiIiJSwKvPmVodLVY51fOqZXoeG1e1E5sFsAaiswDWQHQWwBqIzgJYA9FZgLpVTkm/tOhzAf2+d/X8eed2TXweayA+jzUQn8caiM9TWgNJklBaWgpJkqq8j6NfKy4u1mRsWuaJGpvBYIDZbIbRWPU+pGr6XK+eTOUqp0RERETUELHPJSIiqt9KS0tx8eLFaidSAThvNxgMmjyvlnmixxYUFITw8HDNnt/BqydTPbXKqR5XLXNHllZ5XNVOfBZrID6LNRCfxRqIz2INxGepWeWUxPJUnwvo872rdZZWedyuic9jDcTnsQbi81gD8Xk11UCSJKSlpcHX1xeRkZHV7mHp+GOpyWRSPS6t80SNTZIkFBQU4PLly/D19UWLFi0q3EdNn+vVk6lERERERERERER6YrVaUVBQgMjISFgslmrvy8nUygUEBAAALl++jKZNm2o2BoALUBERERER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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(-3,3,1000)\n", "y_sigmoid = 1.0/(1.0+np.exp(-1*x))\n", "dy_sigmoid = y_sigmoid*(1.0-y_sigmoid)\n", "\n", "y_tanh = (np.exp(x) - np.exp(-1*x))/(np.exp(x) + np.exp(-1*x))\n", "dy_tanh = 1 - (np.exp(x) - np.exp(-1*x))**2.0/(np.exp(x) + np.exp(-1*x))**2.0\n", "\n", "y_relu = np.clip(x, a_min = 0,a_max = None)\n", "dy_relu = np.where(y_relu == 0,0,1.0)\n", "\n", "major_ticks = np.array([-2,-1,0,1,2])\n", "\n", "plt.subplot(321)\n", "plt.plot(x,y_sigmoid,color='red',lw=3,label=r'$f(x)$',zorder=10)\n", "plt.gca().set_yticks(major_ticks); plt.title('Sigmoid / Logistic Activation'); plt.xlabel(r'$H_{j_{in}}$'); plt.ylabel(r'$H_{j}$')\n", "plt.plot([-3,3],[0,0],color='black',zorder=1); plt.plot([-3,3],[1,1],color='black',zorder=1)\n", "add_grid(); plt.xlim([-3,3]); plt.ylim([-3,3]); plt.legend(loc='lower right')\n", "\n", "plt.subplot(322)\n", "plt.plot(x,dy_sigmoid,color='blue',lw=3,label=r'$\\frac{\\partial f}{\\partial x}(x)$',zorder=1)\n", "plt.gca().set_yticks(major_ticks); plt.title('Sigmoid / Logistic Activation Derivative'); plt.xlabel(r'$H_{j_{in}}$'); plt.ylabel(r'$\\frac{\\partial H_{j}}{\\partial H_{j_{in}}}$')\n", "plt.plot([-3,3],[0,0],color='black',zorder=1)\n", "add_grid(); plt.xlim([-3,3]); plt.ylim([-3,3]); plt.legend(loc='lower right')\n", "\n", "plt.subplot(323)\n", "plt.plot(x,y_tanh,color='red',lw=3,label=r'$f(x)$',zorder=10)\n", "plt.gca().set_yticks(major_ticks); plt.title('Tanh Activation'); plt.xlabel(r'$H_{j_{in}}$'); plt.ylabel(r'$H_{j}$')\n", "plt.plot([-3,3],[-1,-1],color='black',zorder=1); plt.plot([-3,3],[1,1],color='black',zorder=1)\n", "add_grid(); plt.xlim([-3,3]); plt.ylim([-3,3]); plt.legend(loc='lower right')\n", "\n", "plt.subplot(324)\n", "plt.plot(x,dy_tanh,color='blue',lw=3,label=r'$\\frac{\\partial f}{\\partial x}(x)$',zorder=1)\n", "plt.gca().set_yticks(major_ticks); plt.title('Sigmoid / Logistic Activation Derivative'); plt.xlabel(r'$H_{j_{in}}$'); plt.ylabel(r'$\\frac{\\partial H_{j}}{\\partial H_{j_{in}}}$')\n", "plt.plot([-3,3],[0,0],color='black',zorder=1)\n", "add_grid(); plt.xlim([-3,3]); plt.ylim([-3,3]); plt.legend(loc='lower right')\n", "\n", "plt.subplot(325)\n", "plt.plot(x,y_relu,color='red',lw=3,label=r'$f(x)$',zorder=10); plt.xlabel(r'$H_{j_{in}}$'); plt.ylabel(r'$H_{j}$')\n", "plt.gca().set_yticks(major_ticks); plt.title('Rectified Linear Unit (ReLU) Activation')\n", "plt.plot([-3,3],[0,0],color='black',zorder=1)\n", "add_grid(); plt.xlim([-3,3]); plt.ylim([-3,3]); plt.legend(loc='lower right')\n", "\n", "plt.subplot(326)\n", "plt.plot(x,dy_relu,color='blue',lw=3,label=r'$\\frac{\\partial f}{\\partial x}(x)$',zorder=1)\n", "plt.gca().set_yticks(major_ticks); plt.title('Rectified Linear Unit (ReLU) Activation Derivative'); plt.xlabel(r'$H_{j_{in}}$'); plt.ylabel(r'$\\frac{\\partial H_{j}}{\\partial H_{j_{in}}}$')\n", "plt.plot([-3,3],[0,0],color='black',zorder=1)\n", "add_grid(); plt.xlim([-3,3]); plt.ylim([-3,3]); plt.legend(loc='lower right')\n", "\n", "plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.5, wspace=0.2, hspace=0.5); plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "82cd5982", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 5 }