From f4f298187f6ef906d01c0ca2ee7cedac74d179d5 Mon Sep 17 00:00:00 2001 From: Sayani Roy Chowdhury Date: Mon, 15 Oct 2018 21:20:18 +0530 Subject: [PATCH 1/2] Assignment 4 - Part 1 --- VicktorKrum.ipynb | 364 +++++++++++----------------------------------- 1 file changed, 83 insertions(+), 281 deletions(-) diff --git a/VicktorKrum.ipynb b/VicktorKrum.ipynb index 0a721fb..42a44b3 100644 --- a/VicktorKrum.ipynb +++ b/VicktorKrum.ipynb @@ -257,18 +257,35 @@ "metadata": { "id": "-uHNe1BolJY0", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "fd1257be-a291-4541-f615-4806e3eefff1" }, "cell_type": "code", "source": [ - "# Build the graph\n", - "# YOUR CODE HERE\n", - "\n", - "# Execute \n", - "# YOUR CODE HERE" + "cg1 =tf.cast(tf.add([7.65,9],[13.5,7.18]),dtype=tf.float64)\n", + "a = tf.cast(tf.constant([9,10], shape=[1,2]),dtype=tf.float64)\n", + "b = tf.cast(tf.constant([7,8.65], shape=[1,2]),dtype=tf.float64)\n", + "c = tf.cast(tf.constant(5.6), dtype = tf.float64)\n", + "cg2 = tf.divide(tf.multiply(a,b), c)\n", + "ok = tf.minimum(cg1,cg2)\n", + "ses = tf.Session()\n", + "part1_res, part2_res, total_res = ses.run([cg1,cg2,ok])\n", + "print(total_res)\n", + "\n" ], - "execution_count": 0, - "outputs": [] + "execution_count": 38, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[11.25000019 15.44642815]]\n" + ], + "name": "stdout" + } + ] }, { "metadata": { @@ -289,18 +306,42 @@ "metadata": { "id": "0ZhYwAlLmEvB", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "c90464c2-d36a-49a3-ffc7-e050d031fa09" }, "cell_type": "code", "source": [ "# Build the graph\n", + "a = tf.cast(tf.constant([1.2,3.4,7.5,8.6], shape=[2,2]), dtype=tf.float64)\n", + "b = tf.cast(tf.constant([7,9,8,6], shape=[2,2]), dtype=tf.float64)\n", + "c = tf.cast(tf.constant([2.79,3.81,5.6,7.3,5.67,8.9], shape=[2,3]), dtype=tf.float64)\n", + "d = tf.cast(tf.constant([2.6,18.1,7.86,9.81,9.36,10.11], shape=[3,2]), dtype=tf.float64)\n", "# YOUR CODE HERE\n", - "\n", + "e = tf.cast(tf.transpose(d),dtype=tf.float64)\n", + "f = tf.matmul(c,d) \n", + "g = tf.matmul(a,b)\n", + "#h = tf.reduce_sum(f,g)\n", + "h = tf.add(g,f)\n", "# Execute \n", + "ses = tf.Session()\n", + "part1_res, part2_res, total_res = ses.run([e,f,g])\n", + "print(total_res)\n", "# YOUR CODE HERE" ], - "execution_count": 0, - "outputs": [] + "execution_count": 64, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[ 35.6000011 31.200001 ]\n", + " [121.30000305 119.10000229]]\n" + ], + "name": "stdout" + } + ] }, { "metadata": { @@ -318,293 +359,54 @@ "metadata": { "id": "GQWyCvsQmMcL", "colab_type": "code", - "colab": {} + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "ad713b59-d3fb-4899-afeb-3399b1252772" }, "cell_type": "code", "source": [ "# Build the graph\n", + "a = tf.cast(tf.constant([7.36,8.91,10.41, 5.31,9.38,7.99], shape =[2,3]), dtype=tf.float64)\n", + "b = tf.cast(tf.constant([7.99,10.36,5.36,7.98,8.91,5.67], shape=[2,3]), dtype=tf.float64)\n", + "c = tf.cast(tf.transpose(b), dtype=tf.float64)\n", + "d = tf.cast(tf.constant([1,5.6,6.1,8,0,0,7.98,9,0,0,7.6,7,0,0,0,8.98], shape=[4,4]), dtype=tf.float64)\n", "# YOUR CODE HERE\n", - "\n", + "e = tf.cast(tf.multiply(a,b), dtype=tf.float64)\n", + "f = tf.cast(tf.reduce_sum(e), dtype=tf.float64)\n", + "f2 = tf.cast(tf.constant(7), dtype=tf.float64)\n", + "g = tf.add(f,f2)\n", + "h = tf.divide(g, tf.cast(tf.constant(19.6),dtype=tf.float64))\n", + "i = tf.divide(h, tf.reduce_sum(d))\n", "# Execute \n", + "ses = tf.Session()\n", + "part1_res, part2_res, total_res = ses.run([f,h,i])\n", + "print(total_res)\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!" + "execution_count": 74, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.32078435417455814\n" + ], + "name": "stdout" + } ] }, { "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", + "id": "z8lXR6_kZiEu", "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", + "#INCOMPLETE\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." + "\n" ] - }, - { - "metadata": { - "id": "JKiHjGN15HPX", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "# YOUR CODE HERE" - ], - "execution_count": 0, - "outputs": [] } ] } \ No newline at end of file From 46fed4f3509167dfe2db5131827a7ba3c8ea6939 Mon Sep 17 00:00:00 2001 From: Sayani Roy Chowdhury Date: Mon, 15 Oct 2018 23:19:10 +0530 Subject: [PATCH 2/2] assignment 4 - 2nd part --- assignment4p2.ipynb | 418 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 418 insertions(+) create mode 100644 assignment4p2.ipynb diff --git a/assignment4p2.ipynb b/assignment4p2.ipynb new file mode 100644 index 0000000..e2cb3a5 --- /dev/null +++ b/assignment4p2.ipynb @@ -0,0 +1,418 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "assignment4p2.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/VicktorKrum/Assignment-4/blob/VicktorKrum/assignment4p2.ipynb)" + ] + }, + { + "metadata": { + "id": "Hx3zMeMEeG6r", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "**2nd Part**" + ] + }, + { + "metadata": { + "id": "QLYLzPimeMju", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "**Linear Regression**" + ] + }, + { + "metadata": { + "id": "CdxJdle9egB9", + "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": "EDPNp1K1eeVZ", + "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": "bXi9itfUerI5", + "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": "vmk6uzANeuYy", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 347 + }, + "outputId": "5db00d80-de75-4432-8855-bfda8c28dbf9" + }, + "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": 4, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "dHFSrSqWe3U8", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Question \n", + "Why did I created a session to plot the graph?\n", + "\n", + "=> perhaps to visulaize the respective (comparitive) changes, i.e., the relation or the function being followed by X vs y slope. " + ] + }, + { + "metadata": { + "id": "PahtC0pTexa2", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the placeholders\n", + "\n", + "x = tf.placeholder(tf.float32, name='x')\n", + "y = tf.placeholder(tf.float32, name='y')" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "If0BF-jygyTp", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Let's define the linear regression model\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": "K2HGwZy9hAZQ", + "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": "2gaV4g2ZhCK3", + "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": "83HKkOxQhGC7", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 432 + }, + "outputId": "e6a0f9a2-04f6-4668-c2fa-806f3cec5b15" + }, + "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": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.06424673\n", + "Loss after epoch 20 is 0.064243086\n", + "Loss after epoch 40 is 0.06423944\n", + "Now testing the model in the test set\n", + "The final loss is: 0.28078592\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nZREREd/WbAinpKSwfPlyANLT04mKiiIkJASAuLg4du/eTVVVFQBbtmyhT58+7ddbERERH9LscPTI\nkSNJTk5m6tSpWCwW5s6dy7Jly3A4HEyePJkZM2Ywffp0bDYbI0aMYNSoUR3RbxERkS7PYtQ/ydsB\nzD6P4OvnMsD3a1R9XZuv1wft+WuqAAAXVUlEQVS+X6Pqa12bTdEds0REREyiEBYRETGJQlhERMQk\nCmERERGTKIRFRERMohAWERExiUJYRETEJAphERERkyiERURETKIQFhERMYlCWERExCQKYREREZMo\nhEVEREyiEBYRETGJQlhERMQkCmERERGTKIRFRERMohAWERExiUJYRETEJAphERERkyiERURETKIQ\nFhERMYlCWERExCQKYREREZMohEVEREyiEBYRETGJQlhERMQkCmERERGTKIRFRERMohAWERExiUJY\nRETEJAphERERkyiERURETKIQFhERMYn9VBaaP38+mzdvxmKxMGfOHIYOHQpATk4O9957r3e5zMxM\n7rnnHn74wx+2T29FRER8SLMhvG7dOjIyMli6dCm7d+9mzpw5LF26FIDo6Ghee+01ANxuN9dffz2T\nJk1q3x6LiIj4iGaHo9PS0khNTQUgMTGR4uJiysrKGi333nvvcfHFFxMcHNz2vRQREfFBzYZwXl4e\n4eHh3umIiAhcLlej5d5++22uuuqqtu2diIiIDzulc8L1GYbR6GebNm2iX79+hISENLt+eHgQdrut\npZttU06nw9TtdwRfr1H1dW2+Xh/4fo2qr200G8JRUVHk5eV5p3Nzc3E6nQ2WWbVqFWPGjDmlDRYW\nVrSwi23L6XTgcpWa2of25us1qr6uzdfrA9+vUfW1rs2mNDscnZKSwvLlywFIT08nKiqq0RHvd999\nR1JSUht0U0RE5MzR7JHwyJEjSU5OZurUqVgsFubOncuyZctwOBxMnjwZAJfLRWRkZLt3VkRExJec\n0jnh+p8FBhod9f773/9uux6JiIicIXTHLBEREZMohEVEREyiEBYRETGJQlhERMQkCmERERGTKIRF\nRERMohAWERExiUJYRETEJAphERERkyiERURETKIQFhERMYlCWERExCQKYREREZMohEVEREyiEBYR\nETGJQlhERMQkCmERERGTKIRFRERMohAWERExiUJYRETEJAphERERkyiERURETKIQFhERMYlCWERE\nxCQKYREREZMohEVEREyiEBYRETGJQlhERMQkCmERERGTKIRFRERMohAWERExiUJYRETEJAphERER\nkyiERURETKIQFhERMYn9VBaaP38+mzdvxmKxMGfOHIYOHeqdl52dza9//WtqamoYPHgwv/vd79qt\nsyIiIr6k2SPhdevWkZGRwdKlS5k3bx7z5s1rMP/xxx/npptu4p133sFms5GVldVunRUREfElzYZw\nWloaqampACQmJlJcXExZWRkAHo+HjRs3MmnSJADmzp1LbGxsO3ZXRETEdzQ7HJ2Xl0dycrJ3OiIi\nApfLRUhICAUFBQQHB/PYY4+Rnp7OqFGjuOeee07aXnh4EHa77fR7fhqcToep2+8Ivl6j6uvafL0+\n8P0aVV/bOKVzwvUZhtHgdU5ODtOnTycuLo5bbrmFVatWMWHChBOuX1hY0aqOthWn04HLVWpqH9qb\nr9eo+ro2X68PfL9G1de6NpvS7HB0VFQUeXl53unc3FycTicA4eHhxMbGkpCQgM1mY8yYMXz//fdt\n1GURERHf1mwIp6SksHz5cgDS09OJiooiJCQEALvdTq9evdi3b593ft++fduvtyIiIj6k2eHokSNH\nkpyczNSpU7FYLMydO5dly5bhcDiYPHkyc+bM4f7778cwDAYMGOC9SEtERERO7pTOCd97770NppOS\nkryve/fuzRtvvNG2vRIRETkD6I5ZIiIiJlEIi4iImEQhLCIiYhKFsIiIiEkUwiIiIiZRCIuIiJhE\nISwiImIShbCIiIhJFMIiIiImUQiLiIiYRCEsIiJiEoWwiIiISRTCIiIiJlEIi4iImEQhLCIiYhKF\nsIiIiEkUwiIiIiZRCIuIiJhEISwiImIShbCIiIhJFMIiIiImUQiLiIiYRCEsIiJiEoWwiIiISRTC\nIiIiJlEIi4iImEQhLCIiYhKFsIiIiEkUwiIiIiZRCIuIiJhEISwiImIShbCIiIhJFMIiIiImUQiL\niIiYxH4qC82fP5/NmzdjsViYM2cOQ4cO9c6bNGkSMTEx2Gw2ABYsWEB0dHT79FZERMSHNBvC69at\nIyMjg6VLl7J7927mzJnD0qVLGyyzaNEigoOD262TIiIivqjZ4ei0tDRSU1MBSExMpLi4mLKysnbv\nmIiIiK9rNoTz8vIIDw/3TkdEROByuRosM3fuXK699loWLFiAYRht30sREREfdErnhOs7PmTvvPNO\nLrzwQsLCwpg5cybLly/nkksuOeH64eFB2O22lve0DTmdDlO33xF8vUbV17X5en3g+zWqvrbRbAhH\nRUWRl5fnnc7NzcXpdHqnr7zySu/rcePGsXPnzpOGcGFhRWv72iacTgcuV6mpfWhvvl6j6uvafL0+\n8P0aVV/r2mxKs8PRKSkpLF++HID09HSioqIICQkBoLS0lBkzZlBdXQ3A+vXr6d+/f1v1WURExKc1\neyQ8cuRIkpOTmTp1KhaLhblz57Js2TIcDgeTJ09m3LhxXHPNNQQEBDB48OCTHgWLiIjIMRajg6+k\nMnsIw9eHUcD3a1R9XZuv1we+X6Pqa12bTdEds0REREyiEBYRETGJQlhERMQkCmERERGTKIRFRERM\nohAWERExiUJYRETEJAphERERkyiERURETKIQFhERMYlCWERExCQKYREREZMohEVEREyiEBYRETGJ\nQlhERMQkCmERERGTKIRFRERMohAWERExiUJYRETEJAphERERkyiERURETKIQFhERMYlCWERExCQK\nYREREZMohEVEREyiEBYRETGJQlhERMQkCmERERGTKIRFRERMohAWERExiUJYRETEJAphERERkyiE\nRURETKIQFhERMYlCWERExCSnFMLz58/nmmuuYerUqXz77bdNLvP0009z/fXXt2nnREREfFmzIbxu\n3ToyMjJYunQp8+bNY968eY2W2bVrF+vXr2+XDoqIiPiqZkM4LS2N1NRUABITEykuLqasrKzBMo8/\n/jh33313+/RQRETER9mbWyAvL4/k5GTvdEREBC6Xi5CQEACWLVvG6NGjiYuLO6UNhocHYbfbWtnd\ntuF0Okzdfkfw9RpVX9fm6/WB79eo+tpGsyF8PMMwvK+LiopYtmwZL7/8Mjk5Oae0fmFhRUs32aac\nTgcuV6mpfWhvvl6j6uvafL0+8P0aVV/r2mxKs8PRUVFR5OXleadzc3NxOp0ArFmzhoKCAq677jpm\nzZpFeno68+fPb6Mui4iI+LZmQzglJYXly5cDkJ6eTlRUlHco+pJLLuHDDz/krbfe4oUXXiA5OZk5\nc+a0b49FRER8RLPD0SNHjiQ5OZmpU6disViYO3cuy5Ytw+FwMHny5I7oo4iIiE86pXPC9957b4Pp\npKSkRsvEx8fz2muvtU2vRESk6zAM8HjA7YbaWiyeWqg9+uWpmz4y79h8z7HpWnfj5RvNO7K8pxZL\nbf359bdVf9seqHU3nO+pxXK0Hbe7Xlse8NRrr08vuOt+sLX/RcQtvjBLRMRnHA2P2qZ3+g3D5Og8\nTxM7/Fpw15t2BOBXUHpsB99gh380EDzHpt3u48KjXlvedT3HhUndNhuER+3RaQ+Wo6HXYP5xYVNv\nm97po0Fab9mG/albrkeD4POY/U62rcBALDfehhER2e6bUgiLdFXHh0f9nXiDnXq9HWWjHf5xYdPg\nSOa4sPHu1D1NHF0c2Tk3caSC57hA8LcRUlbpDQRLvSOkBmFzZJtNhkdtLRwJxIZhcjRcmjoq8zSq\npT3Do3u7tdw2DLu97kjPZsOw2o68toLVhmGzeefh749hq/8zO9YAP9wGcGQ9w2YDux2s1mPTNtux\n+XZbw2W986xHpuv1xWbztlO3rt27rnf5o9N2O0a9ZRvUYj++tvrT1iPrHj+vrq3IAb0xDls65H1Q\nCEvHM4x6Rw/NHAHUD4+jX2HdsLuKmz5S8dQLg0bDYo3barTt2hMEwpGd/ikFQqOjj6aPVI7fnjc8\nDA8RNUe3dezIq1Et9T4u2NUEnsa63p1ug52o9bgdsL1xeBwNl5MFwtFg8s631guA+oFgbSJojoVQ\ncGgQZVXuhuHRIEzqhc2RbTYMBGvddKOgrBdO9YOrqSCy2xv/u3j7fHqPDXA6HRT58EeUCHVAB9Wn\nEG6JpoauvH9VtzQQPE3s8OsffRx/LsNz3A694XmSBm0H2AgurWyi7RMHguVo6J1o6Mo7z3NsfoN5\nnoZte05QZxuFR3gbvJ0dzbBYmthRHhcQNhv42cFmx1MvEIx6O+eGO/0mAsFuPzJtbTps7LaGRxP1\nw6ZRIFiP26k3caTS4EjG2kTbx8IAm43wHqEUFFfVW/5YmDQXNlitYOmYI5TTEex0UOnLISVtpkuH\nsCUnh5B5j2IpKWkYCE0dqRwNRItBeHVNy4auvEdsXee8R1Abt3fSoat68/Dzw2M7fgd8gkBoatjK\nu+O3NzG/bgcfFBJIRbWn6SOVekHT5FDU8a9PdCTVgqGrUzoqs9lOOTycTgcFvrwDdzqo9eX6RFqg\nS4ewbe8eAt5+sy5IT8CwHvcXtd2G1drEDvdEQ1fev8jtTQYC9YaYWjJ01VwgnHDoqtEO/8jy9Xb4\n3SMdFJYcbng0cSrnUE4QNqc7dNXWgpwOyrUTFxEf0KVD2H3+GPK/3w/V1ac8dOV0Osj39R2404Hb\n12sUEfEBXTqEAYwQ376JuIiI+K7ONc4oIiJyBlEIi4iImEQhLCIiYhKFsIiIiEkUwiIiIiZRCIuI\niJhEISwiImIShbCIiIhJFMIiIiImUQiLiIiYRCEsIiJiEothdOEng4uIiHRhOhIWERExiUJYRETE\nJAphERERkyiERURETKIQFhERMYlCWERExCR2szvQFubPn8/mzZuxWCzMmTOHoUOHeuctWbKE999/\nH6vVypAhQ3jwwQdxu908+OCD7N+/n9raWmbPns2oUaO4/vrrqaioICgoCID77ruPIUOGmFWWV0vr\nW7ZsGc8++ywJCQkAjB07ll/+8pds376dRx99FICBAwfy29/+1oxymtTSGl966SVWr14NgMfjIS8v\nj+XLlzNp0iRiYmKw2WwALFiwgOjoaFNqqu9k9a1YsYKXXnoJf39/LrvsMqZNm3bCdbKzs5k9eza1\ntbU4nU6eeuop/P39zSrLqzX1Pfnkk2zcuBG3282tt97KlClTuP/++0lPT6d79+4AzJgxgwkTJphR\nUgMtrW/t2rX86le/on///gAMGDCAhx9+uNO+f9DyGt9++23ef/997zJbtmxh06ZNnXY/unPnTm6/\n/XZ+/vOfe/8PHrV69WqeeeYZbDYb48aNY+bMmUAH/Q4aXdzatWuNW265xTAMw9i1a5dx9dVXe+eV\nlpYaEydONGpqagzDMIwbb7zR2LRpk/HOO+8Yc+fONQzDMHbu3Gn89Kc/NQzDMKZNm2bs2LGjYwto\nRmvqe/fdd43HH3+8UVvTpk0zNm/ebBiGYfz61782Vq1a1QEVNK81Nda3bNkyY9GiRYZhGMbEiRON\nsrKyDur5qTlZfbW1tca4ceOM/Px8o7a21rjpppuM7OzsE65z//33Gx9++KFhGIbx9NNPG0uWLOng\nahprTX1paWnGzTffbBiGYRQUFBjjx483DMMw7rvvPuPTTz/t8BpOpjX1rVmzxrjjjjsatdUZ3z/D\naF2Nx6//6KOPGobROfej5eXlxrRp04yHHnrIeO211xrNv/TSS42srCyjtrbWuPbaa43vv/++w34H\nu/xwdFpaGqmpqQAkJiZSXFxMWVkZAH5+fvj5+VFRUYHb7aayspKwsDCuuOIKHnjgAQAiIiIoKioy\nrf/NaU19TamurubgwYPev24nTpxIWlpaxxTRjNOp0e1288YbbzT6y7YzOVl9hYWFhIaGEhERgdVq\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "0ddtzxmVhb4b", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "def linear_regression(learning_rate=0.000005, n_epochs=100, interval=50):\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", + " if epoch % interval == 0:\n", + " print ('Loss after epoch', epoch, ' is ', curr_loss)\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", + " print ('The final loss is: ', final_loss)\n", + " plt.plot(test_X[:5], test_Y[:5], 'g', label='True Function')\n", + " plt.plot(test_X[:5], final_preds[:5], 'r', label='Predicted Function')\n", + " plt.legend()\n", + " plt.show()\n", + "pass" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "y_HKdyOznSgN", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 551 + }, + "outputId": "10d5a66b-ba69-40e2-d7c6-2dfd4127c89c" + }, + "cell_type": "code", + "source": [ + "linear_regression(learning_rate=0.000034, n_epochs=500)" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.06424673\n", + "Loss after epoch 50 is 0.06423761\n", + "Loss after epoch 100 is 0.064228505\n", + "Loss after epoch 150 is 0.0642194\n", + "Loss after epoch 200 is 0.064210296\n", + "Loss after epoch 250 is 0.06420119\n", + "Loss after epoch 300 is 0.064192094\n", + "Loss after epoch 350 is 0.064183\n", + "Loss after epoch 400 is 0.0641739\n", + "Loss after epoch 450 is 0.064164795\n", + "Now testing the model in the test set\n", + "The final loss is: 0.28021345\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\ni5+18D+vXaglCvsO9/Oampqkk/VNXeyjl/+/T1nWvZ/X7tealpakurrGLn+//cOGyR4cm19JLNuO\n7a+l0X6clFVzXGpoDFnQ/odgyJAMVR2u7WB9N35Ye/CN783+utJHf3g8V1+htviUyLVJiV0ftfX9\nGMKJ6zNhSbIzBkqdPat5cIbsQFInGwAAYAZ3RwMAYAghDACAIYQwAACGEMIAABhCCAMAYAghDACA\nIYQwAACGEMIAABhCCAMAYAghDACAIYQwAACGxPwBDgAAoBlnwgAAGEIIAwBgCCEMAIAhhDAAAIYQ\nwgAAGEIIAwBgiMv0AHqiqKhIO3fulGVZKigo0MSJE4Pr1q1bp1deeUUOh0MTJkzQ4sWL5fP5tHjx\nYu3fv19+v18LFizQ1KlTtXv3bj344IOSpLFjx+qhhx4yVFGbaNb28MMPy+FwaODAgXr88ceVmppq\nsLLo1dZqw4YNWrVqlf7617+aKKedaNVWU1OjefPmqbq6WkOHDtWKFSuUlJRksLLo1VZaWqrnnntO\nbrdbQ4cO1aOPPhp3tR0+fFj333+/Ghoa1NTUpEWLFmnSpEn98lgiRbe+eD+edFRbK2PHEzvOvPvu\nu/bs2bNt27btvXv32tdff31wXU1NjT1t2jS7qanJtm3bvvXWW+0dO3bYL730kl1YWGjbtm3v2bPH\n/td//Vfbtm37Jz/5ib1z507btm373nvvtTdv3hzDSk4XzdpuuummYG3Lli2z165dG8NKThfN2mzb\ntquqquyZM2fa06ZNi10RHYhmbY899pj9/PPP27Zt20899VTwe2hKNGv7wQ9+YB8/fty2bdtesmSJ\n/Ze//CWGlZyuJ7U999xz9iuvvBJsf+utt9q23f+OJbYd3foS4XjSUW22bfZ4Endnwlu2bFFeXp4k\nKTs7W9XV1aqtrVV6errcbrfcbrfq6uqUlpamkydPatCgQfrnf/5nXXXVVZKkrKwsHTt2TI2Njfrm\nm2+Cvz1NmzZNW7Zs0WWXXRb3tUnS7373O6Wnp5+23JRo1iZJv/rVr3T33Xdr3rx5RuoJFc3a3nrr\nLa1du1aSNHfuXDMFhYhmbd/73vd0/PhxZWRk6Pjx48rMzDRWl9Sz2m699dZg+4MHD2ro0KH98lgi\nRa8+KTGOJx3VJpk9nsRdCFdVVSknJyc4n5WVpcrKSqWnpys5OVlz5sxRXl6ekpOTdeWVV+rss89u\n137NmjW66qqrdPToUQ0cODC4fPDgwaqsrIxZHeFEqzZJwf8wdXV1+tOf/qQnnngidoWEEc3a3n33\nXSUnJ7e7lGRSNGurqqrS+vXr9fe//13nnnuulixZYvSSbTRrW7Jkif7lX/5FGRkZGj9+vC6++OKY\n1nKqntZWWVmpO+64QydOnNB/sA8jAAADaUlEQVSaNWv65bFEil59UuIcT8LVZvp4Evc3Ztkhn7pZ\nW1urlStXatOmTXrzzTe1c+dO7d69O7h+3bp1Kisr05w5czrtp7/obW11dXW68847NXPmTGVnZ8d0\n7JH0tLbGxkY9+eSTuvfee00Mu0t6831raGhQbm6u/vCHPygQCOjFF1+M+fg709PaAoGAHnnkEb30\n0kt644035HA49Oabb5oooUNdrc3j8eiPf/yjFi1apEWLFnXaT3/S2/oS4Xhyam394XgSdyHs9XpV\nVVUVnK+oqJDH45EklZeX68wzz1RWVpaSkpI0depU7dq1S5L04osv6q9//aueeeYZud3u0y6pHDp0\nSF6vN7bFnCJatUmSz+fTXXfdpauuuko//vGPY1/MKaJV2yeffKKqqirdfvvtuv7661VRUWH8knQ0\nv29nnHGGJk+eLEnKzc3VZ599FuNq2otWbUeOHJEkjRo1SpZl6aKLLgpua0pPatu6dauqq6slSZdd\ndpnKysr65bFEil59UmIcT8LV1h+OJ3EXwrm5uSotLZUklZWVyev1Bi+VjBgxQuXl5aqvr5ck7dq1\nS6NHj9ZXX32lDRs26Omnn1ZycrIkye1265xzztG2bdskSa+//rouueQSAxW1iVZtkvTss8/qggsu\n0HXXXRf7QsKIVm2TJk1SaWmpNm7cqI0bN8rr9erXv/61maJaRPP7duGFF+qdd94J9nXq5d1Yi1Zt\nmZmZqq6uDobxRx99pLPOOstARW16Utvrr7+ul19+WZL06aef6owzzuiXxxIpevVJiXE8CVdbfzie\nxOVTlJYvX65t27bJsiwVFhbq448/VkZGhmbMmKENGzaopKRETqdTkydP1oIFC7RixQq9+uqrGj58\neLCP1atXa//+/fr5z3+uQCCgSZMmhb20FGvRqm369OkaOXJk8AzrwgsvNH6jT7RqC32PdPr06f3i\nT5SiVVttba3mz5+v+vp6DRkyRMuWLVNaWprByqJX29tvv61Vq1YpKSlJI0eO1C9+8Yvgz6cp3a3t\nyJEjWrhwoU6cOKHGxkYtXrxY559/vvbu3dvvjiVS9Or7wQ9+EPfHk45qC2XieBKXIQwAQCKIu8vR\nAAAkCkIYAABDCGEAAAwhhAEAMIQQBgDAEEIYAABDCGEAAAwhhAEAMOT/A4eDqClDl0BxAAAAAElF\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "Wt03BAkynz3-", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 721 + }, + "outputId": "09bf8b2b-75a8-4151-e611-491d4ae44f3e" + }, + "cell_type": "code", + "source": [ + "linear_regression(learning_rate=0.0000006, n_epochs=1000)" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.06424673\n", + "Loss after epoch 50 is 0.06423761\n", + "Loss after epoch 100 is 0.064228505\n", + "Loss after epoch 150 is 0.0642194\n", + "Loss after epoch 200 is 0.064210296\n", + "Loss after epoch 250 is 0.06420119\n", + "Loss after epoch 300 is 0.064192094\n", + "Loss after epoch 350 is 0.064183\n", + "Loss after epoch 400 is 0.0641739\n", + "Loss after epoch 450 is 0.064164795\n", + "Loss after epoch 500 is 0.064155705\n", + "Loss after epoch 550 is 0.064146616\n", + "Loss after epoch 600 is 0.064137526\n", + "Loss after epoch 650 is 0.06412844\n", + "Loss after epoch 700 is 0.064119354\n", + "Loss after epoch 750 is 0.06411027\n", + "Loss after epoch 800 is 0.06410119\n", + "Loss after epoch 850 is 0.06409211\n", + "Loss after epoch 900 is 0.06408303\n", + "Loss after epoch 950 is 0.06407394\n", + "Now testing the model in the test set\n", + "The final loss is: 0.27956367\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + } + ] +} \ No newline at end of file