From 171444c16ce37f4af897eb7831534c1d6c89f296 Mon Sep 17 00:00:00 2001 From: Himadri Sankar Chatterjee Date: Sat, 13 Oct 2018 10:29:42 +0530 Subject: [PATCH] Solution to the Assignment on Tensorflow. --- Solution_to_First_Date_with_Tensorflow.ipynb | 799 +++++++++++++++++++ 1 file changed, 799 insertions(+) create mode 100644 Solution_to_First_Date_with_Tensorflow.ipynb diff --git a/Solution_to_First_Date_with_Tensorflow.ipynb b/Solution_to_First_Date_with_Tensorflow.ipynb new file mode 100644 index 0000000..ff04b6d --- /dev/null +++ b/Solution_to_First_Date_with_Tensorflow.ipynb @@ -0,0 +1,799 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Solution_to_First_Date_with_Tensorflow.ipynb", + "version": "0.3.2", + "provenance": [], + "collapsed_sections": [], + "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/crazy-lazy-life/Assignment-4/blob/crazy-lazy-life/Solution_to_First_Date_with_Tensorflow.ipynb)" + ] + }, + { + "metadata": { + "id": "YKK7xnCRR8Ji", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "First_Date_With_Tensorflow" + ] + }, + { + "metadata": { + "id": "TW64x5eUR7Ac", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "SY_34iziScYF", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 255 + }, + "outputId": "17c74c5b-7686-4eaf-80d4-b358e2feeadf" + }, + "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]]])\n", + "# Let's print them out!\n", + "print (t1)\n", + "print (t2)\n", + "print (t3)\n", + "\n", + "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": 2, + "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", + "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": "j34li5NCS40F", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "746e553c-77c9-477f-b004-7259a7c1b95d" + }, + "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": 3, + "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": "T1z8UfitTI7e", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "outputId": "691e2a9b-0b94-4121-f993-95fa2a7c693e" + }, + "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": 4, + "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": "J-ZoUqlnTSEo", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "80211188-649e-46b6-be05-4f44d78b9d21" + }, + "cell_type": "code", + "source": [ + "#Building the computational graph\n", + "node_1 = tf.constant([9, 10], dtype = tf.float32, name=\"leaf_node_1\")\n", + "node_2 = tf.constant([7, 8.65], dtype = tf.float32, name=\"leaf_node_2\")\n", + "node_3 = tf.constant([7.65, 9], dtype = tf.float32, name=\"leaf_node_3\")\n", + "node_4 = tf.constant([13.5, 7.18], dtype = tf.float32, name=\"leaf_node_4\")\n", + "node_5 = tf.constant(5.6, dtype = tf.float32, name=\"leaf_node_5\")\n", + "\n", + "cg1 = tf.multiply(node_1, node_2)\n", + "cg2 = tf.divide(cg1, node_5)\n", + "cg3 = tf.add(node_3, node_4)\n", + "cg4 = tf.minimum(cg2, cg3)\n", + "\n", + "with tf.Session() as sess:\n", + " print(sess.run(cg4))" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[11.25 15.446429]\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "Geo1lknNzO_G", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "" + ] + }, + { + "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": "NwVbnf2Y1M9B", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "outputId": "c758417d-add2-443a-c28d-e24bf6118195" + }, + "cell_type": "code", + "source": [ + "#Building the computational graph\n", + "node_1 = tf.constant([[1.2,3.4],[7.5,8.6]], dtype = tf.float32, name=\"leaf_node_1\")\n", + "node_2 = tf.constant([[7, 9],[8,6]], dtype = tf.float32, name=\"leaf_node_2\")\n", + "node_3 = tf.constant([[2.79, 3.81, 5.6],[7.3, 5.67, 8.9]], dtype = tf.float32, name=\"leaf_node_3\")\n", + "node_4 = tf.constant([[2.6, 18.1],[7.86, 9.81],[9.36, 10.11]], dtype = tf.float32, name=\"leaf_node_4\")\n", + "node_4 = tf.transpose(node_4)\n", + "\n", + "cg7 = tf.multiply(node_3, node_4)\n", + "cg8 = tf.reduce_mean(node_1, axis=1)\n", + "cg9 = tf.multiply(node_2, cg8)\n", + "cg10 = tf.reduce_sum(cg7)\n", + "cg11 = tf.add(cg9, cg10)\n", + "\n", + "with tf.Session() as sess:\n", + " print(sess.run(cg11))" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[[383.4483 439.7983 ]\n", + " [385.7483 415.64832]]\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": "s3seP9518uvw", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "outputId": "356ff601-f74e-4859-d207-fbeaea6fe77b" + }, + "cell_type": "code", + "source": [ + "#Building the computational graph\n", + "node_1 = tf.constant(7.0, dtype = tf.float32, name=\"leaf_node_1\")\n", + "node_2 = tf.constant([[7.36, 8.91, 10.41],[5.31, 9.38, 7.99]], dtype = tf.float32, name=\"leaf_node_2\")\n", + "node_3 = tf.constant([[7.99, 10.36],[5.36, 7.98],[8.91, 5.67]], dtype = tf.float32, name=\"leaf_node_3\")\n", + "node_4 = tf.constant([[1, 5.6, 6.1, 8],[0, 0, 7.98, 9],[0, 0, 7.6, 7],[0, 0, 0, 8.98]], dtype = tf.float32, name = \"leaf_node_4\")\n", + "node_5 = tf.constant(19.6, dtype = tf.float32, name=\"leaf_node_5\")\n", + "\n", + "cg12 = tf.reduce_sum(tf.multiply(node_2, tf.transpose(node_3)))\n", + "cg13 = tf.add(cg12, node_1)\n", + "cg14 = tf.divide(cg13, node_5)\n", + "cg15 = tf.divide(cg14, node_4)\n", + "\n", + "with tf.Session() as sess:\n", + " print(sess.run(cg15))" + ], + "execution_count": 7, + "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." + ] + }, + { + "metadata": { + "id": "MEILryGpFRn-", + "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", + "#print(X)\n", + "#print(Y)\n", + "#Normalizing 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": "vQljC__QF6hk", + "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": "toz7KwbXGVkT", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 347 + }, + "outputId": "e4aa66de-f450-4c0f-cb29-2d413f7bd2e0" + }, + "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": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "8RzXk8DtGWT_", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 721 + }, + "outputId": "93358bed-8c05-4ff8-f936-e66951ec149c" + }, + "cell_type": "code", + "source": [ + "#Creating the placeholders\n", + "x = tf.placeholder(tf.float32, name=\"x\")\n", + "y = tf.placeholder(tf.float32, name=\"y\")\n", + "\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\n", + "\n", + "loss = tf.reduce_mean(tf.square(y - pred_y))\n", + "\n", + "optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)\n", + "\n", + "with tf.Session() as sess:\n", + "\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", + " 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": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.1941911\n", + "Loss after epoch 50 is 0.19403192\n", + "Loss after epoch 100 is 0.19387293\n", + "Loss after epoch 150 is 0.19371411\n", + "Loss after epoch 200 is 0.19355547\n", + "Loss after epoch 250 is 0.193397\n", + "Loss after epoch 300 is 0.19323872\n", + "Loss after epoch 350 is 0.19308062\n", + "Loss after epoch 400 is 0.19292267\n", + "Loss after epoch 450 is 0.19276491\n", + "Loss after epoch 500 is 0.19260734\n", + "Loss after epoch 550 is 0.19244994\n", + "Loss after epoch 600 is 0.1922927\n", + "Loss after epoch 650 is 0.19213565\n", + "Loss after epoch 700 is 0.19197878\n", + "Loss after epoch 750 is 0.19182205\n", + "Loss after epoch 800 is 0.1916655\n", + "Loss after epoch 850 is 0.19150916\n", + "Loss after epoch 900 is 0.19135296\n", + "Loss after epoch 950 is 0.19119698\n", + "Now testing the model in the test set\n", + "The final loss is: 0.82333696\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nY8d0++13yO12a/LkqT0e+9Gjn+j++9do69YfSpKWLv26Nmz4Nz399JMaM8an/fv/rOPHj+mBBzZo\n2rR0FRRs0+7db8iyHFq+/A69//6fdPDgAeXk3KuFCxdFanjjjZ+rsLBATqdT06Z9SitXrtLWrU+o\nttavw4cP6eOPP4rcdrEvehTC+fn52rt3ryzLUk5OjmbM6PjF3d///vf17rvv6oc//GGfBgQAsWTE\n+vsV/5P2tzKUw1JKH25l2HjDjapd3/NbGR49+olOnapWaupYSc3fybxmzTrt3PmKRo8eo7VrH1BV\nVZX+9V+Xa9u27XriiS36znf+j6ZMmapVq76tcePGR/qqq6s9620Iy8vLtHv3G3r88a2SpNtuW6r5\n87P0s5/9WNdd93e66aav6Nlnf6CDBw/0uv5WgUBAmzZt0YsvPq+dO19RUlKSdu9+Q0888QN98snH\nevbZH+i++76jgoJtys//d7399lstNdTpyScf0zPP/I+SkpK0evVdkXVlZcf18MOb9eabv9NLL70w\n8CG8Z88eHTp0SIWFhSotLVVOTo4KCwvbbXPw4EH94Q9/6NNlBgDA4Dl8+JDuuGOZJCkuLk733/+g\nXK7mSLj00gxJ0r5972nv3nf03nvvSpIaGxsVDAZ19OhRTZnSPFu97LJMNTY2Rvrt7jaEf/5ziT76\n6IjuvLP5dde6ulodO/aJSktL9bWvLZEkzZo1W2+++bsOY/b7/ZExS1Ja2mRlZ9/cZY0zZ86SJPl8\nY/WnP5XowIH9uvTS6XI4HJow4ULdd993Ot3vyJHDmjBhYuQuULNmfVoHDrwvqeNtF/uq2xAuLi5W\nVlaWJCktLU3V1dXy+/3yeDyRbTZu3Ki77rpLW7Zs6fOAACCW1K7f0GHW6vN5dXKAv0e57WvCZ3K5\n3JHHxYu/oQULPtdufet9gqWOtwns7jaELpdbV1wxV6tXr2vX/qMfFURuQ9jV/p29Jnzs2NF2y2e7\nRaLT6VC4B1cYLKt9XaFQUPHx8Z322VfdhnBFRYUyMjIiyykpKSovL4+EcFFRkT7zmc9o/PjxXXXR\nTnJyklwuZ/cb9kFXX5Qdzag5dsRi3dTcvxobR8jlcnR6jIQEt0aNSpTP59VnPztbv/jFL/TVr35Z\nJ06c0LZt23T33XfrggvOV01NuSZNmqSSkr267LLLdN55SYqPd+vTn56uhx46oqQkh1wul5YvX66n\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "obvL33e38wkp", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 415 + }, + "outputId": "20980253-daa4-48d3-c977-288a5c8d0e55" + }, + "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:]\n", + "\n", + "def linear_regression(learning_rate, n_epochs, interval): \n", + "\n", + " #Creating the placeholders\n", + " x = tf.placeholder(tf.float32, name=\"x\")\n", + " y = tf.placeholder(tf.float32, name=\"y\")\n", + "\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\n", + "\n", + " loss = tf.reduce_mean(tf.square(y - pred_y))\n", + "\n", + " optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)\n", + "\n", + " with tf.Session() as sess:\n", + "\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", + " 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()\n", + " \n", + "linear_regression(learning_rate=0.000005, n_epochs=100, interval=50)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.1922823\n", + "Loss after epoch 50 is 0.19212465\n", + "Now testing the model in the test set\n", + "The final loss is: 0.8234747\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\nMCMtLV2ZmcP18ccf68knn5DLlaDa2mrdd986ff/7Bfrwww8UCoX0jW8s1t/93d9r3769euihB+X1\nZiozc7hGjRqt11/fp+LiHbr//u+f8zGEGzf+Hz333M/0m9/slGU59JnPXKMbb/yKPvroI91221Il\nJCRowoRJPR778eMf6p57Vmrz5uYTwIULv6r77/9P/ehHj2v4cJ8OHfqzTpz4SPfee78mT56ioqIt\n2r37RVmWQ4sXL9U777ytI0cOKy/vLs2bNz9aw4sv/lrbtxfJ6XRq8uS/0bJly7V582M6fbpOR4+W\n6YMP3o8+drEvug3hkpIS5eTkSJKysrJUU1Ojuro6paamRtusW7dOd9xxhzZt2tSnwQBAvBm25h65\nf9H+UYZyWPL24VGGgeu/qNNrev4ow+PHP1RtbY38/hGSmr+TeeXK1dq581fKzByuVavuVXV1tb7z\nncXasmWbHntsk773vf/QxImTtHz5tzVq1OhoX/X1p8/5GMKKinLt3v2iHn10syTp1lsXas6cHP3v\n//5Mn/3sP+qGG27UU0/9WEeOHO51/a2CwaA2bNikZ599Wjt3/kopKSnavftFPfbYj/Xhhx/oqad+\nrLvv/p6KiraosPAHev31fS011Ovxxx/Rk0/+X6WkpGjFijui28rLT2j9+oe0Z8+r+vnPnxn4EK6s\nrFR2dnZ02ev1qqKiIhrCxcXF+uQnP6nRo0d31QUAYJA5erRMS5cukiQlJibqnnvWyuVqjoTLL2/+\nf/6BA29p//439NZbb0qSAoGAmpqadPz4cU2c2Hy2+olPzFQgEIj2291jCP/854N6//1juv325s9d\n6+tP66OPPlRpaaluuukWSdKMGbO0Z8+rHcZcV1cXHbMkZWVNUG7uV7qscfr0GZIkn2+E3n77oA4f\nPqTLL58qh8OhMWPG6u67v9fpfseOHdWYMZdEnwI1Y8bf6fDhdyR1fOxiX533jVltv2q6urpaxcXF\nevLJJ3XixIke7Z+RkSKXy9l9wz7o6js6Yxk1x494rDuma35kY/PPWfryf8mUlp+uBALDdNll47V9\n+9YO25KSEpSZmSafzyOPJ0VLly7Rdddd166Ny+WMzklKSqJcLumii1LkdicoM9OjhARHhzlzOh0a\nPjxVmZlpuvbaObrvvvvabf/pT4vk9abK5/MoPT1JiYmuDn14PJ4OY/7ggw/kcrU9XkRe7zAlJSW0\n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\n/uVftGrVKkmS1+tVdXW1gsGgPvjgg+hvYnPmzFFJSYmZorrRXzUPJb2p+ZZbbtH1118vSTp+/LhG\njBgR8/PcWc1DTW/qbt1v2LBhmjRpkiTF/Fy37te25qGktzWfbSjNc28M+svRlZWVys7Oji57vV5V\nVFQoNTVVbrdbS5YsUU5Ojtx5OaM4AAADnUlEQVRut77whS9o/Pjx7fbfsmWLrrvuOlVVVSktLS26\nPjMzUxUVFResjvPRXzW3euihh1RVVaWsrCzl5eUpKSnpgtXSU72tuaKiQosXL9bp06e1ZcuWuJjn\ns2tuNRTmWepd3cFgUI888ogeffRRFRYWSlLMz3VnNbcaCnPdm5rfeOMN7d27VwsXLlQoFNLKlSuV\nmZk5ZOa5Nwb9mfDZ7DbfsllXV6fHHntMO3fu1Isvvqj9+/frnXfeiW4vKirSwYMHtWTJknP2M9j1\npeYFCxZoxYoVKioqkmVZKioquuDj742e1uzz+fTMM89o1apV0SsBXfUz2PWl5qE6z1LP6n788cf1\npS99qd3/jM/Vz2DXl5qH6lz3pObp06fr9ttv1+bNm7Vs2TKtXLnynP3EgkF/Juz3+1VZWRldLi8v\nl8/nkySVlpZq7Nix8nq9kqRZs2bpwIEDmjJlin7605/qt7/9rR599FElJCR0uER74sQJ+f3+C1tM\nD/VXzZI0d+7caD/XXnutnn/++QtYSc/1puba2lpNnjxZ6enpuvrqq7VixYqYn+fOapaGzjxLvav7\n5ZdfViQSUVFRkY4ePaq33npLGzZsiOm57qzmjRs3Dpm57k3N8+bNU1ZWliRpxowZOnnypDIyMobM\nPPfGoD8Tnj17tnbt2iVJOnjwoPx+v1JTUyVJo0ePVmlpqRobGyVJBw4c0Lhx43Ts2DFt27ZNmzZt\nktvtltT8GcRll12mffv2SZJeeOEFfeYznzFQUff6q2bbtvW1r31NtbW1kqTXXntNEydONFBR93pT\n8wsvvKCf/exnkqRDhw7p4osvjvl57qzmoTTPUu/q3rZtm3bs2KEdO3bommuuUX5+vqZMmRLTc91Z\nzRMmTBgyc92bmp944gn98pe/lCQdPnxYXq9XiYmJQ2aee2PQnwnPnDlT2dnZys3NlWVZys/PV3Fx\nsTwej+bOnauFCxdqwYIFcjqdmjFjhmbNmhX9DXnRokXRfjZv3qy8vDzde++9ikQimj59uq688kqD\nlXWtP2u+4YYb9LWvfU3JyckaMWKEbr/9doOVda03NV922WW6++679etf/1rBYDD6JwyxPM+d1WxZ\n1pCZZ6l3dXcllue6M0NprntT85gxY3TXXXdp27ZtCoVCKigokDR05rk3eJQhAACGDPrL0QAAxCpC\nGAAAQwhhAAAMIYQBADCEEAYAwBBCGAAAQwhhAAAMIYQBADDk/wN2bl7Re3Z8XAAAAABJRU5ErkJg\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "WIuwnz9Ox12R", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 551 + }, + "outputId": "e2d4cee0-aa9d-4ca9-bf55-27313239eeca" + }, + "cell_type": "code", + "source": [ + "linear_regression(learning_rate=0.000034, n_epochs=500, interval = 50)" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.1922823\n", + "Loss after epoch 50 is 0.19121365\n", + "Loss after epoch 100 is 0.19015308\n", + "Loss after epoch 150 is 0.18910047\n", + "Loss after epoch 200 is 0.18805581\n", + "Loss after epoch 250 is 0.18701902\n", + "Loss after epoch 300 is 0.18599004\n", + "Loss after epoch 350 is 0.18496881\n", + "Loss after epoch 400 is 0.18395527\n", + "Loss after epoch 450 is 0.18294935\n", + "Now testing the model in the test set\n", + "The final loss is: 0.7930045\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n+f/TmF8xi9qQNgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "oYxi_5dNx_Hc", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 721 + }, + "outputId": "d099c70c-7136-4719-f795-b39dfd3c2f9b" + }, + "cell_type": "code", + "source": [ + "linear_regression(learning_rate=0.0000006, n_epochs=1000, interval=50)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Loss after epoch 0 is 0.1922823\n", + "Loss after epoch 50 is 0.1922634\n", + "Loss after epoch 100 is 0.19224446\n", + "Loss after epoch 150 is 0.19222555\n", + "Loss after epoch 200 is 0.19220662\n", + "Loss after epoch 250 is 0.1921877\n", + "Loss after epoch 300 is 0.19216877\n", + "Loss after epoch 350 is 0.19214988\n", + "Loss after epoch 400 is 0.19213097\n", + "Loss after epoch 450 is 0.19211206\n", + "Loss after epoch 500 is 0.19209315\n", + "Loss after epoch 550 is 0.19207424\n", + "Loss after epoch 600 is 0.19205534\n", + "Loss after epoch 650 is 0.19203645\n", + "Loss after epoch 700 is 0.19201757\n", + "Loss after epoch 750 is 0.19199866\n", + "Loss after epoch 800 is 0.19197978\n", + "Loss after epoch 850 is 0.19196089\n", + "Loss after epoch 900 is 0.19194202\n", + "Loss after epoch 950 is 0.19192313\n", + "Now testing the model in the test set\n", + "The final loss is: 0.823285\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n+URPPvmEXK4k1dWd1H33rdUPf1ikjz76UOFwWN/61iL9zd/8rfbu3aOHHnpQWVnZys4erlGjRuuN\nN/aqtHS77r//h+d9DOGGDf9Hzz33C/32tztkWQ59/vPX6MYbv6aPP/5Yt922RElJSRo/fmK3x37s\n2Ee6554V2rSp+QRwwYKv6/77/00/+cnjGj7cp4MH/6Tjxz/Wvffer0mTJqukZLN27XpRluXQokVL\n9O677+jw4UMqKLhLc+fOi9Xw4ou/0bZtJXI6nZo06a+0dOkybdr0mE6frteRIxX68MMPYo9d7I0u\nQ7isrEx5eXmSpJycHNXW1qq+vl5paWmxNmvXrtUdd9yhjRs39mowAJBohq2+R55ftX+UoRyWsnrx\nKMPg9V/R6dXdf5ThsWMfqa6uVn7/CEnN38m8YsUq7djxa2VnD9fKlffq5MmT+t73Fmnz5q167LGN\n+sEP/rcmTJioZcu+q1GjRsf6amg4fd7HEFZVVWrXrhf16KObJEm33rpAs2fn6b//+xf6whf+Tjfc\ncKOeeuqnOnz4UI/rbxUKhbR+/UY9++zT2rHj10pNTdWuXS/qscd+qo8++lBPPfVT3X33D1RSslnF\nxT/SG2/sbamhQY8//oiefPL/KjU1VcuX3xHbVll5XOvWPaTdu1/TL3/5TP+HcHV1tXJzc2PLWVlZ\nqqqqioVwaWmpPvOZz2j06NHn6gIAMMgcOVKhJUsWSpLcbrfuuWeNXK7mSLj88ub/8/fvf1v79r2p\nt99+S5IUDAbV1NSkY8eOacKE5rPVT396hoLBYKzfrh5D+Kc/HdAHHxzV7bc3f+7a0HBaH3/8kcrL\ny3XTTbdIkqZPn6ndu1/rMOb6+vrYmCUpJ2e88vO/ds4ap02bLkny+UbonXcO6NChg7r88ilyOBwa\nM+Zi3X33Dzrd7+jRIxoz5pLYU6CmT/8bHTr0rqSOj13srQu+MavtV02fPHlSpaWlevLJJ3X8+PFu\n7Z+ZmSqXy9l1w14413d0xjNqThyJWHdc1/zIhuY/Z+nN/5KpLX/OJRgcpssuG6dt27Z02JacnKTs\n7HT5fF55valasmSxrrvuunZtXC5nbE5SU91yuaRPfSpVHk+SsrO9SkpydJgzp9Oh4cPTlJ2drmuv\nna377ruv3faf/7xEWVlp8vm8yshIltvt6tCH1+vtMOYPP/xQLlfb40WVlTVMyclJbfpLkcfjUmbm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "RjiHdLMNyNyB", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file