{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "kl_py_TF_Day_1_Intro_to_ML_and_TF_Solutions.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "EXQHB7VTte3J" }, "source": [ "![TF](https://1.bp.blogspot.com/-eb-_3Aqu5bA/XnertoOpPgI/AAAAAAAAa6Y/8TPaJ8vjn2cN_so7xLeqPZDqX3pQjVARgCLcBGAsYHQ/s200/tf.jpg)\n", "\n", "## Machine Learning Intro\n", "\n", "Before getting started, active GPU support: **Runtime** -> **Change runtime type**\n", " - Set Handware Accelerator to **GPU**" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ijzHZUHpoV_y" }, "source": [ "## Using Data to Answer Questions\n", "\n", "Machine Learning is a branch of AI devoted to developing systems that learn from data.\n", "\n", "Types of Machine Learning tasks:\n", "\n", "- Supervised learning\n", "- Unsupervised learning\n", "- Reinforcement learning\n", "\n", "\n", "We are going to focus on **Supervised learning**. \n", "\n", "A supervised learning setup is like learning any concept with a teacher (supervisor) by your side.\n", "\n", "In this context, supervised datasets are composed of input features and the correspondings labels. The **true values** for each record.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "vNzPC5yrtnIy" }, "source": [ "# Gradient Descent" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "_svV-GbBXWB3" }, "source": [ "### Gradient Descent is an optimization algorithm.\n", "\n", "**Optimization algorithms** (Basic definition): Finding a value that minimizes or maximizes a function f(x) by changing x.\n", "\n", "Imagine you are on top of a hill and you want to get to its **lowest spot**.\n", "\n", "Some key observatons:\n", "\n", "- You do not have a map of the mountain. So you do **NOT** know where the sweet spot you are looking for is.\n", "- What if you know the direction that brings your there?\n", "\n", "![alt text](https://cdn-images-1.medium.com/max/800/1*QEME_QUKOjntJpBBUdgTNA.png)\n", "\n", "- The Gradient points to the direction of steepest ascent.\n", "- The Gradient is a **vector** os partial derivatives.\n", "\n", "Each gradient value tells how much a function change if we slightly alter one of its parameters.\n", "\n", "![alt text](https://cdn-images-1.medium.com/max/800/1*J-TbI94E1nXNHIubJc7VeQ.png)\n", "\n", "[Intro do Gradient Descent](https://towardsdatascience.com/machine-learning-101-an-intuitive-introduction-to-gradient-descent-366b77b52645)\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "a_XTNZKYtrW3" }, "source": [ "# Learning Rate" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-TedOpi8uW36" }, "source": [ "There are various knobs that we can change in order to optimize our ML models. \n", "\n", "- Batch size\n", "- Regularization strength\n", "- Learning rate\n", "\n", "We call these knobs** Hyper-parameters**.\n", "\n", "The **Learning Rate** is one of these knobs. Perharps, the most important one.\n", "\n", "![alt text](https://cdn-images-1.medium.com/max/1600/0*uIa_Dz3czXO5iWyI.)\n", "\n", "The learning rate controls the rate of learning of your ML algorithm. \n", "\n", "In math terms, the learning rate is a scalar that we **multiply by the Gradient vector**. \n", " - It controls how much of the Gradient Signal, we are going to follow at each step.\n", " \n", "Let's see it in action: [Learning Rate Playground](https://developers.google.com/machine-learning/crash-course/fitter/graph)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "smurnV0etx8n" }, "source": [ "# TensorFlow Intro\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "kbZEM7Jsvzby" }, "source": [ "Tensorflow is a plataform to build Machine Learning algorithms.\n", "\n", "More generally, it is a** Graph based computation** framework.\n", " - It can be used to create any kind of computation (as long as it can be interpreted as a graph)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6O5ZdIOTt9Lf" }, "source": [ "## Tensors and Ranks\n", "\n", "- In TensorFlow, the Tensor is the central unit of data.\n", "- The **Rank** is the Tensor number of dimensions. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "lPw8wbrh-mZY" }, "source": [ "![Tensors](https://image.slidesharecdn.com/tensordecomposition-170301235239/95/a-brief-survey-of-tensors-3-638.jpg?cb=1488412458)\n", "\n", "\n", "**Take away: The Rank of a Tensor is its number of Dimentions.**" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "WAj7oeqTt-q7", "outputId": "8be4674b-3f16-4135-e318-2663cdbaf6ae", "colab": { "base_uri": "https://localhost:8080/", "height": 90 } }, "source": [ "from __future__ import absolute_import\n", "from __future__ import division\n", "from __future__ import print_function\n", "\n", "import numpy as np\n", "import tensorflow as tf\n", "\n", "# create different tensors\n", "scalar = tf.constant(3.) # just a value\n", "one_d_array = tf.constant([4., 5.5, 3]) # a simple 1-D array\n", "two_d_array = tf.constant([[2., 3.4],[8.,1.0],[2.3,7.5]]) # a matrix like object 2-D\n", "tensor = tf.constant([[[3.0,9.3]], [[4.3,7.7]]]) # any representation with more than 2 dimentions\n", "\n", "# Look at the shapes. These are called the Ranks\n", "print(scalar)\n", "print(one_d_array)\n", "print(two_d_array)\n", "print(tensor)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Tensor(\"Const:0\", shape=(), dtype=float32)\n", "Tensor(\"Const_1:0\", shape=(3,), dtype=float32)\n", "Tensor(\"Const_2:0\", shape=(3, 2), dtype=float32)\n", "Tensor(\"Const_3:0\", shape=(2, 1, 2), dtype=float32)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NKL55cl0t3VH" }, "source": [ "## Graph Execution\n", "\n", "You might think of TensorFlow Core programs as consisting of two discrete sections:\n", "\n", "1. Building the computational graph.\n", "2. Running the computational graph." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "k7GUidBNz0GN" }, "source": [ "A Tensorflow graph is a series of operations that are structured as a Graph.\n", "​\n", "A TF Graph contains two types of objects.\n", " - Operations\n", " - Tensors\n", " \n", "## Operations\n", "In a Tensorflow computation graph. **The nodes represent Operations**. E.g. Matmul, add, sub...\n", "\n", "It consumes and produces **Tensors** by the means of math operations. \n", " \n", "## Tensors\n", "\n", "Similarly, the **edges** of a TensorFlow graph represent Tensors. \n", "\n", "Tensors are the inputs and outputs of operations.\n", "\n", "That is, **Tensors** are the kind of information that flows through a TF Graph.\n", "\n", "![alt text](https://github.com/sthalles/tensorflow-tutorials/blob/master/images/sample_graph.png?raw=true)\n", "\n", "Note: When we create tensors using Graph execution, these objects are actually **references** to the nodes in the Graph.\n", "\n", "## Exercise\n", "\n", "- Use [tf.constant()](https://www.tensorflow.org/versions/master/api_docs/python/tf/constant) to build a simple computational graph. Try *y = a + b*. \n", "- Print the result of the tensors. What do you see?" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "vDEs16jJxoMc", "colab": {} }, "source": [ "# Creates a constant tensor.\n", "# tf.constant(\n", "# value, # A constant value (or list) of output type dtype.\n", "# dtype=None, # The type of the elements of the resulting tensor.\n", "# shape=None, # Optional dimensions of resulting tensor.\n", "# name='Const', # Optional name for the tensor.\n", "# verify_shape=False # Boolean that enables verification of a shape of values.\n", "# )\n", "\n", "a = tf.constant(2.0)\n", "b = tf.constant(3.0, dtype=tf.float32) # you can also define the type values\n", "y = a + b" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "LWgm4zNQ7k8V" }, "source": [ "## Session" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Zve3h48E7trt" }, "source": [ "To run a TensorFlow graph and get the results from the operations, we need a **Session()**.\n", "\n", "- **Session is responsible for evaluating a computational Graph**.\n", "- The *run()* method runs the necessary nodes to evaluate a given operation." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "RakouxYm7mCe", "outputId": "faadb289-912e-4e23-97f8-aa3f49375cc9", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "with tf.Session() as sess:\n", " y_ = sess.run(y) # print out the actual result of the computational graph we built above\n", " print(\"a + b =\", y_)\n", " \n", " # we can pass as many tensors to run as we wish\n", " a_,b_,y_ = sess.run([a,b,y])\n", " print(\"a=%d, b=%d, y=%d\" % (a_,b_,y_))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "a + b = 5.0\n", "a=2, b=3, y=5\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "sP83PBHe9Jap" }, "source": [ "When we execute **Session().run()**, Tensorflow backtracks through all **dependent** operations of the running node.\n", "\n", "## Try it yourself\n", "\n", "Create a TensorFlow graph for the following operations.\n", "\n", "![alt text](https://www.tensorflow.org/versions/r1.1/images/getting_started_add.png)" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "w1JVRHHUU858", "outputId": "ebcb11b2-335d-4c0c-e2d5-5536a90f78dd", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "node1 = tf.constant(3.0)\n", "node2 = tf.constant(2.0)\n", "node3 = tf.add(node1, node2)\n", "print(\"node3: \", node3)\n", "\n", "with tf.Session() as sess:\n", " print(\"sess.run(node3): \",sess.run(node3))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "node3: Tensor(\"Add_1:0\", shape=(), dtype=float32)\n", "sess.run(node3): 5.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Llip2PCFt_Cv" }, "source": [ "## Placeholders" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JMt8zZk0AFDJ" }, "source": [ "What if we want to pass different values (from outside Tensorflow) to a computational Graph?\n", "\n", "To do that, Tensorflow provides a special kind of Tensor - the [tf.placeholder()](https://www.tensorflow.org/api_docs/python/tf/placeholder).\n", "\n", "A placeholder acts as a promise. \n", "**It promises to deliver the value assigned to it when its value is requested**.\n", "\n", "To dynamically feed values to a Tensorflow graph using placeholders, we use the **feed_dict** argument of the **run()** method.\n", "\n", "Note that the feed_dict can **overwrite any tensor**, not just placeholders.\n", "\n", "## Exercise\n", "- Use [tf.placeholder()](https://www.tensorflow.org/api_docs/python/tf/placeholder) to finish the new version of the computational graph below. Try y = a + b.\n", "- Try to feed different values to the placeholder. Try to break it. " ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "Bs6s0ZtvuA4B", "outputId": "ee27b3de-3167-4e2f-ced1-9ae5d99802cb", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "a = tf.placeholder(dtype=tf.float32)\n", "b = tf.placeholder(dtype=tf.float32)\n", "y = a + b\n", "\n", "with tf.Session() as sess:\n", " print(sess.run(y, feed_dict={a: 10, b:2}))\n", " print(sess.run(y, feed_dict={a: [1, 3], b: [2, 4]}))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "12.0\n", "[3. 7.]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "afKGn0HyWZ75" }, "source": [ "## Variables\n", "\n", "In Machine Learning, we usually need to modify the internal structure of a Graph (its variables) in order to get new (improved) outputs with the same inputs.\n", "\n", "- [tf.Variable()](https://www.tensorflow.org/api_docs/python/tf/Variable) gives us this possibility.\n", "- After creating a **tf.Variable**, its type and shape are Immutable. But its values can be changed.\n", "- Variables must be **initialized** before used by any operation." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "_ERB7w2ZXbx6", "outputId": "11b6ef62-34c6-4a83-a13c-2bd620de86b1", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "var1 = tf.Variable(1.2, name=\"my_first_variable\")\n", "\n", "# Assign a new value to the variable with `assign()` or a related method.\n", "# op = var1.assign(var1 + 1.0)\n", "op = var1.assign_add(1.0)\n", "\n", "with tf.Session() as sess:\n", " sess.run(var1.initializer) # initialize the variable before running it\n", " print(\"Value:\", sess.run(var1))\n", " print(\"Value after mutation:\", sess.run(op))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Value: 1.2\n", "Value after mutation: 2.2\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "r9IYjHGbuBSw" }, "source": [ "## Tensorboard" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Ui_f0X32fLLt" }, "source": [ "[TensorBoard](https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard) is a Tensorflow utility that provides ways of visualizing learning. Some of the functionalities include:\n", "1. Model's weights visualization\n", "2. Hyperparameters inspection\n", "3. Tensorflow Graph inspection\n", "\n", "[TensorFlow summit talk](https://www.youtube.com/watch?v=eBbEDRsCmv4)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "3MrgyE1jRYy5" }, "source": [ "## Tensorflow APIs\n", "\n", "TensorFlow provides multiple APIs. \n", "\n", "- The lowest level API --**TensorFlow Core**-- provides you with complete programming control.\n", "- The higher level APIs are built on top of TensorFlow Core\n", " - Easier to use.\n", " - Less internal control\n", " \n", "Let's run a complete example using the **Tensorflow Core** API" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "SjprE0CbuFwA" }, "source": [ "# Linear Regression\n", "\n", "Let's create one of the most basic ML models, The **Linear Regression**.\n", "\n", "As the name suggests, is a Regression model (predicts a real value) by finding the best line that fits the data.\n", "\n", "## Loading data" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "j0zbeI6NuHMy", "outputId": "73596097-da8a-42a3-9ae3-15259b1d4023", "colab": { "resources": { "http://localhost:8080/nbextensions/google.colab/files.js": { "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=", "headers": [ [ "content-type", "application/javascript" ] ], "ok": true, "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 91 } }, "source": [ "# updaload the RealEstate dataset\n", "from google.colab import files\n", "\n", "uploaded = files.upload()\n", "\n", "for fn in uploaded.keys():\n", " print('User uploaded file \"{name}\" with length {length} bytes'.format(\n", " name=fn, length=len(uploaded[fn])))" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " \n", " Upload widget is only available when the cell has been executed in the\n", " current browser session. Please rerun this cell to enable.\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Saving RealEstate.csv to RealEstate.csv\n", "User uploaded file \"RealEstate.csv\" with length 45702 bytes\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "ZCDWZZUgpd-W", "colab": {} }, "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "HHbKvgReqLLc" }, "source": [ "We are going to solve the problem of predicting **house prices** based on historical data. " ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "0gw72MCkpyIe", "outputId": "16e6a1f3-be77-4060-a108-9217055278f0", "colab": { "base_uri": "https://localhost:8080/", "height": 198 } }, "source": [ "housing_data = pd.read_csv(\"RealEstate.csv\")\n", "housing_data.head()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MLSLocationPriceBedroomsBathroomsSizePrice/SQ.FtStatus
0132842Arroyo Grande795000.0332371335.30Short Sale
1134364Paso Robles399000.0432818141.59Short Sale
2135141Paso Robles545000.0433032179.75Short Sale
3135712Morro Bay909000.0443540256.78Short Sale
4136282Santa Maria-Orcutt109900.031124987.99Short Sale
\n", "
" ], "text/plain": [ " MLS Location Price Bedrooms Bathrooms Size \\\n", "0 132842 Arroyo Grande 795000.0 3 3 2371 \n", "1 134364 Paso Robles 399000.0 4 3 2818 \n", "2 135141 Paso Robles 545000.0 4 3 3032 \n", "3 135712 Morro Bay 909000.0 4 4 3540 \n", "4 136282 Santa Maria-Orcutt 109900.0 3 1 1249 \n", "\n", " Price/SQ.Ft Status \n", "0 335.30 Short Sale \n", "1 141.59 Short Sale \n", "2 179.75 Short Sale \n", "3 256.78 Short Sale \n", "4 87.99 Short Sale " ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "nlYIRm-iqHhd" }, "source": [ "To build a Machine Learning model, we often need at least 3 things. A **problem T**, a performance **measure P**, and an **experience E**, from where our model will learn patterns from.\n", "\n", "- Take a look at the statistics bellow." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "s-_OOc8wqTm-", "outputId": "410a1702-c1e1-49e9-83ca-863fe7f4e4ab", "colab": { "base_uri": "https://localhost:8080/", "height": 288 } }, "source": [ "housing_data.describe()" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MLSPriceBedroomsBathroomsSizePrice/SQ.Ft
count781.0000007.810000e+02781.000000781.000000781.000000781.000000
mean151224.5505763.833291e+053.1421252.3559541755.058899213.131293
std3936.1220423.490381e+050.8557680.846596819.577603115.082146
min132842.0000002.650000e+040.0000001.000000120.00000019.330000
25%149922.0000001.990000e+053.0000002.0000001218.000000142.140000
50%152581.0000002.950000e+053.0000002.0000001550.000000188.360000
75%154167.0000004.290000e+054.0000003.0000002032.000000245.420000
max154580.0000005.499000e+0610.00000011.0000006800.0000001144.640000
\n", "
" ], "text/plain": [ " MLS Price Bedrooms Bathrooms Size \\\n", "count 781.000000 7.810000e+02 781.000000 781.000000 781.000000 \n", "mean 151224.550576 3.833291e+05 3.142125 2.355954 1755.058899 \n", "std 3936.122042 3.490381e+05 0.855768 0.846596 819.577603 \n", "min 132842.000000 2.650000e+04 0.000000 1.000000 120.000000 \n", "25% 149922.000000 1.990000e+05 3.000000 2.000000 1218.000000 \n", "50% 152581.000000 2.950000e+05 3.000000 2.000000 1550.000000 \n", "75% 154167.000000 4.290000e+05 4.000000 3.000000 2032.000000 \n", "max 154580.000000 5.499000e+06 10.000000 11.000000 6800.000000 \n", "\n", " Price/SQ.Ft \n", "count 781.000000 \n", "mean 213.131293 \n", "std 115.082146 \n", "min 19.330000 \n", "25% 142.140000 \n", "50% 188.360000 \n", "75% 245.420000 \n", "max 1144.640000 " ] }, "metadata": { "tags": [] }, "execution_count": 24 } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "4EzMLA89Gs7n" }, "source": [ "## Visualizing data" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "gYVbjdg-qi7m", "outputId": "835e3c0f-cd72-4f11-980e-cb779c9a2541", "colab": { "base_uri": "https://localhost:8080/", "height": 420 } }, "source": [ "# only get the Size and the Price features\n", "Xs = housing_data[['Size']]\n", "Ys = housing_data[['Price']]\n", "print(\"Size shape:\", Xs.shape)\n", "print(\"Price shape:\", Ys.shape)\n", "dataset_size = Xs.shape[0]\n", "print(\"Size:\", dataset_size)\n", "\n", "# plot the price and the size\n", "plt.plot(Xs, Ys, 'ro')" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Size shape: (781, 1)\n", "Price shape: (781, 1)\n", "Size: 781\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": { "tags": [] }, "execution_count": 11 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9VPFTuCpGx83" }, "source": [ "## Normalization\n", "\n", "Normalization helps the Learning algorithm in many aspects. \n", "- Prevents some attributes to outvalue some other\n", "- Decreases numerical error\n", "- Accelerates learning\n", "\n", "## Mean Standardization\n", "\n", "- Center the data by removing the mean, and scale it by dividing to the standard deviation.\n", "\n", "![alt text](https://wikimedia.org/api/rest_v1/media/math/render/svg/b0aa2e7d203db1526c577192f2d9102b718eafd5)\n", "\n", "## MinMax Scaling\n", "- Scale the data values to the [0-1] interval.\n", "\n", "![alt text](https://wikimedia.org/api/rest_v1/media/math/render/svg/358923abc154221bb5022fc329061f6fc4dcc69f)\n", "\n", "Tips: Use **np.max()**, **np.min()**, **np.mean()** and **np.std()**" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "uXYA9zWysxT9", "colab": {} }, "source": [ "Xs = Xs.values\n", "Ys = Ys.values\n", "\n", "# Normalize the input features\n", "max_size = np.max(Xs)\n", "min_size = np.min(Xs)\n", "max_price = np.max(Ys)\n", "min_price = np.min(Ys)\n", "\n", "Xs = (Xs - min_size) / (max_size - min_size)\n", "Ys = (Ys - min_price) / (max_price - min_price)\n", "\n", "# shuffle the dataset before separating test/train sets\n", "p = np.random.permutation(len(Xs))\n", "Xs = Xs[p]\n", "Ys = Ys[p]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "n-A-UuXhGv19" }, "source": [ "## Cross validation\n", "\n", "**Cross-validation allows us to be more confident about how good our model is**.\n", "\n", "We want to measure how our models will generalize when faced with unseen data.\n", "\n", "There are many kinds of cross-validation techniques.\n", "\n", "![alt text](https://github.com/sthalles/tensorflow-tutorials/blob/master/images/cross_val_1.png?raw=true)\n", "\n", "Can you see any problems with that?\n", "\n", "![alt text](https://github.com/sthalles/tensorflow-tutorials/blob/master/images/cross_val_2.png?raw=true)\n", "\n", "What happens if the results of on the validation data are quite different from the testing data?\n", "\n", "Let's stick with the basics. \n", "- Separates a subset for training and testing.\n", "\n", "\n" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "TFtV18cIbOYf", "outputId": "5a7c928d-cb47-431b-b7b1-613d5d8d0347", "colab": { "base_uri": "https://localhost:8080/", "height": 90 } }, "source": [ "# separate train/test sets \n", "# Use 80% for training and 20% for testing\n", "train_size = int(0.8 * dataset_size)\n", "Xs_train = Xs[0:train_size]\n", "Xs_test = Xs[train_size:]\n", "Ys_train = Ys[0:train_size]\n", "Ys_test = Ys[train_size:]\n", "print(\"Training set:\", Xs_train.shape )\n", "print(\"Training set labels:\", Ys_train.shape )\n", "print(\"Testing set:\", Xs_test.shape )\n", "print(\"Testing set labels:\", Ys_test.shape )\n", "\n" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Training set: (624, 1)\n", "Training set labels: (624, 1)\n", "Testing set: (157, 1)\n", "Testing set labels: (157, 1)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "eJAolOnar_kX", "outputId": "66ae6655-7062-4cfc-944f-02424261f136", "colab": { "base_uri": "https://localhost:8080/", "height": 418 } }, "source": [ "\n", "min_x = np.min(Xs_test)\n", "max_x = np.max(Xs_test)\n", "\n", "# plot the price and the size\n", "fig = plt.figure()\n", "fig.suptitle('Normalized housing Size/Price dataset', fontsize=14, fontweight='bold')\n", "ax = fig.add_subplot(111)\n", "fig.subplots_adjust(top=0.85)\n", "ax.plot(Xs_train, Ys_train, 'ro')\n", "ax.set_xlabel('Size')\n", "ax.set_ylabel('Price')" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0,0.5,'Price')" ] }, "metadata": { "tags": [] }, "execution_count": 13 }, { "output_type": "display_data", "data": { "image/png": "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\nj6FORESkEAx1IiIihWCoExERKQRDnYiISCEY6kRERArBUCciIlIIhjoREZFCMNSJiIgUgqFORESk\nEAx1IiIihWCoExERKQRDnYiISCEY6kRERArBUCciIlIIhjoREZFCMNSJiIgUgqFORESkEAx1IiIi\nhWCoExERKQRDnYiISCEY6kRERArBUCciIlIIhjoREZFCMNSJiIgUgqFORESkEAx1IiIihWCoExER\nKQRDnYiISCEY6kRERArBUCciIlIIhjoREZFCMNSJiIgUgqFORESkEAx1IiIihWCoExERKQRDnYiI\nSCEY6kRERArBUCciIlIIhjoREZFCMNSJiIgUgqFORESkEAx1IiIihdDIufP09HQcP34cKpUKSUlJ\nCA8P1z22ceNG7NixAy4uLnjooYfwxhtvyFkUIiIixZOtpX748GFcvnwZW7duRVpaGtLS0nSPlZWV\nYd26ddi4cSM2b96Mixcv4pdffpGrKERERE5BtlA/ePAgYmJiAABdunRBSUkJysrKAACurq5wdXVF\neXk5qqurUVFRAW9vb7mKQkRE5BRk634vLCxEWFiY7ndfX18UFBTA09MT7u7umDp1KmJiYuDu7o7H\nH38cnTp1Mrg/H5+W0GjUkpbRz89L0v0R61QOrFPpsU6lxzqVniV1KuuYen2CIOj+v6ysDBkZGfjq\nq6/g6emJcePG4cyZMwgJCRF9fXFxuaTl8fPzQkHBbUn36exYp9JjnUqPdSo91qn0tHVqbrDL1v3u\n7++PwsJC3e83btyAn58fAODixYsICgqCr68v3NzcEBkZiVOnTslVFCIiIqcgW6hHRUVh9+7dAIDs\n7Gz4+/vD09MTABAQEICLFy/i7t27AIBTp06hY8eOchWFiIjIKcjW/d6jRw+EhYUhISEBKpUKKSkp\nyMrKgpeXF2JjYzFhwgSMHTsWarUaERERiIyMlKsoRERETkEl1B/stmNSj9dwDEh6rFPpsU6lxzqV\nHutUenY3pk5ERETWxVAnIiJSCIY6ERGRQjDUiYiIFIKhTkREpBAMdSIiIoVgqBMRESkEQ52IiEgh\nGOpEREQKwVAnIiJSCIY6ERGRQjDUiYiIFIKhTkREpBAMdSIiIoVgqBMRESkEQ52IiEghGOpEREQK\nwVAnIiJSCIY6ERGRQjDUiYiIFIKhTkREpBAMdSIiIoVgqBMRESkEQ52IiEghGOpEREQKwVAnIiJS\n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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "BuarbqyF__t0" }, "source": [ "## Placeholders and Variables\n", "\n", "## Exercise:\n", "\n", "1. Use [tf.placeholder()](https://www.tensorflow.org/api_docs/python/tf/placeholder) to build the two placeholders necessary for feeding the housing data into the Tensorflow Model.\n", "2. Use [tf.Variable()](https://www.tensorflow.org/api_docs/python/tf/Variable) to create the two necessary variables for a Linear Model - *Hint: slope and y-intercept*\n", "\n", "**Template**: \n", "- *inputs = tf.placeholder(shape=[...], dtype=tf.float32, name=\"tensor_name\")*\n", "- *slope = tf.Variable({initial-value}, name={optional-name})*\n", "\n" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "ExALaYu-uTZF", "outputId": "ace34b2f-0297-4ffb-d08f-947bc935ec47", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "inputs = tf.placeholder(shape=[None,1], dtype=tf.float32, name=\"inputs\")\n", "labels = tf.placeholder(dtype=tf.float32, name=\"labels\")\n", "print(inputs)\n", "print(labels)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Tensor(\"inputs_1:0\", shape=(?, 1), dtype=float32)\n", "Tensor(\"labels_1:0\", dtype=float32)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "1Lo-CppoqyN5", "outputId": "99426c23-2948-4322-91f8-f8f6f55d0bf4", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "# create the training variables for the y_intercept and slope of the linear function\n", "\n", "# Pay special attention to the Tensor shapes\n", "y_intercept = tf.Variable(tf.random_normal(shape=[1], mean=0, stddev=0.02), name=\"y-intercept\")\n", "slope = tf.Variable(tf.random_normal(shape=[1,1], mean=0, stddev=0.02), name=\"slope\")\n", "print(y_intercept)\n", "print(slope)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "HsYimvQdG3va" }, "source": [ "## Building the Model" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "EOTHoFdf_T4x" }, "source": [ "## Exercise\n", "\n", "1- Build a linear model following the equation bellow.\n", "\n", "**Hint: Think about how a computational graph for the linear equation would look like.**\n", "\n", "![alt text](https://cdn-images-1.medium.com/max/800/1*SuNmDkv0qNJbKGZoEoGBmw.png)\n", "\n", "For Matrix multiplication: [tf.matmul()](https://www.tensorflow.org/api_docs/python/tf/matmul)" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "UtzDgJc6u4DM", "colab": {} }, "source": [ "def model(X):\n", " # create the graph model here, and return it\n", " return tf.matmul(X,slope) + y_intercept\n", "predictions = model(inputs)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "1A9Rh624_MiL" }, "source": [ "## Hyper-parameters\n", "\n", "## Exercise:\n", "1. Tune the hyper-parameters" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "ZghXH3pb1BXU", "colab": {} }, "source": [ "\n", "lr = 0.3 # defines the size of the step we want to perform in the direction of the gradient define \n", "batch_size = 96 # number of examples that we will use to calculate the gradients at each time step \n", "total_epochs = 25 # number of complete passes through the dataset " ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "tUl1ra1F--se" }, "source": [ "## Error Function\n", "\n", "![alt text](https://cdn-images-1.medium.com/max/800/1*GQ6vjZ9j0K5V7BReHywWAA.png)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "odKT25Ee_7eO" }, "source": [ "### Loss Function and Convex Optimization\n", "\n", "- The **loss function**, also called the objective, is a method for evaluating how good our model is. \n", "- Remember, the goal is to make the **generalization loss** as low as possible.\n", "- The optimization function is responsible for minimizing the loss. It does it using **Gradient Descent**. \n", "- Basically, at each time step, it computes the Gradient of the loss function (MSE) with respect to the Weights (slope and bias) and then it takes a step in the opposite direction of this gradient.\n", "\n", "**DO NOT** worry with gradients - TensorFlow handles it for you :)\n", "\n", "In Practice:\n", "\n", "![alt text](http://res.cloudinary.com/dyy3xzfqh/image/upload/v1511673179/QQ%E6%88%AA%E5%9B%BE20171126131248_muwkba.png)\n", "\n", "## Exercise:\n", "\n", "1. Use [tf.losses.mean_squared_error()](https://www.tensorflow.org/api_docs/python/tf/losses/mean_squared_error) to compute the loss between the prediction values and the true (target) values.\n", "2. Use [tf.train.GradientDescentOptimizer()](https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer) to compute the Gradients and minimize the loss function." ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "ciIWm6zgq9iv", "colab": {} }, "source": [ "# create the loss function here. It need to receive the labels and the predictions from the model\n", "loss = tf.losses.mean_squared_error(\n", " labels=labels,\n", " predictions=predictions)\n", "\n", "# Set the Gradient Descent optimizer and use the minimize() function to minimize the loss\n", "optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "6hQL0bchw-Wn", "colab": {} }, "source": [ "## DO NOT CHANGE\n", "def next_batch(Xs, Ys, batch_size=64):\n", " p = np.random.permutation(len(Xs))\n", " Xs = Xs[p]\n", " Ys = Ys[p]\n", " for i in range(0,Xs.shape[0],batch_size):\n", " x_batch = Xs[i:i+batch_size]\n", " if x_batch.shape[0] < batch_size:\n", " continue\n", " yield np.reshape(x_batch, (batch_size,-1)), Ys[i:i+batch_size]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "i3TXqbTVzito", "colab": {} }, "source": [ "## DO NOT CHANGE\n", "def eval_and_plot(W0, W1, min_x, max_x):\n", " min_y = W0 + np.dot(W1, min_x)\n", " max_y = W0 + np.dot(W1, max_x)\n", "\n", " plt.plot(Xs_test, Ys_test, 'ro')\n", " plt.plot([min_x, max_x], [min_y.squeeze(), max_y.squeeze()], 'k-', lw=2)\n", " #plt.savefig(\"./media/fit%(number)04d.png\" % {\"number\": id_})\n", " #plt.clf()\n", " plt.show()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "f0pNHIrdIKGz" }, "source": [ "## Exercise:\n", "\n", "\n", "1. Finish the training loop bellow. Make sure you run the *optimizer* Tensor.\n", "2. Fetch and display the *training* and *generalization* losses.\n", "\n", "Tips: Use the Session object to run the TF Graph. \n", "\n", "**Template:** \n", "\n", "*sess.run(\"tensor1, tensor2...\", feed_dict={inputs: \"python var\", labels: \"python var\"})*\n" ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "FE2uGdotvcye", "outputId": "d293be01-15e4-494b-a3cf-9bd8ad0c7ed6", "colab": { "base_uri": "https://localhost:8080/", "height": 802 } }, "source": [ "training_loss = []\n", "generalization_loss =[]\n", "\n", "with tf.Session() as sess:\n", " sess.run(tf.global_variables_initializer())\n", " \n", " for epoch in range(total_epochs):\n", " \n", " for X_batch, y_batch in next_batch(Xs_train, Ys_train, batch_size):\n", " _, train_loss = sess.run([optimizer, loss], \n", " feed_dict={inputs:X_batch, labels:y_batch})\n", " training_loss.append(train_loss)\n", " val_pred, val_loss, m, y = sess.run([predictions, loss, slope, y_intercept], \n", " feed_dict={inputs: Xs_test, labels:Ys_test})\n", " \n", " generalization_loss.append(val_loss)\n", " print(\"Epoch:\", epoch, \"Generalization error:\", val_loss)\n", " \n", "eval_and_plot(y,m,min_x,max_x)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Epoch: 0 Generalization error: 0.003373503\n", "Epoch: 1 Generalization error: 0.0033908547\n", "Epoch: 2 Generalization error: 0.0031347417\n", "Epoch: 3 Generalization error: 0.0029506658\n", "Epoch: 4 Generalization error: 0.0028681594\n", "Epoch: 5 Generalization error: 0.0027268634\n", "Epoch: 6 Generalization error: 0.002658567\n", "Epoch: 7 Generalization error: 0.0025818124\n", "Epoch: 8 Generalization error: 0.0025076296\n", "Epoch: 9 Generalization error: 0.002445568\n", "Epoch: 10 Generalization error: 0.0024022933\n", "Epoch: 11 Generalization error: 0.0023721373\n", "Epoch: 12 Generalization error: 0.0023220603\n", "Epoch: 13 Generalization error: 0.0022678894\n", "Epoch: 14 Generalization error: 0.0022409824\n", "Epoch: 15 Generalization error: 0.0022144038\n", "Epoch: 16 Generalization error: 0.002190112\n", "Epoch: 17 Generalization error: 0.0021960097\n", "Epoch: 18 Generalization error: 0.0021574877\n", "Epoch: 19 Generalization error: 0.0021513787\n", "Epoch: 20 Generalization error: 0.002142476\n", "Epoch: 21 Generalization error: 0.0021658572\n", "Epoch: 22 Generalization error: 0.0021265019\n", "Epoch: 23 Generalization error: 0.0021143414\n", "Epoch: 24 Generalization error: 0.0021170583\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "BxRF-CYBAt5g", "outputId": "8def4a90-7166-4d18-ba82-2e2465776f04", "scrolled": true, "colab": { "base_uri": "https://localhost:8080/", "height": 361 } }, "source": [ "# plot the price and the size\n", "plt.plot(training_loss, label=\"validation\")\n", "plt.plot(generalization_loss, label=\"training\")\n", "plt.xlabel('Epoch')\n", "plt.ylabel('Error')\n", "plt.show()" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "code", "metadata": { "colab_type": "code", "id": "eglK4edYgdRg", "colab": {} }, "source": [ "" ], "execution_count": 0, "outputs": [] } ] }