diff --git a/NehaAgarwal2598.ipynb b/NehaAgarwal2598.ipynb new file mode 100644 index 0000000..0a721fb --- /dev/null +++ b/NehaAgarwal2598.ipynb @@ -0,0 +1,610 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "First_Date_with_TensorFlow.ipynb", + "version": "0.3.2", + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "metadata": { + "id": "2XXfXed5YLbe", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# First Date with TensorFlow\n", + "\n", + "Hi all,
\n", + "\n", + "You know what's important for understanding Deep Learning / Machine Learning?
\n", + "Intuition. Period.\n", + "\n", + "And Intuition comes when you run the code multiple times.\n", + "\n", + "So, today I can write a couple of defination and say this is this, this is that.
\n", + "You Google half of the things up. You find answers which you need to Google further.
\n", + "In the process, you probably won't even remember what's the first thing you started out with!\n", + "\n", + "So?\n", + "\n", + "Hence on, I will execute cells with code.
\n", + "The neurons in your brain will optimize a function to get a hold of what each function is doing.
\n", + "**No Theory Just Code.**\n", + "\n", + "I will at max give a defination that extends for a line. That's it.
\n", + "Let's get started!\n", + "\n", + "
\n", + "\n", + "**RECOMMENDED!**
\n", + "Write the code in the cells using the signals sent by your brain to your fingers!
\n", + "Don't just `shift+enter` the cells.\n", + "\n", + "[Source](https://github.com/iArunava/TensorFlow-NoteBooks)" + ] + }, + { + "metadata": { + "id": "gYWUpE-bYKWP", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Essential imports\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "eKpz5NCIYMdi", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define some tensors\n", + "t1 = tf.constant(2.0, dtype=tf.float32)\n", + "t2 = tf.constant([1.0, 2.0], dtype=tf.float32)\n", + "t3 = tf.constant([[[1.0, 9.0], [2.0, 3.0], [4.0, 5.0]], \n", + " [[1.0, 9.0], [2.0, 3.0], [4.0, 5.0]]])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "vmMcjzTxbWzw", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's print them out!\n", + "print (t1)\n", + "print (t2)\n", + "print (t3)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "10ahnfjYbcop", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Where's Waldo?
\n", + "I mean, the value?
\n", + "\n", + "So, the thing is you can't print the value of tensors directly.
\n", + "You have to use `session`, so let's do that!" + ] + }, + { + "metadata": { + "id": "ol6O5I7Tb2nb", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "sess = tf.Session()\n", + "print (sess.run(t1))\n", + "print (\"=======================\")\n", + "print (sess.run(t2))\n", + "print (\"=======================\")\n", + "print (sess.run(t3))\n", + "sess.close()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "rXKfVs_zb-kU", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Aaahaa!! Just printed those tensors!!!
\n", + "Feels good!
\n", + "\n", + "For some of you, who are like, dude you got \"No Theory Just Code\" in bold
\n", + "And you are still using the markdown cells for the theory ?!\n", + "\n", + "I am just gonna say I am a unreasonable man.
\n", + "\n", + "\n", + "So, you are programming with tf.
\n", + "What ever you do is broken down to 2 basic steps:\n", + "- Building the computational Graph!\n", + "- Execute that graph using `session`!\n", + "\n", + "That's all!\n", + "\n", + "
\n", + "\n", + "Let's compare this 2 steps with what we did above!
\n", + "So, I defined 3 `tensor`s and these 3 `tensor`s formed my computational Graph.
\n", + "And then I executed each tensor in this graph using a `session`.\n", + "\n", + "That simple!\n", + "\n", + "
\n", + "\n", + "Now, let's define a few more computational graphs and execute them with sessions.\n", + "\n", + "Okay, to start with let's build this computational graph!\n", + "\n", + "![Comp Graph 1](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_1.jpg)" + ] + }, + { + "metadata": { + "id": "FyVz0GNqgreZ", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the graph\n", + "comp_graph_1 = tf.multiply(tf.add(78, 19), 79)\n", + "\n", + "# Alternatively\n", + "comp_graph_1_alt = (tf.constant(78) + tf.constant(19)) * tf.constant(79)\n", + "\n", + "# Let's execute using session\n", + "sess = tf.Session()\n", + "print ('Comp Graph 1 : ', sess.run(comp_graph_1))\n", + "print ('Comp Graph 1 Alt: ', sess.run(comp_graph_1_alt))\n", + "sess.close()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "SVMMtuFYhaQB", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Let's define a sligtly more involved graph!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_2.jpg)" + ] + }, + { + "metadata": { + "id": "4856BTvRhiBb", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let build the graph\n", + "# We need to cast cause the tensors operated on should be of the same type\n", + "comp_graph_part_1 = tf.cast(tf.subtract(tf.add(7, 8), tf.add(9, 10)), \n", + " dtype=tf.float32)\n", + "comp_graph_part_2 = tf.divide(tf.cast(tf.multiply(7, 10), dtype=tf.float32), tf.constant(19.5))\n", + "comp_graph_complete = tf.maximum(comp_graph_part_1, comp_graph_part_2)\n", + "\n", + "# Let's execute\n", + "sess = tf.Session()\n", + "part1_res, part2_res, total_res = sess.run([comp_graph_part_1, comp_graph_part_2, comp_graph_complete])\n", + "print ('Complete Result: ', total_res)\n", + "print ('Part 1 Result: ', part1_res)\n", + "print ('Part 2 Result: ', part2_res)\n", + "sess.close()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "B-_ZDtEbj4N0", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Cool! Let's go! Build another graph and execute it with sessions.
\n", + "\n", + "But this time, it's all you!\n", + "\n", + "Build this graph and execute it with `session`!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_3.jpg)\n", + "\n", + "_Remember that `tensors` operated on should be of the same type!_
\n", + "_Search up errors and other help you need on Google_" + ] + }, + { + "metadata": { + "id": "-uHNe1BolJY0", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Build the graph\n", + "# YOUR CODE HERE\n", + "\n", + "# Execute \n", + "# YOUR CODE HERE" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "qmap38WelREN", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Let's do another!
\n", + "It's fun! Isn't it?!\n", + "\n", + "Build and execute this one!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_4.jpg)" + ] + }, + { + "metadata": { + "id": "0ZhYwAlLmEvB", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Build the graph\n", + "# YOUR CODE HERE\n", + "\n", + "# Execute \n", + "# YOUR CODE HERE" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "BnB0b6qCmGmg", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "And a final one, before we move on to the next part!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_5.jpg)" + ] + }, + { + "metadata": { + "id": "GQWyCvsQmMcL", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Build the graph\n", + "# YOUR CODE HERE\n", + "\n", + "# Execute \n", + "# YOUR CODE HERE" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "12NC7XTPsJw7", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Linear Regression\n", + "\n", + "Okay, now we will create a dummy dataset and perform linear regression on this dataset!\n", + "\n", + "\n", + "To get you in the habit of looking up for the documentation, I am not providing what some of the following functions does, Google them up!" + ] + }, + { + "metadata": { + "id": "hW31RZkjtNwI", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Create the dataset\n", + "X = np.linspace(-30.0, 300.0, 300)\n", + "Y = 2 * np.linspace(-30.0, 250.0, 300) + np.random.randn(*X.shape)\n", + "\n", + "# Divide it into train and test\n", + "train_X = X[:250]\n", + "train_Y = Y[:250]\n", + "\n", + "test_X = X[250:]\n", + "test_Y = Y[250:]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "LQKy6U33y4lt", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the hyperparameters\n", + "learning_rate = 0.000005\n", + "n_epochs = 1000\n", + "interval = 50" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "1h1-D8K1uT48", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# let's viz the first 10 datapoints of the dataset\n", + "plt.plot(train_X[:10], train_Y[:10], 'g')\n", + "plt.show()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "jrsUps0nu8vj", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "** Question **
\n", + "Why did I created a session to plot the graph?
\n", + "[Ans]" + ] + }, + { + "metadata": { + "id": "P3-iuxE4sjAf", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the placeholders\n", + "\n", + "# Placeholders?\n", + "# The input to the model changes on iteration\n", + "# So we cannot have a constant in the input as we did before\n", + "# And thus we need placeholders which we can change on each \n", + "# iteration of the training\n", + "\n", + "x = tf.placeholder(tf.float32, name='x')\n", + "y = tf.placeholder(tf.float32, name='y')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "8hPRkaoxvRyV", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the linear regression model\n", + "\n", + "# tf.Variable?\n", + "# We define the model parameters as tf.Variables\n", + "# as they get updated throghout the training.\n", + "# And variables denotes something which changes overtime.\n", + "\n", + "W = tf.Variable(0.0, name='weight_1')\n", + "b = tf.Variable(0.0, name='bias_1')\n", + "\n", + "pred_y = (W*x) + b" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "cSw1P8bkv96r", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the loss function\n", + "# We are going to use the mean squared loss\n", + "loss = tf.reduce_mean(tf.square(y - pred_y))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "5G4uQqjsygNj", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the optimizer\n", + "# And specify the which value (i.e. loss) it has to minimize\n", + "optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "ttI7ZT-ozAm1", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# So the graph is now built\n", + "# Now let's execute the graph using session\n", + "# i.e. lets train the model\n", + "\n", + "# What it is to train a model?\n", + "# To update the paramters in the graph (i.e. tf.Variables)\n", + "# So that the loss is minimized\n", + "\n", + "# Okay let's start!\n", + "with tf.Session() as sess:\n", + " # We need to initialize the variables in our graph\n", + " sess.run(tf.global_variables_initializer())\n", + " \n", + " for epoch in range(n_epochs):\n", + " _, curr_loss = sess.run([optimizer, loss], feed_dict={x:train_X, y:train_Y})\n", + " \n", + " if epoch % interval == 0:\n", + " print ('Loss after epoch', epoch, ' is ', curr_loss)\n", + " \n", + " print ('Now testing the model in the test set')\n", + " final_preds, final_loss = sess.run([pred_y, loss], feed_dict={x:test_X, y:test_Y})\n", + " \n", + " print ('The final loss is: ', final_loss)\n", + " \n", + " # Plotting the final predictions against the true predictions\n", + " plt.plot(test_X[:10], test_Y[:10], 'g', label='True Function')\n", + " plt.plot(test_X[:10], final_preds[:10], 'r', label='Predicted Function')\n", + " plt.legend()\n", + " plt.show()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "jgmH3wwt1src", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Okay, so we are doing good!
\n", + "\n", + "Now, let me just put everything here into one function so that you can tweak the hyperparameters easily!\n", + "\n", + "Or better, do it yourself!" + ] + }, + { + "metadata": { + "id": "OZ5TY7B_4E_v", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "def linear_regression(learning_rate=0.000005, n_epochs=100, interval=50):\n", + " # YOUR CODE HERE\n", + " pass" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "A6MaclhK4rc6", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Okay! Now let's tweak!\n", + "linear_regression(learning_rate=0.000034, n_epochs=500)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "peoHmV2M40uU", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "linear_regression(learning_rate=0.0000006, n_epochs=1000)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "KjY_KnlE5ClG", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "## Drive the loss to a minimum." + ] + }, + { + "metadata": { + "id": "JKiHjGN15HPX", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# YOUR CODE HERE" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/TensorFlow.ipynb b/TensorFlow.ipynb new file mode 100644 index 0000000..ee02a2e --- /dev/null +++ b/TensorFlow.ipynb @@ -0,0 +1,968 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "TensorFlow.ipynb", + "version": "0.3.2", + "provenance": [], + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "[View in Colaboratory](https://colab.research.google.com/github/NehaAgarwal2598/Assignment-4/blob/NehaAgarwal2598/TensorFlow.ipynb)" + ] + }, + { + "metadata": { + "id": "2XXfXed5YLbe", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# First Date with TensorFlow\n", + "\n", + "Hi all,
\n", + "\n", + "You know what's important for understanding Deep Learning / Machine Learning?
\n", + "Intuition. Period.\n", + "\n", + "And Intuition comes when you run the code multiple times.\n", + "\n", + "So, today I can write a couple of defination and say this is this, this is that.
\n", + "You Google half of the things up. You find answers which you need to Google further.
\n", + "In the process, you probably won't even remember what's the first thing you started out with!\n", + "\n", + "So?\n", + "\n", + "Hence on, I will execute cells with code.
\n", + "The neurons in your brain will optimize a function to get a hold of what each function is doing.
\n", + "**No Theory Just Code.**\n", + "\n", + "I will at max give a defination that extends for a line. That's it.
\n", + "Let's get started!\n", + "\n", + "
\n", + "\n", + "**RECOMMENDED!**
\n", + "Write the code in the cells using the signals sent by your brain to your fingers!
\n", + "Don't just `shift+enter` the cells.\n", + "\n", + "[Source](https://github.com/iArunava/TensorFlow-NoteBooks)" + ] + }, + { + "metadata": { + "id": "gYWUpE-bYKWP", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Essential imports\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "eKpz5NCIYMdi", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define some tensors\n", + "t1 = tf.constant(2.0, dtype=tf.float32)\n", + "t2 = tf.constant([1.0, 2.0], dtype=tf.float32)\n", + "t3 = tf.constant([[[1.0, 9.0], [2.0, 3.0], [4.0, 5.0]], \n", + " [[1.0, 9.0], [2.0, 3.0], [4.0, 5.0]]])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "vmMcjzTxbWzw", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "917df1c6-73c0-46ce-9d6f-c36434563bd8" + }, + "cell_type": "code", + "source": [ + "# Let's print them out!\n", + "print (t1)\n", + "print (t2)\n", + "print (t3)" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Tensor(\"Const:0\", shape=(), dtype=float32)\n", + "Tensor(\"Const_1:0\", shape=(2,), dtype=float32)\n", + "Tensor(\"Const_2:0\", shape=(2, 3, 2), dtype=float32)\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "10ahnfjYbcop", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Where's Waldo?
\n", + "I mean, the value?
\n", + "\n", + "So, the thing is you can't print the value of tensors directly.
\n", + "You have to use `session`, so let's do that!" + ] + }, + { + "metadata": { + "id": "ol6O5I7Tb2nb", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "outputId": "9e04cf47-68f4-43b1-edf1-93783aca8228" + }, + "cell_type": "code", + "source": [ + "sess = tf.Session()\n", + "print (sess.run(t1))\n", + "print (\"=======================\")\n", + "print (sess.run(t2))\n", + "print (\"=======================\")\n", + "print (sess.run(t3))\n", + "sess.close()" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2.0\n", + "=======================\n", + "[1. 2.]\n", + "=======================\n", + "[[[1. 9.]\n", + " [2. 3.]\n", + " [4. 5.]]\n", + "\n", + " [[1. 9.]\n", + " [2. 3.]\n", + " [4. 5.]]]\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "rXKfVs_zb-kU", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Aaahaa!! Just printed those tensors!!!
\n", + "Feels good!
\n", + "\n", + "For some of you, who are like, dude you got \"No Theory Just Code\" in bold
\n", + "And you are still using the markdown cells for the theory ?!\n", + "\n", + "I am just gonna say I am a unreasonable man.
\n", + "\n", + "\n", + "So, you are programming with tf.
\n", + "What ever you do is broken down to 2 basic steps:\n", + "- Building the computational Graph!\n", + "- Execute that graph using `session`!\n", + "\n", + "That's all!\n", + "\n", + "
\n", + "\n", + "Let's compare this 2 steps with what we did above!
\n", + "So, I defined 3 `tensor`s and these 3 `tensor`s formed my computational Graph.
\n", + "And then I executed each tensor in this graph using a `session`.\n", + "\n", + "That simple!\n", + "\n", + "
\n", + "\n", + "Now, let's define a few more computational graphs and execute them with sessions.\n", + "\n", + "Okay, to start with let's build this computational graph!\n", + "\n", + "![Comp Graph 1](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_1.jpg)" + ] + }, + { + "metadata": { + "id": "FyVz0GNqgreZ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "9d1ce2d4-e054-4a5f-9038-9422d574f36e" + }, + "cell_type": "code", + "source": [ + "# Let's define the graph\n", + "comp_graph_1 = tf.multiply(tf.add(78, 19), 79)\n", + "\n", + "# Alternatively\n", + "comp_graph_1_alt = (tf.constant(78) + tf.constant(19)) * tf.constant(79)\n", + "\n", + "# Let's execute using session\n", + "sess = tf.Session()\n", + "print ('Comp Graph 1 : ', sess.run(comp_graph_1))\n", + "print ('Comp Graph 1 Alt: ', sess.run(comp_graph_1_alt))\n", + "sess.close()" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Comp Graph 1 : 7663\n", + "Comp Graph 1 Alt: 7663\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "SVMMtuFYhaQB", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Let's define a sligtly more involved graph!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_2.jpg)" + ] + }, + { + "metadata": { + "id": "4856BTvRhiBb", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "87d1479c-1d7d-46aa-d9a7-488e924ebc12" + }, + "cell_type": "code", + "source": [ + "# Let build the graph\n", + "# We need to cast cause the tensors operated on should be of the same type\n", + "comp_graph_part_1 = tf.cast(tf.subtract(tf.add(7, 8), tf.add(9, 10)), \n", + " dtype=tf.float32)\n", + "comp_graph_part_2 = tf.divide(tf.cast(tf.multiply(7, 10), dtype=tf.float32), tf.constant(19.5))\n", + "comp_graph_complete = tf.maximum(comp_graph_part_1, comp_graph_part_2)\n", + "\n", + "# Let's execute\n", + "sess = tf.Session()\n", + "part1_res, part2_res, total_res = sess.run([comp_graph_part_1, comp_graph_part_2, comp_graph_complete])\n", + "print ('Complete Result: ', total_res)\n", + "print ('Part 1 Result: ', part1_res)\n", + "print ('Part 2 Result: ', part2_res)\n", + "sess.close()" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Complete Result: 3.5897436\n", + "Part 1 Result: -4.0\n", + "Part 2 Result: 3.5897436\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "B-_ZDtEbj4N0", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Cool! Let's go! Build another graph and execute it with sessions.
\n", + "\n", + "But this time, it's all you!\n", + "\n", + "Build this graph and execute it with `session`!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_3.jpg)\n", + "\n", + "_Remember that `tensors` operated on should be of the same type!_
\n", + "_Search up errors and other help you need on Google_" + ] + }, + { + "metadata": { + "id": "-uHNe1BolJY0", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "66133ca8-7104-4ef1-c144-bba801849bf7" + }, + "cell_type": "code", + "source": [ + "# Build the graph\n", + "# YOUR CODE HERE\n", + "node_1 = tf.constant([9,10],dtype=tf.float32,name= 'leaf_node1')\n", + "node_2 = tf.constant([7,8.65],dtype=tf.float32,name= 'leaf_node1')\n", + "node_3 = tf.constant([5.6],dtype=tf.float32,name= 'leaf_node1')\n", + "node_4 = tf.constant([7.65,9],dtype=tf.float32,name= 'leaf_node1')\n", + "node_5 = tf.constant([13.5,7.18],dtype=tf.float32,name= 'leaf_node1')\n", + "\n", + "cg_1 = tf.minimum(((node_1 * node_2 ) / node_3),\n", + " (node_4 + node_5))\n", + "\n", + "\n", + "\n", + "# Execute \n", + "# YOUR CODE HERE\n", + "with tf.Session() as sess:\n", + " print(sess.run(cg_1))" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[11.25 15.446429]\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "qmap38WelREN", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Let's do another!
\n", + "It's fun! Isn't it?!\n", + "\n", + "Build and execute this one!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_4.jpg)" + ] + }, + { + "metadata": { + "id": "0ZhYwAlLmEvB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "ff0c12b6-7f7b-48d9-9c51-5d617a4797da" + }, + "cell_type": "code", + "source": [ + "# Build the graph\n", + "# YOUR CODE HERE\n", + "\n", + "node_1 = tf.constant([[1.2, 3.4], \n", + " [7.5, 8.6]], dtype=tf.float32)\n", + "node_2 = tf.constant([[7, 9],\n", + " [8, 6]], dtype=tf.float32)\n", + "node_3 = tf.constant([[2.79, 3.81, 5.6],\n", + " [7.3, 5.67, 8.9]], dtype=tf.float32)\n", + "node_4 = tf.constant([[2.6, 18.1],\n", + " [7.86, 9.81],\n", + " [9.36, 10.41]], dtype=tf.float32)\n", + "\n", + "cg_2 = (tf.reduce_mean(node_1, axis=1) * node_2) + tf.reduce_sum(node_3 * tf.transpose(node_4))\n", + "\n", + "# Execute \n", + "# YOUR CODE HERE\n", + "\n", + "with tf.Session() as sess:\n", + " print(sess.run(cg_2))" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[386.1183 442.4683 ]\n", + " [388.41827 418.3183 ]]\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "BnB0b6qCmGmg", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "And a final one, before we move on to the next part!\n", + "\n", + "![alt text](https://raw.githubusercontent.com/iArunava/TensorFlow-NoteBooks/master/assets/comp_graph_5.jpg)" + ] + }, + { + "metadata": { + "id": "GQWyCvsQmMcL", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "06e8e24b-5da0-43b7-d909-fc8368f5930f" + }, + "cell_type": "code", + "source": [ + "# Build the graph\n", + "# YOUR CODE HERE\n", + "\n", + "node_1 = tf.constant(7.0, dtype=tf.float32)\n", + "node_2 = tf.constant([[7.36, 8.91, 10.41],\n", + " [5.31, 9.38, 7.99]], dtype=tf.float32)\n", + "node_3 = tf.constant([[7.99, 10.36],\n", + " [5.36, 7.98],\n", + " [8.91, 5.67]], dtype=tf.float32)\n", + "node_4 = tf.constant(19.6, dtype=tf.float32)\n", + "node_5 = tf.constant([[1, 5.6, 6.1, 8],\n", + " [0, 0, 7.98, 9],\n", + " [0, 0, 7.6, 7],\n", + " [0, 0, 0, 8.98]], dtype=tf.float32)\n", + "\n", + "cg_3 = ((node_1 + tf.reduce_sum(node_2 * tf.transpose(node_3)))/node_4)/node_5\n", + "\n", + "# Execute \n", + "# YOUR CODE HERE\n", + "with tf.Session() as sess:\n", + " print(sess.run(cg_3))" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[19.463488 3.475623 3.1907358 2.432936 ]\n", + " [ inf inf 2.4390335 2.1626098]\n", + " [ inf inf 2.5609853 2.7804983]\n", + " [ inf inf inf 2.1674263]]\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "12NC7XTPsJw7", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Linear Regression\n", + "\n", + "Okay, now we will create a dummy dataset and perform linear regression on this dataset!\n", + "\n", + "\n", + "To get you in the habit of looking up for the documentation, I am not providing what some of the following functions does, Google them up!" + ] + }, + { + "metadata": { + "id": "hW31RZkjtNwI", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Create the dataset\n", + "X = np.linspace(-30.0, 300.0, 300)\n", + "Y = 2 * np.linspace(-30.0, 250.0, 300) + np.random.randn(*X.shape)\n", + "\n", + "# Normalize the dataset\n", + "X = X / np.max(X)\n", + "Y = Y / np.max(Y)\n", + "\n", + "# Divide it into train and test\n", + "train_X = X[:250]\n", + "train_Y = Y[:250]\n", + "\n", + "test_X = X[250:]\n", + "test_Y = Y[250:]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "LQKy6U33y4lt", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the hyperparameters\n", + "learning_rate = 0.00001\n", + "n_epochs = 60\n", + "interval = 20" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "1h1-D8K1uT48", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 347 + }, + "outputId": "549d72b7-16f1-4b8e-d789-0132c9b9d823" + }, + "cell_type": "code", + "source": [ + "# let's viz the first 10 datapoints of the dataset\n", + "plt.plot(train_X[:10], train_Y[:10], 'g')\n", + "plt.show()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfIAAAFKCAYAAADmCN3IAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xtgz3X///H7zgc2NrZRDZFDYmIb\nXRMiEpXqukytLy7RQVzUhZipRmFTJu2SStTlksgKSZLUUrKcppEsJJHVbNmMjW229+8PtV/LcR+f\n7f05PG5/9Xl/3ofnszcen/fx5WIYhoGIiIjYJVezCxARERHLKchFRETsmIJcRETEjinIRURE7JiC\nXERExI4pyEVEROyYu9kFWCIn54TV1xkQ4EteXpHV12vL1LNzcMaewTn7Vs+OLSjI77zTdUT+O3d3\nN7NLqHHq2Tk4Y8/gnH2rZ+ekIBcREbFjCnIRERE7piAXERGxYwpyERERO6YgFxERsWMKchERETum\nIBcREbFjCnIRERE7piAXERGxYwpyERERO6YgFxERsaKC4uO8k/k2Z8rP1Mj27HLQFBEREVtkGAbD\nPxnG+kPraB7Qgg4hEdW+TR2Ri4iIWMmCXa+x/tA6bgntwY3BHWpkmwpyERERK/jut91MSXuaet71\n+E+PV3F1qZmI1al1ERGRK3TqzCmGfzKU4rJiFvT+HyG1GtTYtnVELiIicoWeTXuazGN7GNrmYW5r\n0qdGt60gFxERuQKfHFzLgl3zaBV4PfFRU2t8+wpyERERC2UXZTP6s8fwcvPilZ4L8HH3qfEadI1c\nRETEAuVGOaM+fZTfTv/GtJtncEP9NqbUoSNyERERC8zbOZfPD3/GrY168VDb4abVoSAXERGpol25\nO5maNpn6PkEk93gVFxcX02pRkIuIiFRBUWkRj30yjJLyEv7T4xWCfINMrUdBLiIiUgXxmyaxN+97\nHgl7jFsb32Z2OQpyERGRy/XRjx+ycPcCWtdrw1M3TTG7HEBBLiIicll+LfyFf6eOxNvNm1d7LcDb\n3dvskgA9fiYiInJJ5UY5Iz99lGOnj5HYNYlWgdebXVIFHZGLiIhcwivfzOHLnz+nd5M+PHjDQ2aX\nU4mCXERE5CJ25nzD9M1TCPYN4cXuL5v6qNn5KMhFREQuoLC0kEc/GUppeSn/6fEq9X3qm13SORTk\nIiIiF/D0xlh+yN/P8Hb/onujW80u57wU5CIiIufxwQ/v89aehbSpH8akm+LNLueCFOQiIiJ/kXXy\nCGM/H4WPuw+v9XoDLzcvs0u6ID1+JiIi8idl5WWMXP8I+cX5vNBtNs0DWphd0kVZFOSlpaXExsaS\nlZWFm5sbCQkJhIaGVppn1apVLFy4EFdXVwYMGEB0dDRFRUXExsaSm5uLj48PiYmJBAUFkZmZyeTJ\nkwFo2bIlU6bYxttyRETE+bz8zUt8lfUlfa69k8GtHzS7nEuy6NT66tWr8ff3Z8mSJQwfPpykpKRK\n3xcVFfHyyy/z3//+l0WLFrFw4ULy8/NZtmwZoaGhvP322zz22GMkJycDMG3aNOLi4li6dCknT55k\nw4YNV96ZiIhIFe3I3k7ilqk0qNWQF7v/x+YeNTsfi4I8LS2NXr16ARAVFUV6enql7zMyMmjbti1+\nfn54e3vToUMH0tPTOXjwIGFhYQBERESwfft2SkpKOHLkSMX07t27k5aWdiU9iYiIVNnJ0pMMXz+M\nsvIy5tz6GoHe9cwu6bJYFOS5ubkEBgaeXYGrKy4uLpSUlJz3e4DAwEBycnJo0aJFxdH2li1byMrK\nIi8vD39//4p569WrR05OjkXNiIiIWGrSl+P58fgBRrZ/nK7X3GJ2OZftktfIU1JSSElJqTQtIyOj\n0mfDMC66jj++79+/P99//z0xMTF07NixUthf7roAAgJ8cXd3u+R8VRUU5Gf1ddo69ewcnLFncM6+\n1bNllu1expLMtwhvGE7SHTPwdPO0QmU145JBHh0dTXR0dKVpsbGx5OTk0KpVK0pLSzEMA0/P/990\ncHAwubm5FZ+PHj3KjTfeiKenZ8WNbIWFhXz66acEBgaSn59fMW92djbBwcEXrSkvr+jyuquCoCA/\ncnJOWH29tkw9Owdn7Bmcs2/1bJmfTxzm4VWP4Ovuy5zu8zh+rBgotk6BVnShHywWnVrv3Lkza9eu\nBSA1NZVOnTpV+r5du3bs2rWLgoICCgsLSU9PJyIigg0bNjB79mzg7F3tXbp0wcPDg6ZNm7Jt2zYA\n1q1bR5cuXSwpS0REpErKyssYsf5hCkqOM+3m52lWt7nZJVWZRY+f9e3bl02bNhETE4OnpyeJiYkA\nzJs3j8jISNq3b8/YsWMZNmwYLi4ujBw5Ej8/Pzp16sTixYsZMGAAderUYdasWQDExcXxzDPPUF5e\nTrt27YiKirJehyIiIhfwUnoSX/+yiTub3s0D1w8yuxyLuBiXc1HaxlTHqSOdknIO6tl5OGPf6rlq\ntv26hbtW9CbEtwGp931FgPe5923ZEqueWhcREbFnJ0oKGL7+IcqNcub2fN3mQ/xiFOQiIuJ0Yr8Y\nx6GCg4zuMIaoq282u5wroiAXERGn8t7eZaTsXUr74A6Mj4wzu5wrpiAXERGn8VPBQcZ/MYZaHrV5\npdcCPNw8zC7pimn0MxERcQpnys8wYv3DnCgpILnHKzSt08zskqxCR+QiIuIUZm17nq2/buae6/7O\nfS0fMLscq1GQi4iIw9v8y9fM2v4819QO5YVus+1iVLPLpSAXERGHVlB8nBHrHwJgbs/XqeNV1+SK\nrEtBLiIiDsswDMZ/8W8OnzjEE+HjuOkqx3tzqIJcREQcVsrepSzf9y7hIZGMi4g1u5xqoSAXERGH\n9OPxA0z4Yiy1Pfx4ped83F0d80Etx+xKREScWmlZKSPWP0Rh6UlevnUeTepca3ZJ1UZH5CIi4nCS\ntiWyPXsbf28eTXTL+80up1opyEVExKGkZX3Fi9tn0sivMc93nWV2OdVOQS4iIg4j/3QeI9Y/jKuL\nK3N7zsffq47ZJVU7BbmIiDgEwzAYt+EJjpz8mbERE+jYsJPZJdUIBbmIiDiEpZmLWfXDCjo2uIkn\nwseZXU6NUZCLiIjdO5C/n4lfPomfpz9ze77usI+anY/zdCoiIg6ppKyE4Z8Mo+hMIa/1eoNG/o3N\nLqlG6YhcRETs2vNbpvNNzg4GtIzh3ub9zS6nxinIRUTEbqX+mMp/drxIY/8mJHaZaXY5plCQi4iI\nXTp2+jcGrRiEq4srr/ZaQG1PP7NLMoWCXERE7I5hGIz9/HGOnDjC+Mg4wkMizS7JNApyERGxO2/t\nWciHB1bRtXFXRncYY3Y5plKQi4iIXdmft4+nN8ZSx6sub937Fm6ubmaXZCoFuYiI2I3ismIe/WQo\nRWeKSOr2EqF1Qs0uyXQKchERsRsJm59jV24GD7QaRL/r7jW7HJugIBcREbuw4XAqc79JpmmdZkzt\nMsPscmyGglxERGzeb6d+41+fPoq7qzuv9JxPbY/aZpdkMxTkIiJi0wzD4N+pI8ku+pXYjk/TPiTc\n7JJsioJcRERs2sLdb7D24Bpuvror/2r/uNnl2BwFuYiI2KyMozt45quJ1PWqy5xbX8PVRbH1V/o/\nIiIiNufUmVNM+3oKfZbfyumy08y6ZQ5X1b7a7LJskoYxFRERm7LhcCpPbniCgwU/EurXiBldk+jZ\nuLfZZdksi4K8tLSU2NhYsrKycHNzIyEhgdDQyg/lr1q1ioULF+Lq6sqAAQOIjo6mqKiI2NhYcnNz\n8fHxITExkaCgIAYNGkRRURG+vr4ATJgwgTZt2lx5dyIiYjdyinKI3xTHu3vfwdXFlcfajWJ8xzhq\nedQyuzSbZlGQr169Gn9/f5KSkti4cSNJSUnMnj274vuioiJefvll3n33XTw8POjfvz+9evVi5cqV\nhIaGkpyczLZt20hOTua5554DICEhgRYtWlinKxERsRuGYbAk8y2mbHqKvOI8bgxqT9ItybQNamd2\naXbBomvkaWlp9OrVC4CoqCjS09MrfZ+RkUHbtm3x8/PD29ubDh06kJ6ezsGDBwkLCwMgIiKC7du3\nX2H5IiJiz/bn7ePe9+/gidSRlJSXMrVzIh/94zOFeBVYdESem5tLYGAgAK6urri4uFBSUoKnp+c5\n3wMEBgaSk5NDixYt2LBhA71792bLli1kZWVVzJOcnExeXh7NmjUjLi4Ob2/vC24/IMAXd3frvyQ/\nKMj5xrJVz87BGXsG5+zbXnouPlNM4sZEpm+cTklZCf1a9mNOnzkWvTvdXnquLpcM8pSUFFJSUipN\ny8jIqPTZMIyLruOP7/v378/3339PTEwMHTt2rAj7wYMH07JlSxo1akR8fDyLFy9m2LBhF1xfXl7R\npcqusqAgP3JyTlh9vbZMPTsHZ+wZnLNve+k5Lesrxn3+OPvy99KgVkMSuszkjqZ3QQlVrt9eeraG\nC/1guWSQR0dHEx0dXWlabGwsOTk5tGrVitLSUgzDqDgaBwgODiY3N7fi89GjR7nxxhvx9PRkypQp\nABQWFvLpp58CVJymB+jRowdr1qypQmsiImIP8k4f49m0Z1i853+44MKwto8Q1+kZ/Dz9zS7Nrll0\njbxz586sXbsWgNTUVDp16lTp+3bt2rFr1y4KCgooLCwkPT2diIgINmzYUHFT3KpVq+jSpQuGYTBk\nyBAKCgoA2Lx5M82bN7+SnkRExIYYhsG7e9+h85IIFu/5H63rtWHNP9aT0GWmQtwKLLpG3rdvXzZt\n2kRMTAyenp4kJiYCMG/ePCIjI2nfvj1jx45l2LBhuLi4MHLkSPz8/OjUqROLFy9mwIAB1KlTh1mz\nZuHi4sKAAQMYMmQIPj4+hISEMGrUKKs2KSIi5vjx+AEmfDGGzw9/ho+7D0//7VmGh43Ew83D7NIc\nhotxqQvcNqg6roc403WWP6hn5+CMPYNz9m1LPZeWlfJKxn+YuTWR02Wn6R56K893e5HG/k2suh1b\n6rm6WXyNXEREpCq2/bqFsZ8/zp5ju6nvE8RLN8/lnuv+gYuLi9mlOSQFuYiIWEVB8XGmbZ7Cf79d\ngIHBoNZDePqmKdT1DjC7NIemIBcRkStiGAarD6wi7ssnyS76lRYBLZnZ7SVuuirK7NKcgoJcREQs\n9vOJw0z8chwfH/wILzcvJnScxL/aP4GXm5fZpTkNBbmIiFTZmfIzzN/1Kombp1F0ppCbr+7KC91e\npFldPT5c0xTkIiJSJTtzvmHM56PZmfMNgd6BJHadyX0tH9DNbCZRkIuIyGU5WXqSGVum8frOVyg3\nyhnQMoYpUdOp51PP7NKcmoJcRKSKCksLeeWb//Bt7i7aBoXRPjicDsHhDn139rqDHxH7xTh+PnmY\na+s05YVus+l6zS1mlyUoyEVELpthGLy3bxnPpcXzS+HZ0RvX/PhBxfdN6zSjQ0gEHYLDaR8STpv6\nYXZ/09evhb8waeMEPvhhJR6uHvw7fBxPhD+Jj7uP2aXJ7xTkIiKXYUf2diZtnMC27C14uXnx7/Bx\nPHD9YDKP7SE9eyvp2dvZcTSdd/e+w7t73wHAw9WDNvXbnj1iD4mgQ3AETes2w9XFomEualS5Uc5/\ndy9g2tdTOFFSQMcGNzHzlpdoFXi92aXJXyjIRUQuIrvwV6ZtnsLSzMUA3NXsHp7527MVrxpt7N+E\n3k36AGfD70D+D6Qf3caOo9tJz97Gt7m72HE0nTe+fR2AOl51uTGoPR1CwmkfHEGHkAiCfYNN6e1C\nvvttN2M/H8327K34e9bhhW6zGdR6iF38AHFGCnIRkfM4feY083bO5cXtMyksPUnrem2YdvMMOl/d\n5YLLuLq4cl1Ac64LaM6AljEAFJcVszt3F+nZ20g/up0dR7ez4edUNvycWrHcNbVDaR8STofgCDqE\nhNM2qB21PWpXe49/derMKZK2zmBuRjJnys9wz3V/57mbZxDiG1LjtcjlU5CLiPyJYRis+XE1kzdN\n4qeCg9TzrseUqGn83/WDcXN1q/L6vNy8zp5WD4momJZ3+hjfHN1RcdSefnQbH/ywkg9+WAmc/UHQ\nKrB1xbX2DsERtAxshbtr9f2T/fnhz3hywxP8VHCQUL9GPN91Frc2vq3atifWoyAXEfndd7/t5umN\nsXx5ZAPuru482m4k4yImUMerrlW3E+AdSPdGt9K90a3A2R8Ph08c+j3Yt5N+dBs7c77hu9++5a09\nCwHwdfclLOjGSjfTXVM79Iqf3c4pyuHpr2JZvi8FNxc3Rtw4micjJ1LLo9YV9yk1Q0EuIk7vt1O/\n8fzWaSzc/QblRjk9G93GlM7TaR7Qoka27+LiQiP/xjTyb8zd1/0dOPvmtMxje/7/UXv2drb8+jVf\n/7KpYrkgn+Dfr7WfvZmuZ+2uXO4/64ZhsCTzLSZvmkR+cT7tgzsw85Zk2tYPq44WpRppPPLfOdOY\ntn9Qz87BGXuGy+u7tKyU/+6ez/NbEzhenM91dZvzbOfp9Gzcu4aqrJqTpSfZefSbimvt6dnbOHLy\n50rzNKt7XcW19vbB4dxQv+05j8Dty9vLuA2Pk5b1FbU8ajOp0zM82OZhiy4dmM2Z/nxrPHIRkT/5\n7NB6nvlqInvzvsffsw7PdU5gaJtH8HDzMLu0C6rtUZuoq28m6uqbK6ZlF/7KjqPpZ++Qz/+GzT9v\nIWXvUlL2LgXA09Xz7CNwv19r//H4AZLTZ1FSXkKfa+8kocsLXFX7arNaEitQkIuIU/khfx/xX01i\n3U9rcXVxZXDrocR2eor6PvXNLs0iIbUacPu1fbn92r4EBfmRffQ4P+TvJz37/z8Ctyt3J+lHt7OA\neQA0rHUVCV1m0rfpnSZXL9agIBcRp1BQfJykbc8zf9erlJaX0vmqLjx3cyJt6rc1uzSrcnVxpXlA\nC5oHtOC+Vg8AZx+l2/3b2UfgistK+OcND+Ln6W9ypWItCnIRcWhl5WUsyXyL6ZunkHsql0Z+jYmP\nmsqdTfs5zWhd3u7ehIdEEh4SaXYpUg0U5CLisNKyvmLSxgl8m7sTX/daxHV6huHt/oW3u7fZpYlY\njYJcRBzO4ROH+NeGZ1m2exkA0S3u56mbJtOw9lUmVyZifQpyEXEYhaWF/GfHi8zdkczpstOEh0Qw\n9eYZOqUsDk1BLiJ2zzAMlu9L4dm0Z/ilMIsQ3wbMu+15bmvYTwN9iMNTkIuIXduRvZ2nvopl66+b\nK4YXHdVhDNde1dBpXhQizk1BLiJ26a/Di97Z9G7io56rGF5UxFkoyEXErlgyvKiII1OQi4hdMAyD\nj378kPhNcRXDi06OmsrA6/9pl+8IF7EWBbmI2LyaGl5UxB4pyEXEZpk9vKiIPVCQi4jNsbfhRUXM\npCAXEZvy1+FFn+08naFtHsHTzdPs0kRskoJcRGyCow0vKlJTLAry0tJSYmNjycrKws3NjYSEBEJD\nQyvNc/z4ccaMGUOtWrVITk6+6HKZmZlMnjwZgJYtWzJlypQr60pE7MpL25N4fut0SstLibrqZqbe\nPMPhhhcVqS4Wvbtw9erV+Pv7s2TJEoYPH05SUtI588THxxMeHn5Zy02bNo24uDiWLl3KyZMn2bBh\ngyVliYgdmrPjJaZtnkKQTzALei9ixd0fKsRFqsCiIE9LS6NXr14AREVFkZ6efs48U6dOPSfIz7dc\nSUkJR44cISwsDIDu3buTlpZmSVkiYmfe3rOIZ9OepmGtq/jg7x9zV7O7nWaMcBFrsSjIc3NzCQwM\nPLsCV1dcXFwoKSmpNE/t2rUva7nc3Fz8/f0r5qlXrx45OTmWlCUiduTDAx8w5vNRBHgFsOyulYT6\nNTK7JBG7dMlr5CkpKaSkpFSalpGRUemzYRgWbfx8y13OugICfHF3t/6bnIKC/Ky+Tlunnp2DrfWc\n+mMqj37yID7uPnw08CM6XVM9w4zaWt81QT07n0sGeXR0NNHR0ZWmxcbGkpOTQ6tWrSgtLcUwDDw9\nL/1oSHBw8DnLBQUFkZ+fXzFPdnY2wcHBF11PXl7RJbdVVUFBfk43UpJ6dg621vM3R9O59/1+GIbB\nm7cvpqlX62qpz9b6rgnq2bFd6AeLRafWO3fuzNq1awFITU2lU6dOFi/n4eFB06ZN2bZtGwDr1q2j\nSxcNfiDiiPbn7SNm9T8oKi3klZ7zuSW0h9klidg9ix4/69u3L5s2bSImJgZPT08SExMBmDdvHpGR\nkYSFhTFkyBAKCgrIzs5m0KBBjBgx4oLLxcXF8cwzz1BeXk67du2IioqyXociYhOOnPiZ6A/u5rfT\nvzGz20v0u+5es0sScQguhqUXuE2k03DWoZ6dgy30/Nup3+i3ojf78vcyqVM8j4ePrfZt2kLfNU09\nOzarnloXEblcJ0tO8MCH/2Bf/l6Gt/sXozuMMbskEYeiIBeRalNcVsyQtQPZcTSd+1o+wOSoqXpO\nXMTKFOQiUi3KyssYsf5hvvg5ldub9OXF7nNwddE/OSLWpr9VImJ1hmEw/osxfPDDSv52VWdeu+1N\n3F01RpNIdVCQi4jVJWx+jkXfvUmb+mEs6rMUH3cfs0sScVgKchGxqle+mcPs9JlcW6cpS+9cjr9X\nHbNLEnFoCnIRsZqlmYuJ3xRHg1oNSbnrfYJ9L/6WRhG5cgpyEbGKtT+u4d+p/6KuV13euXMFjfwb\nm12SiFNQkIvIFdt0ZCMPr/snXm5eLL4jhevrtTa7JBGnodtIReSK7MrJYNBH91NulLOwzxIiG1ze\n2AsiYh0KchGx2IH8/dy3+u+cLDnBq70W0KNRT7NLEnE6CnIRscgvJ7OI/uAeck/lMKPrLO5t3t/s\nkkSckq6Ri0iV5Z0+xn2r7+XwiUNM6DiJB9s8ZHZJIk5LQS4iVVJYWsgDH0aTeWwPD7cdzpjw8WaX\nJOLUFOQictlKykoYunYg27O30r/FfTx3c6IGQRExmYJcRC5LWXkZ//r0EVIPf0qvxr15qftcDYIi\nYgP0t1BELskwDOI2PsnK/cvp1PBvvH7bQjzcPMwuS0RQkIvIZXh+63Te/HY+reu14a2+7+Dr4Wt2\nSSLyOwW5iFzU6ztfIWnbDJr4X8s7d62gjldds0sSkT9RkIvIBb279x0mbZxAsG8Iy+5aSYhviNkl\nichfKMhF5Lw+ObiW0Z89Rp3fB0FpUudas0sSkfNQkIvIOb7+JY1hHw/Gw9WDt/ou44b6bcwuSUQu\nQK9oFZFKdud+y8APB3DGOMP/bl9Cp4Y3mV2SiFyEglxEKvx4/AD3rb6XgpLjvNJzPj0b9za7JBG5\nBJ1aFxEAsgt/ZcAH93C0KJvpNz/PP1oMMLskEbkMCnIRIf90HgM+uJefCg4yLiKWh8KGm12SiFwm\nBbmIkysqLWLgmvvYc2w3Q9s8zJORE80uSUSqQEEu4sRKy0p56OPBbPn1a/7evD/Tu7ygQVBE7IyC\nXMRJlRvljPpsOOsPraNHo54k93hVg6CI2CH9rRVxQoZhMGnjeJbvSyEipCMLei/C083T7LJExAIK\nchEnlLRtBgt2zeP6wNYsvmMZtTxqmV2SiFhIQS7iZBbsmsfzW6fTyL8J79y1ggDvQLNLEpEroCAX\ncSLL96UQ9+WTBPkEs+yuFTSo1dDskkTkCinIRZzEZ4c+4V+fPoqfpz/v3LWCpnWamV2SiFiBRa9o\nLS0tJTY2lqysLNzc3EhISCA0NLTSPMePH2fMmDHUqlWL5OTkiy43aNAgioqK8PX1BWDChAm0aaNB\nGkSsZcsvm3lw7UDcXdx5q+87tKnf1uySRMRKLDoiX716Nf7+/ixZsoThw4eTlJR0zjzx8fGEh4df\n9nIJCQksWrSIRYsWKcRFrGhX9i7+b000JWUlzO+9kJuuijK7JBGxIouCPC0tjV69egEQFRVFenr6\nOfNMnTr1nCC/nOVExHp+KjhI77d6c7w4n5d6zOW2Jn3MLklErMyiU+u5ubkEBp6909XV1RUXFxdK\nSkrw9Pz/z6HWrl37spcDSE5OJi8vj2bNmhEXF4e3t/cFtx8Q4Iu7u5slpV9UUJCf1ddp69Sz48o+\nmc39S+7ll5O/MLv3bEbe9IjZJdU4Z9nXf6aenc8lgzwlJYWUlJRK0zIyMip9NgzDoo3/sdzgwYNp\n2bIljRo1Ij4+nsWLFzNs2LALLpeXV2TR9i4mKMiPnJwTVl+vLVPPjut4cT73rLyDH/J+4KkuT/FA\ns6FO0fefOcu+/jP17Ngu9IPlkkEeHR1NdHR0pWmxsbHk5OTQqlUrSktLMQyj0tH4hQQHB593uT9O\ntwP06NGDNWvWXHJdInJ+p86cYtCa+9n92y7+ecMwnu3+LLm5J80uS0SqiUXXyDt37szatWsBSE1N\npVOnThYvZxgGQ4YMoaCgAIDNmzfTvHlzS8oScWqGYbDhcCrRq+7m6182cXezv5PYZaYGQRFxcBZd\nI+/bty+bNm0iJiYGT09PEhMTAZg3bx6RkZGEhYVVhHN2djaDBg1ixIgR513OxcWFAQMGMGTIEHx8\nfAgJCWHUqFFWbVLEkZ06c4r39i5j3s65ZB7bA0Cfa+/k5Z7zcHO1/r0kImJbXAxLL3CbqDquhzjT\ndZY/qGf79mvhL7z57ess3P0Gx04fw93VnX7N7uGRsBF0CImomM+Req4KZ+xbPTs2i6+Ri4htyTi6\ng9d2zuX9/cspLS8lwCuAxzuM5cE2D3FV7avNLk9EapiCXMQOnCk/w0c/fsi8nXPZ/EsaAC0CWvJI\n2Aj6t7gPXw9fkysUEbMoyEVs2PHifBbvWcSCXa9x+MQhAG5t1ItHwkZwS2gP3cgmIgpyEVt0IH8/\nr+96lSV7FlN0phAfdx+G3DCMh8Meo3lAC7PLExEboiAXsRGGYbDxyBe8lvEyn/z0MQYGV9W6mjER\n4xnU+p8aN1xEzktBLmKy02dOs3xfCq9lzGXPsd0AhIdE8mjYCO5o2g8PNw+TKxQRW6YgFzFJduGv\nvLl7Pv/b/Qa5p3Jxc3Hj3uv+wcNhjxHRoKPZ5YmInVCQi9SwnTnf8FrGXFbuf4/S8lLqetVldPsx\nPNjmIa72u8bs8kTEzijIRWpAWXkZaw+uYd7OuaRlfQVA87oteDjsMaJb3k8tj1omVygi9kpBLlKN\nCoqP83bmIubvfI1DJ34CoHt5BEh3AAAYo0lEQVTorTzabgS3hN6Kq4tFwx2IiFRQkItUgwPHf2DB\nztd4O/MtCktP4uPuw+DWQ3k4bDgtA1uZXZ6IOBAFuYiVGIbBV1lfMi9jLh8f/AgDg4a1ruLf4eMY\n2PqfBHrXM7tEEXFACnKRK3T6zGlW7n+P1zLmsvu3XQB0CA7n0XYjubPp3Xp8TESqlYJcxELZRdks\n/HYB/929gNxTObi5uHHPdX/nkbARenxMRGqMglykinbl7mRexlxW7HuXkvIS6njV5V/tn2Bom4e5\nxi/U7PJExMkoyEUuQ1l5GR8f/Ih5O+eyKWsjANfVbc7DYY8xoGWMHh8TEdMoyEUu4kRJAUv2vMXr\nu17lp4KDANwS2oNHw0bQvVFPPT4mIqZTkItcQOaxPfRf1Y+jRdl4u3kzqPWDPBw2nFaB15tdmohI\nBQW5yHl899tu+q+6i9xTuTzRYRyPthtJPR89PiYitkdBLvIXu3J3Er2qH8dOH+OFbrP55w1DzS5J\nROSCFOQif7Iz5xv6r+rH8eLjvHjLHP6v9WCzSxIRuSgFucjvdmRvZ8DqeykoPs5LPeZyf6v/M7sk\nEZFLUpCLANt+3cJ9q/9OYelJ5tz6GtEt7ze7JBGRy6IgF6e3+ZeviVn9D06dKeKVnvO5t3l/s0sS\nEblsCnJxamlZXxGzuj/FZad5rdcb9LvuXrNLEhGpEgW5OK2vjnzJ/30YTUl5Ca/ftpA7m/UzuyQR\nkSpTkItT+uLnzxm05j7OlJ9hQe9F9Ln2DrNLEhGxiIJcnM5nh9Yz5KMHKDfK+e/ti+nV5HazSxIR\nsZiCXJzKmn1r+OdHMQD8r+8SejTqZXJFIiJXRiM+iNP4+OBH3PvOvbjgwqK+7yjERcQhKMjFKaw5\nsJqhawfi7urO4jtSuCW0h9kliYhYhU6ti8P74IeVPPrJUDxdvVjzwIe0rtXB7JJERKxGR+Ti0Fbu\ne49H1j2Il5s3S+9aTrcm3cwuSUTEqiwK8tLSUsaOHUtMTAwDBw7k8OHD58xz/Phxhg0bxujRoytN\n37JlC3/7299ITU2tmJaZmcn999/P/fffT3x8vCUliZzjvb3LGL5+GL4etVh21wpuavg3s0sSEbE6\ni4J89erV+Pv7s2TJEoYPH05SUtI588THxxMeHl5p2qFDh3jzzTfp0KHyqc1p06YRFxfH0qVLOXny\nJBs2bLCkLJEK72S+zchPH6G2hx8pd60kskEns0sSEakWFgV5WloavXqdveM3KiqK9PT0c+aZOnXq\nOUEeFBTEnDlz8PPzq5hWUlLCkSNHCAsLA6B79+6kpaVZUpYIAG/vWcTozx7D39Of9/qtokNIhNkl\niYhUG4uCPDc3l8DAwLMrcHXFxcWFkpKSSvPUrl37nOV8fHxwc3OrNC0vLw9/f/+Kz/Xq1SMnJ8eS\nskT43+43eSJ1JHW96vJevw9oF9ze7JJERKrVJe9aT0lJISUlpdK0jIyMSp8Nw7BaQZezroAAX9zd\n3S45X1UFBfldeiYH40g9v7L1FcZteJz6vvVZP2g97Rq0O+98jtTz5XLGnsE5+1bPzueSQR4dHU10\ndHSlabGxseTk5NCqVStKS0sxDANPT0+LCggMDCQ/P7/ic3Z2NsHBwRddJi+vyKJtXUxQkB85OSes\nvl5b5kg9z9/5KnEbx1PfJ4j37vqAq9yanrc3R+r5cjljz+Ccfatnx3ahHywWnVrv3Lkza9euBSA1\nNZVOnSy/kcjDw4OmTZuybds2ANatW0eXLl0sXp84n1cz5hC3cTzBviGsvHsN19drbXZJIiI1xqIX\nwvTt25dNmzYRExODp6cniYmJAMybN4/IyEjCwsIYMmQIBQUFZGdnM2jQIEaMGEFxcTELFizgwIED\n7N69m0WLFvHGG28QFxfHM888Q3l5Oe3atSMqKsqqTYrjmrPjJZ5Ne5oGtRqyvN9qrgtobnZJIiI1\nysWw5gXuGlIdp1Gc6fTMH+y955e2JzFt8xSuqnU1y+9ZTdM6zS65jL33bAln7Bmcs2/17NgudGpd\nr2gVu5S0bQYztkzjmtqhLL97NU3qXGt2SSIiplCQi10xDIPnt04nadsMGvk1Zvndq2nk39jsskRE\nTKMgF7thGAYJm59jdvpMGvs3YcXdH3KNX6jZZYmImEpBLnbBMAye+zqeOTtmc22dpqy4+0Ouqn21\n2WWJiJhOQS42zzAM4jdN4tWMOTSrex0r7v6QBrUaml2WiIhNUJCLTTMMg6c2TuD1Xa/SIqAl7/X7\ngJBaDcwuS0TEZijIxWaVG+VM/HIcb347n+sDW5PSbxXBvhd/65+IiLNRkItNKjfKeXLDv1n03Zu0\nrteGd/utor5PfbPLEhGxOQpysTnlRjljUkfxduYi2tQP491+7xPoXc/sskREbJKCXGxKWXkZT6SO\n5J3v36ZdUHuW3bWCAO9As8sSEbFZCnKxGWfKzzDq0+G8t28ZHYLDeeeuFdTxqmt2WSIiNk1BLjbh\nTPkZRqx/iJX7lxMR0pGld76Hv1cds8sSEbF5CnIxXWlZKcPXD+ODH1bSqeHfWHLHu9T2PP/gACIi\nUpmCXExVUlbCI+seZM2PHxB11c28dccyanvUNrssERG7oSAX0xSXFfPQx4P5+OBHdLm6G//ru5Ra\nHrXMLktExK4oyMUUp8+cZujagaw/tI5u13RnYZ8l+Hr4ml2WiIjdUZBLjTt15hRDPnqA1MOf0qNR\nT968fTE+7j5mlyUiYpcU5FKjikqLGPxRDF/8nEqvxr1Z0HsR3u7eZpclImK3FORSYwpLCxm05j42\nHvmC26+9g9dv+y9ebl5mlyUiYtdczS5AnMOunAyiV93NxiNfcEfTfsy/baFCXETECnRELtVqV04G\nL2xLZO2PHwJw73X/YM6t8/Bw8zC5MhERx6Agl2qxK3cnL2xNqAjwyAadGB8ZR9drbsHFxcXk6kRE\nHIeCXKxqV+5OZm5N5KMfVwMQEdKR8R3j6HZNdwW4iEg1UJCLVezK3UnS1hms+fEDQAEuIlJTFORy\nRb7N3cXMrYkVAR4eEsn4yDhuCe2hABcRqQEKcrHIt7m7SNo2gw8PrAIU4CIiZlGQS5Xszv2WmdsS\n/xTgETwZGUf30FsV4CIiJlCQy2XZnfstSdtmsPrA+8AfAT6R7qE9FeAiIiZSkMtFfffbbpK2zeCD\nH1YC0CE4nPEd4xTgIiI2QkEu53W+AH8yciI9GvVSgIuI2BAFuVSy57fvSNo2g1U/rACgfXAHxkfG\nKcBFRGyUglwAyDy2h5lbEysF+JORE7m10W0KcBERG6Ygd3KZx/aQtPXsEbiBwY1B7RnfMU4BLiJi\nJxTkTirz2B5GbZjFst3LKgL8yciJ9GzcWwEuImJHLAry0tJSYmNjycrKws3NjYSEBEJDQyvNc/z4\nccaMGUOtWrVITk6umL5lyxYef/xxpk+fTvfu3QEYNGgQRUVF+Pr6AjBhwgTatGljaU9yEd8fyyRp\nWyLv7z97BN4uqD1PRsbSq/HtCnARETtkUZCvXr0af39/kpKS2LhxI0lJScyePbvSPPHx8YSHh5OZ\nmVkx7dChQ7z55pt06NDhnHUmJCTQokULS8qRy/D9sUxmbZvByv3LKwJ8as9n6Vi3qwJcRMSOuVqy\nUFpaGr169QIgKiqK9PT0c+aZOnUq4eHhlaYFBQUxZ84c/Pz8LNmsWGDvse95dN2DdF3aiRX736Nt\nUDsW9X2Hdf0/584WdyrERUTsnEVH5Lm5uQQGBgLg6uqKi4sLJSUleHp6VsxTu3btc5bz8fG54DqT\nk5PJy8ujWbNmxMXF4e3tbUlp8ru9x75n1vYZrNj3HgYGYUE38mTkRG7TKXQREYdyySBPSUkhJSWl\n0rSMjIxKnw3DuKIiBg8eTMuWLWnUqBHx8fEsXryYYcOGXXD+gABf3N3drmib5xMUZP9nCjJzM3nu\ni+dYsmsJBgbtG7Rn8i2TuavFXecNcEfouarUs/Nwxr7Vs/O5ZJBHR0cTHR1daVpsbCw5OTm0atWK\n0tJSDMOodDReVX+cpgfo0aMHa9asuej8eXlFFm/rQoKC/MjJOWH19daUfXl7Sdo2gxX73sXAoG39\ndjwZOZHeTfrg4uJCbu7Jc5ax954toZ6dhzP2rZ4d24V+sFh0jbxz586sXbsWgNTUVDp16mRxYYZh\nMGTIEAoKCgDYvHkzzZs3t3h9zmZ/3j4e++QhuiztyPJ9KdxQvy0L+yxhffQX3H5tX51GFxFxcBZd\nI+/bty+bNm0iJiYGT09PEhMTAZg3bx6RkZGEhYVVhHN2djaDBg1ixIgRFBcXs2DBAg4cOMDu3btZ\ntGgRb7zxBgMGDGDIkCH4+PgQEhLCqFGjrNqkI9qft+/sEfj+dyk3yrmhXluejJxIn2vvUHiLiDgR\nF+NKL3CboDpOo9jL6Zmi0iJe2JrAqxlzKDPKKgL89mv74upStRMs9tKzNaln5+GMfatnx3ahU+t6\ns5sd+ezQesZ/MYZDBQdp5N+EyX+bSt+md1Y5wEVExHEoyO1ATlEOT38Vy/J9Kbi5uDGq/b8ZGzEB\nXw9fs0sTERGTKchtmGEYLM1cTPymOPKL8+kQHM7MW5JpU7+t2aWJiIiNUJDbqB/y9zHu8yf4KutL\nannUZvrNz/Ngm4dxc7X+8/MiImK/FOQ2pqSshDk7ZvPi9hcoLivm9iZ9Segyk6v9rjG7NBERsUEK\nchuy+ZevGff5aL7PyyTEtwEJXWZyR9Pzv5FNREQEFOQ24XhxPs+lTeZ/372BCy482OYhJnWKx9+r\njtmliYiIjVOQm8gwDD74YSVxG8dztCibVoHXk3RLMpENLH9TnoiIOBcFuUl+PnGY2C/Gsu6ntXi5\neRHX6RlG3DgaTzfL31kvIiLOR0Few8rKy5i/61USNk+l6EwhXa7uxgvdXqRp3evMLk1EROyQgrwG\n7crJYOzno/kmZwcBXgEkdp3JfS0f0M1sIiJiMQV5DSgsLeSFrQm8lvEyZUYZ0S3uZ0rn6dT3qW92\naSIiYucU5NXss0OfMH7DGA6d+InG/k14odtsbgntYXZZIiLiIBTk1eRo0VGe+SqW5fvexc3FjdHt\nxzAmYrzejy4iIlalILcywzB4e88ipqQ9VfF+9KRb/sMN9duYXZqIiDggBbkV7c/bx7gNj7MpayO1\nPGqT0OUFhtzwkN6PLiIi1UZBbgXFZcX8J/1FZm+fSUl5CbdfeweJXWZyVe2rzS5NREQcnIL8Cn39\nSxrjPh/N3rzvaVCrYcX70UVERGqCgtxCx4vzeTYtnkXfvan3o4uIiGkU5FX01/ejXx/Ympm3vKT3\no4uIiCkU5FVw+MQhYr8Yyyc/fYyXmxeTOsXz2I2j9H50ERExjYL8Muj96CIiYqsU5JewKyeDMZ+P\nJiNnB4HegczomsSAljF6P7qIiNgEBfkFFJYW8vyW6czbOZcyo4wBLWOYEjWdej71zC5NRESkgoL8\nPD79aR3jvxjD4ROHaOzfhJndXqJbaHezyxIRETmHgvxPjhYd5emNE1ix/z3cXd31fnQREbF5CnLO\nPlK2IH0BY9eN43hxPuEhEczslqz3o4uIiM1z+iAvKi1i4JoBbDzyBbU9/PR+dBERsStOH+RHi7JJ\nz97GPa3uYXLHBL0fXURE7IrTB3mTOtey/6GfaRgSQE7OCbPLERERqRJXswuwBe6uTv97RkRE7JSC\nXERExI4pyEVEROyYglxERMSOWXRxuLS0lNjYWLKysnBzcyMhIYHQ0NBK8xw/fpwxY8ZQq1YtkpOT\nAThz5gyTJk3i0KFDlJWVMX78eCIiIsjMzGTy5MkAtGzZkilTplxZVyIiIk7CoiPy1atX4+/vz5Il\nSxg+fDhJSUnnzBMfH094eHilae+//z4+Pj4sWbKEadOmkZiYCMC0adOIi4tj6dKlnDx5kg0bNlhS\nloiIiNOxKMjT0tLo1asXAFFRUaSnp58zz9SpU88J8n79+jFx4kQAAgMDyc/Pp6SkhCNHjhAWFgZA\n9+7dSUtLs6QsERERp2PRqfXc3FwCAwMBcHV1xcXFhZKSEjw9PSvmqV279jnLeXh4VPz3woULufPO\nO8nLy8Pf379ier169cjJybno9gMCfHF3t/6b14KC/Ky+Tlunnp2DM/YMztm3enY+lwzylJQUUlJS\nKk3LyMio9NkwjCptdPHixezevZtXX32VY8eOVXldeXlFVdre5QgK8nO6F8KoZ+fgjD2Dc/atnh3b\nhX6wXDLIo6OjiY6OrjQtNjaWnJwcWrVqRWlpKYZhVDoav5iUlBQ+++wz5s6di4eHR8Up9j9kZ2cT\nHBx8WesSERFxdhZdI+/cuTNr164FIDU1lU6dOl3WcocPH2bp0qXMmTMHLy8v4Ozp9qZNm7Jt2zYA\n1q1bR5cuXSwpS0RExOlYdI28b9++bNq0iZiYGDw9PSvuPp83bx6RkZGEhYUxZMgQCgoKyM7OZtCg\nQYwYMYK0tDTy8/N55JFHKta1YMEC4uLieOaZZygvL6ddu3ZERUVZpzsREREH52JU9QK3iIiI2Ay9\n2U1ERMSOKchFRETsmIJcRETEjinIRURE7JiCXERExI4pyEVEROyYRc+R2xNLh1y90HL2MOTq5fS8\natUqFi5ciKurKwMGDCA6OpqioiJiY2PJzc3Fx8eHxMREgoKCGDRoEEVFRfj6+gIwYcIE2rRpY0Zr\nF2Ttnh15P2dnZxMXF0dJSQnl5eVMnDiRNm3a0KNHDxo0aICb29lxDGbOnElISIgZrV2UtfvetGkT\ns2bNws3Nja5duzJy5EiTOrswS3t+5ZVX2LRpEwDl5eXk5uby8ccf28W+tnbP9rCfLWY4uOXLlxuT\nJ082DMMwvvzyS+Pxxx8/Z57HH3/cePnll41Ro0ZdcrmBAwcaGRkZhmEYxpgxY4zPP/+8uluoskv1\nXFhYaNx2221GQUGBcerUKeOOO+4w8vLyjDfffNN4/vnnDcMwjK1btxpPPfWUYRhne/7+++9rtokq\nqo6eHXU/JyYmGkuWLDEMwzC2b99uDB061DAMw+jevbtx8uTJmm3CAtbuu0+fPkZWVpZRVlZmxMTE\nGPv27avZhi6DpT3/dR2vv/66YRj2sa+t3bM97GdLOfypdUuHXD3fcvYy5Oqles7IyKBt27b4+fnh\n7e1Nhw4dSE9P5+DBgxW9RUREsH379hqv3VLW7NnR93NAQEDF+AYFBQUEBATUeO1Xwpp9Hz58mDp1\n6tCwYUNcXV3p1q2bQ+3rP5w5c4YlS5YwcODAGq37SlizZ3vZz5Zy+FPrlg65er7lcnNzqzzkqhku\n1fOfv4ezY8Pn5OTQokULNmzYQO/evdmyZQtZWVkV8yQnJ5OXl0ezZs2Ii4vD29u7Zpu6BGv2bMnQ\numawtOchQ4bQv39/Vq5cycmTJ1myZEnFPPHx8Rw5coTw8HDGjh2Li4tLzTZ1GazZd05OzjnzHj58\nuGYbugyW9vyHdevWcfPNN1f6e2vr+9qaPdvLfraUQwV5dQy5erHlLF2XNVmj5z++79+/P99//z0x\nMTF07Nix4g/+4MGDadmyJY0aNSI+Pp7FixczbNgwK3ZRNTXRc1XWVROs2fP8+fPp06cPjz32GKmp\nqcyYMYM5c+YwevRounTpQp06dRg5ciQff/wxt99+u3UbqaLq7nvo0KHWLdgKrNnzH957771K93nY\n2r6uiZ4dmUMFuTWHXA0ODj5nuaCgIJsbctWSnoODg8nNza34fPToUW688UY8PT0r/uAXFhby6aef\nAlSc3gLo0aMHa9asqc6WLqm6e7bFoXWt2fMnn3zCE088AZwdyfCP/u+5556Kebt27crevXtND/Lq\n7vuv8zravgYoKiri119/5Zprrqn43tb2dXX3bIv72Zoc/hq5pUOunm85exly9VI9t2vXjl27dlFQ\nUEBhYSHp6elERESwYcMGZs+eDZy9G7RLly4YhlExkh3A5s2bad68ec02dBms2bOj7+fGjRtXHO3s\n3LmTxo0bc+LECYYNG0ZJSQkAW7dutcn9DNbt+5prruHkyZP8/PPPnDlzhtTUVDp37lzjPV2KpT0D\nZGZm0rRp04p57WVfW7Nne9nPlnL40c/Kysp46qmnOHjwYMWQqw0bNrzgkKvNmzdnxIgRdOzY8bzL\n7d+/v9KQqxMnTjS7xXNcquf27duzdu1aFixYgIuLCwMHDqRfv36cPn2a0aNHk5+fT506dZg1axZ+\nfn6sWbOG+fPn4+PjQ0hICNOmTcPHx8fsNiuxds+OvJ+PHj3KpEmTOH36NACTJk2iVatWLFy4kJUr\nV+Ll5UXr1q15+umnbe66KVi/761btzJz5kwAbrvtNlMvG12IpT0DFY9e/fk0sz3sa2v3bA/72VIO\nH+QiIiKOzOFPrYuIiDgyBbmIiIgdU5CLiIjYMQW5iIiIHVOQi4iI2DEFuYiIiB1TkIuIiNgxBbmI\niIgd+394yQ1vr8HLagAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "jrsUps0nu8vj", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "** Question **
\n", + "Why did I created a session to plot the graph?
\n", + "[Ans]" + ] + }, + { + "metadata": { + "id": "P3-iuxE4sjAf", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the placeholders\n", + "\n", + "# Placeholders?\n", + "# The input to the model changes on iteration\n", + "# So we cannot have a constant in the input as we did before\n", + "# And thus we need placeholders which we can change on each \n", + "# iteration of the training\n", + "\n", + "x = tf.placeholder(tf.float32, name='x')\n", + "y = tf.placeholder(tf.float32, name='y')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "8hPRkaoxvRyV", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the linear regression model\n", + "\n", + "# tf.Variable?\n", + "# We define the model parameters as tf.Variables\n", + "# as they get updated throghout the training.\n", + "# And variables denotes something which changes overtime.\n", + "\n", + "W = tf.Variable(np.random.random_sample(), name='weight_1')\n", + "b = tf.Variable(np.random.random_sample(), name='bias_1')\n", + "\n", + "pred_y = (W*x) + b" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "cSw1P8bkv96r", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the loss function\n", + "# We are going to use the mean squared loss\n", + "loss = tf.reduce_mean(tf.square(y - pred_y))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "5G4uQqjsygNj", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the optimizer\n", + "# And specify the which value (i.e. loss) it has to minimize\n", + "optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "ttI7ZT-ozAm1", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 432 + }, + "outputId": "edc6b5ca-c1bc-44db-cd20-a132c8f013d0" + }, + "cell_type": "code", + "source": [ + "# So the graph is now built\n", + "# Now let's execute the graph using session\n", + "# i.e. lets train the model\n", + "\n", + "# What it is to train a model?\n", + "# To update the paramters in the graph (i.e. tf.Variables)\n", + "# So that the loss is minimized\n", + "\n", + "# Okay let's start!\n", + "with tf.Session() as sess:\n", + " # We need to initialize the variables in our graph\n", + " sess.run(tf.global_variables_initializer())\n", + " \n", + " for epoch in range(n_epochs):\n", + " _, curr_loss = sess.run([optimizer, loss], feed_dict={x:train_X, y:train_Y})\n", + " \n", + " if epoch % interval == 0:\n", + " print ('Loss after epoch', epoch, ' is ', curr_loss)\n", + " \n", + " print ('Now testing the model in the test set')\n", + " final_preds, final_loss = sess.run([pred_y, loss], feed_dict={x:test_X, y:test_Y})\n", + " \n", + " \n", + " print ('The final loss is: ', final_loss)\n", + " \n", + " # Plotting the final predictions against the true predictions\n", + " plt.plot(test_X, test_Y, 'g', label='True Function')\n", + " plt.plot(test_X, final_preds, 'r', label='Predicted Function')\n", + " plt.legend()\n", + " plt.show()" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.008448609\n", + "Loss after epoch 20 is 0.00844489\n", + "Loss after epoch 40 is 0.0084411735\n", + "Now testing the model in the test set\n", + "The final loss is: 0.0040524257\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFKCAYAAAAnj5dkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd8U/X+x/FXkjajm9LB3nvvITIF\nFBFEUIYgq4UiQ1FQFFRUFBdwVRwUWoYMqcoQHIAoqMiWvaHs2Ulnds7vj97b3+UKlNH2pOnn+Xj4\noElOTt7fpvbdfHNyvhpFURSEEEII4Ta0agcQQgghxI2knIUQQgg3I+UshBBCuBkpZyGEEMLNSDkL\nIYQQbkbKWQghhHAzXmoH+I/ExAxVH79ECR9SU7NVzVCQPH184PljlPEVbZ4+PvD8Meb3+EJD/W95\nm7xy/jcvL53aEQqUp48PPH+MMr6izdPHB54/xsIcn5SzEEII4WaknIUQQgg3I+UshBBCuBkpZyGE\nEMLNSDkLIYQQbkbKWQghhHAzUs5CCCGEm3Gbk5C4o9mz/8Xx40dJSUnGYrFQpkxZAgICmT79o3zZ\n/5NP9iAsLByt9v//Rvrss7n3vd8tW36nZcsHSE9PIzY2mpdfnnLf+xRCCFF47qicT5w4wejRoxk6\ndCiDBg264batW7cya9YsdDod7dq1Y8yYMQBMnz6d/fv3o9FomDx5Mg0aNMj/9AVs3LgXAPjpp7Wc\nPh3P2LHj8/0xZsz4FB8fn3zd5/LlS2nSpDklS4ZIMQshRBGUZzlnZ2czbdo0WrdufdPb33nnHWJj\nYwkPD2fQoEE8/PDDpKSkcO7cOeLi4oiPj2fy5MnExcXle3i17Nmzm+XLl5Cdnc3YsS8wYcJYfvzx\nVwBee+1levfuS61atZk+/S0yMjJwOp2MH/8S1apVv6P9d+/+0D/2t3fv32RlZXL+/DkuXbrIc89N\noHXrNqxb9yPffReHRqOhf/+B2O12jhw5xMSJz/HKK6/z1luvERu7mB07dvDhhzPw8vIiNDSMV199\ng40b13PgwD6uX0/l/PlzPP30Mzz2WK8C+74JIYS4M3mWs16vZ968ecybN+8ft124cIHAwEBKly4N\nQPv27dm2bRspKSl07twZgKpVq5KWlkZmZiZ+fn73HPTNra+xNn71Pd//ZnpU7cWbD7xzT/eNjz/F\n11+vRK/X3/T2b775mpYtH6BHj16cOXOaTz6Zwccff3E/cUlIuMaMGZ+yfftWvv9+BQ0bNmLhwhgW\nLfoam83Ou+9O5f33ZxETM4cZMz4lLe167n2nTp3KjBmzCQ8vxaxZH/DLL+vQaDTEx59izpz5XLx4\ngalTJ0s5CyGKndNp8Ww6/ysuxYmvtx9+3n74evvim/uvL756f0KUe++wu5VnOXt5eeHldfPNEhMT\nCQ4Ozr0cHBzMhQsXSE1NpW7dujdcn5iYeNtyLlHC57bnLfUx6dFqNXnFvSs+Jv0NJx6/1UnI/f2N\n+Pj8/7ZBQT7UqVObsmVLAqDRaHJvMxi8CQry4fjxw6SkpLBp0wYArFbzP/av02l59dUX0Olyxl2i\nRAk+/fTTm+7P19dA69YtCQ31p2bNylitZtLSEqhevRrlyoUCEBs7L3e/ISF+6HR2vLy0eHs70Wg0\n1KuX88q9Q4e27Nq1izp16tC8eVNKlQrC398bsznrtidiLwqKev68yPiKNk8fHxSNMSqKwqGEQ6w8\nupIVR1dwMOHgHd1vUINBLH5icQGny1EoB4QpipLnNnmt9PFy4zd4ufEb+RUp139WwwoN9b/lylgZ\nGRays225t1+/no2iaHIvK4qS+3VWljn39nHjJlCv3v+/1/6/+3c6Xbz33r9ueM85MTHjpvvLyrLi\n7W0iMTGD1NQsbDYHaWkWLBbbTfeblJRJWloWDoeL5OSsG/aZnJyOxeIgI8OCzeYiMTGD7OxsnE6X\n6quD3Y/bPYeeQMZXtHn6+MC9x6goCnsT/ubH02v54fT3nEk7DYBeq6drxUd4pHJ3Ag1BZNkzybJn\n/fvf/3ydc7lnjZ75Or7b/SFzX+UcFhZGUlJS7uVr164RFhaGt7f3DdcnJCQQGhp6Pw/l1jQaDRaL\nBYATJ44DUKdOPf74YzP16jXgzJnT7Nixlf79B91uN7fd381UrFiJ8+fPkZ2djU6nY9KkF/jXvz5H\no9HidDpztwsICECj0XD16lVKlSrFvn17aNCg0Q3bCCGEJ8q0ZzL/4DwWHJrHpcyLAPh4+dKz6hN0\nr9KDzhW74q8PuKN9FeYfH/dVzuXKlSMzM5OLFy9SqlQpNm3axIwZM0hNTWX27Nn079+fw4cPExYW\ndl/vN7u7Xr2eZOTIIVSqVIWaNWsD8OST/Xj33TcZPToSl8vF+PET72t/N2MymYiIGMX48aMB6Nfv\naTQaDY0bN2H06AimTHkzd9tp06bx1ltT0Ol0lC1bjoce6sqGDT/f24CFEMLNZduzWXR4PrP3ziLJ\nnIS/PoC+NQfQvUpPOpTvhMnLpHbE29Ioecw5Hzp0iA8++IBLly7h5eVFeHg4nTp1oly5cnTp0oVd\nu3YxY8YMALp27UpERAQAM2bMYPfu3Wg0GqZOnUqtWrVuG0TtqRB3no7JD54+PvD8Mcr4ijZPHx+4\nxxgtDguLjyzgkz2zSMi+hr8+gFENxxDVYDQBhsD72nd+j+9209p5lnNhUfsJdYcfqoLk6eMDzx+j\njK9o8/TxgbpjtDltLD36FR//PYMrWZfx9fZjZINRjGo4lhLG4Lx3cAcKs5zlDGFCCCGKtJ9O/8Br\nWyZxMfMCPl4+jG08njGNnqekqaTa0e6ZlLMQQogi6+czPzJ8/SD0Wj1RDccwrvELhPmEqR3rvkk5\nCyGEKJK2XtrCyA1DMepMrHh8DU3Dm6sdKd9IOQshhChyDibu55mf++NSXHzVbYlHFTNIOQshhChi\nTqfF0++H3mTaMojuMp+OFR5SO1K+k3K+jStXLjN4cH9q1sz5GJjNZmPgwCG0b9/xrve1YkUc169f\np127Dvzxx2YiIqJuut1/lnv09vbOc5+nT59i1qwP/7HMZPv2Lalfv2Hu5ZIlS/LFF5/ddeb/tWnT\nRjp27MzJk8dvOwYhhCgo17Ku0nftEySZE3m/3Ux6Ve+jdqQCIeWchwoVKuaWX3p6GsOGDaRVq9YY\nDMZ72l/16jWpXr3mLW//z3KPd1LOt+Ln55cv60L/ryVLFtGxY+c8xyCEEAUhzXqdfj/05nz6WV5q\n/irD641QO1KBkXK+CwEBgZQsGUJycjILFszDy8ub9PTrvP32+3z44btcvnwJh8NBZOQomjZtzu7d\nO/n005kEB5ekZMkQypQpy549u1m58hveeefD2y73+MknX7JmzSo2blyHRqOlbdsODBgwiISEa7z+\n+it4e3tTrVqNO85+8eJFRo8eS2xszknbIyKe4Z13PmD+/LmEhIRy/PhRrl27yhtvvEPNmrVYunQR\nmzf/ikajZdSosRw7doRTp04wefJLPPlkv9wx/PrrL8TFLUWn01GzZm3Gj59IbGz0TZe3FEKIe5Vt\nz2bQT/04knyI4fVGMLHZK2pHKlBFppx933wNw9r8XTLS2qMXWW/e+ZKRV65cJj09jbCwcCDnnNWT\nJk1h3bofKVkyhFdffYPr16/z/POjWLRoOdHRn/H669OoXr0GEyc+R5kyZXP3lZ2dddvlHhMTE9i8\n+Ve++CIWgGefjaBjx86sXBnHQw91pW/fASxZspBTp07c9/fBZrMxa9ZnrF79HevW/YiPjw+bN/9K\ndPRCLl++xJIlC3nllddZunQR06d/xJ49u/89hmzmzv2cBQuW4ePjw8svv5B72/8ubynlLIS4V3an\nnZEbhrLjyjZ6VevN9LYfodHk7yqF7qbIlLNazp8/x9ixI4Gcta1fe+2t3CU069TJWRbz0KED7N+/\nlwMH9gFgtVqx2+1cuXKF6tVzXt02atQEq9Wau9+zZ89QoUIlDAYjBoOR99+fdcPjHj16mIsXLzBu\nXM77utnZWVy9epmzZ8/QsWPOWtmNGzdj+/at/8icmZmZmxmgatVqjB596/eHGzZsDEBoaDhHjhzm\nxInj1KlTD61WS7ly5Xnllddver8LF85TrlyF3FW1GjduyokTxwBo0KARkLM4SmZm5i0fWwghbkVR\nFA4lH+STv2ey4dw6OpTvxGcPzUWr0aodrcAVmXLOevOdu3qVm1/++z3n/+Xl5Z377+DBw+nS5ZEb\nbtdq//8H6H/PkqrV6lAU1y0f18vLm9at2/Dyy1NuuH7p0kVo/v2Deav73+w9Z5st/YbLDocj9+v/\nrCf9n5w6nRaXK++zumo0N47L4bBjMBhuuk8hhLgTTpeTXdd28tPptfx05gfOp58FoGl4M+Y/sgS9\nTq9uwELi+X9+FII6deqxZcvvAKSmphAd/TkAISGhnD9/Nmcd0b1/33Cf/17u0Wq1Mn78aBRFyV3u\nsWbN2uzZ8zcWiwVFUfj44xlYrRYqVKjIsWNHAHKnkO+En58fqakpKIpCcnISly9fvOW2NWvW5uDB\n/TgcDlJSknn11ZwVtf63sMuXr8jFi+fJzs4CYO/ePdSsWeeOMwkhBIDVaeXXcxuYsPk56i+qQc9V\nDzNn/2ekmJN5olof5nVdyKrHf8LP23NXN/xfReaVszvr1Kkze/bsYtSo4TidToYPz5lSHjlyNK+9\nNolSpUrnvk/9H3kt9zh79lz69h3AmDEj0Gq1tGvXAYPByFNPDeD111/hjz82UbVq9TvOGBgYSLNm\nLYiMHEy1atVve7R16dJlePjhRxk7diSKohAVNQaAGjVqMmLEYJ599rncMYwZ8zwTJoxDo9HSoEEj\nGjZsxO7dO+7q+yeEKJ4uZJxn7oEv+froEtJtaQCEmEIYVHsI3av04MFy7THoDCqnVIesSvVvnr5i\njKePDzx/jDK+os3Txwd3Psb9CXv5cv9svj+1CqfiJNynFL2q96F75R40L9USnVaX5z7UIKtSCSGE\n8CguxcWv5zbwxb7Z/HX5TwBqB9dldKNxPFH9yWLzXvKdknIWQghRYGxOG98eX86X+2dzIvU4AB3K\nd+LZhuPoUL6Tx38k6l5JOQshhCgwozeOYE38Kry13vStOYBnG46jbkg9tWO5PSlnIYQQBeLnMz+y\nJn4VTcObM//hxZT2K6N2pCJDPkolhBAi32XaMnj1j4l4a735pOMXUsx3ScpZCCFEvntvxzQuZ11i\nXJMXqBEsC+XcLSlnIYQQ+WrPtd3EHIymalA1xjeZqHacIknKWQghRL6xO+1M2Pw8Cgoz2n+C0eve\nltct7qSchRBC5JvoA19wOPkgA2oNok3ZtmrHKbKknIUQQuSLM6ln+GjXdEJMIUx9YJracYo0+SiV\nEEKI+6YoCqN/Go3ZYWZmh08JNpZUO1KRJq+chRBC3JLT5byjZV9Xn1rBulM5ay73qd63EJJ5Niln\nIYQQ/6AoCnP2f0bleaVpubQRM3a9z/n0czfd9rollSlbJmH0MvJBu1lySs58IOUshBDiBtctqQxd\nN5A3/pqMj7cPCdnX+HDXdJotqU+v1Y/y9dElZNr+f3Wmt7e9QZI5kTfbv0nlwCoqJvcc8p6zEEKI\nXHuv/c2IDUM5n3GOB8u248susfh6+fDD6TXEHVvGX5f/ZOvlLbz650QerdKDJmFNWXJ0EXVK1uPF\n1i9yPcWi9hA8gpSzEEIIFEUh9mA0U7dOweFyMKHZJCY2eyV3beX+tQbSv9ZAzqef49sTy4k7tozv\nTsTx3Yk4NGiY2eETvHXegJRzfpByFkKIYi7dmsYLm8exNn41IaYQvugcQ4fynW66bYWAikxoNokX\nm77Mzqs7WHnyG2oG16ZpePNCTu3ZpJyFEKIYO5C4j8j1QzibfoZWpR9gbtcFlPItnef9NBoNLUu3\nomXpVoWQsviRA8KEEKKYWnrkK7qv7MLZ9DM832QCKx//4Y6KWRQ8eeUshBDFjN1p542trxJ7cC4l\nDCVY+MhSHqrYVe1Y4r9IOQshRDGSZE5ixPoh/HX5T2oH12FRt6+pFFhZ7Vjif0g5CyFEMXEw6QBD\nf36aCxnn6V6lJ7MfmoOft5/ascRNSDkLIUQxsObUKp777VmyHdlMajGFF5q+hFYjhx25KylnIYTw\nYC7Fxfs73uHjPTPw9fZjUbev6Va5u9qxRB6knIUQwkOlW9MYvXEEG86to1JAZb56dDm1gmurHUvc\nASlnIYTwMNctqcw/NI+Yg3NIMifRoXwnorvMp4QxWO1o4g5JOQshhIe4lHGROQc+Z/HhhWQ7sgg0\nBDGpxRSebzIBL638ui9K5NkSQogi7njKMT7b+zErTn6Dw+WgtG8ZXm4xmcF1huKn91c7nrgHUs5C\nCFEEKYrC9itb+WLfp6w/+zMA1YNqMLbxePrU6Itep1c5obgfUs5CCFGEHEk+zMoT37Lq1HdcyDgP\nQLPwFoxr8gIPV+omH4/yEFLOQgjh5s6ln2X1yRWsPPktR1OOAODn7U+/mk8zsPZgWpZujUajUTml\nyE9SzkII4YZSLSmsPPktK058y+5rOwHQa/U8WrkHfWo8ReeKD2PyMqmcUhQUKWchhHATiqKw48o2\nvjqygLXxq7E6rWg1WtqV60jv6k/SvUoPAg1BascUhUDKWQghVJZsTuab41+z5MhCTl4/AUCVwKoM\nqjOUp2r0I9y3lMoJRWGTchZCCBUoisLWy1tYfGQBP8Svweayodfq6V39KQbXGUbrMm3kfeRiTMpZ\nCCEK2anUk7y4eRzbr2wFcj4C9UzdoTxVYwAlTSVVTifcgZSzEEIUErvTzuf7PmHm7g+wOq08XKkb\nYxo9L0dbi3+QchZCiEKw+/JuhqwcxpHkQ4T5hPN+25k8VrWn2rGEm7qjcp4+fTr79+9Ho9EwefJk\nGjRokHvbxo0b+fLLL9Hr9XTv3p1BgwaxY8cOnn/+eapXrw5AjRo1eP311wtmBEII4cay7dl8sPNd\nog98jktxMaj2EN5o/TZBxhJqRxNuLM9y3rlzJ+fOnSMuLo74+HgmT55MXFwcAC6Xi2nTprFq1SqC\ngoIYMWIEnTt3BqBFixZ8+umnBZteCCHc2B8XNzNh83OcSz9L1RJV+bDtx7Qt117tWKIIyPM8b9u2\nbcst3KpVq5KWlkZmZiYAqampBAQEEBwcjFarpVWrVmzdurVgEwshhJtzuBxM+uNFnlzTk4sZFxjb\neDwHnj0gxSzuWJ7lnJSURIkS/z/9EhwcTGJiYu7XWVlZnD17Frvdzo4dO0hKSgLg1KlTjBo1igED\nBvDXX38VUHwhhHAvVqeVERuGsuBQDLWD67L+yU280fptfLx91I4mipC7PiBMUZTcrzUaDe+//z6T\nJ0/G39+fcuXKAVCpUiXGjh1Lt27duHDhAoMHD2bDhg3o9bdeJaVECR+8vHT3MIT8Exrq2Uurefr4\nwPPHKONzb9n2bJ6JG8T60+vpUKkDa/qvwd/w/2Mq6uO7E54+xsIaX57lHBYWlvtqGCAhIYHQ0NDc\nyy1atGDZsmUAzJw5k7JlyxIeHs6jjz4KQIUKFQgJCeHatWuUL1/+lo+Tmpp9z4PID6Gh/iQmZqia\noSB5+vjA88co43NvGbZ0Bv7Yl+1XttK5Qldiuy7Gkg4WcsZU1Md3Jzx9jPk9vtsVfZ7T2m3atGH9\n+vUAHD58mLCwMPz8/HJvj4yMJDk5mezsbDZt2kTr1q1Zs2YNsbGxACQmJpKcnEx4ePj9jkMIIdxS\niiWZPt/3YPuVrfSs+gQLuy2TRSnEfcnzlXOTJk2oW7cu/fv3R6PRMHXqVFauXIm/vz9dunShb9++\nDB8+HI1Gw8iRIwkODqZTp05MnDiRX3/9FbvdzptvvnnbKW0hhCiqrmVd5am1j3Ms5SgDag1iVofZ\n6LTqvkUnij6N8t9vIqtI7akQmY4p+jx9jDK+wpNlz+KXs+uoEFCRmsG18fX2vel2FzLO0+f7HpxN\nP8OI+qOY9uD7aDU3n5B0p/EVFE8fY2FOa8sZwoQQ4r/YnDYG/9SfPy/9DoAGDZUCK1M7uC51Stal\ndsm61ClZB6fLRd+1vbicdYkXm77EpBavySk4Rb6RchZCiH9zKS6e++1Z/rz0O+3LdaR6iRocTT7C\nkeRD/HRmLT+dWfuP+7ze+m3GNR6vQlrhyaSchRDi36Ztm8rKk9/SvFRLvnp0ee5BXYqicC37KkeS\nD3Mk+TBHkw9zLv0sT9d+hqdrP6NyauGJpJyFEAKYu/8LPt/3CdWDarD4v4oZcs7pUMq3NKV8S9Op\nQmcVU4riIs+PUgkhhKdbc2oVr//1KuE+pVjeYyXBRllTWahLylkIUaxtvbSF0RtH4Ovtx7LHvqO8\nfwW1Iwkh5SyEKL6OJh9h8M8DUFBY2G0p9UMa5H0nIQqBvOcshCiWLmVcpP8PvUm3pfFF53m0K9dB\n7UhC5JJXzkKIYue6JZUBP/bhStZl3mg9jSdr9FM7khA3kFfOQgiPZXPaOJN2muMpRzmeeozjKcc4\nkXqM+OunsLvsjKg/ijGNnlM7phD/IOUshCjyFEUhIfsah5IOcCjpIIeSDnIs5QjxaadwuBw3bOvn\n7U+D0Ia0L9+Jl5q9Kmf1Em5JylkIUeScSz/Lnmu7OZR0kINJ+zmUdJAkc+IN2/jrA2gY2phawbWp\nUaIWNYNrUbNELcr4lZVCFm5PylkIUaRsPLeeZ37qj1Nx5l5Xwb8i3So/Rr2Q+tQLaUD9kAaU9Ssn\nJSyKLClnIUSRYXVamfznyznL17Z6h0Zhjalbsh5BxhJqRxMiX0k5CyGKjLkHvuRs+hmiGoxmTGM5\nkEt4LvkolRCiSLiWfY1/7f6IYGMwE5pNUjuOEAVKXjkLIYqE97a/TaY9gw9b/0umsYXHk1fOQgi3\ntz9hL18fW0Lt4LoMqjNE7ThCFDgpZyGEW1MUhSlbJqGg8M6D7+OllQk/4fmknIUQbm31qRXsvLqd\nRyv3oG259mrHEaJQSDkLIdxWtj2bt7e9gV6r580H3lE7jhCFRspZCOG2Pt/3CZcyLzKq4VgqBVZW\nO44QhUbKWQjhli5lXOSzvR8T5hPO+KYT1I4jRKGSIyuEEG5p2vY3MDvMfNBuFn56f7XjCFGo5JWz\nEMLt7LiynZUnv6NxWBP61hygdhwhCp2UsxDCrbgUF69tyTkD2DsPfoBWI7+mRPEj09pCCNW4FBeX\nMy9xJu00Secvc+DiEQ4lHWB/4l56V3+K5qVaqh1RCFVIOQshCkWqJYXdV3ey8+oOjqUc4Uzaac6l\nn8XqtP5j28qBVXij9dsqpBTCPUg5CyHynaIonE47xa6rO9l5ZTs7r27nROrxG7YJ0AdSO7gOlQOr\nUDmoKg3L1aWkpgyVA6sQYgqRtZhFsSblLITIF1anlV/OrmflyW/ZfuUvksxJubf5ePnStlwHWpRq\nSYtSrWgQ2ohgY/ANBRwa6k9iYoYa0YVwO1LOQoh7pigK+xL2EHd8GatOfkeqNRWAcn7leaJaH1qU\nbkWLUq2oXbKunBNbiLsg/7cIIe7alczLfHsijm+OL8udrg41hTGq4Vj61XyauiH1VE4oRP7RxZ/E\nuGwJtGkJnR4tlMeUchZC3LH46yeZ/OfL/H5xEy7FhV6rp2fVJ+hXcwAdK3SWV8fCc7hc6H/7BVNM\nNPrfNuZclzpIylkI4V5Op8XTa3V3rmVfpWl4c/rVfJpe1XoTZCyhdjQh8o0mPQ3j8qUYY+fideY0\nAPYWrTBHRhEwdCBctxRKDilnIUSezqefo8/3PbiWfZVpbd4jquEYtSMJka90J45jio3GGPc1muws\nFIMB84BBWCKjcNRvmLORtzcg5SyEcAOXMi7S+/vHuJR5kddavSXFLDyH04n+l/U5U9d/bMq5qmw5\nzC++hGXgEJSSJVWLJuUshLilq1lX6L3mMc5nnOPl5pN5rskLakcS4r5prqdiXLYE0/x56M6fBcD2\nwIOYI6KwdesOXupXo/oJhBBuKSE7gT7f9+BM2mnGN5nIhGaT1I4kxH3RHT2CKSYa44o4NNnZKCYT\n5meGYh4+Emdd9/qEgZSzEOIfks3JPLWmJyevn+DZhuN4teXrcsYuUTQ5HOjX/4wpZg76v/4EwFmh\nIuZhI7A8PQilRLDKAW9OylkIcYPrllT6ru3F0ZQjRNQfyZsPvCPFLIocTXIyxqWLMC2MRXfxAgC2\nth0wR0Zh6/oI6HQqJ7w9KWchRK50axr9f+jNwaT9PFNnKO8++KEUsyhSvA7uxxgTjXHVd2gsFhQf\nX8xDIzBHROGsWUvteHdMylmIYu5y5iV+Pf8LG89t4I+Lm8myZ9Kv5tN81P5jWUtZFA12O4af1mKK\nicZ7xzYAnJUqY44YiaX/QJTAIJUD3j0pZyGKGbvTzs6r2/n1/C/8em4DR1OO5N5WJbAqT1Qfw8Rm\nr0gxC7enSUzEtHgBxoWx6K5eAcDW8aGcqeuHuoK26P4MSzkLUUycSTvNjF3vs+7sT2TY0gEw6ox0\nqtCZzhW60qliF6oEVlU5pRB589r7N6aYaAzfr0Rjs+Hy8yc7MgrL8JE4q1VXO16+kHIWwsOlWJKZ\ntftDFhyKwe6yUyGgEn1r9uehCl14oExbfLx91I4oRN5sNgxrV+dMXf+9CwBHteqYI0Zi7TsAxT9A\n5YD5S8pZCA9ldpiZd2AOn+6ZRbotjYoBlXit1Zv0rPqEHOQligzttasYF83H+NUCdAnXUDQarF0f\nwRwRhb19xyI9dX07Us5CeBiX4uLb48t5f+c7XMq8SAlDCd5p8z5D6kVg0BnUjidE3hQFr907McVG\nY1j7PRq7HVdAINmjxmIeFomrchW1ExY4KWchPMjmC7/x1tbXOZx8EIPOwLjGL/BckxcINBS9o1VF\nMWS1Yli9Imfqev9eABw1a2GOiMLyZD/w81M5YOGRchbCA1zNusKULZNYG78aDRr61hzAKy1eo5x/\nebWjCZEn7eVLGBfFYlq8EG1SEopWi7XbY5gjo7A/2A6K4dswUs5CFGFOl5NFR+bz7va3yLCl06JU\nK95r+xH1QxuqHU2I21MUvHdswxgTjeHHNWicTlxBQWSPHY95aASuChXVTqgqKWchiqhDSQd56ffn\n+fvabgINQczs8CkDaw+Wzyfidw+EAAAgAElEQVQL92Y2Y1z5LcbYuXgfOgCAo049zJFRWHo/BT7y\n6QGQchaiyMmyZzFj1/vM2f8ZTsVJ7+pP8lab9wj3CVc7mhC3pL14AdOCGIxLFqJNTUXR6bD26JUz\ndd3qgWI5dX07d1TO06dPZ//+/Wg0GiZPnkyDBg1yb9u4cSNffvkler2e7t27M2jQoDzvI4S4N7+e\n28CkPyZwPuMcFQIq8WG7mXSq0EXtWELcnKLgvXULpnlz0K/7EY3LhatkSbLGT8QyZDiusuXUTui2\n8iznnTt3cu7cOeLi4oiPj2fy5MnExcUB4HK5mDZtGqtWrSIoKIgRI0bQuXNnzp8/f8v7CCHu3rn0\ns4za9CYrj67ES+vFc41f5MVmL8sJRIR7ysrCuOIbTLHReB3NOT2svUEjzJFRWHv1AaNR5YDuL89y\n3rZtG507dwagatWqpKWlkZmZiZ+fH6mpqQQEBBAcnLMeZqtWrdi6dSsXLly45X2EEHcuy57F7D2z\n+Hzfp1idVpqXaslH7T+mTsm6akcT4p/OnMH3o39hXLYYbdp1FC8vLE/0wRwxCkfzFjJ1fRfyLOek\npCTq1v3/XwTBwcEkJibi5+dHcHAwWVlZnD17lrJly7Jjxw5atGhx2/sIIfKmKAqrTn3H21vf4HLW\nJUr7lmHGwx/ROfwxObuXcC+KgvcfmzHFzIEN6/BRFFwhoWS9+DKWoRG4SpVWO2GRdNcHhCmKkvu1\nRqPh/fffZ/Lkyfj7+1Ou3M3fP/jv+9xKiRI+eHmpu/h1aKi/qo9f0Dx9fOAZY9xzZQ/P/fwcf134\nC4POwJS2U3jlwVfw03v+H7ee8PzdjkeNLzMTvvoKPvsMjh7Nua5FCxg3Du1TT+FrMOCrbsICUVjP\nYZ7lHBYWRlJSUu7lhIQEQkNDcy+3aNGCZcuWATBz5kzKli2L1Wq97X1uJjU1+67D56fQUH8SEzNU\nzVCQPH18UHTHqCgKGbZ0rmRdYe6BL1hyZBEKCt2r9GRq62lUCqyMOU3BL5QiOb47VVSfvzvlKePT\nno7HNH8uxq+Xos1IR/H2xtqnL+YRoyjxcMecMabbAJvaUfNdfj+Htyv6PMu5TZs2zJ49m/79+3P4\n8GHCwsJumJ6OjIzkgw8+wGQysWnTJoYNG0bp0qVvex8hihtFUfj5zI8cSNxLojmRhOxrJGYnkJCd\nQKI5AavTmrttreDavPPgB7Qr10G9wEL8N5cL/aaNOScM+fUXAJzhpch6dizmZ4ahhMvH+PJbnuXc\npEkT6tatS//+/dFoNEydOpWVK1fi7+9Ply5d6Nu3L8OHD0ej0TBy5EiCg4MJDg7+x32EKM6+PraE\n8ZvG3HCdXqsn1CeM2sF1CPUJI8wnnCbhzRhQaxBeWjkFgVCfJiMd4/KlGGPn4nU6HgB785Y5R113\n7wl6vcoJPZdGuZM3hAuB2tM9njLldCuePj5w3zEeTzlG1+/a463VM7frfMr7VyTUFEqgIeiuDu5y\n1/HlFxmf+9CdPJGzIlTc12izMlEMBqxPPIk5MgpHg0a3vF9RGuO9cKtpbSHEvTM7zIzcMBSzw8zn\nD8+TE4YI9+V0ov91A6aYaPSbf8u5qkxZsp5/EfOgoSghIermK2aknIUoQK9teYWjKUcYVi+Sx6r2\nVDuOEP+gSbuOcdkSTPPnojt3FgBb6zaYI6OwdXsMvKQm1CDfdSEKyOqTK1h8ZAF1S9bnrQemqx1H\niBvojh3FFBON8bvlaLKzUYxGzIOGYB4+Eme9+mrHK/aknIUoAGfSTvPi5ufw8fIl5uGFGL3kdIXC\nDTid6Nf/jCk2Gv2fv+dcVb4C5gmRWAY+gxJcUuWA4j+knIXIZzanjagNw8i0Z/DZQ9FUDaqudiRR\nzGlSkjEuXYxpYQy6C+cBsLVtjzkiCtvD3UCn7gmgxD9JOQuRz6Ztn8q+xL30q/k0fWsOUDuOKMZ0\nhw5iio3GuOIbNBYLio8P5iERmCNG4qxVW+144jaknIXIRxvO/kz0/s+pHlSD99rNUDuOKI7sdvQ/\n/5Bz1PX2rQA4K1bCPHwklgEDUYJKqBxQ3AkpZyHyyeXMS4z7dRQGnYG5XRfi5y1nxROFR5OUhGnx\nAowLY9FduQyArUOnnKOuH+oqU9dFjJSzEPkgzXqdUb9EkGpN5cN2/6JuSD21I4liwmvfHkwx0RhW\nr0Bjs+Hy9cM8fATmiCic1WuoHU/cIylnIe5SmvU6BxL3sz9xHwcS97I/cR9n0k4D0KNqL4bUHa5y\nQuHxbDYMP3yPKSYa7907AXBUqYolYiSW/gNR/ANUDijul5SzELeRbE7mYNJ+DiYd4GDivhuK+D+C\nDEG0K9eR5qVaMKbRc7LesigwmmvXMH01H+Oi+egSrgFgfagL5hGjsHd4CLRalROK/CLlLAQ5q0Zd\nyrz47xLez6GkAxxMOsClzIs3bPefIm4Y2oiGoY1oENqIigGVpJBFgfL6exemeXMwrF2Nxm7H5R9A\n9shnsQwfgbNKNbXjiQIg5SyKpWtZV9mXuJe9CX+zL2EP+xP2kmxJvmGbMJ9wHqrQhQahDakX0pD6\nIQ2kiEXhsVoxfL8SU2w03nv3AOCoUTPnqOu+A0CW4fVoUs6iWNhxZTtbL/3J3sScIr6SdfmG2yv4\nV6RVmTY0CGlI/dAG1A9pSLhvKZXSiuJMe+UyxkWxmL5aiDYpEUWjwfrIo5gjorC36wDyx2GxIOUs\nPN7CQ7G8/McLuZfDfUrxSKVHaRjWmMZhTWgQ2pgQk6y4I1SkKHjt3IEpZg6GH9egcThwBQWRPfo5\nzMMicVWspHZCUciknIVH25ewh9e2TCLYGMzMDrNpGt6MUr6l1Y4lRA6LBcOq73KOuj64HwBH7bqY\nI6Ow9OkLPj4qBxRqkXIWHivVkkLE+sHYXXa+6BxDpwqd1Y4kBADaixcwLYzFuGQh2pQUFK0W62OP\nY46Mwt66jUxdCyln4ZlciosxG0dyIeM8E5u9IsUs1KcoeG/dknNazZ/WonG5cAUHk/3ci5iHRuAq\nV17thMKNSDkLj/TJ3zPZeH4DHcp3YkKzSWrHEcVZdjbGFd/AwnkEHTwIgL1+Q8yRUVh79QGTSeWA\nwh1JOQuP88fFzXyw613K+Jbly86x6LRyTmFR+LTnz2FaEINx6SK016+DToelV2/MEaNwtGgpU9fi\ntqSchUe5knmZUb8MR6fREfPwIkqaZPF4UYgUBe8/f8+Zut7wc87UdUgoWS++hO+Lz5Ohl9Nqijsj\n5Sw8ht1pZ8SGoSSZk5j+4Ic0K9VC7UiiuMjMxPjtckzz5+J1/BgA9sZNMEdEYX28NxgM+Ib6Q2KG\nykFFUSHlLDzGKxtfYefV7TxetTcR9aPUjiOKAe3peEwL5mH8eina9DQUb28sffpijozC0bS52vFE\nESblLDzC2vjvmbV9FtWDavCvjrPlFJui4LhceG/+DVNsNPqNG9AoCs6wcLKiRmMePBwlPFzthMID\nSDmLIs3hcvD7hd94/rfR+Hj7EPvIYvz0/mrHEh5Ik5GOIW4Zpti5eMWfAsDetDnmEaOwPvY46PUq\nJxSeRMpZFDkOl4Mtl/5gbfxqfjq9NnfBiiVPLKFWcG2V0wlPozt1ElNsNIa4r9FmZqDo9Vj6DsiZ\num7URO14wkNJOYsiweFy8NelP1kTv+qGQg41hTGsXiR9qveje4POJMoBNyI/uFzof92Qc9T1pl8B\ncJYuQ9a48ZgHDUUJDVU5oPB0Us7CrV23pPLxnpnEHVv6j0J+vGpvWpZuLZ9jFvlGk3Yd49dLMM2f\nh+7sGQBsrR7AHBmFrdtj4O2tckJRXEg5C7dkd9pZdDiWj3a9R6o1lRBTqBSyKDC648cwxURj/HY5\nmuwsFKMR89PPYI6Iwlm/gdrxRDEk5SzciqIo/HJuHW9ufY1T10/irw/g9dZvM6L+KIxeRrXjCU/i\ndKLfsC5n6vrPzTlXlSuP+cWXsQwajBIsJ7AR6pFyFm7jcNIhpm6dwh8XN6HVaBlaN4KXmk8m1Efe\n3xP5R5OagnHpYkwLY9CdPweArU1bzJGjsD3cDbzk16JQn/wUCtVdy77GhzvfZenRr3ApLjpV6Myb\nD7wrR16LfKU7chhTbDTG7+LQmM0oJhPmZ4ZhjhiJs05dteMJcQMpZ6GaNOt1vtw3m+gDX5Jlz6Rm\niVq81eZdOlXoonY04SkcDvQ//5hzwpCtWwBwVqiEefgILE8PQgkqoXJAIW5OylkUuix7FjEH5vDZ\nvk9Is14nzCecN1q/zTN1huKllR9Jcf80yckYly7CtCAG3aWLANjadcw56rrLw6CTAwqFe5PfhKLQ\nWBwWvjo8n4/3zCTJnEgJQwleb/02EfVG4uPto3Y84QG8DuzDFBONYdV3aKxWFB9fzMMic466rlFT\n7XhC3DEpZ1Hg7E47y48vZeauD7icdQlfbz8mNnuFUQ3HEGAIVDueKOrsdgw/rsEUE433zu0AOCpX\nwRIxEkv/gSgB8jMmih4pZ1GgTqQc55mf+3Em7TRGnZHRjZ5jXOMXZJ1lcd80CQmYFi/AuGg+uqtX\nALA+1AVLZBS2jp1Bq1U5oRD3TspZFJhsezYR65/hTNpphtaN4MVmL1PKt7TasUQR57Vnd87U9ZpV\naGw2XH7+ZI8YhWX4CJxVq6sdT4h8IeUsCsyULS9zPPUYI+qP4t22H6odRxRlViuGNaswxUbjvedv\nABzVa2AePhJrvwEofrISmfAsUs6iQKw8+S1Lj35F/ZCGvPHANLXjiCJKe/UKxoWxmBYvRJuYgKLR\nYO36COaIKOztO8rUtfBYUs4i351Oi2fi5vH4evsxr+sCDDqD2pFEUaIoeO3aiSl2Doa136NxOHAF\nBpE9aizm4SNwVaqsdkIhCpyUs8hXVqeVqA3DybRn8EXneVQJqqZ2JFFUWCwYli/NOer6wD4AHLVq\nY46IwvJkP/D1VTmgEIVHylnkq3e2v8n+xL30rzWQJ2v0UzuOKAK0ly5iWhgLSxcRkJSEotVifbQH\n5sgo7G3agkajdkQhCp2Us8g3G87+TPT+z6kWVJ332s5QO45wZ4qC9/atOStC/bQWjdMJwcFkj3sB\n89AIXOUrqJ1QCFVJOYt8cTnzEuN+HYVBZ2Be10X4essUpLiJ7GyMK7/FFBON15FDANjrNcASGYX/\nyGFkZTpUDiiEe5ByFvfN4XIw6pcIUq2pfNBuFnVD6qkdSbgZ7YXzmBbEYFy6CG1qKopOh6XnE5gj\nR+Fo2Qo0GvxNJsjMUDuqEG5Bylnct5m7P2D7la08VuVxhtaNUDuOcBeKgveWP3Kmrtf/hMblwhUS\nQtYLE7EMicBVpqzaCYVwW1LO4q7ZnXYuZJzjTNppDiUdZNbuDynvX4F/dZyNRg7eEVlZGL9djmn+\nXLyOHQXA3rAx5oiRWHv1AaNR5YBCuD8pZ3FbBxL3se3yX5xOi+dM2mnOpJ3mYsYFnIozdxtvrTfR\nXeYTaAhSMalQm/bsGUzz52H8egnatOsoXl5Yej+JOSIKR7MWctS1EHdBylncVJY9i+nb32LewTk3\nXB9qCqNpeHMqB1bJ/a9JeDMqBlRSJ6hQl6Lgvfk3TLHR6H9Zj0ZRcIWGkTVhEpahEbjCS6mdUIgi\nScpZ/MP2K9t4/rdnOZN2mmpB1ZnQbBI1StSkUmBl/PUBascTbkCTmYEhbhmm2Ll4nToJgL1pM8wR\nUVh7PgF6vcoJhSjapJxFLrPDzHs7phG9/3MARjd6jkktpmDyMqmcTLgL3elTGGPnYvx6KdrMDBS9\nHstT/TFHRuFo3FTteEJ4jDsq5+nTp7N//340Gg2TJ0+mQYMGubctXbqUNWvWoNVqqVevHlOmTGHl\nypV88sknVKiQcyKBBx54gGeffbZgRiDyxe6rOxn32yjir5+iSmBVPu00hxalW6odS7gDlwv9b7/k\nHHX920YAnKVKkzX2ecyDhqKEhakcUAjPk2c579y5k3PnzhEXF0d8fDyTJ08mLi4OgMzMTGJjY9mw\nYQNeXl4MHz6cfftyzon76KOPMmnSpIJNL+6bxWHhw13T+WLfpyiKQlTDMbza4nV8vH3UjiZUpklP\nw7h8KcbYuXidOQ2AvUUrzJFRWLv3BG9vlRMK4bnyLOdt27bRuXNnAKpWrUpaWhqZmZn4+fnh7e2N\nt7c32dnZ+Pj4YDabCQwMLPDQ4u7ZnDZOp8VzPv0cFzLO//vfc+y+tpvz6WepFFCZTzt9SasyD6gd\nVahMd+I4pthojHFfo8nOQjEYMA8YhCUyCkf9hmrHE6JYyLOck5KSqFu3bu7l4OBgEhMT8fPzw2Aw\nMGbMGDp37ozBYKB79+5UrlyZvXv3snPnTiIiInA4HEyaNIk6deoU6EDEP227/Bcf7pzOmbTTXMm6\njILyj230Wj2R9aOY0upNOeVmceZ0ov9lfc7U9R+bcq4qWw7ziy9hGTgEpWRJlQMKUbzc9QFhivL/\nv+AzMzOJjo5m3bp1+Pn5MWTIEI4dO0bDhg0JDg6mQ4cO7N27l0mTJrF27drb7rdECR+8vHR3P4J8\nFBrqr+rj56etF7Yy4Mc+mO1mygWUo23FtlQOqkyloEpUDqpM5RKVqRxUmTL+ZdBp1f2+5ydPeg5v\nJt/Hl5oKsbHwxRdw5kzOde3bw7hx6B5/HD8vL/zy9xFvS56/os/Tx1hY48uznMPCwkhKSsq9nJCQ\nQGhoKADx8fGUL1+e4OBgAJo1a8ahQ4d48sknqVq1KgCNGzcmJSUFp9OJTnfrEkhNzb6vgdyv0FB/\nEhM947y+BxL30fv7HlgdVhZ2W0a3yt1vPj4bpCSr+33PT570HN5Mfo5Pd/QIpphojCvi0GRno5hM\nWJ4Zinn4SJx1/31u9FRzvjzWnZLnr+jz9DHm9/huV/TavO7cpk0b1q9fD8Dhw4cJCwvDzy/nb+my\nZcsSHx+PxWIB4NChQ1SqVIl58+bxww8/AHDixAmCg4NvW8wi/xxLOUrftb3IsKXzeee5dKvcXe1I\nwl04HOh/WEPgE90Jbt8K0+IFuEJCyZz6Dsn7jpI589P/L2YhhKryfOXcpEkT6tatS//+/dFoNEyd\nOpWVK1fi7+9Ply5diIiIYPDgweh0Oho3bkyzZs0oV64cL730EsuXL8fhcPDuu+8WxliKvTNpp3lq\nzeOkWFKY1WE2vas/pXYk4QY0KckYl3yFaWEMuosXALC17YB5xChsXR4G+cNZCLejUf77TWQVqT0V\nUtSnYy5lXKTn6ke4kHGeaW3eI6rhmBtuL+rjuxOePsa7HZ/u4IGco65XfovGYkHx8cXStz/miCic\nNWsVYNJ7I89f0efpYyzMaW05Q5gHuJZ9jT5renAh4zyvtnj9H8UsihG7Hf3PP+Azbw7eO7YB4KxU\nGXPESCz9B6IEyuIkQhQFUs5FXKolhb5renE6LZ7nGr/I+KYT1Y4kVKBJTMS0ZCHGhbHorlwGwNbx\nIcyRUdge6graPA8vEUK4ESlnN+V0OVlydBHXsq4SaAgk0BCEvz6AQEMgAfoAAvSB6HV6hq0byNGU\nw0TUH8mUVlNlPeVixmvfHkwx0RhWr0Bjs+Hy9cMcMTJn6rpadbXjCSHukZSzG7puSWXkL8PYfOG3\nO9q+f62BvPvgh1LMxYXNhmHtakwx0Xj/vQsAR9VqmCNGYu33NIq/rBwmRFEn5exmjqUcZfBP/Tmb\nfobOFboS1XAMGbYMMmzppNmuk25NJ92WRpo1jXRbOrWDa/NS88loNTJt6fGuXMFn1qcYv1qALuEa\nikaDtcvDmCOisHfoJFPXQngQKWc38uPptYzZOJJsRxbjm0xkUospHnX2LnEPFAWv3TsxxUbDmtX4\nOhy4/APIjhqDeVgkripV1U4ohCgAUs5uwKW4+GjXe8zc/QE+Xj7EdF1Ez2pPqB1LqMlqxbB6Rc7U\n9f69OdfVqUPGkEgsT/UHv8I8qaYQorBJOassw5bOmI0jWXf2JyoEVGLRI8uoGyJnaSqutJcvYVwU\ni2nxQrRJSShaLdZHumOOjCKo92NYkjLVjiiEKARSziqKv36SIT8/zYnU47Qt14F5XRcQbJTVf4od\nRcF7xzaMMdEYflyDxunEFRRE9pjnc6auK1TM2U4O+BOi2JByVsn2y1sZ9FM/0m1pRDUcw9TW0/DS\nytNRrJjNGFd9hzEmGu9DBwBw1KmHOTIKS++nwMdH5YBCCLVIG6hg++Wt9P+hDzaXldmd5tCv1tNq\nRxKFSHvxAqYFMRiXLkKbkoKi02Ht0QtzZBT2Vg/IK2QhhJRzYfvvYo7p+hWPVnlM7UiiMCgK3lu3\nYJo3B/26H9G4XLhKliRr/EQsQ4bjKltO7YRCCDci5VyIpJiLoawsjCu+wRQbjdfRIwDYGzTCHBmF\ntVcfMBpVDiiEcEdSzvfI6XKi0Wju+OQfUszFi/bcWUzz52Fcthht2nUULy8sT/TBHDEKR/MWMnUt\nhLgtKed7kGpJoeeqR0i1pjK4zjAG1x1GKd/St9xeirmYUBS8f9+EKTYa/YZ1aBQFV2gYWRMm5Uxd\nl7r1z4gQQvw3Kee7ZHfaidwwlOOpx9Br9czY/T4f75lBjyqPM7x+FC1KtbzhHNdSzJ5Pk5mB4Zvl\nmObPxevEcQDsTZpijojC2vMJMBhUTiiEKGqknO/SG1tf5c+Lm3mkcnc+fyialSe/I/ZgNKtOrWDV\nqRXUC2lAZP0onqj+JPsT9koxezDd6VMYY+diXL4MbUY6irc3lif7YY6MwtGkmdrxhBBFmEZRFEXt\nEACJiRmqPn5oqH+eGRYdns9Lv4+ndnAdfuz9C356fwAURWHr5S3EHpzLz2d+wKk4KWEogdVpc5ti\nvpPxFXWFMkaXC/2mjTknDPn1FwCc4aWwDI3A/MwwlLCwAntoT38OZXxFn6ePMb/HFxrqf8vb5JXz\nHfrr0p+8+udEShpL8tWjy3OLGUCj0dCmbFvalG3LpYyLLDo8n8VHFmB32dyimMX906SnYVy+FOP8\neXidjgfA3rxlzlHX3XuCXq9yQiGEJ5FyvgNn084wfN0gAOY/soSKAZVuuW1Z/3JMbvUGE5pPIt2a\nTqhPaCGlFAVBd/IEpthoDHFfo83KRDEYsPQfmDN13aCR2vGEEB5KyjkPGbZ0Bv/cn1RrKjM7fErr\nMm3u6H4GnUGKuahyOtFv3IApZg763zflXFWmLJnjJ2AZOAQlJETlgEIITyflfBtOl5Nnf4nkWMpR\nRtQfxTN1hqodSRQgTdp1jMuWYJo/F925swDYWrfBHBmFrdtj4CX/uwghCof8trmN6TveZsO5dbQv\n15G32kxXO44oILpjRzHFRGP8bjma7GwUoxHzoCGYh4/EWa++2vGEEMWQlPMtfHt8ObP3/osqgVWZ\n13WhrBjlaZxO9Ot+yjlhyJY/cq4qXwHzhEgsA59BCZalO4UQ6pHG+R82p40v983mo13vEaAPZMmj\n3xBkLKF2LJFPNCnJGJd8hWlhDLqLFwCwtW2POSIK28PdQKdTOaEQQkg532DLpT+Y9PuLnLx+ghBT\nKNFd5lOtRHW1Y4l8oDt0EFNsNMYV36CxWFB8fDAPicAcMRJnrdpqxxNCiBtIOQMJ2Qm8sPJZlh5c\nigYNw+pFMrnlGwQagtSOJu6Hw4H+p7WYYqLRb98KgLNiJczDR2IZMBAlSGZEhBDuqViXs9PlZNGR\n+Uzf/jbptjQahjbmw3azaBzeVO1o4j5okpIwLVmIcWEsusuXALB16JRz1PVDXWXqWgjh9optOe9L\n2MPLv7/AvsS9BOgD+azbZ/SpOBCdVn5xF1l//43/R7MwrF6BxmrF5euHOWIk5ogonNXk7QkhRNHh\n8eXscDk4m3aGYylHOZZyJPffk6knUFDoU70vb7Z5l3oVq3n0OWE9lt2O4YfvMcVEw64dGAFHlapY\nIkZi6T8QxT9A7YRCCHHXPLKcd1zZzqLDsRxLOcrJ1ONYndYbbvfXB9C6TBsmNJtE23LtVUop7ofm\n2jVMixdgXDQf3bWrOVc++ijXB0dg7/AQaLXqBhRCiPvgkeW86HAs352Iw+RlolZwHWoG16JWcB1q\nB9emVnAdyviVvWHNZVF0eP29C1NMNIY1q9DY7bj8A8iOGo152AhKtmyEXWY/hBAewCPLeVaH2Uxq\nMYVyfuXlPWRPYLVi+H4lpthovPfuAcBRo2bOUdd9B4Cfn8oBhRAif3lkORu9jLddOUoUDdorlzEu\nisX01UK0SYkoGg3WRx7FHBGFvV0HkNkPIYSH8shyFkWYouC1cwemmDkYflyDxuHAFRhE9rPjMA+L\nxFWpstoJhRCiwEk5C/dgNmNYvQJTTDTeB/cD4KhdB3NEFJY+fcHXV+WAQghReKSchaq0Fy9gWhiL\ncclCtCkpKFot1u49MUdGYX/gQZm6FkIUS1LOovApCt5bt+ScVvPnH9C4XLiCg8l+7kXMQyNwlSuv\ndkIhhFCVlLMoPNnZGFd8gykmGq+jhwGw12+IOTIKa68+YDKpHFAIIdyDlLMocNrz5zDNn4dx2Vdo\nr19H0emw9OqNOWIUjhYtZepaCCH+h5SzKBiKgvefv+dMXW/4OWfqOiSUrBdfwjIkAlfpMmonFEII\ntyXlLPJXZibGb5djmj8Xr+PHALA3aow5chTWx3uDwaByQCGEcH9SziJfaE/HY1owD+PXS9Gmp6F4\ne2Pp/RTmEaNwNG2udjwhhChSpJzFvXO58N78G6bYaPQbN6D5v/buPiyqOu/j+HseYRBEx4B8XNS7\n1HTzpmUrNVFMLdcue9jd7igEZUhaH2rrKjXcpP2jfAi7ajdLBCxLVG6Rbam8hHW1aytIrct0wSWT\nu5J8BDRlYEaY4Xf/MTllCgjlnGH4vv5yznCO348/zvnO/M7PGaVwR0bRkDYXR1IKKipK6wqFEKJL\nkuYsOkxXf46g/I1YctdirDoMQHPszZ5V13fdDWazxhUKIUTXJs1ZXDHD4S+w5GYRlL8Jvb0eZTbj\nvD8BR2oarv++SevyhESWSWIAABDuSURBVBAiYEhzFm1racH8zxLPqutd/wTA3bcfDQv+iCNxFioi\nQuMChRAi8EhzFpelO/stwZs2YFmXjeGrLwFounUsjtQ0mqbdBSaTxhUKIUTgkuYsLmL4vBJLbhbB\n/7sZXWMDKjgYx4MzcdjScP/yRq3LE0KIbkGaswC3G3PJds/U9QfvezYNGIjjiYU4E5NQ1j7a1ieE\nEN2MNOduTHfmNMEbN2B5PRvDka8BaLotDoctjaY7poFRfj2EEEILcvXthgwHKzxT1wX56BwOlMWC\nY+ZsHLY5uG8YqXV5QgjR7V1Rc37++efZv38/Op2O9PR0brzx+3uPeXl5FBUVodfrGTVqFEuWLKG5\nuZnFixdz7NgxDAYDy5YtY+BA+RpATblcmN/5u+cDQ0o/BMA9KBpHysM4H0xE9eqtcYFCCCEuaLc5\n79mzh6+//pr8/HyqqqpIT08nPz8fALvdTm5uLiUlJRiNRlJSUvjss8/48ssv6dmzJ6tWreLDDz9k\n1apVvPTSS1c9jLiUrq6O4A1vwJvrCK+uBqBpQjyO1EdomjwVDAZtCxRCCHGJdptzWVkZkydPBmDo\n0KGcPXsWu91OaGgoJpMJk8lEY2MjISEhOBwOwsPDKSsr45577gFg7NixpKenX90U4hLGA59hycki\n6G8F6M6fhx49cMxO9ay6vn6Y1uUJIYRoQ7vNuba2lpEjv78PabVaqampITQ0lKCgIObNm8fkyZMJ\nCgpi+vTpDB48mNraWqxWKwB6vR6dTkdTUxNm+VjHq6u5maD3irDkZGHa8zEArsFDcNrmEDr/EexN\neo0LFEIIcSU6vCBMKeX9s91uJysri+3btxMaGkpycjKVlZVt7tOa3r1DMBq1nWKNiAjT9O/vtJMn\nYe1aWLMGjh3zbLvzTnj0UYx33EGo3tOUu8NneXXZMbxCkq9rC/R8EPgZfZWv3eYcGRlJbW2t9/Gp\nU6eI+O4jG6uqqhg4cKD3XXJsbCzl5eVERkZSU1PD8OHDaW5uRinV7rvmM2caf0qOnywiIoyamnpN\na+go475PPVPXfy9E19RES2gYzocfwZnyMO6h13l+qK4B6Jr5OirQM0q+ri3Q80HgZ/y587XV6Nud\n5xw3bhzFxcUAVFRUEBkZSWhoKAD9+/enqqoKp9MJQHl5OdHR0YwbN47t27cDsGvXLm655ZafHEJ8\np6mJoIJ8ek2bRO874gneshn3L6KpX5bJ6QOVNDy38vvGLIQQoktq953zTTfdxMiRI3nggQfQ6XRk\nZGRQWFhIWFgYU6ZMwWazkZSUhMFgICYmhtjYWNxuN6WlpSQkJGA2m1m+fLkvsgQ0/YnjBK9fh+XN\n19HXnELpdJyfeicOWxrNEyeBTqd1iUIIIX4mOnUlN4R9QOupEL+cjlEK4949WHLXEPTO39G5XLT0\nDMf54Ewcs1NpGTzkig/ll/l+ZoGeUfJ1bYGeDwI/oy+nteUTwvyR00nQ21s9q64PfAaAa/gIHLY0\nnL/7H+jRQ+MChRBCXE3SnP2I/ug3WN7IJXjDG+jr6lB6Peen3YUjNY3m2+Jk6loIIboJac5aUwrT\nx6Web4Ta9g46t5uW3r1pnP9HHLNstAz6hdYVCiGE8DFpzlppbCT4bwVYcrIwVvwbANfIX+JITcN5\n3+/BYtG4QCGEEFqR5uxj+uojWF7PIThvPfozZ1AGA84Z9+JMTaP5ljEydS2EEEKas08ohenDf3mm\nrou3oWtpoeWaa2h4/EmcyTZa+vXXukIhhBB+RJrz1dTQQPCWzVjWrcVY+R8AmkfH4EhN4/zd90Fw\nsMYFCiGE8EfSnK8C/VdfYlmXTfDGt9CfO4syGnHe9zsctjRcsTfL1LUQQog2SXP+uSiF6f2dWHKz\nMP+jGJ1StERE0vDkYpzJKbREXat1hUIIIboIac4/kc5eT1D+Riy5azEe/gKA5l/F4rClcX7GvSBf\nkymEEKKDpDl3kqHqC4LXZRO8KQ+9vR5lNuP8/QM4UtNwxfxK6/KEEEJ0YdKcO6KlBfPOf3hWXe/c\nAYD72r40zH8Mx8zZqIju8I3JQgghrjZpzldAd+4swZs2ELwuG+OX/wdA8823elZdT58BJpPGFQoh\nhAgk0pzbYDj0OZbcLILzN6FrbEAFBeFISMSZmobrl6O1Lk8IIUSAkub8Y2435n8Ue6au/7XLs6n/\nABxPPIXzoWRUnz4aFyiEECLQSXO+4MwZLKtfxfJ6DoYjXwHQNPY2HLY0mqZNB6P8UwkhhPCNbt9x\nDP85iCUnC7bmE9rYiLJYcMychSNlDu6Ro7QuTwghRDfUPZuzy4V5+zbPB4Z89IFnW3Q09uRUnA8m\nonpbta1PCCFEt9atmrPudB3BG97E8kYOhm+qAWgaPxFHahrhD/0ex+lGjSsUQgghuklzNvz7gGfV\ndeEWdE4nKqQHjlk2HLY03MOGf/dDBm2LFEIIIb4TuM25uZmgbe9gycnCtLsMAHf0YBwpD+NMSESF\n99K4QCGEEOLyArI5m7e9S+jTT2I4fgyApvjbcaSm0XT7VNDrNa5OCCGEaFtgNudd/0RXX09jahrO\nlDm4/+s6rUsSQgghrlhANmf7ilXYl2fKfWQhhBBdUkA2Z5m6FkII0ZVJFxNCCCH8jDRnIYQQws9I\ncxZCCCH8jDRnIYQQws9IcxZCCCH8jDRnIYQQws9IcxZCCCH8jDRnIYQQws9IcxZCCCH8jDRnIYQQ\nws9IcxZCCCH8jE4ppbQuQgghhBDfk3fOQgghhJ+R5iyEEEL4GWnOQgghhJ+R5iyEEEL4GWnOQggh\nhJ+R5iyEEEL4GaPWBVxNzz//PPv370en05Gens6NN97ofS4vL4+ioiL0ej2jRo1iyZIluFwulixZ\nwpEjR3C73SxcuJDY2FhmzpxJY2MjISEhACxatIhRo0ZpFcuro/kKCwt5+eWXGTRoEABjx47lD3/4\nA5WVlTz77LMADBs2jD//+c9axLlER/O99tprlJaWAtDS0kJtbS3FxcVMmjSJa6+9FoPBAEBmZiZR\nUVGaZPqxtjLu2LGD1157DbPZzPTp00lMTGx1n+PHj7Nw4ULcbjcRERG88MILmM1mrWJ5dSbfypUr\n+fTTT3G5XKSlpTF16lQWL15MRUUFvXr1AsBmszFx4kQtIl2ko/l2797NY489xnXXXQfA9ddfzzPP\nPBMw47dlyxaKioq8P1NeXs6+ffv89hoKcOjQIebOncusWbO8v4MXlJaW8uKLL2IwGIiLi2PevHmA\nj85BFaB2796t5syZo5RS6vDhw+r+++/3PldfX6/i4+NVc3OzUkqp2bNnq3379qmCggKVkZGhlFLq\n0KFD6re//a1SSqnExET1+eef+zZAOzqTb+vWrWr58uWXHCsxMVHt379fKaXUE088od5//30fJGhb\nZ/L9UGFhocrOzlZKKRUfH6/sdruPKr9ybWV0u90qLi5O1dXVKbfbrVJSUtTx48db3Wfx4sVq27Zt\nSimlVq1apfLy8nyc5lKdyVdWVqZSU1OVUkqdPn1aTZgwQSml1KJFi9TOnTt9nqEtncn38ccfqwUL\nFlxyrEAZvx/v/+yzzyql/PMaqpRSDQ0NKjExUf3pT39Sb7311iXPT5s2TR07dky53W6VkJCgvvji\nC5+dgwE7rV1WVsbkyZMBGDp0KGfPnsVutwNgMpkwmUw0NjbicrlwOByEh4czY8YMnn76aQCsVivf\nfvutZvW3pzP5LqepqYmjR496XxHHx8dTVlbmmxBt+Cn5XC4XmzZtuuRVsL9pK+OZM2fo2bMnVqsV\nvV7PrbfeSmlpaav77N69m9tvvx3oGmPYWr5f//rXvPzyywD07NkTh8OB2+3WLENbOpOvNYEyfj+0\nevVq5s6d6/O6O8JsNpOdnU1kZOQlz1VXVxMeHk7fvn3R6/VMmDCBsrIyn52DAduca2tr6d27t/ex\n1WqlpqYGgKCgIObNm8fkyZOJj49n9OjRDB48GJPJRFBQEADr16/nrrvu8u7/l7/8hYceeoilS5fi\ndDp9G+YyOpMPYM+ePdhsNpKTkzl48KD3JLugT58+3uNoqbP5AEpKSrjtttsIDg72bsvIyCAhIYHM\nzEyUn3woXlsZrVYrDQ0NfPXVVzQ3N7N7925qa2tb3cfhcHin0LrCGLaWz2AweKc+CwoKiIuL896O\n2LBhA0lJSTz++OOcPn3a94F+pDP5AA4fPswjjzxCQkICH330EUDAjN8FBw4coG/fvkRERHi3+ds1\nFMBoNF50nfihmpoarFar9/GF/L46BwP6nvMP/fCCbLfbycrKYvv27YSGhpKcnExlZSXDhw8HPPcz\nKyoqWLNmDQBJSUkMGzaMQYMGkZGRQV5eHjabTZMcrbmSfKNHj8ZqtTJx4kT27dvHokWLyMnJafU4\n/qQj47d169aL7ps/+uijjB8/nvDwcObNm0dxcTF33nmnzzO054cZdTody5cvJz09nbCwMAYMGNDu\nPm1t8wcdybdjxw4KCgpYt24dAHfffTe9evVixIgRrF27lldeeYWlS5f6tP72XEm+6Oho5s+fz7Rp\n06iuriYpKYmSkpJWj+NPOjJ+BQUF3Hvvvd7HXeEa2llX6xwM2HfOkZGRF72SO3XqlPdVXFVVFQMH\nDsRqtWI2m4mNjaW8vByALVu2sHPnTl599VVMJhMAU6ZM8S6imjRpEocOHfJxmkt1Jt/QoUO9i2hi\nYmI4ffo0vXv3vmj6/uTJk5ed4vG1zo5fY2MjJ06cuOhicc8999CnTx+MRiNxcXF+MX7QdkaAm2++\nmY0bN5KVlUVYWBj9+/dvdZ+QkBDvu5GuMIZw+XwAH3zwAWvWrCE7O5uwsDAAxowZw4gRI4CucQ7C\n5fNFRUXxm9/8Bp1Ox6BBg7jmmms4efJkQI0feKbpY2JivI/98Rranh/nvzAuvjoHA7Y5jxs3juLi\nYgAqKiqIjIwkNDQUgP79+1NVVeX9hywvLyc6Oprq6mo2b97MK6+84p3eVkoxa9Yszp07B3h+6S6s\ntNRSZ/JlZ2fz7rvvAp4Vihea25AhQ/jkk08Az5Tw+PHjNUh0sc7kA6isrGTIkCHe49TX12Oz2Whq\nagJg7969fjF+0HZGgNTUVOrq6mhsbGTXrl2MGTOm1X3Gjh3r3d4VxhAun6++vp6VK1eSlZXlXZkN\nsGDBAqqrq4GucQ7C5fMVFRWRm5sLeKZN6+rqiIqKCpjxA09j6tGjh3eK11+voe0ZMGAAdrudb775\nBpfLxa5duxg3bpzPzsGA/laqzMxMPvnkE3Q6HRkZGRw8eJCwsDCmTJnC5s2bKSwsxGAwEBMTw8KF\nC3nxxRd577336Nevn/cYubm57Nixg5ycHCwWC1FRUTz33HNYLBYNk3l0NN+JEyd46qmnUErhcrm8\n/wXg8OHDLF26lJaWFkaPHu1dFKe1juYDKC4uprS09KJp7fXr1/P2228TFBTEDTfcwDPPPINOp9Mq\n1kXaylhSUsLq1avR6XSkpKQwY8aMy+4zfPhwTp06xaJFizh//jz9+vVj2bJl3pkfLXU0X35+Pn/9\n618vWkOwYsUKjhw5wgsvvIDFYiEkJIRly5bRp08fDZN5dDSf3W7nySef5Ny5czQ3NzN//nwmTJgQ\nMOMHnhfLL7300kW3zLZt2+aX19Dy8nJWrFjB0aNHMRqNREVFMWnSJAYMGMCUKVPYu3cvmZmZAEyd\nOtU7Fe+LczCgm7MQQgjRFQXstLYQQgjRVUlzFkIIIfyMNGchhBDCz0hzFkIIIfyMNGchhBDCz0hz\nFkIIIfyMNGchhBDCz0hzFkIIIfzM/wMpJNWCaMieOgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "jgmH3wwt1src", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Okay, so we are doing good!
\n", + "\n", + "Now, let me just put everything here into one function so that you can tweak the hyperparameters easily!\n", + "\n", + "Or better, do it yourself!" + ] + }, + { + "metadata": { + "id": "OZ5TY7B_4E_v", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "def linear_regression(learning_rate=0.000005, n_epochs=100, interval=50, weight=0.0, bias=0.0):\n", + " # YOUR CODE HERE\n", + "\n", + " x = tf.placeholder(tf.float32, name='x')\n", + " y = tf.placeholder(tf.float32, name='y')\n", + " W = tf.Variable(weight, name='weight_1')\n", + " b = tf.Variable(bias, name='bias_1')\n", + " pred_y = (W*x) + b\n", + " loss = tf.reduce_mean(tf.square(y - pred_y))\n", + " optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)\n", + " with tf.Session() as sess:\n", + " sess.run(tf.global_variables_initializer())\n", + " for epoch in range(n_epochs):\n", + " _, curr_loss = sess.run([optimizer, loss], feed_dict={x:train_X, y:train_Y})\n", + "\n", + " if epoch % interval == 0:\n", + " print('Loss after epoch', epoch, ' is ', curr_loss)\n", + "\n", + " #Now testing the model in the test set\n", + " final_preds, final_loss = sess.run([pred_y, loss], feed_dict={x:test_X, y:test_Y})\n", + "\n", + " print('The final loss is: ', final_loss)\n", + "\n", + " plt.plot(test_X[:10], test_Y[:10], 'g', label='True Function')\n", + " plt.plot(test_X[:10], final_preds[:10], 'r', label='Predicted Function')\n", + " plt.legend()\n", + " plt.show()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "A6MaclhK4rc6", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 534 + }, + "outputId": "1af7a819-1b18-4670-e256-0ed316375778" + }, + "cell_type": "code", + "source": [ + "# Okay! Now let's tweak!\n", + "linear_regression(learning_rate=0.000034, n_epochs=500)" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.19403577\n", + "Loss after epoch 50 is 0.19295721\n", + "Loss after epoch 100 is 0.1918868\n", + "Loss after epoch 150 is 0.19082442\n", + "Loss after epoch 200 is 0.1897701\n", + "Loss after epoch 250 is 0.18872368\n", + "Loss after epoch 300 is 0.18768515\n", + "Loss after epoch 350 is 0.18665445\n", + "Loss after epoch 400 is 0.1856315\n", + "Loss after epoch 450 is 0.18461625\n", + "The final loss is: 0.80066\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "peoHmV2M40uU", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 704 + }, + "outputId": "ffe32c3f-bb58-405f-81f1-30c297222bf4" + }, + "cell_type": "code", + "source": [ + "linear_regression(learning_rate=0.0000006, n_epochs=1000)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.19403577\n", + "Loss after epoch 50 is 0.19401667\n", + "Loss after epoch 100 is 0.19399756\n", + "Loss after epoch 150 is 0.19397846\n", + "Loss after epoch 200 is 0.19395939\n", + "Loss after epoch 250 is 0.19394028\n", + "Loss after epoch 300 is 0.1939212\n", + "Loss after epoch 350 is 0.19390209\n", + "Loss after epoch 400 is 0.19388302\n", + "Loss after epoch 450 is 0.19386394\n", + "Loss after epoch 500 is 0.19384487\n", + "Loss after epoch 550 is 0.19382578\n", + "Loss after epoch 600 is 0.19380671\n", + "Loss after epoch 650 is 0.19378762\n", + "Loss after epoch 700 is 0.19376855\n", + "Loss after epoch 750 is 0.1937495\n", + "Loss after epoch 800 is 0.19373043\n", + "Loss after epoch 850 is 0.19371136\n", + "Loss after epoch 900 is 0.1936923\n", + "Loss after epoch 950 is 0.19367325\n", + "The final loss is: 0.8312258\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "KjY_KnlE5ClG", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "## Drive the loss to a minimum." + ] + }, + { + "metadata": { + "id": "JKiHjGN15HPX", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 551 + }, + "outputId": "fa12a7b0-f19e-482f-d748-b849443be069" + }, + "cell_type": "code", + "source": [ + "# YOUR CODE HERE\n", + "linear_regression(learning_rate=0.005, n_epochs=100001, interval=10000, weight=6.0, bias=-10.0)\n" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 68.97549\n", + "Loss after epoch 10000 is 2.1100524e-05\n", + "Loss after epoch 20000 is 3.9968963e-06\n", + "Loss after epoch 30000 is 3.9968963e-06\n", + "Loss after epoch 40000 is 3.9968963e-06\n", + "Loss after epoch 50000 is 3.9968963e-06\n", + "Loss after epoch 60000 is 3.9968963e-06\n", + "Loss after epoch 70000 is 3.9968963e-06\n", + "Loss after epoch 80000 is 3.9968963e-06\n", + "Loss after epoch 90000 is 3.9968963e-06\n", + "Loss after epoch 100000 is 3.9968963e-06\n", + "The final loss is: 4.7825715e-06\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nlCT8gAphdQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "7FZ_5GXOY96c", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file