-
-
Save jtokoph/40b726c20ed84047660454707a80aa4b to your computer and use it in GitHub Desktop.
TensorFlow 101
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import numpy as np\n", | |
| "import matplotlib.cm as cm\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "import seaborn as sns\n", | |
| "import tensorflow as tf\n", | |
| "%matplotlib inline" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "TensorFlow 101\n", | |
| "==============\n", | |
| "\n", | |
| "Some of the main objects in TensorFlow are \"placeholders\", which are things that you can feed things into, \"Variables\", which contain intermediate results of calculations, and \"sessions\" in which one carries out predefined calculations." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "4\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "a = tf.placeholder('int64') # a will be an integer\n", | |
| "b = tf.placeholder('int64') # b will also be an integer\n", | |
| "c = tf.add(a, b) # c = a + b\n", | |
| "\n", | |
| "with tf.Session() as sess: # Start a TensorFlow \"session\"\n", | |
| " # Feed in the values of a and b and evaluate c\n", | |
| " result = sess.run(c, feed_dict={a: 2, b: 2})\n", | |
| " print(result)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Linear regression in TensorFlow\n", | |
| "===============================\n", | |
| "\n", | |
| "Let's do a slightly more interesting example: OLS linear regression. Let's first set up some data outside of TensorFlow" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Number of samples: 15\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "[<matplotlib.lines.Line2D at 0x63e2ded7b8>]" | |
| ] | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x63e0ab8470>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "train_X = np.array([7.33892413, 6.09065249, 3.6782235 , 1.5484478 , 5.2024495 ,\n", | |
| " 1.55973193, 1.90577005, 3.52333413, 1.89705273, 7.16303144,\n", | |
| " 6.69186969, 6.35116542, 8.40910037, 6.81104552, 9.0276311])\n", | |
| "train_Y = np.array([6.01218497, 7.15272823, 4.39711002, 0.78859037, 4.66163788,\n", | |
| " 2.1366047 , 0.75108498, 2.4262601 , 2.01357347, 5.1216737 ,\n", | |
| " 8.01817765, 7.07644285, 9.11215858, 8.64146407, 8.13432732])\n", | |
| "\n", | |
| "n_samples = train_X.shape[0]\n", | |
| "\n", | |
| "print(\"Number of samples: \", n_samples)\n", | |
| "plt.plot(train_X, train_Y, 'o')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "At the end of the day, our model will be $y = Wx + b$, where we feed in the training values for $x$ and $y$, and the model will have to determine $W$ and $b$." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "X = tf.placeholder(\"float\")\n", | |
| "Y = tf.placeholder(\"float\")\n", | |
| "\n", | |
| "# Set model weights; initialize all weights as random numbers\n", | |
| "W = tf.Variable(np.random.randn(), name=\"weight\")\n", | |
| "b = tf.Variable(np.random.randn(), name=\"bias\")\n", | |
| "\n", | |
| "# Construct a linear model\n", | |
| "pred = tf.add(tf.mul(X, W), b)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Recall that OLS works by minimizing the mean squared error, $\\frac{1}{2n} \\sum_{i=1}^n (W x_i + b - y_i)^2$; in TensorFlow, we explicitly specify this \"cost\" and how to go about minimizing it." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# Mean squared error\n", | |
| "cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)\n", | |
| "\n", | |
| "# Gradient descent\n", | |
| "learning_rate = 0.001\n", | |
| "optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)\n", | |
| "\n", | |
| "# Initializing the variables\n", | |
| "init = tf.global_variables_initializer()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "With the variables in place, we can run the TensorFlow session and examine what it learns." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "W = 0.760127\n", | |
| "b = 1.5108\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x63da7f73c8>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "with tf.Session() as sess:\n", | |
| " sess.run(init)\n", | |
| "\n", | |
| " # Run the optimization algorithm 1000 times\n", | |
| " for i in range(1000):\n", | |
| " sess.run(optimizer, feed_dict={X: train_X, Y: train_Y})\n", | |
| " \n", | |
| " # Visualize the results\n", | |
| " print('W = ', sess.run(W))\n", | |
| " print('b = ', sess.run(b))\n", | |
| " plt.plot(train_X, train_Y, 'o')\n", | |
| "\n", | |
| " # Make predictions for new values of x\n", | |
| " x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n", | |
| " predictions = sess.run(pred, feed_dict={X: x})\n", | |
| " plt.plot(x, predictions)\n", | |
| " plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Logistic regression in TensorFlow\n", | |
| "=================================" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Next up, let us take a look at a classification problem instead." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/png": "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\njkAPAIH7f3OVkJ3MfizKAAAAAElFTkSuQmCC\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0x63e33a7da0>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "group1 = np.random.multivariate_normal([-4, -4], 20*np.identity(2), size=40)\n", | |
| "group2 = np.random.multivariate_normal([4, 4], 20*np.identity(2), size=40)\n", | |
| "plt.plot(*group1.T, 'o')\n", | |
| "plt.plot(*group2.T, 'o')\n", | |
| "plt.show()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The plan will be to find a line separating the two groups, so that if one day, someone comes with a new point in the plane, we will be able to say if that point should be green or blue.\n", | |
| "\n", | |
| "We proceed as with linear regression with a few notable differences: Inputs $X$ are now 2-dimensional, which will be reflected in our placeholders and variables, we now have two weights, $w_1$ and $w_2$, and our prediction function will be the *logistic function* $p(X) = 1/(1 + \\exp(w^tX + b))$, taking values between $0$ and $1$. At the end of the day, $p(X)$ represents the probability that the point $X$ should be labelled \"green\". Here's what its logarithm looks like:" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 11, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "[<matplotlib.lines.Line2D at 0xe95aa8d048>]" | |
| ] | |
| }, | |
| "execution_count": 11, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<matplotlib.figure.Figure at 0xe95aa8d7f0>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "x = np.arange(-10, 11)\n", | |
| "plt.title('The logarithm of the logistic function')\n", | |
| "plt.plot(x, np.log(1/(1+np.exp(x))))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# Inputs are now two-dimensional and come with labels \"blue\" or \"green\" (represented by 0 or 1)\n", | |
| "X = tf.placeholder(\"float\", shape=[None, 2])\n", | |
| "labels = tf.placeholder(\"float\", shape=[None])\n", | |
| "\n", | |
| "# Set model weights and bias as before\n", | |
| "W = tf.Variable(tf.zeros([2, 1], \"float\"), name=\"weight\")\n", | |
| "b = tf.Variable(tf.zeros([1], \"float\"), name=\"bias\")\n", | |
| "\n", | |
| "# Predictor is now the logistic function\n", | |
| "pred = tf.sigmoid(tf.to_double(tf.reduce_sum(tf.matmul(X, W), axis=[1]) + b))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Just as we replaced our prediction method, we replace our cost function with $$-\\sum_{i=1}^n l(X_i) \\log(p(X_i)) + (1-l(X_i))\\log(1-p(X_i)),$$ where $l(X_i)$ is the label of $X_i$ (which is $0$ or $1$)." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# Similarly, the OLS cost function from before is now replaced by cross-entropy\n", | |
| "cost = -tf.reduce_sum(tf.to_double(labels) * tf.log(pred) + (1-tf.to_double(labels)) * tf.log(1-pred))\n", | |
| "\n", | |
| "# Gradient descent\n", | |
| "learning_rate = 0.001\n", | |
| "optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)\n", | |
| "\n", | |
| "# Initializing the variables\n", | |
| "init = tf.global_variables_initializer()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "We are now in a position to run our optimization and plot the resulting values of $p$." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "ename": "NameError", | |
| "evalue": "name 'tf' is not defined", | |
| "output_type": "error", | |
| "traceback": [ | |
| "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", | |
| "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", | |
| "\u001b[1;32m<ipython-input-1-f3b6409e0b53>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mwith\u001b[0m \u001b[0mtf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mSession\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0msess\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mtrain_X\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgroup1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mtrain_labels\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m40\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m40\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0msess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minit\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", | |
| "\u001b[1;31mNameError\u001b[0m: name 'tf' is not defined" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "with tf.Session() as sess:\n", | |
| " train_X = np.vstack((group1, group2))\n", | |
| " train_labels = np.array([0.0] * 40 + [1.0] * 40)\n", | |
| "\n", | |
| " sess.run(init)\n", | |
| "\n", | |
| " # Run the optimization algorithm 1000 times\n", | |
| " for i in range(1000):\n", | |
| " # We stack our two groups of 2-dimensional points and label them 0 and 1 respectively\n", | |
| " sess.run(optimizer, feed_dict={X: train_X, labels: train_labels})\n", | |
| " \n", | |
| " # Plot the predictions: the values of p\n", | |
| " Xmin = np.min(train_X)\n", | |
| " Xmax = np.max(train_X)\n", | |
| " x = np.arange(Xmin, Xmax, 0.1)\n", | |
| " y = np.arange(Xmin, Xmax, 0.1)\n", | |
| " \n", | |
| " plt.plot(*group1.T, 'o')\n", | |
| " plt.plot(*group2.T, 'o')\n", | |
| " plt.xlim(Xmin, Xmax)\n", | |
| " plt.ylim(Xmin, Xmax)\n", | |
| " print('W = ', sess.run(W))\n", | |
| " print('b = ', sess.run(b))\n", | |
| " \n", | |
| " xx, yy = np.meshgrid(x, y)\n", | |
| " predictions = sess.run(pred, feed_dict={X: np.array((xx.ravel(), yy.ravel())).T})\n", | |
| " \n", | |
| " plt.title('Probability that model will label a given point \"green\"')\n", | |
| " plt.contour(x, y, predictions.reshape(len(x), len(y)), cmap=cm.BuGn, levels=np.arange(0.0, 1.1, 0.1))\n", | |
| " plt.colorbar()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "anaconda-cloud": {}, | |
| "kernelspec": { | |
| "display_name": "Python [Root]", | |
| "language": "python", | |
| "name": "Python [Root]" | |
| }, | |
| "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.5.2" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment