Skip to content

Instantly share code, notes, and snippets.

@voodootikigod
Last active September 27, 2018 20:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save voodootikigod/22b0666664ce8605812b40ade3392f76 to your computer and use it in GitHub Desktop.
Save voodootikigod/22b0666664ce8605812b40ade3392f76 to your computer and use it in GitHub Desktop.
Google AI/ML White Glove
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Google AI/ML White Glove",
"version": "0.3.2",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true,
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"accelerator": "TPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"[View in Colaboratory](https://colab.research.google.com/gist/voodootikigod/22b0666664ce8605812b40ade3392f76/google-aiml-montauk.ipynb)"
]
},
{
"metadata": {
"id": "Lah8kNHvpJgM",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Basics"
]
},
{
"metadata": {
"id": "LIgHAheSpvEl",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Our First Tensor\n",
"\n",
"Start with importing the necessary packages (from python). Notice you don't have to worry about `pip` or anything crazy with the Python packaging."
]
},
{
"metadata": {
"id": "kqoMOf_3qPiU",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"import tensorflow as tf\n",
"import numpy as np"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "qAJ6xnOSqTRF",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Now lets make a 2x2 matrix!"
]
},
{
"metadata": {
"id": "62WKtwoNqV2t",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"m1 = [[1.0, 2.0],\n",
" [3.0, 4.0]]\n",
"\n",
"m2 = np.array([[1.0, 2.0],\n",
" [3.0, 4.0]], dtype=np.float32)\n",
"\n",
"m3 = tf.constant([[1.0, 2.0], [3.0, 4.0]])"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "usYH0w5tqvc6",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"WTF did we just do?!?!"
]
},
{
"metadata": {
"id": "AfzUp0GuqzIW",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 72
},
"outputId": "2025f0c1-32ee-4ed7-bc3e-1086bec062b2"
},
"cell_type": "code",
"source": [
"print(type(m1))\n",
"print(type(m2))\n",
"print(type(m3))"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'list'>\n",
"<class 'numpy.ndarray'>\n",
"<class 'tensorflow.python.framework.ops.Tensor'>\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "-4r07-e3q6IQ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"But I only want tensors?!"
]
},
{
"metadata": {
"id": "T1k0LzDErATZ",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"t1 = tf.convert_to_tensor(m1, dtype=tf.float32)\n",
"t2 = tf.convert_to_tensor(m2, dtype=tf.float32)\n",
"t3 = tf.convert_to_tensor(m3, dtype=tf.float32)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "DLZ3wkzWrOXX",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let's see what happened!"
]
},
{
"metadata": {
"id": "vsftfTBorRVp",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 70
},
"outputId": "1dd85b45-07b8-4eea-c79d-174ea584d4bb"
},
"cell_type": "code",
"source": [
"print(type(t1))\n",
"print(type(t2))\n",
"print(type(t3))\n",
"\n",
"# find the bug."
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'tensorflow.python.framework.ops.Tensor'>\n",
"<class 'tensorflow.python.framework.ops.Tensor'>\n",
"<class 'tensorflow.python.framework.ops.Tensor'>\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "ELiYBtbIrSqZ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Boom!"
]
},
{
"metadata": {
"id": "IF3E93QzrU8D",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Lets Add Math"
]
},
{
"metadata": {
"id": "TPbbpSM7sBTq",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"x = tf.constant([[1,2]])"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "VoeLoVmxsHDh",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Negate that 1x2 matrix."
]
},
{
"metadata": {
"id": "RTBPtRemsNSJ",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"neg_x = tf.negative(x)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "cL5G51ZNsP6I",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let's test it"
]
},
{
"metadata": {
"id": "ly9SHLDksR4B",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "fd2b4831-f5c4-4b1c-c711-04acafedc133"
},
"cell_type": "code",
"source": [
"print(neg_x)"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"Tensor(\"Neg:0\", shape=(1, 2), dtype=int32)\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "CNGfMjz7sUZv",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Wait wut? To actually execute a Tensorflow operation, you will need to create a session and run it."
]
},
{
"metadata": {
"id": "wXmzv8eYsawE",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "bfce13ff-e3b4-4760-ac71-13f3014925b2"
},
"cell_type": "code",
"source": [
"with tf.Session() as sess:\n",
" result = sess.run(neg_x)\n",
" print(result)"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"[[-1 -2]]\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "utjj2_6BsiHs",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Happines \n",
"![alt text](https://media.giphy.com/media/JltOMwYmi0VrO/giphy-downsized.gif)"
]
},
{
"metadata": {
"id": "2g8kFJUhtaZY",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Lets Get Interactive"
]
},
{
"metadata": {
"id": "xrw247-TvXBS",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"intSess = tf.InteractiveSession()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "wQ1PALBIvZ92",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let's invert a matrix"
]
},
{
"metadata": {
"id": "RfsPVb-kvfiO",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"intX = tf.constant([[1., 2.]])\n",
"neg_op = tf.negative(x)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "rIqhbxLuvq4x",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Since we are in an interactive session, we can run `eval()` method on the op."
]
},
{
"metadata": {
"id": "Lojncl8Evy1u",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "7c37ce28-8922-4499-a752-4e220d874646"
},
"cell_type": "code",
"source": [
"result = neg_op.eval()\n",
"print(result)"
],
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"text": [
"[[-1 -2]]\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "5FNwRGzJv6di",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"This generally reads better and looks nicer **HERE**, but do not use it when you write actual code its an anti-pattern."
]
},
{
"metadata": {
"id": "l4pCNNxEwMWe",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"intSess.close()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "BksvdhHrxBex",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Variables"
]
},
{
"metadata": {
"id": "tX4O8TuQxJe7",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Again, this is a big no no, but lets get crazy and just open an interactive session for this part. \n",
"\n",
"**REPEAT DO NOT DO THIS AT HOME (OR WORK) ((OR EVER)) (((OK JUST THIS TIME)))**"
]
},
{
"metadata": {
"id": "A_FO2IVvxYdI",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"import tensorflow as tf\n",
"\n",
"sess = tf.InteractiveSession()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "zVKyvGpoxg41",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Lets play with random data."
]
},
{
"metadata": {
"id": "1nORC67TxkcO",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"raw_data = [1., 2., 8., -1., 0., 5.5, 6., 13]"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "Z7QS0npoxtVA",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"A **critical** thing with tf that will bite you is that you will need to initialize variables, this tells the session to \"store space for this variable\". This will feel strange to start, but will become second nature."
]
},
{
"metadata": {
"id": "E8AasCXeyCsV",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"spike = tf.Variable(False)\n",
"spike.initializer.run() # done due to interactive session, commonly use session.run(tf.global_variables_initializer())"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "rAx9vAEBy5B_",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Lets loop through and assign true or false to the variable based on the distance between each cell's value."
]
},
{
"metadata": {
"id": "Ht02lcEMyWrQ",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 145
},
"outputId": "e0e82413-6773-4ea6-8239-719c041412a6"
},
"cell_type": "code",
"source": [
"for i in range(1, len(raw_data)):\n",
" if raw_data[i] - raw_data[i-1] > 5:\n",
" updater = tf.assign(spike, tf.constant(True)) #notice the assignment\n",
" \n",
" \n",
" updater = tf.add(1,2)\n",
" updater = tf.assign(spike, tf.add(1,2)).eval()\n",
" \n",
" updater = tf.assign(spike, 1+2).eval()\n",
" updater = 1+2\n",
" \n",
" \n",
" \n",
" updater.eval()\n",
" else:\n",
" tf.assign(spike, tf.constant(False)).eval()\n",
" print(\"Spike \", i,\" \", spike.eval())"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"text": [
"Spike 1 False\n",
"Spike 2 True\n",
"Spike 3 False\n",
"Spike 4 False\n",
"Spike 5 True\n",
"Spike 6 False\n",
"Spike 7 True\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "_5OtTBM6y_8R",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"WE DID IT!\n",
"\n",
"![alt text](https://media.giphy.com/media/5GoVLqeAOo6PK/giphy.gif)"
]
},
{
"metadata": {
"id": "XWyzluQs6Z7Z",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Clean up after yourself."
]
},
{
"metadata": {
"id": "mn0cmC_k6bgS",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"sess.close()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "72rbZrqmtBbP",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Don't Stress, Just Regress!"
]
},
{
"metadata": {
"id": "XrErClGWr2x1",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Linear Regression"
]
},
{
"metadata": {
"id": "Oq-MtPaspJgP",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"You don't need to re-import, but in case you want to break this out, I have left it as a \"fully complete\" section. We'll need NumPy to set up the initial data. And we'll use matplotlib to visualize our data. These are both python libraries. **Important note:** `%matplotlib inline` will tell matplotlib to inline the output."
]
},
{
"metadata": {
"id": "Qo4aJob8pJgR",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"%matplotlib inline\n",
"import tensorflow as tf\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "UAfSKqNhpJgX",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let's define some constants (note: not variables) used by the learning algorithm. Technically, these are called hyper-parameters."
]
},
{
"metadata": {
"id": "GX2FxwNMpJgZ",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"learning_rate = 0.01\n",
"training_epochs = 100"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "WLM0m2XgpJge",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up fake data that we will use to to find a best fit line"
]
},
{
"metadata": {
"id": "W_r0p5F8pJgg",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"x_train = np.linspace(-1, 1, 101)\n",
"y_train = 2 * x_train + np.random.randn(*x_train.shape) * 0.33"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "DwDfbPk7pJgm",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Plot the raw data"
]
},
{
"metadata": {
"id": "NcwwP57qpJgo",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "380cdd41-18b9-4ce2-bbd0-3a5b4613e9fc"
},
"cell_type": "code",
"source": [
"plt.scatter(x_train, y_train)"
],
"execution_count": 26,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7f1aa1840ba8>"
]
},
"metadata": {
"tags": []
},
"execution_count": 26
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAW8AAAD4CAYAAAAjKGdbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X2UXOV9H/Dv7uzO7Era1b5ShISi\nsEg/2RLCQjJIqLEAK1Ac65RjYVOgNFQBO41JSVyS+sQ5fklwmrh1HcftaWJe4pM4ysEuNcE2NY5A\nBkegWkhCQhzrERKmoLdqX2ZfpN2dWc1u/5gZ6e7sfb/PvXPvzPfzD2he7vx2dvZ3n/nd3/M8DTMz\nMyAiomRprHYARETkHZM3EVECMXkTESUQkzcRUQIxeRMRJVBTVC/U3z8WqK2ls3MestlxXeFow7jc\ni2NMAOPyIo4xAbUdV29vW4PZ7YkZeTc1paodginG5V4cYwIYlxdxjAmoz7gSk7yJiOgSJm8iogRi\n8iYiSiAmbyKiBGLyJiJKICZvIiIXclMFnM2OIzdVqHYoACLs8yYiSqLC9DSeevEYDhztx9BoDl3t\nGaxd0Yu7brkaqcbqjX+ZvImIbDz14jHsfO3ExX8PjuYu/vueLSuqFRbLJkREVnJTBRw42m9634Gj\nA1UtoTB5ExFZGDmXw9BozvS+7NgkRs6Z3xcFJm8iIgsLF2TQ1Z4xva+zrQULF5jfF4VAyVtEviIi\nr4rIXhH5mK6giIjiINOcwtoVvab3rV3Rg0xzqmpdKL4vWIrIzQBWK6U2ikg3gAMA/pe2yIiIYuCu\nW64GUKxxZ8cm0dnWgrUrenDnTVdhx86jVetCCdJt8jKAn5X+fxjAfBFJKaXi0QRJRKRBqrER92xZ\ngW2b+zByLoeFCzLINKewY+fRqnahNOjYPV5EPgngV5RS91k95sKFwkxcl20kIvJiMn8Bn/7Kizib\nnZhz32Wdrfjvv38LWtLaOrFN1/MOfHQR+ZcAfgPArXaP07AgOfr7xwIdIwyMy704xgQwLi/iGBMQ\nfVxns+PoN0ncANCfncDP3zqLJZe1aYmrt7fN9PagFyxvA/A5ALcrpUaCHIuIki9uU8jDYteFMgPg\n6//zEHbsPIpCYTq0GIJcsFwI4D8D2KKUGtIXEhElTVynkIdp5dJO7D58xvS+cv17Xmsad2xaFsrr\nBymb3AWgB8B3RKR8279RSr0bOCoiSpS4TiEHit8GjBcagzCepAZHc2hJN2JmBshNmY+w9xw+jduv\nvzLw65rxnbyVUt8E8E2NsRBRAjlNId+2uS+U5OUkjG8DlSepybx9WWRgeAIj53K4rHOer9ezU5vf\nZ4goMnGdQl5OtIOjOczg0reBp1485ut4diepRtN+EKCnozW0WZhM3kQUSBynkIexoJTdSWraouN6\nw+pFoX3rYPImokDcTCGPWhjfBuxOUl1tGdx83WJ0t7egsQHobm/BlvVLsH3rKs+v4xbX8yaiwKym\nkJdvj1o50Q6aJHC/3wbKJyljzbvsOunFPVtWIHfz7IujqVR442MmbyIKzGoKebXYJdog3wacTlKZ\n5lQoFyfNMHkTkTZRJq9KlS2BYXwbiNNJismbiGLPrle7MD2Nx555A7sPnpzTEhhWonVzkspNFXB6\n4DwKU4V49XkTEYXNTa+20wShqL8NzIp5LIeutnBmm7LbhIhiy6lXO457TM6KeSZ4f7kVJm8iiiU3\niTmMlsAgi2tFeTJh2YSIYslNYvbaEuhUOw86nd5NzLpKOEzeRBQbxuTqJjG7bQnUUTt3I4z+citM\n3kRUdVbJ9QPLe/DCvpNzHm9MzHfdcjXmtaax++Cpiy2Ba/q6cPPaxciVOj2sEvP45AXcd1txVVQd\ni2uF1V9uhsmbiKrOKrnesm4xtqxfYturnWpsxIN3XIPbr78SQ6OT2LnvBA4dG8BPDpxCV3sGa/q6\ncej4oOnrvnL4DNS7WcjSTm3ljqhmmzJ5E1FV2V3kO/jWIB598AZXvdqZ5hR2HTiJXfsvjdQHR3PY\ndeCU7esPjubwyuEzaEmnMJmfe0GxfX4arRn3qdI4kSeVbkYhPxVKnze7TYioqtxc5Cv3atslQT9L\ntroxfC6PP/rW3uK2ZtPutzXLNKewqGc+VxUkotqka0lZP0u2Gk3mC9jw/svQ3d4y576werWDYPIm\noqrStaSsmyVbu9rsTwRvnRjBql/uQMeCtOn91Zr4Y4bJm4iq7q5brsaW9UvmrIft5SKf3UngOunF\nfbcKvvzJDdi0+nLLYwyO5vDywTMYPpc3vb+aOwNV4gVLIqo6Xav1uVmy9f6PrERrSxP2q+LaI2Ya\nG8xLLdXaGcgMkzcRxUbQRaTcnATKj/nQtVfgC0/8DGblcKsaebV2BjLDsgkR1Rw33Sm9Ha2etzWr\n1s5AZjjyJqJZ7Nb/qCV+tjWLEyZvIgKgZ2GmKOg8ucRpWzOvmLyJCICehZm88pKI7U4ufsVpWzOv\nmLyJyHEdarcLM7l9LeMaJG5H+XaLS/3uvesCxRTnEbYVJm8iimQdauPIuXLJVKdRvt3J5ZXDZ/DW\nV17EtX3dsSvxhKk+fkoisqVrirpR5Y40xu3BrFjNYLQ7uQBAf3YidtPXw8aRNxEBAFYu7cTuw2fm\n3O61t9msNm23LKuR1SjfbpMDI90lnjhj8iaqY5WljJZ0I4AG5KcKvtehNqtNOy3LWmYc5VdezLRq\n6zPSvdVYnDF5E1VBXHqpKxPtZL645OmNqy/HfbeJ59iclmV1Wt1v7YoeNKUasGPn0TldJXfedBUA\n2E5rj9P09bAxeRNFKE691HaJVr077OuYfpdl7W6/NMp3alnctrkP335eaSnxJBmTN1GE/PZShzFS\nD6PDxK423dWWwbXLe3Do2OCsvSa3rL8SXe0tyDSnXLcslheXKk+u6eloxZpSt0m9YPImioifXuow\nR+ph7HQedMq52xNK5eSavmXdGBuZ8BxvkgX67YvIahE5LiIP6QqIqFa5SUyVjO11M9C7o4vXTRBy\nUwWcHjjvuBmB09rcdotGeW1ZLB+rJV1/41DfP7GIzAfwDQAv6AuHqHZ5HelO5i+EPuvRzU7ns0b/\nYzl0tdmP/oNMObcbuddTPduNIKerHICPAPiPmmIhqmleE1N2NPxZj24Srd86vd8p525OKBQgeSul\nLgC4ICKuHt/ZOQ9NTcHOmr29bYGeHxbG5V4cYwKii+uhT6zFvNY09hw+jYHhCfR0tGLD6kXYvnUV\nUqnZo9jJ/AX0drbibHZuLbenoxV9y7q1lguWmNw2mb9gObnm0PFBfGpbaygli4fvXofJ/AVkR3Po\nbM+4eo16+2xFVijKZscDPb+3tw39/WOaotGHcbkXx5iA6OO6Y9My3H79lbNGukND503jWtPXbTpS\nX9NXvEAXdtRns+PoNzl5AMDA8ASOvzMY6oSYJsDVz1nLny2r5F9/VX6iGHBbUqh2CSGMjhTSg8mb\nKMb8XvzT1RduV6eXpR2+j0vBBek2WQfgqwCWAZgSkTsBfEwpNaQpNiIqcTtSt1oUyjgRxivj6H9o\ndBKZdPEYrx4+A/VuNpa77dSDIBcs9wG4SV8oRBSU1aJQuw6cQrfPCT7G0f93X3obL7723qzjh73b\nDpnjqZKoRtjN4AQuJdq/fu6I40QbK4ePD5jebrUON4WHNW+iKtNVn3basKDsFZ/ljpFzOfQPm3ee\n1NNSrHHB5E1UJbrXLXG7YQHgr9yxcEEGvR3mfefsPIkeyyZEVeK0bslk/sKsbcSc2K1VYsVLuSPT\nnMKG1YtM7+PU9ehx5E1UBXb16f2qH4XpGbz5iyH0Zyc8jciNnSGDo5OOcXgtd2zfugrjE/lZfedr\n+rpw89rFyE0VmMAjxORNVAV29emhsRx27T958d9eShzGzpCh0Uns3HcCB98a0LbzTCo19/iHjg3g\nJwdOVXVjiXrEd5ioCuyWPm1sMH+OU4nDuFt7pjmFRd3zcd+tgi9/cgM2rb7c9Dl+J9pkmlPYdeAk\ndu0/GcpyteSMI2+iKrCbuWi1XZhVicPpwmflzjM6Jtp43VgiLnt21hImb6IqMVu3ZE1fFw4dH/S0\nloibJVuN5ZTK/R/9dJ643fEmTnt21homb6IqsVq3ZMfOo67X/PaztdqRd7OeHm/G7YJVftcCJ2c8\n9RFVWeW2YOVtxC7rbDXdRszI69ZqfrZis4rZaQs1pxMLZ2QGw5E3UcyUR+Sf2taK4+8M2taJvS7Z\nqnOJV6flasPYnZ4uYfImiqmWdJNpcqu8+OdlazWde0Q6LVfLtcDDxeRNpEEU3RRWF//uvOkqAO43\nbNC9wYPVcrXcTDhcTN5EAUTZTeF08c/thg1Bdnf3qto7AdUyJm+iAKLqpnDbVeKlhux3d3cvojxR\n1Bt2mxD5FGU3ha4ukWqp7Kih4Ji8KdaMU77jJsqEajedvn1+Gq0ZfomuN/yNUywlYWZelN0Udhf/\nhs/l8Uff2hu794fCxd8yxZLTWtdxYDdRJYyd1cuTd7rbW+bcF8f3h8LF5E2xk6SZecaE2gCgJZ1C\nSzqFVw+fwR8+tgc7dh5FYXpay2uVL/59/v716LQY1cft/aHwMHlT7CTp4lw5oT764A24cfXlmMwX\nMJkvhPptYSJ3AcMW70Hc3h8KD5M3xY7dxTmnWnI1L3BaLfj02pGzGBvPa3udIO8P1Q5esKTY8TMz\nr9oXOO2+LQyfy+OLT+7FupV64uHMRQKYvCmmvM7Mq/bSo047t2fP6Y2HMxeJyZtiycvMPD9rWuvg\ndoGoMOLhzEVi8qZYczOFO4ylR+0WmnJaIOq1I2cxfM68xq17KdQoprhTPDF5U+LpnCzjpnbuVKLZ\neuMyfPHJvciadH3wgiLpwm4TSjw3u7q45TQ5yE0Petu8NNat1BMPkRUmb6oJxskyTluHWXGTmN32\noOuIh8gOyyZUE3RcwHOTmN2WaGrlgmIUm0yQP0zeVFOCXMBzk5j9bDuWxAuKVrX/hz6xttqhUQnL\nJlR3rGZhuq2d10NJxKr2/+T336x2aFTCkTfVhdxUAUOjk9i57wQOHRuwHE06TX4plxG2be5LfEnE\nil3tf8/h07j9+itr6udNKt/JW0S+BmADgBkADyul9mqLisiEn/qr8et/ZTmkPJqc15rGHZuWAbCu\nVRemp7Fj59FYry+ui13tf2B4QmufOvnnK3mLyGYAy5VSG0XkfQCeBLBRa2REJUHWLansyTZjNpqs\nrFVXe/p9lOxq/z0drexTjwm/Q4YPA3gGAJRSPwfQKSLt2qIiMvC7MYPd13+j8mjSz3Fqcf1su9r/\nhtWLWDKJCb9lk8sB7DP8u79026jVEzo756GpKdgvvbe3LdDzw8K43PMa02T+Ag4dHzS979DxQXxq\nWyta0uYf49MD5zE05ry2dU9HK/qWdfs6TnZsEql0M3p75ju+jh/V+h0+9Im1mNeaxp7DpzEwPIGe\njlZsWL0I27euQioVzzJRHD/vQHhx6bpg2eD0gGx2PNAL9Pa2ob9/LNAxwsC43PMT09nsOPqzE6b3\nDQxP4Pg7g5b118JUAV1t1iv9lW1YvQhjIxOwiszuOJ1tLSjkp1z9XF5r9tX+Hd6xaRluv/7KWTGn\nUo2x+1wB1X+vrOiIyyr5+03ep1AcaZddAeC0z2MRWQqybonTSn/d7cVOku1bV2Fo6Lyv47iZ7l7t\ntcaDSGqfej3wm7x/DOBLAP5KRK4DcEopFb/THiVe0MRp1vq3pq8LW9Zfia72loujScB+ZBxk/ex6\nuthJ0fGVvJVSr4jIPhF5BcA0gE/rDYvokiCJ08009ULBuQ3Q73R3r2uNG08gRHZ817yVUp/VGQiR\nFR3rhNh9/X/y+2/ajowrR+Reyghu1xo3K61sunYxtm5cGvvSClUHZ1hSYoRRf81NFbDnsPnlmv2q\nH4XpmTkzMr3Uqt3W7M1KK8/+9G2MT+RZWiFTPKWTK9Xcld1JkNhGzuXQP2zezTI0lsOu/Sc995cb\nuVkvpd76yEkPjrxrXNAlPePcKaEjtoULMujtaMVZk3bExgZgembuc7zuQ+lUsw9jGzeqfUzeNcrN\nRTg34twpoSO2THMKG1YvwrM/fXvOfWaJG/CeUJ1q9jq3caP6wbJJjSpfhAvylT/OX+d1xrZ966o5\nS7zevPYKdLebJ02/CbVcszdb81vXNm5UPzjyrkF2F+G8fOWP89d5nbGlUuYj4x07j/ruL/fKrLSy\n6dorsHXjUq2vQ7WDybsG2V2E85LY4vx13k1sXuv9ld0sQfrLvTIrrSy5oiOWU74pHpi8a5DdRTgv\nSTfo7MYw2cV27fJuPP3S8cD1/mrsQ8np6OQWk3cNsrsI5zXpRjn69MoqtpmZGa0XWZlQKY6YvGvU\n9q2rMD6RD5R0477ll9nIGAD+8LE9po/32uJHFGdM3jXK6iKcG3Hu7TZjHBmfzY7H9iIrkU7x+0sk\nraza0+z43bnGDV0zNa2OU76QaabaF1mJdOLIm2bxugqeW4XpaTz2zBvYffBkoNG807eCOF9kJdKJ\nyZtmCdI/bdeap2umppvjxPkiK5EuTN40i5/+aafRsK7RvNvjVKPFjyhqTN4JFnTRKTN++qdnZmbw\nwr6TFx9XORp2M5pfuCDj+LN4/VbAFj+qZUzeCRR2N4jX/umWtHmyLY+G7UbzHQsyeH7ve7PWzF7T\n1z1rm7KyOM/4JIoak3cChb3Sn9f+6cm8eeeIcVS9cmkndh8+M+cx81ubsWv/7FH7rgOnsOvAKXRH\ncDEyN1XA6YHzKEwVWFqhRGHyTpiwukHMuO2ftmIcVQ+O5tCaSWFmBshPFS5uBHzo+KDl88O8GDnr\n28tYDl1t8e5lJ6rE5J0w1Vrpz65k0ZJOmY6+K0fVE7niY25cfTnuu03QPzyBnxw45fjaYVyMjPM6\n5URucIgRojC2DqvWJBS7NadvvOZy0/WwxyenTB9/5P9m8Z1dx/Dn33kdFvsdzFI+KVXG43XyUVmc\n1ykncosj7xCEeUGxmpNQ7EoWqcbGWaPhkXM5y1F1eW9It3SflOK8TjmRW0zeIQj7K3m1JqE4lSyM\nNXK7MovV3pBWdJ+U2LVCtYDJW7MoLihWexKKm/5pu28Idol7w/svw1snRkM9KXEKPdUCJm/NovxK\nHvdJKJXfEHo6WrFqWScOHR80HfV2t7fg129/HwCEflLiFHpKOiZvzfiV/JLKbwh9y7oxNjLham/I\nsE9KxthS6WYU8lMccVOisNtEM+4EPlf5G0JLujhWuOuWq+d0p2xZv6Qqo95McwqLeubX5e+Fko0j\n7xDwK7m9atfsiWoBk3cImJzcLZoV95o9UZwxeYdIV3IKY/XAMI4J2Pe4E5E+TN4xFsZkn7BXJLTr\ncX/47nWBj09ERUzeMRbGZJ8wJxA59bhP5i8EOj4RXcJuk5gKsv5GeZnTyse4OWaQ9VicetyzHlcl\nJCJrHHnHiLEO7Weyj9Myp3bHHBqdxLefVzjybtZ3OcWpx72zPYOxkQlXxyIie76Tt4hsBvBdANuV\nUj/QF1L9MatDr+nr9jzZx6kkYpdcM+nUrM0S/JRTnKadt6SbMObqSETkxFfZRET6AHwGwG694dSn\nctIdHM1hBpd2k5nX0mz6eLPJPm7LLCuXdnqKzesSqXGagENUy/yOvE8D+BiAJzTGUpfsku75iSnc\nfN1iHDo26DjZx21JZHA0h5Z0I4CGizvayNIOvGqyRRngfT0W9rgTRcNX8lZKjQOAiLh+TmfnPDQ1\nBfsj7u1tC/T8sASJ6/TAeQyNmSfd4XM53H3b+/BbH88gO5pDZ3vm4hTzSm0LW9Hb2Yqz2bk15ZbM\n7JLIZH4aAPDh9VfiN7etAQAc+8qLps/t6WhF37Juy9e1s8Tktlr8HYYpjnHFMSag/uJy/IsUkQcA\nPFBx8xeUUs97eaFsdtzLw+fo7W1Df3/8KqZB4ypMFdDVZl3bLuSnMDYyjSYAYyMTtjXjNX3dpvXm\nGYslWF8/2o+BgXPINKcsn7umr9vxdd2q1d9hWOIYVxxjAmo7Lqvk75i8lVKPA3g80KuTJZ1rS5ut\nqeK2JML1WIiSha2CJrxOHQ861VxX4jRb5hQAVKnWXanctVKOf9vmPs+16rCm2RORPV/JW0R+DcDv\nAVgJYJ2I/Hul1K1aI6sCr1PHC9PTeOyZN7D74MlAU811XOSrTKK9PfMvfl2zGtlfu7wbT7903NdU\n+bCn2RORPb8XLH8I4IeaY6k6r1PHdU8197OQlVUSfegTay8+xmpkPzMz4zv+sPfpJCJ7HCKVeJ2O\nHmT6uk5mPeI7XzuBJ7//5sXHlEf2jz54A/7kkxvw6IM3YNvmPrz+1oCv+OPysxPVMybvEjfT0YM8\nPgx2SXTP4dNzkmh5ZJ9pTgWKPw4/O1G9Y/IuKU8dN2M2Hb0104QOi/0ovexVGdZCUAPDE7ZJ1OvP\nq+u5RKQHu01K3LbsGWvMWYvk6KbFT8cFP7u1Sno6Wm2TaJAWRZ3tjUTkD5O3gZuWvcoLdUbd7e5b\n/Jwu+LndRswqiW5YvcgxiQZpUWRfOFF1MXkbOLXs2dWYOxak8fn716NtXtrxdeyOs1/1ozA9g0PH\nBlyNyK2S6PatqzA0dD7QzxvWc4koOCZvE1Yte3Y15tHzeUzkLrhK3raLSI3lsGv/yYv/dmrBs0qi\nqZT7yxlB9trkJsJE1cELlh7oulBnd5zGBvPnOLXgGTtJiKj2JT55B+nW8KpcYzbj5UKd3XGmLRaR\nYgseERkltmxSrenZlTXmno5WrOnr9nyhzqxWvaavC4eOD3raPYeI6lNik3e1pmdX1pj7lnX72pfR\nqla9Y+dRtuARkaNElk3GxvPYd6S607PLNWY/mxSYHaecmLmNGBG5kaiRd7lU8tqRsxg+lzd9jJdt\nu+K4nClb8IjIjUQlb7sJMmVuasPVqJd7PVGwBY+I7CQmeU/mL1hObDFyUxuOsl7Oda+JKAyJyR7Z\nUeuJLQDQuSDjqjYc9XKmVku2PvXiMV/Hi7I1kojiKzEj785260WYOhak8cXtHww8u9FLvdwNpxPF\nts19ruvZHMETkVFi/upb0k2WE1vWr7zMVeIGol3OVOe617pH8ESUbIlJ3oBzG52bkoKuWZJu6DpR\ncOcaIqqUmLIJYN1GV5iexo6dR12XFKJazlTXutdRlnqIKBkSlbzLKtvovHaPRNlLreNEYbfpAqfN\nE9WnRCZvoyAXBaPopdZxouDONURUKfHJOyklhaAnCu5cQ0RGiU/eukoKcZwqb8Rp80RklPjkHbSk\nkLT+aU6bJyKgBpI3EKykUK2lZYmIgqiJ5O23pKBzBqQXcS/REFH81UTyLvNaUoj6YmfSSjREFF91\nlzGMszCjnCoPcIo7EelTUyNvK7mpAoZGJ7Fz3wkcOjYwa9T7geU9eGHfyTnP0d0/Xa0SDRHVpppO\n3sYyRWUrYXnUe8u6xdiyfkno/dNJ6UcnomSo6eTtZuedg28N4tEHbwi9f5pT3IlIp5qtedttUmxU\nHvVWbgSsW5SrGRJR7au5kbebTYqNnEa9xrY+AI6jc7s2QE5xJyJdai55uymVGFmNeivr5S3pRgAN\nyOULs1r8zB5v1QbIKe5EpIuv5C0iTQCeANBXOsYjSql/0hmYH3YdHZW62+1HvZUngcn89MX/N87C\nfPjudaaPt5upySnuRBSU35H3fQDOK6X+uYisAvDXAK7XF5Y/dh0dQHGT4g8s78aW9Veiq73FtvTh\n5iRw4OgAJvMX2AZIRJHzm7y/DeDvS//fD6BbTzjB2HV06Nqk2Cg7NonsaI5tgEQUOV/JWyk1BWCq\n9M/fAbDD6TmdnfPQ1BRs9Nnb2+b4mE3XLsazP317zu0fWrsEV/2Su3NM28JW9Ha24mx2wvZxPR2t\n6GzPoLM9Y/n4no5W9C3rRks6+ssLbt6vqMUxJoBxeRHHmID6i8sxo4jIAwAeqLj5C0qp50Xk0wCu\nA7DV6TjZ7Li/CEt6e9vQ3z/m+LitG5difCI/p6Nj68alrp5ftqav2/HC55q+YlLu7x+zfPyavm6M\njUzA/Svr4fb9ilIcYwIYlxdxjAmo7biskr9j8lZKPQ7g8crbReQ3UEzad5RG4rGgq6PD2NY3NDqJ\nTLp4jPxUwbTFj22ARBQlv90mVwH4TQCblVKTekPSI2hHh9lJALDu82YbIBFFyW8h9gEUL1I+JyLl\n225VSjnPikmYypOA0wmBbYBEFAW/Fyz/AMAfaI6FiIhcqtm1TYiIahmTNxFRAjF5ExElEJM3EVEC\nMXkTESUQkzcRUQIxeRMRJRCTNxFRAiUieeemCjg9cB65qUK1QyEiioVYb4M2a2uxsRy62uZuLUZE\nVI9inby9bC1GRFRPYjt8ddpajCUUIqpnsU3ebrYWIyKqV7FN3uX9KM10trVcXF+biKgexTZ5Z5pT\nWLui1/S+tSt6uNEBEdW1WF+w5NZiRETmYp28jVuLpdLNKOSnOOImIkKMyyZGmeYUFvXMZ+ImIipJ\nRPImIqLZmLyJiBKIyZuIKIGYvImIEojJm4gogRpmZmaqHQMREXnEkTcRUQIxeRMRJRCTNxFRAjF5\nExElEJM3EVECMXkTESUQkzcRUQLFbklYEdkM4LsAtiulfmBy/70AfgfANIBvKqWeEJFmAN8C8EsA\nCgD+rVLqbY0x2R5fRNYB+KrhKe8HcAeAWwHcC+Bk6fa/VUo9EVVcpcdMAdhtuOnDKJ60bZ8Xckx3\nAfgPKP4OX1BKfU5E7gfwxwCOlx72j0qpL2uK6WsANgCYAfCwUmqv4b4tAP6kFOtzSqk/dnpOBDHd\nDOA/lWJSAB4A8CEU/y7eLD3sDaXUb+uMyUVc7wB4rxQXANyrlDoZ9ntlF5eILAbwd4aHXgXgswDS\nCOnzVBHXagD/AOBrSqn/VnFfqJ+tWCVvEekD8BnMTjbG++cD+DyA6wHkAewVke8B2ApgWCl1r4jc\niuIH/y6Nod1jd3yl1D4AN5Vi7EDxl7kHxeT99cpfalRxlYwopW4y3iAi/9rF80KJSUTmAfgzANcA\nOAdgj4iU//ieUko9oimO8uttBrBcKbVRRN4H4EkAGw0P+QsAt6F4gn1JRJ4G0OvwnLBj+iaAm5VS\nJ0TkuwD+BYBxAC8ppe7UFYeE6JmfAAAErElEQVSPuADgdqXUOY/PCS0updRJXPrbawLwEwDPArgT\nIXyeKuKaD+AbAF6weEion624lU1OA/gYgBGL+28AsFcpNaKUmkAxyW9CcTT5vdJjdpZu08nL8R8B\n8OdKqWnNMZjx+3OH+X7ZHlspNQ7gGqXUmFJqBsAggG6Nr28WzzOl1/45gE4RaQcAEbkKwJBS6r3S\n7+u50uMtnxN2TCXrlFInSv/fj3DfHy9x6XpOWHHdD+Bp48klZDkAHwFwqvKOKD5bsUreSqlxpVTB\n5iGXo/hhLjsLYJHx9tIbNSMiaY2huTq+iLSieKb9B8PNHxeRfxSRH4jIL2uMyW1cLSKyQ0R2i8hn\nvPw8YcWklBoDABG5BsAyFL+lAMBmEfmRiLwgImt1x1PSX7rN7L45nyeT54QdE5RSowAgIotQ/Pb2\nXOmu94vIsyLyTyLyqxrjcRVXyV+WXv9PRaTB5XOiiAsolpeMZckwPk8XKaUulAaRZkL/bFWtbCIi\nD6D4Zht9QSn1vIfDNHi83ZFFXDe4PP4dAH5oGHU/B+BFpdTLIvKvUPyK9dGI43oEwLdRrK+9LCIv\nmzzG1/sV5L0SkeUAdgC4Ryk1JSJ7APQrpX4oIhsB/A2KpRXd7H5W7Z8nl+YcX0QuA/B9AL+llBoU\nkbcAfAnAd1Cs6+4SkauVUvkI4/o8gB8BGEJx9LjNxXPCYPZ+bQRwpHziQ3FAEMXnyS3tn62qJW+l\n1OMAHvf4tFOYfZZajOIvqXz7wdIFswa/H2qzuETkWy6P/1EA/8NwrJ8Z7nsWxVqvL37jUkr9peHx\nL6D4AdbyfvmNSUSWoPjHf59S6vXSsY4AOFL6/1dFpFdEUg7fxNyo/MxcgWJ5zuy+xaXb8jbP0cEu\nJpS+Rv9vAJ9TSv0YuFjbfar0kOMicqYU7y+iiksp9TeGGJ/D7M+S6XOiiKvkoyiW6cqxhvV5civ0\nz1asyiYu/B8AHxSRDhFZgGI99acAfgzg46XHbAWwS/Pruj3+BwEcLP9DRL4uIr9S+udNAA5HGZcU\n7RCRhtLFnE0odiuE+X65OfYTAP6dUmq/IdbfF5G7S/+/GsVRk44/tB+jePEKInIdgFPlso1S6h0A\n7SKyrPT+fLT0eMvnaOJ0/K+i2L3wo/INInKviDxS+v/LAfwzXOpiCj0uEVkoIs8bSmCbUfw8h/1e\n2cZlUPm3F9bnyZUoPluxWhJWRH4NwO8BWIliLei0UupWEfksilfaXxWRO0uPmQHwDaXU34lICsUR\n4HIULyLcr5R6T2Ncpsc3xlV63Fml1GWG510D4K8ATKHYFvegUupYlHGJyJ8BuKX0+s8qpb4c5vvl\nFBOKFyhfB2D8VvJfAewH8LcoDiiaAPxuxTeXIDH9KYqtdtMAPg1gLYpdON8TkQ/h0jeip5VS/8Xs\nOUqpg3OPrD8mAM8DyAJ41fDwHQD+vvTfDhTb4L6klHoOmjm8Vw8D+HUAEwAOAPhtpdRM2O+VU1yl\n+98AsEUp9f9K/16CkD5PhpjKLcLLUPwbP4niN+xfRPHZilXyJiIid5JWNiEiIjB5ExElEpM3EVEC\nMXkTESUQkzcRUQIxeRMRJRCTNxFRAv1/6ooMlOgjl8EAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1aa19074a8>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "D275BGy8pJgy",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up the input and output nodes as placeholders since the value will be injected by `x_train` and `y_train`."
]
},
{
"metadata": {
"id": "TddFrlpJpJg0",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"X = tf.placeholder(\"float\")\n",
"Y = tf.placeholder(\"float\")"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "6tSAsJFNpJg-",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the model as `y = w'*x`"
]
},
{
"metadata": {
"id": "b1DBcpfipJg_",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def model(X, w):\n",
" return tf.multiply(X, w)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "ZaiBunCbpJhF",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up the weights variable"
]
},
{
"metadata": {
"id": "LXYJwg00pJhH",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"w = tf.Variable(0.0, name=\"weights\")"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "ROSu5nNrpJhN",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the cost function as the mean squared error"
]
},
{
"metadata": {
"id": "eixcxpiPpJhP",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"y_model = model(X, w)\n",
"cost = tf.reduce_mean(tf.square(Y-y_model))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "djwfHYXgpJhU",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the operation that will be called on each iteration of the learning algorithm"
]
},
{
"metadata": {
"id": "CXtdjE7zpJhV",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)\n"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "WdmZHY7spJhZ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Initialize all variables"
]
},
{
"metadata": {
"id": "iTTDB_V4pJhb",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"sess = tf.Session()\n",
"init = tf.global_variables_initializer()\n",
"sess.run(init)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "2GgyThMCpJhh",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Train on each (x, y) pair multiple times"
]
},
{
"metadata": {
"id": "f0IIJP80pJhj",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"for epoch in range(training_epochs):\n",
" for (x, y) in zip(x_train, y_train):\n",
" sess.run(train_op, feed_dict={X: x, Y: y})"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "nCHAsNmOpJhl",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Fetch the value of the learned parameter"
]
},
{
"metadata": {
"id": "Hn20dS10pJhw",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"w_val = sess.run(w)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "6aQwaeLKpJiz",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"sess.close()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "RDi8fBhQpJi3",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Visualize the best fit curve"
]
},
{
"metadata": {
"id": "rMKExwMOpJi4",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"outputId": "d2a899dc-6a97-4ef9-c218-a9ff9391d983"
},
"cell_type": "code",
"source": [
"plt.scatter(x_train, y_train)\n",
"y_learned = x_train*w_val\n",
"plt.plot(x_train, y_learned, 'r')\n",
"plt.show()"
],
"execution_count": 36,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1aa17aefd0>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "RYFQhGx12_IM",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Polynomial Regression"
]
},
{
"metadata": {
"id": "ef7RtH8N2_IM",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Import the relevant libraries and initialize the hyper-parameters"
]
},
{
"metadata": {
"id": "u0aVzgsp2_IM",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"%matplotlib inline\n",
"import tensorflow as tf\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"learning_rate = 0.01\n",
"training_epochs = 40"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "-CuQ6T7j2_IQ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up some fake raw input data"
]
},
{
"metadata": {
"id": "6wdRby3T2_IQ",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"trX = np.linspace(-1, 1, 101)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "xjTJt3O32_IW",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up raw output data based on a degree 6 polynomial"
]
},
{
"metadata": {
"id": "ItSbWnsW2_IW",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"num_coeffs = 6\n",
"trY_coeffs = [1, 2, 3, 4, 5, 6]\n",
"trY = 0\n",
"for i in range(num_coeffs):\n",
" trY += trY_coeffs[i] * np.power(trX, i)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "tO5lGiKA2_IY",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Add some noise"
]
},
{
"metadata": {
"id": "1rX9P1Tl2_IY",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"trY += np.random.randn(*trX.shape) * 1.5"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "ZfmRHl912_Ia",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Plot the raw data"
]
},
{
"metadata": {
"id": "EwOnjD5w2_Ib",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"outputId": "9051f9c0-b9b3-4cd2-9766-68ab70da2a13"
},
"cell_type": "code",
"source": [
"plt.scatter(trX, trY)\n",
"plt.show()"
],
"execution_count": 41,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nC7uro61qFy6DphGWIhIp+fVsp5GRixa20t3ZerZkkq+xwb2LoJON65bGZsHhQvEfIyoikVfK/CL5\n9ew05y4u7nn0CJBZLHjjuoTjfd0Sd3IixZb1y1nS2UZjAyzpbKNn0yp2bV9b7kuqObW8RSQ0xVrR\nhbzq2fsP97Nz6xpa5zWdTbr7D/czODLO0sXtXLK6i4NHBxxb5N2dbbzjusxYFadSTBwpeYtIaNzm\nHQHnLnpe9ez8i4tNjY3c1LOOnVvXcHo0yZrVSxg5PcbuvYdnPF9OfnkkjhcnnahsIiKhKNaKdiqh\n5OrZTpwuLrbOa2JZ13zaWjLt0F3b19KzadWcKo+4UctbRELhtxWdL1fPLtZ6dlPYIp8L5RE3St4i\nEgqvXiFeXfQK69m5EZOltJ5zLfK5TMlbREJRbiu6nlrPlVDyFpHQVNKKrofWcyWUvEUkNGpFh0fJ\nW0RCp1Z08NRVUERqxu/Iy7m6Anwl1PIWkarzO/Ky1BGa9UTJW0Sqzu/Iy1JHaNaT+j50iUjV+R15\n6bXfMy/2MnJmIrQY40DJW0Sqys/Iy2L7DY1OcNfdT7N772FSTqsM1wElbxGpKr/zl3jtBzA4OnOq\n2Hqj5C1Sp2rVg8NrPu78kZde++Xbf7if8YmpQGOMA12wFKkzUejB4Tby8vprfofewTNnB/Pk9nvm\nxV6GRp1r3IMj4wwOJ+sumdXb6xWpe1HowVE48nLh/BYeeOwlPvr1n886oNzUs44dV6/mrrufZtBh\nIeGujja6OlsZOT1WldijQmUTkTpSzhzbYcqNvHzgsZc8lz7rmN/CFRe7l1py83nXEyVvkTrit6dH\nNfk9oNTTQgt+1N/hSqSOlTvHdpjKXfqs3ie5UstbpI747ekRBL+9Wcpd+qyeEzeo5S1Sd4JYqcZL\nqb1ZKl36rF4peYvUmbDLD+X0Zgn7gDIXKXmL1Kkw5tgudvFx59Y1jgcK1bNLV3byNsZcC3wLeCG7\n6Xlr7fuDCEpE4qmcFePzadEG/yptef/UWntDIJGISOz56c2SnEypdR0AlU1EJDBeFx8vu2gJ9//0\nqBZWCEhDOp0u647Zssn/Ao4A3cDHrLU/dtt/aiqVbm7WUVZkrkulprn7oRd46tAJ+ofGWLq4navW\nr2A6neZ7//zrWfv/8TUXcvv1l9Yg0thocNxYQfJeCfw+cB9wIbAPWGutdZw9pq9vpLwnykokOujr\n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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1a9c6d0898>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "rM7CGTQ42_Ic",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the nodes to hold values for input/output pairs"
]
},
{
"metadata": {
"id": "sdXmEgbX2_Ie",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"X = tf.placeholder(\"float\")\n",
"Y = tf.placeholder(\"float\")"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "MyxIBs382_Ie",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define our polynomial model"
]
},
{
"metadata": {
"id": "LgghUoWf2_If",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def model(X, w):\n",
" terms = []\n",
" for i in range(num_coeffs):\n",
" term = tf.multiply(w[i], tf.pow(X, i))\n",
" terms.append(term)\n",
" return tf.add_n(terms)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "L2Gjh9cR2_Ih",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up the parameter vector to all zero"
]
},
{
"metadata": {
"id": "gJCuTC3E2_Ih",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"w = tf.Variable([0.] * num_coeffs, name=\"parameters\")\n",
"y_model = model(X, w)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "hpNt9opQ2_Ik",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the cost function just as before"
]
},
{
"metadata": {
"id": "LmBiquqN2_Im",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"cost = tf.reduce_sum(tf.square(Y-y_model))\n",
"train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "UtJnHXxr2_In",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up the session and run the learning algorithm just as before"
]
},
{
"metadata": {
"id": "Ye2dYObP2_Io",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "9f99dcfa-9578-437c-e9dc-83a031665249"
},
"cell_type": "code",
"source": [
"sess = tf.Session()\n",
"init = tf.global_variables_initializer()\n",
"sess.run(init)\n",
"\n",
"for epoch in range(training_epochs):\n",
" for (x, y) in zip(trX, trY):\n",
" sess.run(train_op, feed_dict={X: x, Y: y})\n",
"\n",
"w_val = sess.run(w)\n",
"print(w_val)"
],
"execution_count": 46,
"outputs": [
{
"output_type": "stream",
"text": [
"[0.913407 1.96338 4.281649 4.9721303 3.5153463 5.787564 ]\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "Cfk-XsQu2_Iq",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Close the session when done"
]
},
{
"metadata": {
"id": "XxHIO6vV2_Is",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"sess.close()"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "_RNIYxUX2_It",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Plot the result"
]
},
{
"metadata": {
"id": "HGFal0X12_It",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"outputId": "734cf39e-07b3-4460-cfbc-f3d13b615fd7"
},
"cell_type": "code",
"source": [
"plt.scatter(trX, trY)\n",
"trY2 = 0\n",
"for i in range(num_coeffs):\n",
" trY2 += w_val[i] * np.power(trX, i)\n",
"plt.plot(trX, trY2, 'r')\n",
"plt.show()"
],
"execution_count": 48,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1aa1984518>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "D4CpHzvz2_Ix",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Machine Learning\n",
"\n"
]
},
{
"metadata": {
"id": "EjjzEb5R2_Ix",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Linear regression for classification"
]
},
{
"metadata": {
"id": "V8bS46zC2_Ix",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Import the usual libraries:"
]
},
{
"metadata": {
"id": "MdlWj-Np2_Iy",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"%matplotlib inline\n",
"import tensorflow as tf\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "XvMnG0vF2_Iz",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Let's say we have numbers that we want to classify. They'll just be 1-dimensional values. Numbers close to 5 will be given the label `[0]`, and numbers close to 2 will be given the label `[1]`, as designed here:"
]
},
{
"metadata": {
"id": "X0nm8Mx32_I0",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 283
},
"outputId": "c9a51491-19b3-4cce-e234-3075a3459005"
},
"cell_type": "code",
"source": [
"x_label0 = np.random.normal(5, 1, 10)\n",
"x_label1 = np.random.normal(2, 1, 10)\n",
"xs = np.append(x_label0, x_label1)\n",
"labels = [0.] * len(x_label0) + [1.] * len(x_label1)\n",
"\n",
"plt.scatter(xs, labels)"
],
"execution_count": 50,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7f1a9c6d04a8>"
]
},
"metadata": {
"tags": []
},
"execution_count": 50
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1aaccba860>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "jsjpikuF2_I4",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the hyper-parameters, placeholders, and variables:"
]
},
{
"metadata": {
"id": "zToz4ayH2_I5",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"learning_rate = 0.001\n",
"training_epochs = 1000\n",
"\n",
"X = tf.placeholder(\"float\")\n",
"Y = tf.placeholder(\"float\")\n",
"\n",
"w = tf.Variable([0., 0.], name=\"parameters\")"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "nPAzo4qw2_I8",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Define the model:"
]
},
{
"metadata": {
"id": "fZmHzDOv2_I9",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"def model(X, w):\n",
" return tf.add(tf.multiply(w[1], tf.pow(X, 1)),\n",
" tf.multiply(w[0], tf.pow(X, 0)))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "DCmCl-PA2_I_",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Given a model, define the cost function:"
]
},
{
"metadata": {
"id": "xqQgSKbw2_JA",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"y_model = model(X, w)\n",
"cost = tf.reduce_sum(tf.square(Y-y_model))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "5qZs_g9o2_JD",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Set up the training op, and also introduce a couple ops to calculate some metrics, such as accuracy:"
]
},
{
"metadata": {
"id": "xvE6qAZ62_JD",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)\n",
"correct_prediction = tf.equal(Y, tf.to_float(tf.greater(y_model, 0.5)))\n",
"accuracy = tf.reduce_mean(tf.to_float(correct_prediction))"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "l9Hyysnr2_JF",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Prepare the session:"
]
},
{
"metadata": {
"id": "jAzSAHjz2_JF",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"sess = tf.Session()\n",
"init = tf.global_variables_initializer()\n",
"sess.run(init)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "5agEcjih2_JH",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Run the training op multiple times on the input data:"
]
},
{
"metadata": {
"id": "D6E98mP02_JJ",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 200
},
"outputId": "8602c189-a143-4683-b44a-b161db75b47b"
},
"cell_type": "code",
"source": [
"for epoch in range(training_epochs):\n",
" sess.run(train_op, feed_dict={X: xs, Y: labels})\n",
" current_cost = sess.run(cost, feed_dict={X: xs, Y: labels})\n",
" if epoch % 100 == 0:\n",
" print(epoch, current_cost)"
],
"execution_count": 56,
"outputs": [
{
"output_type": "stream",
"text": [
"0 8.679545\n",
"100 2.716721\n",
"200 1.7040077\n",
"300 1.5295486\n",
"400 1.499495\n",
"500 1.4943175\n",
"600 1.4934256\n",
"700 1.4932721\n",
"800 1.4932455\n",
"900 1.493241\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "ahNd-pBx2_JL",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Show some final metrics/results:"
]
},
{
"metadata": {
"id": "Zm6RiINH2_JM",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 53
},
"outputId": "a60c59ff-9458-4b7a-c30f-7de147e84db1"
},
"cell_type": "code",
"source": [
"w_val = sess.run(w)\n",
"print('learned parameters', w_val)\n",
"\n",
"print('accuracy', sess.run(accuracy, feed_dict={X: xs, Y: labels}))\n",
"\n",
"sess.close()"
],
"execution_count": 57,
"outputs": [
{
"output_type": "stream",
"text": [
"learned parameters [ 1.2692816 -0.20756595]\n",
"accuracy 0.9\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "TCH5sdpx2_JQ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"Plot the learned function"
]
},
{
"metadata": {
"id": "fadQjYSR2_JR",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"outputId": "7be1d7b6-aef5-4b6e-a8aa-aaa253f9bbde"
},
"cell_type": "code",
"source": [
"all_xs = np.linspace(0, 10, 100)\n",
"plt.plot(all_xs, all_xs*w_val[1] + w_val[0])\n",
"plt.scatter(xs, labels)\n",
"plt.show()"
],
"execution_count": 58,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nAl5EJEj9f83O1yYcCax3AAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1a9c6d6c88>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "2bb5AYU1wkkr",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Dumb Tricks"
]
},
{
"metadata": {
"id": "vsXTOuSwwmes",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 3060
},
"outputId": "34772f06-81d4-44ea-cbfb-2c3d5a71e3bc"
},
"cell_type": "code",
"source": [
"# Install Keras with pip\n",
"!pip install -q keras\n",
"import keras\n",
"\n",
"\n",
"# Install GraphViz with apt\n",
"!apt-get install graphviz -y\n"
],
"execution_count": 59,
"outputs": [
{
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
],
"name": "stderr"
},
{
"output_type": "stream",
"text": [
"Reading package lists... Done\n",
"Building dependency tree \n",
"Reading state information... Done\n",
"The following additional packages will be installed:\n",
" fontconfig libcairo2 libcdt5 libcgraph6 libdatrie1 libgd3 libgraphite2-3\n",
" libgvc6 libgvpr2 libharfbuzz0b libjbig0 libltdl7 libpango-1.0-0\n",
" libpangocairo-1.0-0 libpangoft2-1.0-0 libpathplan4 libpixman-1-0\n",
" libthai-data libthai0 libtiff5 libwebp6 libxaw7 libxcb-render0 libxcb-shm0\n",
" libxmu6 libxpm4 libxt6\n",
"Suggested packages:\n",
" gsfonts graphviz-doc libgd-tools\n",
"The following NEW packages will be installed:\n",
" fontconfig graphviz libcairo2 libcdt5 libcgraph6 libdatrie1 libgd3\n",
" libgraphite2-3 libgvc6 libgvpr2 libharfbuzz0b libjbig0 libltdl7\n",
" libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpathplan4\n",
" libpixman-1-0 libthai-data libthai0 libtiff5 libwebp6 libxaw7 libxcb-render0\n",
" libxcb-shm0 libxmu6 libxpm4 libxt6\n",
"0 upgraded, 28 newly installed, 0 to remove and 0 not upgraded.\n",
"Need to get 4,122 kB of archives.\n",
"After this operation, 20.6 MB of additional disk space will be used.\n",
"Get:1 http://archive.ubuntu.com/ubuntu artful/main amd64 fontconfig amd64 2.11.94-0ubuntu2 [177 kB]\n",
"Get:2 http://archive.ubuntu.com/ubuntu artful/main amd64 libjbig0 amd64 2.1-3.1 [26.6 kB]\n",
"Get:3 http://archive.ubuntu.com/ubuntu artful/main amd64 libcdt5 amd64 2.38.0-16ubuntu2 [19.5 kB]\n",
"Get:4 http://archive.ubuntu.com/ubuntu artful/main amd64 libcgraph6 amd64 2.38.0-16ubuntu2 [40.0 kB]\n",
"Get:5 http://archive.ubuntu.com/ubuntu artful-updates/main amd64 libtiff5 amd64 4.0.8-5ubuntu0.1 [150 kB]\n",
"Get:6 http://archive.ubuntu.com/ubuntu artful/main amd64 libwebp6 amd64 0.6.0-3 [181 kB]\n",
"Get:7 http://archive.ubuntu.com/ubuntu artful/main amd64 libxpm4 amd64 1:3.5.12-1 [34.0 kB]\n",
"Get:8 http://archive.ubuntu.com/ubuntu artful/main amd64 libgd3 amd64 2.2.5-3 [119 kB]\n",
"Get:9 http://archive.ubuntu.com/ubuntu artful/main amd64 libpixman-1-0 amd64 0.34.0-1 [230 kB]\n",
"Get:10 http://archive.ubuntu.com/ubuntu artful/main amd64 libxcb-render0 amd64 1.12-1ubuntu1 [14.8 kB]\n",
"Get:11 http://archive.ubuntu.com/ubuntu artful/main amd64 libxcb-shm0 amd64 1.12-1ubuntu1 [5,482 B]\n",
"Get:12 http://archive.ubuntu.com/ubuntu artful/main amd64 libcairo2 amd64 1.14.10-1ubuntu1 [558 kB]\n",
"Get:13 http://archive.ubuntu.com/ubuntu artful/main amd64 libltdl7 amd64 2.4.6-2 [38.8 kB]\n",
"Get:14 http://archive.ubuntu.com/ubuntu artful/main amd64 libthai-data all 0.1.26-3 [132 kB]\n",
"Get:15 http://archive.ubuntu.com/ubuntu artful/main amd64 libdatrie1 amd64 0.2.10-5 [17.6 kB]\n",
"Get:16 http://archive.ubuntu.com/ubuntu artful/main amd64 libthai0 amd64 0.1.26-3 [17.7 kB]\n",
"Get:17 http://archive.ubuntu.com/ubuntu artful/main amd64 libpango-1.0-0 amd64 1.40.12-1 [152 kB]\n",
"Get:18 http://archive.ubuntu.com/ubuntu artful/main amd64 libgraphite2-3 amd64 1.3.10-2 [78.3 kB]\n",
"Get:19 http://archive.ubuntu.com/ubuntu artful/main amd64 libharfbuzz0b amd64 1.4.2-1 [211 kB]\n",
"Get:20 http://archive.ubuntu.com/ubuntu artful/main amd64 libpangoft2-1.0-0 amd64 1.40.12-1 [33.2 kB]\n",
"Get:21 http://archive.ubuntu.com/ubuntu artful/main amd64 libpangocairo-1.0-0 amd64 1.40.12-1 [20.8 kB]\n",
"Get:22 http://archive.ubuntu.com/ubuntu artful/main amd64 libpathplan4 amd64 2.38.0-16ubuntu2 [22.6 kB]\n",
"Get:23 http://archive.ubuntu.com/ubuntu artful/main amd64 libgvc6 amd64 2.38.0-16ubuntu2 [587 kB]\n",
"Get:24 http://archive.ubuntu.com/ubuntu artful/main amd64 libgvpr2 amd64 2.38.0-16ubuntu2 [167 kB]\n",
"Get:25 http://archive.ubuntu.com/ubuntu artful/main amd64 libxt6 amd64 1:1.1.5-1 [160 kB]\n",
"Get:26 http://archive.ubuntu.com/ubuntu artful/main amd64 libxmu6 amd64 2:1.1.2-2 [46.0 kB]\n",
"Get:27 http://archive.ubuntu.com/ubuntu artful/main amd64 libxaw7 amd64 2:1.0.13-1 [173 kB]\n",
"Get:28 http://archive.ubuntu.com/ubuntu artful/main amd64 graphviz amd64 2.38.0-16ubuntu2 [710 kB]\n",
"Fetched 4,122 kB in 1s (2,141 kB/s)\n",
"Selecting previously unselected package fontconfig.\n",
"(Reading database ... 18408 files and directories currently installed.)\n",
"Preparing to unpack .../00-fontconfig_2.11.94-0ubuntu2_amd64.deb ...\n",
"Unpacking fontconfig (2.11.94-0ubuntu2) ...\n",
"Selecting previously unselected package libjbig0:amd64.\n",
"Preparing to unpack .../01-libjbig0_2.1-3.1_amd64.deb ...\n",
"Unpacking libjbig0:amd64 (2.1-3.1) ...\n",
"Selecting previously unselected package libcdt5.\n",
"Preparing to unpack .../02-libcdt5_2.38.0-16ubuntu2_amd64.deb ...\n",
"Unpacking libcdt5 (2.38.0-16ubuntu2) ...\n",
"Selecting previously unselected package libcgraph6.\n",
"Preparing to unpack .../03-libcgraph6_2.38.0-16ubuntu2_amd64.deb ...\n",
"Unpacking libcgraph6 (2.38.0-16ubuntu2) ...\n",
"Selecting previously unselected package libtiff5:amd64.\n",
"Preparing to unpack .../04-libtiff5_4.0.8-5ubuntu0.1_amd64.deb ...\n",
"Unpacking libtiff5:amd64 (4.0.8-5ubuntu0.1) ...\n",
"Selecting previously unselected package libwebp6:amd64.\n",
"Preparing to unpack .../05-libwebp6_0.6.0-3_amd64.deb ...\n",
"Unpacking libwebp6:amd64 (0.6.0-3) ...\n",
"Selecting previously unselected package libxpm4:amd64.\n",
"Preparing to unpack .../06-libxpm4_1%3a3.5.12-1_amd64.deb ...\n",
"Unpacking libxpm4:amd64 (1:3.5.12-1) ...\n",
"Selecting previously unselected package libgd3:amd64.\n",
"Preparing to unpack .../07-libgd3_2.2.5-3_amd64.deb ...\n",
"Unpacking libgd3:amd64 (2.2.5-3) ...\n",
"Selecting previously unselected package libpixman-1-0:amd64.\n",
"Preparing to unpack .../08-libpixman-1-0_0.34.0-1_amd64.deb ...\n",
"Unpacking libpixman-1-0:amd64 (0.34.0-1) ...\n",
"Selecting previously unselected package libxcb-render0:amd64.\n",
"Preparing to unpack .../09-libxcb-render0_1.12-1ubuntu1_amd64.deb ...\n",
"Unpacking libxcb-render0:amd64 (1.12-1ubuntu1) ...\n",
"Selecting previously unselected package libxcb-shm0:amd64.\n",
"Preparing to unpack .../10-libxcb-shm0_1.12-1ubuntu1_amd64.deb ...\n",
"Unpacking libxcb-shm0:amd64 (1.12-1ubuntu1) ...\n",
"Selecting previously unselected package libcairo2:amd64.\n",
"Preparing to unpack .../11-libcairo2_1.14.10-1ubuntu1_amd64.deb ...\n",
"Unpacking libcairo2:amd64 (1.14.10-1ubuntu1) ...\n",
"Selecting previously unselected package libltdl7:amd64.\n",
"Preparing to unpack .../12-libltdl7_2.4.6-2_amd64.deb ...\n",
"Unpacking libltdl7:amd64 (2.4.6-2) ...\n",
"Selecting previously unselected package libthai-data.\n",
"Preparing to unpack .../13-libthai-data_0.1.26-3_all.deb ...\n",
"Unpacking libthai-data (0.1.26-3) ...\n",
"Selecting previously unselected package libdatrie1:amd64.\n",
"Preparing to unpack .../14-libdatrie1_0.2.10-5_amd64.deb ...\n",
"Unpacking libdatrie1:amd64 (0.2.10-5) ...\n",
"Selecting previously unselected package libthai0:amd64.\n",
"Preparing to unpack .../15-libthai0_0.1.26-3_amd64.deb ...\n",
"Unpacking libthai0:amd64 (0.1.26-3) ...\n",
"Selecting previously unselected package libpango-1.0-0:amd64.\n",
"Preparing to unpack .../16-libpango-1.0-0_1.40.12-1_amd64.deb ...\n",
"Unpacking libpango-1.0-0:amd64 (1.40.12-1) ...\n",
"Selecting previously unselected package libgraphite2-3:amd64.\n",
"Preparing to unpack .../17-libgraphite2-3_1.3.10-2_amd64.deb ...\n",
"Unpacking libgraphite2-3:amd64 (1.3.10-2) ...\n",
"Selecting previously unselected package libharfbuzz0b:amd64.\n",
"Preparing to unpack .../18-libharfbuzz0b_1.4.2-1_amd64.deb ...\n",
"Unpacking libharfbuzz0b:amd64 (1.4.2-1) ...\n",
"Selecting previously unselected package libpangoft2-1.0-0:amd64.\n",
"Preparing to unpack .../19-libpangoft2-1.0-0_1.40.12-1_amd64.deb ...\n",
"Unpacking libpangoft2-1.0-0:amd64 (1.40.12-1) ...\n",
"Selecting previously unselected package libpangocairo-1.0-0:amd64.\n",
"Preparing to unpack .../20-libpangocairo-1.0-0_1.40.12-1_amd64.deb ...\n",
"Unpacking libpangocairo-1.0-0:amd64 (1.40.12-1) ...\n",
"Selecting previously unselected package libpathplan4.\n",
"Preparing to unpack .../21-libpathplan4_2.38.0-16ubuntu2_amd64.deb ...\n",
"Unpacking libpathplan4 (2.38.0-16ubuntu2) ...\n",
"Selecting previously unselected package libgvc6.\n",
"Preparing to unpack .../22-libgvc6_2.38.0-16ubuntu2_amd64.deb ...\n",
"Unpacking libgvc6 (2.38.0-16ubuntu2) ...\n",
"Selecting previously unselected package libgvpr2.\n",
"Preparing to unpack .../23-libgvpr2_2.38.0-16ubuntu2_amd64.deb ...\n",
"Unpacking libgvpr2 (2.38.0-16ubuntu2) ...\n",
"Selecting previously unselected package libxt6:amd64.\n",
"Preparing to unpack .../24-libxt6_1%3a1.1.5-1_amd64.deb ...\n",
"Unpacking libxt6:amd64 (1:1.1.5-1) ...\n",
"Selecting previously unselected package libxmu6:amd64.\n",
"Preparing to unpack .../25-libxmu6_2%3a1.1.2-2_amd64.deb ...\n",
"Unpacking libxmu6:amd64 (2:1.1.2-2) ...\n",
"Selecting previously unselected package libxaw7:amd64.\n",
"Preparing to unpack .../26-libxaw7_2%3a1.0.13-1_amd64.deb ...\n",
"Unpacking libxaw7:amd64 (2:1.0.13-1) ...\n",
"Selecting previously unselected package graphviz.\n",
"Preparing to unpack .../27-graphviz_2.38.0-16ubuntu2_amd64.deb ...\n",
"Unpacking graphviz (2.38.0-16ubuntu2) ...\n",
"Setting up libpathplan4 (2.38.0-16ubuntu2) ...\n",
"Setting up libxcb-render0:amd64 (1.12-1ubuntu1) ...\n",
"Setting up libjbig0:amd64 (2.1-3.1) ...\n",
"Setting up libdatrie1:amd64 (0.2.10-5) ...\n",
"Setting up libtiff5:amd64 (4.0.8-5ubuntu0.1) ...\n",
"Setting up libgraphite2-3:amd64 (1.3.10-2) ...\n",
"Setting up libpixman-1-0:amd64 (0.34.0-1) ...\n",
"Processing triggers for libc-bin (2.26-0ubuntu2.1) ...\n",
"Setting up libltdl7:amd64 (2.4.6-2) ...\n",
"Setting up libxcb-shm0:amd64 (1.12-1ubuntu1) ...\n",
"Setting up libxpm4:amd64 (1:3.5.12-1) ...\n",
"Setting up libxt6:amd64 (1:1.1.5-1) ...\n",
"Setting up libthai-data (0.1.26-3) ...\n",
"Setting up libcdt5 (2.38.0-16ubuntu2) ...\n",
"Setting up fontconfig (2.11.94-0ubuntu2) ...\n",
"Regenerating fonts cache... done.\n",
"Setting up libcgraph6 (2.38.0-16ubuntu2) ...\n",
"Setting up libwebp6:amd64 (0.6.0-3) ...\n",
"Setting up libcairo2:amd64 (1.14.10-1ubuntu1) ...\n",
"Setting up libgvpr2 (2.38.0-16ubuntu2) ...\n",
"Setting up libgd3:amd64 (2.2.5-3) ...\n",
"Setting up libharfbuzz0b:amd64 (1.4.2-1) ...\n",
"Setting up libthai0:amd64 (0.1.26-3) ...\n",
"Setting up libxmu6:amd64 (2:1.1.2-2) ...\n",
"Setting up libpango-1.0-0:amd64 (1.40.12-1) ...\n",
"Setting up libxaw7:amd64 (2:1.0.13-1) ...\n",
"Setting up libpangoft2-1.0-0:amd64 (1.40.12-1) ...\n",
"Setting up libpangocairo-1.0-0:amd64 (1.40.12-1) ...\n",
"Setting up libgvc6 (2.38.0-16ubuntu2) ...\n",
"Setting up graphviz (2.38.0-16ubuntu2) ...\n",
"Processing triggers for libc-bin (2.26-0ubuntu2.1) ...\n"
],
"name": "stdout"
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment