├── figs ├── fig1.png ├── fig2.png └── fig3.png ├── up and running with tensorflow.pdf ├── up and running with tensorflow.pptx ├── README.md ├── Ch0. Graph.ipynb ├── Ch1. Variables.ipynb ├── Ch0. Graph-solution.ipynb ├── Ch2. Placeholder.ipynb ├── Ch2. Placeholder-solution.ipynb ├── Ch1. Variables-solution.ipynb ├── Ch3. Linear Regression.ipynb ├── Demo1. Indexing and Slicing.ipynb ├── Demo0. Create Arrays and Tensors.ipynb ├── Demo2. Math.ipynb ├── Demo3. Simple Linear Regression.ipynb └── Ch3. Linear Regression-solution.ipynb /figs/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyubyong/up_and_running_with_Tensorflow/HEAD/figs/fig1.png -------------------------------------------------------------------------------- /figs/fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyubyong/up_and_running_with_Tensorflow/HEAD/figs/fig2.png -------------------------------------------------------------------------------- /figs/fig3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyubyong/up_and_running_with_Tensorflow/HEAD/figs/fig3.png -------------------------------------------------------------------------------- /up and running with tensorflow.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyubyong/up_and_running_with_Tensorflow/HEAD/up and running with tensorflow.pdf -------------------------------------------------------------------------------- /up and running with tensorflow.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kyubyong/up_and_running_with_Tensorflow/HEAD/up and running with tensorflow.pptx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Up and Running with TensorFlow 2 | The files in this repo are for my hands-on session `Up and Running with Tensorflow` at the first Deep Learning Conference http://www.deepcon.info/?page_id=246. 3 | -------------------------------------------------------------------------------- /Ch0. Graph.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Ch0. Build a graph below and retrieve the value of `c, d, e`." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Start TensorFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 3, 27 | "metadata": { 28 | "collapsed": false 29 | }, 30 | "outputs": [ 31 | { 32 | "data": { 33 | "text/plain": [ 34 | "Ellipsis" 35 | ] 36 | }, 37 | "execution_count": 3, 38 | "metadata": {}, 39 | "output_type": "execute_result" 40 | } 41 | ], 42 | "source": [ 43 | "..." 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "Build graph" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 2, 56 | "metadata": { 57 | "collapsed": false 58 | }, 59 | "outputs": [], 60 | "source": [ 61 | "# Define inputs\n", 62 | "a = ...\n", 63 | "b = ...\n", 64 | "\n", 65 | "# Ops\n", 66 | "c = ...\n", 67 | "d = ...\n", 68 | "e = ..." 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": {}, 74 | "source": [ 75 | "Launch the graph" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 4, 81 | "metadata": { 82 | "collapsed": true 83 | }, 84 | "outputs": [], 85 | "source": [ 86 | "# Start a session\n", 87 | "...\n", 88 | "\n", 89 | "# Fetch the tensor(s)\n", 90 | "...\n", 91 | "\n", 92 | "# Close the session\n", 93 | "..." 94 | ] 95 | } 96 | ], 97 | "metadata": { 98 | "anaconda-cloud": {}, 99 | "kernelspec": { 100 | "display_name": "Python [conda root]", 101 | "language": "python", 102 | "name": "conda-root-py" 103 | }, 104 | "language_info": { 105 | "codemirror_mode": { 106 | "name": "ipython", 107 | "version": 3 108 | }, 109 | "file_extension": ".py", 110 | "mimetype": "text/x-python", 111 | "name": "python", 112 | "nbconvert_exporter": "python", 113 | "pygments_lexer": "ipython3", 114 | "version": "3.5.2" 115 | } 116 | }, 117 | "nbformat": 4, 118 | "nbformat_minor": 1 119 | } 120 | -------------------------------------------------------------------------------- /Ch1. Variables.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Ch1. Build a graph which 5 cycles below and retrieve the value of Variable `a` and Tensor `e`." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Start TensorFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": null, 27 | "metadata": { 28 | "collapsed": true 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "..." 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "Build a graph" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": null, 45 | "metadata": { 46 | "collapsed": false 47 | }, 48 | "outputs": [], 49 | "source": [ 50 | "# Define inputs\n", 51 | "a = ...\n", 52 | "b = ...\n", 53 | "\n", 54 | "# Ops\n", 55 | "c = a * b\n", 56 | "d = a + b\n", 57 | "e = c - d \n", 58 | "\n", 59 | "# Update the value of `a`\n", 60 | "...\n", 61 | "\n", 62 | "# initialize variable(s)\n", 63 | "...\n", 64 | "\n", 65 | "# Create a saver\n", 66 | "...\n" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "Launch the graph" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": null, 79 | "metadata": { 80 | "collapsed": false 81 | }, 82 | "outputs": [], 83 | "source": [ 84 | "# Start a session\n", 85 | "...\n", 86 | "\n", 87 | "# Initialize Variable(s)\n", 88 | "...\n", 89 | "\n", 90 | "# Fetch the value of c, d, and e.\n", 91 | "for step in range(5):\n", 92 | " # Fetch the value of `a` and `e`.\n", 93 | " ...\n", 94 | " \n", 95 | " # Save Variable a to './ckpt.ckpt'\n", 96 | " ...\n", 97 | " \n", 98 | " # Update the value of `a`\n", 99 | " ...\n", 100 | " \n", 101 | "# Close the session\n", 102 | "sess.close()" 103 | ] 104 | } 105 | ], 106 | "metadata": { 107 | "anaconda-cloud": {}, 108 | "kernelspec": { 109 | "display_name": "Python [conda root]", 110 | "language": "python", 111 | "name": "conda-root-py" 112 | }, 113 | "language_info": { 114 | "codemirror_mode": { 115 | "name": "ipython", 116 | "version": 3 117 | }, 118 | "file_extension": ".py", 119 | "mimetype": "text/x-python", 120 | "name": "python", 121 | "nbconvert_exporter": "python", 122 | "pygments_lexer": "ipython3", 123 | "version": "3.5.2" 124 | } 125 | }, 126 | "nbformat": 4, 127 | "nbformat_minor": 1 128 | } 129 | -------------------------------------------------------------------------------- /Ch0. Graph-solution.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Ch0. Build a graph below and retrieve the value of `c, d, e`." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Start TensorFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": { 28 | "collapsed": true 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "import tensorflow as tf" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "Build graph" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": { 46 | "collapsed": false 47 | }, 48 | "outputs": [], 49 | "source": [ 50 | "# Define inputs\n", 51 | "a = tf.constant(2, tf.int32)\n", 52 | "b = tf.constant(3, tf.int32)\n", 53 | "\n", 54 | "# Ops\n", 55 | "c = tf.mul(a, b)\n", 56 | "d = tf.add(a, b)\n", 57 | "e = tf.sub(c, d)" 58 | ] 59 | }, 60 | { 61 | "cell_type": "markdown", 62 | "metadata": {}, 63 | "source": [ 64 | "Start Session" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 3, 70 | "metadata": { 71 | "collapsed": true 72 | }, 73 | "outputs": [], 74 | "source": [ 75 | "sess = tf.Session()" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "Fetch `c, d, e`" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 4, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "[6, 5, 1]\n" 97 | ] 98 | } 99 | ], 100 | "source": [ 101 | "print(sess.run([c, d, e]))" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": { 107 | "collapsed": true 108 | }, 109 | "source": [ 110 | "Close the Session" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 5, 116 | "metadata": { 117 | "collapsed": false 118 | }, 119 | "outputs": [], 120 | "source": [ 121 | "sess.close()" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": null, 127 | "metadata": { 128 | "collapsed": true 129 | }, 130 | "outputs": [], 131 | "source": [] 132 | } 133 | ], 134 | "metadata": { 135 | "anaconda-cloud": {}, 136 | "kernelspec": { 137 | "display_name": "Python [conda root]", 138 | "language": "python", 139 | "name": "conda-root-py" 140 | }, 141 | "language_info": { 142 | "codemirror_mode": { 143 | "name": "ipython", 144 | "version": 3 145 | }, 146 | "file_extension": ".py", 147 | "mimetype": "text/x-python", 148 | "name": "python", 149 | "nbconvert_exporter": "python", 150 | "pygments_lexer": "ipython3", 151 | "version": "3.5.2" 152 | } 153 | }, 154 | "nbformat": 4, 155 | "nbformat_minor": 1 156 | } 157 | -------------------------------------------------------------------------------- /Ch2. Placeholder.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Ch2. Build a graph which cycles 5 times below and retrieve the value of Variable `a`." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Start NumPy and TensorFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": { 28 | "collapsed": true 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "import ...\n", 33 | "import ..." 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "Build a graph" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 6, 46 | "metadata": { 47 | "collapsed": false 48 | }, 49 | "outputs": [], 50 | "source": [ 51 | "# Define inputs\n", 52 | "a = tf.Variable(...)\n", 53 | "b_pl = tf.placeholder(tf.float32, shape=...)\n", 54 | "\n", 55 | "# Ops\n", 56 | "c = ...\n", 57 | "d = ...\n", 58 | "e = ...\n", 59 | "f = ...\n", 60 | "g = ...\n", 61 | "\n", 62 | "# initialize variable(s)\n", 63 | "init = ...\n", 64 | "\n", 65 | "# Update variable\n", 66 | "update_op = ...\n", 67 | "\n", 68 | "# Create a (summary) writer\n", 69 | "writer = tf.summary.FileWriter('asset2', ...)\n", 70 | "\n", 71 | "# Add scalar `a` to writer\n", 72 | "...\n", 73 | "\n", 74 | "# Merge all summaries\n", 75 | "summaries = ...\n" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "Launch the graph" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 5, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "# Start a session\n", 94 | "sess = ...\n", 95 | "\n", 96 | "# Initialize Variable(s)\n", 97 | "sess.run(init)\n", 98 | "\n", 99 | "# Fetch the value of c, d, and e.\n", 100 | "for step in range(5):\n", 101 | " _b = np.arange(10, dtype=np.float32)\n", 102 | " _, _s = sess.run([update_op, summaries], {b_pl:_b})\n", 103 | " \n", 104 | " # Write _s to Tensorboard\n", 105 | " ... \n", 106 | " \n", 107 | "# Close the session\n", 108 | "sess.close()" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": null, 114 | "metadata": { 115 | "collapsed": true 116 | }, 117 | "outputs": [], 118 | "source": [] 119 | } 120 | ], 121 | "metadata": { 122 | "anaconda-cloud": {}, 123 | "kernelspec": { 124 | "display_name": "Python [conda root]", 125 | "language": "python", 126 | "name": "conda-root-py" 127 | }, 128 | "language_info": { 129 | "codemirror_mode": { 130 | "name": "ipython", 131 | "version": 3 132 | }, 133 | "file_extension": ".py", 134 | "mimetype": "text/x-python", 135 | "name": "python", 136 | "nbconvert_exporter": "python", 137 | "pygments_lexer": "ipython3", 138 | "version": "3.5.2" 139 | } 140 | }, 141 | "nbformat": 4, 142 | "nbformat_minor": 1 143 | } 144 | -------------------------------------------------------------------------------- /Ch2. Placeholder-solution.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Ch2. Build a graph which cycles 5 times below and retrieve the value of Variable `a`." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Start NumPy and TensorFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": { 28 | "collapsed": true 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "import tensorflow as tf\n", 33 | "import numpy as np" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "Build a graph" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 2, 46 | "metadata": { 47 | "collapsed": false 48 | }, 49 | "outputs": [], 50 | "source": [ 51 | "# Define inputs\n", 52 | "a = tf.Variable(tf.random_uniform([]))\n", 53 | "b_pl = tf.placeholder(tf.float32, [None])\n", 54 | "\n", 55 | "# Ops\n", 56 | "c = a * b_pl\n", 57 | "d = a + b_pl\n", 58 | "e = tf.reduce_sum(c)\n", 59 | "f = tf.reduce_mean(d)\n", 60 | "g = e - f\n", 61 | "\n", 62 | "# initialize variable(s)\n", 63 | "init = tf.global_variables_initializer()\n", 64 | "\n", 65 | "# Update variable\n", 66 | "update_op = tf.assign(a, a + g)\n", 67 | "\n", 68 | "# Create a (summary) writer\n", 69 | "writer = tf.summary.FileWriter('asset', tf.get_default_graph())\n", 70 | "tf.summary.scalar(\"a\", a)\n", 71 | "summaries = tf.summary.merge_all()\n" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "Launch the graph" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 3, 84 | "metadata": { 85 | "collapsed": false 86 | }, 87 | "outputs": [], 88 | "source": [ 89 | "# Start a session\n", 90 | "sess = tf.Session()\n", 91 | "\n", 92 | "# Initialize Variable(s)\n", 93 | "sess.run(init)\n", 94 | "\n", 95 | "# Fetch the value of c, d, and e.\n", 96 | "for step in range(5):\n", 97 | " _b = np.arange(10, dtype=np.float32)\n", 98 | " _, summaries_proto = sess.run([update_op, summaries], {b_pl:_b})\n", 99 | " \n", 100 | " writer.add_summary(summaries_proto, global_step=step)\n", 101 | " \n", 102 | "# Close the session\n", 103 | "sess.close()" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": null, 109 | "metadata": { 110 | "collapsed": true 111 | }, 112 | "outputs": [], 113 | "source": [] 114 | } 115 | ], 116 | "metadata": { 117 | "anaconda-cloud": {}, 118 | "kernelspec": { 119 | "display_name": "Python [conda root]", 120 | "language": "python", 121 | "name": "conda-root-py" 122 | }, 123 | "language_info": { 124 | "codemirror_mode": { 125 | "name": "ipython", 126 | "version": 3 127 | }, 128 | "file_extension": ".py", 129 | "mimetype": "text/x-python", 130 | "name": "python", 131 | "nbconvert_exporter": "python", 132 | "pygments_lexer": "ipython3", 133 | "version": "3.5.2" 134 | } 135 | }, 136 | "nbformat": 4, 137 | "nbformat_minor": 1 138 | } 139 | -------------------------------------------------------------------------------- /Ch1. Variables-solution.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Ch1. Build a graph which 5 cycles below and retrieve the value of Variable `a` and Tensor `e`." 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Start TensorFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": { 28 | "collapsed": true 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "import tensorflow as tf" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "Build a graph" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": { 46 | "collapsed": false 47 | }, 48 | "outputs": [], 49 | "source": [ 50 | "# Define inputs\n", 51 | "a = tf.Variable(2, tf.int32)\n", 52 | "b = tf.constant(3, tf.int32)\n", 53 | "\n", 54 | "# Ops\n", 55 | "c = tf.mul(a, b)\n", 56 | "d = tf.add(a, b)\n", 57 | "e = tf.sub(c, d)\n", 58 | "\n", 59 | "# Update the value of `a`\n", 60 | "update_op = tf.assign(a, a + e)\n", 61 | "\n", 62 | "# initialize variable(s)\n", 63 | "init = a.initializer\n", 64 | "\n", 65 | "# Create a saver\n", 66 | "saver = tf.train.Saver([a])" 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "Launch the graph" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 3, 79 | "metadata": { 80 | "collapsed": false 81 | }, 82 | "outputs": [ 83 | { 84 | "data": { 85 | "text/plain": [ 86 | "3" 87 | ] 88 | }, 89 | "execution_count": 3, 90 | "metadata": {}, 91 | "output_type": "execute_result" 92 | } 93 | ], 94 | "source": [ 95 | "sess=tf.InteractiveSession()\n", 96 | "sess.run(tf.global_variables_initializer())\n", 97 | "update_op.eval()" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 4, 103 | "metadata": { 104 | "collapsed": false 105 | }, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "2 1\n", 112 | "3 3\n", 113 | "6 9\n", 114 | "15 27\n", 115 | "42 81\n" 116 | ] 117 | } 118 | ], 119 | "source": [ 120 | "# Start a session\n", 121 | "sess = tf.Session()\n", 122 | "\n", 123 | "# Initialize Variable(s)\n", 124 | "sess.run(init)\n", 125 | "\n", 126 | "# Fetch the value of c, d, and e.\n", 127 | "for step in range(5):\n", 128 | " _a, _e = sess.run([a, e])\n", 129 | " \n", 130 | " # Save Variable a\n", 131 | " saver.save(sess, './ckpt.ckpt') \n", 132 | " \n", 133 | " print(_a, _e)\n", 134 | " sess.run(update_op)\n", 135 | "\n", 136 | "# Close the session\n", 137 | "sess.close()" 138 | ] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "metadata": {}, 143 | "source": [ 144 | "Restore Variable a" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 5, 150 | "metadata": { 151 | "collapsed": false 152 | }, 153 | "outputs": [ 154 | { 155 | "name": "stdout", 156 | "output_type": "stream", 157 | "text": [ 158 | "42\n" 159 | ] 160 | } 161 | ], 162 | "source": [ 163 | "# Start a new session\n", 164 | "sess2 = tf.Session()\n", 165 | "\n", 166 | "# Restore Variable a\n", 167 | "saver.restore(sess2, './ckpt.ckpt')\n", 168 | "\n", 169 | "# Check the value of a\n", 170 | "print(sess2.run(a))" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": { 177 | "collapsed": true 178 | }, 179 | "outputs": [], 180 | "source": [] 181 | } 182 | ], 183 | "metadata": { 184 | "anaconda-cloud": {}, 185 | "kernelspec": { 186 | "display_name": "Python [conda root]", 187 | "language": "python", 188 | "name": "conda-root-py" 189 | }, 190 | "language_info": { 191 | "codemirror_mode": { 192 | "name": "ipython", 193 | "version": 3 194 | }, 195 | "file_extension": ".py", 196 | "mimetype": "text/x-python", 197 | "name": "python", 198 | "nbconvert_exporter": "python", 199 | "pygments_lexer": "ipython3", 200 | "version": "3.5.2" 201 | } 202 | }, 203 | "nbformat": 4, 204 | "nbformat_minor": 1 205 | } 206 | -------------------------------------------------------------------------------- /Ch3. Linear Regression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "* Note: These codes are partly adapted from TensorFlow Tutorial of Stanford cs224d course \n", 8 | " https://cs224d.stanford.edu/lectures/CS224d-Lecture7.pdf" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "Ch3. This is a simple exercise on linear regression in TensorFlow. Follow the instructions, and fill out the codes." 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": { 22 | "collapsed": false 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "from __future__ import print_function\n", 27 | "import numpy as np\n", 28 | "import tensorflow as tf\n", 29 | "import matplotlib.pyplot as plt\n", 30 | "%matplotlib inline" 31 | ] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": {}, 36 | "source": [ 37 | "Overview" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 2, 43 | "metadata": { 44 | "collapsed": false 45 | }, 46 | "outputs": [], 47 | "source": [ 48 | "_x = np.arange(0, 100, .1)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 3, 54 | "metadata": { 55 | "collapsed": false 56 | }, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "text/plain": [ 61 | "array([ 44.2, 49.7, 56.7, 64.7, 41. , 9.9, 42.2, 37.6, 57.5, 30.1])" 62 | ] 63 | }, 64 | "execution_count": 3, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "np.random.shuffle(_x)\n", 71 | "_x[:10]" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "metadata": { 78 | "collapsed": true 79 | }, 80 | "outputs": [], 81 | "source": [ 82 | "_y = _x + 20*np.sin(_x*.1)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": null, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "plt.scatter(_x, _y)" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "Now create a line that best fits in the graph. " 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "Build a graph" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": null, 113 | "metadata": { 114 | "collapsed": true 115 | }, 116 | "outputs": [], 117 | "source": [ 118 | "# Inputs, Outputs\n", 119 | "x_pl = tf.placeholder(tf.float32, [None, 1]) # 2-D\n", 120 | "y_pl = tf.placeholder(tf.float32, [None, 1]) # 2-D" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": { 127 | "collapsed": true 128 | }, 129 | "outputs": [], 130 | "source": [ 131 | "# Variables\n", 132 | "W = ...\n", 133 | "b = ..." 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": null, 139 | "metadata": { 140 | "collapsed": false 141 | }, 142 | "outputs": [], 143 | "source": [ 144 | "# Hypothesis\n", 145 | "h = ..." 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": null, 151 | "metadata": { 152 | "collapsed": true 153 | }, 154 | "outputs": [], 155 | "source": [ 156 | "# loss\n", 157 | "loss = ..." 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": null, 163 | "metadata": { 164 | "collapsed": true 165 | }, 166 | "outputs": [], 167 | "source": [ 168 | "# Optimization\n", 169 | "optimizer = tf.train.AdamOptimizer()\n", 170 | "train_op = ..." 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": { 177 | "collapsed": true 178 | }, 179 | "outputs": [], 180 | "source": [ 181 | "# Init\n", 182 | "init = tf.global_variables_initializer()" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": null, 188 | "metadata": { 189 | "collapsed": false 190 | }, 191 | "outputs": [], 192 | "source": [ 193 | "# Summary\n", 194 | "writer = tf.summary.FileWriter('asset-ex3', tf.get_default_graph())\n", 195 | "tf.summary.scalar(\"loss\", ...)\n", 196 | "tf.summary.scalar(\"W\", ...)\n", 197 | "tf.summary.scalar(\"b\", ...)\n", 198 | "\n", 199 | "# Merge all\n", 200 | "summaries = ..." 201 | ] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "metadata": {}, 206 | "source": [ 207 | "Launch the graph" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": null, 213 | "metadata": { 214 | "collapsed": true 215 | }, 216 | "outputs": [], 217 | "source": [ 218 | "# Start a session\n", 219 | "sess = tf.Session()\n", 220 | "\n", 221 | "# Initialize all variables\n", 222 | "sess.run(init)" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": null, 228 | "metadata": { 229 | "collapsed": true 230 | }, 231 | "outputs": [], 232 | "source": [ 233 | "def get_samples(x, y, size):\n", 234 | " '''Extract `size` of elements form paired x and y randomly.'''\n", 235 | " assert len(x) == len(y), \"Two arrays must be the same in length!\"\n", 236 | " indices = np.random.choice(len(x), size)\n", 237 | " sample1 = x[indices]\n", 238 | " sample2 = y[indices]\n", 239 | " \n", 240 | " # Expand the dimensions of sample1 and sample2 such that \n", 241 | " # they have the second dimension.\n", 242 | " sample1_expanded = ...\n", 243 | " sample2_expanded = ...\n", 244 | " return sample1_expanded, sample2_expanded\n", 245 | " " 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": null, 251 | "metadata": { 252 | "collapsed": false 253 | }, 254 | "outputs": [], 255 | "source": [ 256 | "loss_list = []\n", 257 | "for i in range(1, 2001):\n", 258 | " x_batch, y_batch = get_samples(_x, _y, 100)\n", 259 | " _, _loss, _summaries = sess.run([train_op, loss, summaries], {x_pl:x_batch, y_pl:y_batch})\n", 260 | " \n", 261 | " # Write _summaries to TensorBoard.\n", 262 | " ...\n" 263 | ] 264 | }, 265 | { 266 | "cell_type": "markdown", 267 | "metadata": {}, 268 | "source": [ 269 | "Let's find out the value of the trained Variables `W` and `b`, and \n", 270 | "how well they fit in the graph." 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": null, 276 | "metadata": { 277 | "collapsed": false 278 | }, 279 | "outputs": [], 280 | "source": [ 281 | "_w, _b = sess.run([W, b])" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": null, 287 | "metadata": { 288 | "collapsed": false 289 | }, 290 | "outputs": [], 291 | "source": [ 292 | "plt.scatter(_x, _y)\n", 293 | "plt.plot(_x, _x * _w[0, 0] + _b[0])" 294 | ] 295 | }, 296 | { 297 | "cell_type": "code", 298 | "execution_count": null, 299 | "metadata": { 300 | "collapsed": true 301 | }, 302 | "outputs": [], 303 | "source": [] 304 | } 305 | ], 306 | "metadata": { 307 | "anaconda-cloud": {}, 308 | "kernelspec": { 309 | "display_name": "Python [conda root]", 310 | "language": "python", 311 | "name": "conda-root-py" 312 | }, 313 | "language_info": { 314 | "codemirror_mode": { 315 | "name": "ipython", 316 | "version": 3 317 | }, 318 | "file_extension": ".py", 319 | "mimetype": "text/x-python", 320 | "name": "python", 321 | "nbconvert_exporter": "python", 322 | "pygments_lexer": "ipython3", 323 | "version": "3.5.2" 324 | } 325 | }, 326 | "nbformat": 4, 327 | "nbformat_minor": 1 328 | } 329 | -------------------------------------------------------------------------------- /Demo1. Indexing and Slicing.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true, 8 | "deletable": true, 9 | "editable": true 10 | }, 11 | "outputs": [], 12 | "source": [ 13 | "import numpy as np\n", 14 | "import tensorflow as tf\n", 15 | "sess = tf.InteractiveSession()" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "deletable": true, 22 | "editable": true 23 | }, 24 | "source": [ 25 | "1-d array (a.k.a. vector)" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": { 32 | "collapsed": false 33 | }, 34 | "outputs": [ 35 | { 36 | "data": { 37 | "text/plain": [ 38 | "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" 39 | ] 40 | }, 41 | "execution_count": 2, 42 | "metadata": {}, 43 | "output_type": "execute_result" 44 | } 45 | ], 46 | "source": [ 47 | "_x = np.arange(10)\n", 48 | "_x" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 3, 54 | "metadata": { 55 | "collapsed": false 56 | }, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "text/plain": [ 61 | "0" 62 | ] 63 | }, 64 | "execution_count": 3, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "_x[0]" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 4, 76 | "metadata": { 77 | "collapsed": false 78 | }, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "text/plain": [ 83 | "2" 84 | ] 85 | }, 86 | "execution_count": 4, 87 | "metadata": {}, 88 | "output_type": "execute_result" 89 | } 90 | ], 91 | "source": [ 92 | "_x[2]" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 5, 98 | "metadata": { 99 | "collapsed": false 100 | }, 101 | "outputs": [ 102 | { 103 | "data": { 104 | "text/plain": [ 105 | "array([0, 1, 2, 3, 4])" 106 | ] 107 | }, 108 | "execution_count": 5, 109 | "metadata": {}, 110 | "output_type": "execute_result" 111 | } 112 | ], 113 | "source": [ 114 | "_x[0:5]" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 6, 120 | "metadata": { 121 | "collapsed": false 122 | }, 123 | "outputs": [ 124 | { 125 | "data": { 126 | "text/plain": [ 127 | "array([0, 1, 2, 3, 4])" 128 | ] 129 | }, 130 | "execution_count": 6, 131 | "metadata": {}, 132 | "output_type": "execute_result" 133 | } 134 | ], 135 | "source": [ 136 | "_x[:5]" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 7, 142 | "metadata": { 143 | "collapsed": false 144 | }, 145 | "outputs": [ 146 | { 147 | "data": { 148 | "text/plain": [ 149 | "array([5, 6, 7, 8, 9])" 150 | ] 151 | }, 152 | "execution_count": 7, 153 | "metadata": {}, 154 | "output_type": "execute_result" 155 | } 156 | ], 157 | "source": [ 158 | "_x[5:]" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 9, 164 | "metadata": { 165 | "collapsed": false 166 | }, 167 | "outputs": [ 168 | { 169 | "name": "stdout", 170 | "output_type": "stream", 171 | "text": [ 172 | "[0 1 2 3 4] [5 6 7 8 9]\n" 173 | ] 174 | } 175 | ], 176 | "source": [ 177 | "_head, _tail = _x[:5], _x[5:] # Slicing\n", 178 | "print(_head, _tail)" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": 10, 184 | "metadata": { 185 | "collapsed": false, 186 | "deletable": true, 187 | "editable": true 188 | }, 189 | "outputs": [ 190 | { 191 | "data": { 192 | "text/plain": [ 193 | "array([1, 3, 5, 7])" 194 | ] 195 | }, 196 | "execution_count": 10, 197 | "metadata": {}, 198 | "output_type": "execute_result" 199 | } 200 | ], 201 | "source": [ 202 | "_x[1:9:2]" 203 | ] 204 | }, 205 | { 206 | "cell_type": "code", 207 | "execution_count": 11, 208 | "metadata": { 209 | "collapsed": false 210 | }, 211 | "outputs": [ 212 | { 213 | "data": { 214 | "text/plain": [ 215 | "array([0, 2, 4, 6, 8])" 216 | ] 217 | }, 218 | "execution_count": 11, 219 | "metadata": {}, 220 | "output_type": "execute_result" 221 | } 222 | ], 223 | "source": [ 224 | "_x[::2]" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": 12, 230 | "metadata": { 231 | "collapsed": false 232 | }, 233 | "outputs": [ 234 | { 235 | "data": { 236 | "text/plain": [ 237 | "array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])" 238 | ] 239 | }, 240 | "execution_count": 12, 241 | "metadata": {}, 242 | "output_type": "execute_result" 243 | } 244 | ], 245 | "source": [ 246 | "_x[::-1] # Reverse" 247 | ] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": {}, 252 | "source": [ 253 | "1-d tensor" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "execution_count": 13, 259 | "metadata": { 260 | "collapsed": true 261 | }, 262 | "outputs": [], 263 | "source": [ 264 | "x = tf.convert_to_tensor(_x)" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": 14, 270 | "metadata": { 271 | "collapsed": false 272 | }, 273 | "outputs": [ 274 | { 275 | "data": { 276 | "text/plain": [ 277 | "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" 278 | ] 279 | }, 280 | "execution_count": 14, 281 | "metadata": {}, 282 | "output_type": "execute_result" 283 | } 284 | ], 285 | "source": [ 286 | "x.eval()" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 15, 292 | "metadata": { 293 | "collapsed": false 294 | }, 295 | "outputs": [ 296 | { 297 | "data": { 298 | "text/plain": [ 299 | "array([0, 1, 2])" 300 | ] 301 | }, 302 | "execution_count": 15, 303 | "metadata": {}, 304 | "output_type": "execute_result" 305 | } 306 | ], 307 | "source": [ 308 | "x[:3].eval()" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 16, 314 | "metadata": { 315 | "collapsed": false 316 | }, 317 | "outputs": [ 318 | { 319 | "data": { 320 | "text/plain": [ 321 | "3" 322 | ] 323 | }, 324 | "execution_count": 16, 325 | "metadata": {}, 326 | "output_type": "execute_result" 327 | } 328 | ], 329 | "source": [ 330 | "x[3].eval()" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 17, 336 | "metadata": { 337 | "collapsed": false 338 | }, 339 | "outputs": [ 340 | { 341 | "data": { 342 | "text/plain": [ 343 | "array([5, 6, 7, 8, 9])" 344 | ] 345 | }, 346 | "execution_count": 17, 347 | "metadata": {}, 348 | "output_type": "execute_result" 349 | } 350 | ], 351 | "source": [ 352 | "x[5:].eval()" 353 | ] 354 | }, 355 | { 356 | "cell_type": "code", 357 | "execution_count": 18, 358 | "metadata": { 359 | "collapsed": false 360 | }, 361 | "outputs": [ 362 | { 363 | "data": { 364 | "text/plain": [ 365 | "array([1, 3])" 366 | ] 367 | }, 368 | "execution_count": 18, 369 | "metadata": {}, 370 | "output_type": "execute_result" 371 | } 372 | ], 373 | "source": [ 374 | "x[1:5:2].eval()" 375 | ] 376 | }, 377 | { 378 | "cell_type": "code", 379 | "execution_count": 19, 380 | "metadata": { 381 | "collapsed": false 382 | }, 383 | "outputs": [ 384 | { 385 | "data": { 386 | "text/plain": [ 387 | "array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])" 388 | ] 389 | }, 390 | "execution_count": 19, 391 | "metadata": {}, 392 | "output_type": "execute_result" 393 | } 394 | ], 395 | "source": [ 396 | "x[::-1].eval()" 397 | ] 398 | }, 399 | { 400 | "cell_type": "code", 401 | "execution_count": 20, 402 | "metadata": { 403 | "collapsed": true 404 | }, 405 | "outputs": [], 406 | "source": [ 407 | "head, tail = x[:4], x[4:] # Slicing" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 21, 413 | "metadata": { 414 | "collapsed": false 415 | }, 416 | "outputs": [ 417 | { 418 | "data": { 419 | "text/plain": [ 420 | "array([0, 1, 2, 3])" 421 | ] 422 | }, 423 | "execution_count": 21, 424 | "metadata": {}, 425 | "output_type": "execute_result" 426 | } 427 | ], 428 | "source": [ 429 | "head.eval()" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": 22, 435 | "metadata": { 436 | "collapsed": false 437 | }, 438 | "outputs": [ 439 | { 440 | "data": { 441 | "text/plain": [ 442 | "array([4, 5, 6, 7, 8, 9])" 443 | ] 444 | }, 445 | "execution_count": 22, 446 | "metadata": {}, 447 | "output_type": "execute_result" 448 | } 449 | ], 450 | "source": [ 451 | "tail.eval()" 452 | ] 453 | }, 454 | { 455 | "cell_type": "markdown", 456 | "metadata": { 457 | "deletable": true, 458 | "editable": true 459 | }, 460 | "source": [ 461 | "2-d arrays (a.k.a. matrices)" 462 | ] 463 | }, 464 | { 465 | "cell_type": "code", 466 | "execution_count": 23, 467 | "metadata": { 468 | "collapsed": false 469 | }, 470 | "outputs": [ 471 | { 472 | "data": { 473 | "text/plain": [ 474 | "array([[ 1, 2, 3, 4, 5],\n", 475 | " [ 6, 7, 8, 9, 10]])" 476 | ] 477 | }, 478 | "execution_count": 23, 479 | "metadata": {}, 480 | "output_type": "execute_result" 481 | } 482 | ], 483 | "source": [ 484 | "_X = np.arange(1, 11).reshape([2, 5])\n", 485 | "_X" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": 24, 491 | "metadata": { 492 | "collapsed": false 493 | }, 494 | "outputs": [ 495 | { 496 | "data": { 497 | "text/plain": [ 498 | "2" 499 | ] 500 | }, 501 | "execution_count": 24, 502 | "metadata": {}, 503 | "output_type": "execute_result" 504 | } 505 | ], 506 | "source": [ 507 | "_X[0, 1]" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 25, 513 | "metadata": { 514 | "collapsed": false, 515 | "deletable": true, 516 | "editable": true 517 | }, 518 | "outputs": [ 519 | { 520 | "data": { 521 | "text/plain": [ 522 | "array([2, 7])" 523 | ] 524 | }, 525 | "execution_count": 25, 526 | "metadata": {}, 527 | "output_type": "execute_result" 528 | } 529 | ], 530 | "source": [ 531 | "_X[:, 1]" 532 | ] 533 | }, 534 | { 535 | "cell_type": "code", 536 | "execution_count": 26, 537 | "metadata": { 538 | "collapsed": false 539 | }, 540 | "outputs": [ 541 | { 542 | "data": { 543 | "text/plain": [ 544 | "array([[2],\n", 545 | " [7]])" 546 | ] 547 | }, 548 | "execution_count": 26, 549 | "metadata": {}, 550 | "output_type": "execute_result" 551 | } 552 | ], 553 | "source": [ 554 | "_X[:, 1:2]" 555 | ] 556 | }, 557 | { 558 | "cell_type": "code", 559 | "execution_count": 28, 560 | "metadata": { 561 | "collapsed": false, 562 | "deletable": true, 563 | "editable": true 564 | }, 565 | "outputs": [ 566 | { 567 | "data": { 568 | "text/plain": [ 569 | "array([ 4, 10])" 570 | ] 571 | }, 572 | "execution_count": 28, 573 | "metadata": {}, 574 | "output_type": "execute_result" 575 | } 576 | ], 577 | "source": [ 578 | "_X[[0, 1], [3, 4]] # Multiple indexing" 579 | ] 580 | }, 581 | { 582 | "cell_type": "markdown", 583 | "metadata": {}, 584 | "source": [ 585 | "2-d tensors" 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "execution_count": 29, 591 | "metadata": { 592 | "collapsed": false 593 | }, 594 | "outputs": [ 595 | { 596 | "data": { 597 | "text/plain": [ 598 | "array([[ 1, 2, 3, 4, 5],\n", 599 | " [ 6, 7, 8, 9, 10]])" 600 | ] 601 | }, 602 | "execution_count": 29, 603 | "metadata": {}, 604 | "output_type": "execute_result" 605 | } 606 | ], 607 | "source": [ 608 | "X = tf.convert_to_tensor(_X)\n", 609 | "X.eval()" 610 | ] 611 | }, 612 | { 613 | "cell_type": "code", 614 | "execution_count": 30, 615 | "metadata": { 616 | "collapsed": false 617 | }, 618 | "outputs": [ 619 | { 620 | "data": { 621 | "text/plain": [ 622 | "4" 623 | ] 624 | }, 625 | "execution_count": 30, 626 | "metadata": {}, 627 | "output_type": "execute_result" 628 | } 629 | ], 630 | "source": [ 631 | "X[0,3].eval()" 632 | ] 633 | }, 634 | { 635 | "cell_type": "code", 636 | "execution_count": 31, 637 | "metadata": { 638 | "collapsed": false 639 | }, 640 | "outputs": [ 641 | { 642 | "data": { 643 | "text/plain": [ 644 | "array([2, 7])" 645 | ] 646 | }, 647 | "execution_count": 31, 648 | "metadata": {}, 649 | "output_type": "execute_result" 650 | } 651 | ], 652 | "source": [ 653 | "X[:, 1].eval()" 654 | ] 655 | }, 656 | { 657 | "cell_type": "code", 658 | "execution_count": 33, 659 | "metadata": { 660 | "collapsed": false, 661 | "deletable": true, 662 | "editable": true 663 | }, 664 | "outputs": [ 665 | { 666 | "data": { 667 | "text/plain": [ 668 | "array([[2, 3, 4, 5]])" 669 | ] 670 | }, 671 | "execution_count": 33, 672 | "metadata": {}, 673 | "output_type": "execute_result" 674 | } 675 | ], 676 | "source": [ 677 | "X[0:1, 1:5].eval()" 678 | ] 679 | }, 680 | { 681 | "cell_type": "code", 682 | "execution_count": 35, 683 | "metadata": { 684 | "collapsed": false, 685 | "deletable": true, 686 | "editable": true 687 | }, 688 | "outputs": [ 689 | { 690 | "ename": "TypeError", 691 | "evalue": "can only concatenate list (not \"int\") to list", 692 | "output_type": "error", 693 | "traceback": [ 694 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 695 | "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", 696 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mX\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;31m# Multiple indexing: not woking\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 697 | "\u001b[0;32mC:\\Users\\kakao\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\ops\\array_ops.py\u001b[0m in \u001b[0;36m_SliceHelper\u001b[0;34m(tensor, slice_spec, var)\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 410\u001b[0m \u001b[0mbegin\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m--> 411\u001b[0;31m \u001b[0mend\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 412\u001b[0m \u001b[0mstrides\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 413\u001b[0m \u001b[0mshrink_axis_mask\u001b[0m \u001b[1;33m|=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m \u001b[1;33m<<\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 698 | "\u001b[0;31mTypeError\u001b[0m: can only concatenate list (not \"int\") to list" 699 | ] 700 | } 701 | ], 702 | "source": [ 703 | "X[[0, 1], [1, 3]] # Multiple indexing: not woking" 704 | ] 705 | } 706 | ], 707 | "metadata": { 708 | "anaconda-cloud": {}, 709 | "kernelspec": { 710 | "display_name": "Python [conda root]", 711 | "language": "python", 712 | "name": "conda-root-py" 713 | }, 714 | "language_info": { 715 | "codemirror_mode": { 716 | "name": "ipython", 717 | "version": 3 718 | }, 719 | "file_extension": ".py", 720 | "mimetype": "text/x-python", 721 | "name": "python", 722 | "nbconvert_exporter": "python", 723 | "pygments_lexer": "ipython3", 724 | "version": "3.5.2" 725 | } 726 | }, 727 | "nbformat": 4, 728 | "nbformat_minor": 2 729 | } 730 | -------------------------------------------------------------------------------- /Demo0. Create Arrays and Tensors.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false, 8 | "deletable": true, 9 | "editable": true 10 | }, 11 | "outputs": [], 12 | "source": [ 13 | "import numpy as np\n", 14 | "import tensorflow as tf" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "Notation: _x, _y, _z: array, x, y, z: tensor" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": { 28 | "collapsed": false 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "# For convenience\n", 33 | "sess = tf.InteractiveSession()" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": {}, 39 | "source": [ 40 | "Arrays can be created from Python lists or tuples." 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": { 47 | "collapsed": false, 48 | "deletable": true, 49 | "editable": true 50 | }, 51 | "outputs": [ 52 | { 53 | "name": "stdout", 54 | "output_type": "stream", 55 | "text": [ 56 | "[1 2 3 4 5] [1 2 3 4 5]\n" 57 | ] 58 | } 59 | ], 60 | "source": [ 61 | "_x1 = np.array([1,2,3,4,5])# from list\n", 62 | "_x2 = np.array((1,2,3,4,5)) # from tuple\n", 63 | "print(_x1, _x2)" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "It's always a good idea to explicitly assign the data type when creating an array." 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 4, 76 | "metadata": { 77 | "collapsed": false 78 | }, 79 | "outputs": [], 80 | "source": [ 81 | "_x1 = np.array([1,2,3,4,5], dtype=np.int32)" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 5, 87 | "metadata": { 88 | "collapsed": false 89 | }, 90 | "outputs": [ 91 | { 92 | "data": { 93 | "text/plain": [ 94 | "dtype('int32')" 95 | ] 96 | }, 97 | "execution_count": 5, 98 | "metadata": {}, 99 | "output_type": "execute_result" 100 | } 101 | ], 102 | "source": [ 103 | "_x1.dtype" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "If you want to change the data type of an array," 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 6, 116 | "metadata": { 117 | "collapsed": true 118 | }, 119 | "outputs": [], 120 | "source": [ 121 | "_x1 = _x1.astype(np.float32)" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 7, 127 | "metadata": { 128 | "collapsed": false 129 | }, 130 | "outputs": [ 131 | { 132 | "data": { 133 | "text/plain": [ 134 | "dtype('float32')" 135 | ] 136 | }, 137 | "execution_count": 7, 138 | "metadata": {}, 139 | "output_type": "execute_result" 140 | } 141 | ], 142 | "source": [ 143 | "_x1.dtype" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 8, 149 | "metadata": { 150 | "collapsed": false 151 | }, 152 | "outputs": [ 153 | { 154 | "data": { 155 | "text/plain": [ 156 | "(5,)" 157 | ] 158 | }, 159 | "execution_count": 8, 160 | "metadata": {}, 161 | "output_type": "execute_result" 162 | } 163 | ], 164 | "source": [ 165 | "_x1.shape # shape" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 9, 171 | "metadata": { 172 | "collapsed": false 173 | }, 174 | "outputs": [ 175 | { 176 | "data": { 177 | "text/plain": [ 178 | "1" 179 | ] 180 | }, 181 | "execution_count": 9, 182 | "metadata": {}, 183 | "output_type": "execute_result" 184 | } 185 | ], 186 | "source": [ 187 | "_x1.ndim # ndim or rank in TensorFlow terminology" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 10, 193 | "metadata": { 194 | "collapsed": false 195 | }, 196 | "outputs": [ 197 | { 198 | "data": { 199 | "text/plain": [ 200 | "array([[ 1., 2., 3.],\n", 201 | " [ 4., 5., 6.]], dtype=float32)" 202 | ] 203 | }, 204 | "execution_count": 10, 205 | "metadata": {}, 206 | "output_type": "execute_result" 207 | } 208 | ], 209 | "source": [ 210 | "_X1 = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)\n", 211 | "_X1" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 11, 217 | "metadata": { 218 | "collapsed": false 219 | }, 220 | "outputs": [ 221 | { 222 | "name": "stdout", 223 | "output_type": "stream", 224 | "text": [ 225 | "(2, 3)\n", 226 | "float32\n" 227 | ] 228 | } 229 | ], 230 | "source": [ 231 | "print(_X1.shape)\n", 232 | "print(_X1.dtype)" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "Tensors can be made from Python scalars, lists, or numpy arrays." 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 12, 245 | "metadata": { 246 | "collapsed": false 247 | }, 248 | "outputs": [ 249 | { 250 | "data": { 251 | "text/plain": [ 252 | "" 253 | ] 254 | }, 255 | "execution_count": 12, 256 | "metadata": {}, 257 | "output_type": "execute_result" 258 | } 259 | ], 260 | "source": [ 261 | "tf.constant(1) # from Python scalar" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 13, 267 | "metadata": { 268 | "collapsed": false 269 | }, 270 | "outputs": [ 271 | { 272 | "data": { 273 | "text/plain": [ 274 | "" 275 | ] 276 | }, 277 | "execution_count": 13, 278 | "metadata": {}, 279 | "output_type": "execute_result" 280 | } 281 | ], 282 | "source": [ 283 | "tf.constant([1, 2, 3]) # from list" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 14, 289 | "metadata": { 290 | "collapsed": false 291 | }, 292 | "outputs": [ 293 | { 294 | "data": { 295 | "text/plain": [ 296 | "" 297 | ] 298 | }, 299 | "execution_count": 14, 300 | "metadata": {}, 301 | "output_type": "execute_result" 302 | } 303 | ], 304 | "source": [ 305 | "tf.constant(np.array([1, 2, 3], np.int64)) # Best practice!" 306 | ] 307 | }, 308 | { 309 | "cell_type": "markdown", 310 | "metadata": {}, 311 | "source": [ 312 | "Or you can convert them to a tensor like this." 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 15, 318 | "metadata": { 319 | "collapsed": false 320 | }, 321 | "outputs": [ 322 | { 323 | "data": { 324 | "text/plain": [ 325 | "" 326 | ] 327 | }, 328 | "execution_count": 15, 329 | "metadata": {}, 330 | "output_type": "execute_result" 331 | } 332 | ], 333 | "source": [ 334 | "X1 = tf.convert_to_tensor(_X1)\n", 335 | "X1" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": 16, 341 | "metadata": { 342 | "collapsed": false 343 | }, 344 | "outputs": [ 345 | { 346 | "data": { 347 | "text/plain": [ 348 | "array([[ 1., 2., 3.],\n", 349 | " [ 4., 5., 6.]], dtype=float32)" 350 | ] 351 | }, 352 | "execution_count": 16, 353 | "metadata": {}, 354 | "output_type": "execute_result" 355 | } 356 | ], 357 | "source": [ 358 | "X1.eval()" 359 | ] 360 | }, 361 | { 362 | "cell_type": "code", 363 | "execution_count": 17, 364 | "metadata": { 365 | "collapsed": false 366 | }, 367 | "outputs": [ 368 | { 369 | "data": { 370 | "text/plain": [ 371 | "tf.float32" 372 | ] 373 | }, 374 | "execution_count": 17, 375 | "metadata": {}, 376 | "output_type": "execute_result" 377 | } 378 | ], 379 | "source": [ 380 | "X1.dtype" 381 | ] 382 | }, 383 | { 384 | "cell_type": "code", 385 | "execution_count": 18, 386 | "metadata": { 387 | "collapsed": false 388 | }, 389 | "outputs": [ 390 | { 391 | "data": { 392 | "text/plain": [ 393 | "[2, 3]" 394 | ] 395 | }, 396 | "execution_count": 18, 397 | "metadata": {}, 398 | "output_type": "execute_result" 399 | } 400 | ], 401 | "source": [ 402 | "X1.get_shape().as_list()" 403 | ] 404 | }, 405 | { 406 | "cell_type": "markdown", 407 | "metadata": { 408 | "deletable": true, 409 | "editable": true 410 | }, 411 | "source": [ 412 | "Create an array filled with zeros or ones." 413 | ] 414 | }, 415 | { 416 | "cell_type": "code", 417 | "execution_count": 19, 418 | "metadata": { 419 | "collapsed": false, 420 | "deletable": true, 421 | "editable": true 422 | }, 423 | "outputs": [ 424 | { 425 | "data": { 426 | "text/plain": [ 427 | "array([[0, 0, 0, 0, 0],\n", 428 | " [0, 0, 0, 0, 0],\n", 429 | " [0, 0, 0, 0, 0]])" 430 | ] 431 | }, 432 | "execution_count": 19, 433 | "metadata": {}, 434 | "output_type": "execute_result" 435 | } 436 | ], 437 | "source": [ 438 | "_zeros = np.zeros([3, 5], np.int32)\n", 439 | "_zeros" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": 20, 445 | "metadata": { 446 | "collapsed": false 447 | }, 448 | "outputs": [ 449 | { 450 | "data": { 451 | "text/plain": [ 452 | "array([[ 1., 1., 1., 1., 1.],\n", 453 | " [ 1., 1., 1., 1., 1.],\n", 454 | " [ 1., 1., 1., 1., 1.]], dtype=float32)" 455 | ] 456 | }, 457 | "execution_count": 20, 458 | "metadata": {}, 459 | "output_type": "execute_result" 460 | } 461 | ], 462 | "source": [ 463 | "_ones = np.ones([3, 5], np.float32)\n", 464 | "_ones" 465 | ] 466 | }, 467 | { 468 | "cell_type": "code", 469 | "execution_count": 21, 470 | "metadata": { 471 | "collapsed": false 472 | }, 473 | "outputs": [ 474 | { 475 | "data": { 476 | "text/plain": [ 477 | "array([[ 5., 5., 5., 5., 5.],\n", 478 | " [ 5., 5., 5., 5., 5.],\n", 479 | " [ 5., 5., 5., 5., 5.]], dtype=float32)" 480 | ] 481 | }, 482 | "execution_count": 21, 483 | "metadata": {}, 484 | "output_type": "execute_result" 485 | } 486 | ], 487 | "source": [ 488 | "_fives = np.ones([3, 5], np.float32) * 5\n", 489 | "_fives" 490 | ] 491 | }, 492 | { 493 | "cell_type": "markdown", 494 | "metadata": {}, 495 | "source": [ 496 | "Create an array with the same shape and dtype as a certain array, but filled with zeros or ones." 497 | ] 498 | }, 499 | { 500 | "cell_type": "code", 501 | "execution_count": 22, 502 | "metadata": { 503 | "collapsed": true 504 | }, 505 | "outputs": [], 506 | "source": [ 507 | "X = tf.constant([[1, 2, 3], [4, 5, 6]], dtype=tf.int32)" 508 | ] 509 | }, 510 | { 511 | "cell_type": "code", 512 | "execution_count": 23, 513 | "metadata": { 514 | "collapsed": false 515 | }, 516 | "outputs": [ 517 | { 518 | "data": { 519 | "text/plain": [ 520 | "array([[0, 0, 0],\n", 521 | " [0, 0, 0]])" 522 | ] 523 | }, 524 | "execution_count": 23, 525 | "metadata": {}, 526 | "output_type": "execute_result" 527 | } 528 | ], 529 | "source": [ 530 | "X2 = tf.zeros_like(X)\n", 531 | "X2.eval()" 532 | ] 533 | }, 534 | { 535 | "cell_type": "code", 536 | "execution_count": 24, 537 | "metadata": { 538 | "collapsed": false 539 | }, 540 | "outputs": [ 541 | { 542 | "data": { 543 | "text/plain": [ 544 | "array([[1, 1, 1],\n", 545 | " [1, 1, 1]])" 546 | ] 547 | }, 548 | "execution_count": 24, 549 | "metadata": {}, 550 | "output_type": "execute_result" 551 | } 552 | ], 553 | "source": [ 554 | "X3 = tf.ones_like(X)\n", 555 | "X3.eval()" 556 | ] 557 | }, 558 | { 559 | "cell_type": "markdown", 560 | "metadata": {}, 561 | "source": [ 562 | "Create a tensor filled with zeros or ones." 563 | ] 564 | }, 565 | { 566 | "cell_type": "code", 567 | "execution_count": 25, 568 | "metadata": { 569 | "collapsed": false 570 | }, 571 | "outputs": [ 572 | { 573 | "data": { 574 | "text/plain": [ 575 | "array([[ 0., 0., 0.],\n", 576 | " [ 0., 0., 0.]], dtype=float32)" 577 | ] 578 | }, 579 | "execution_count": 25, 580 | "metadata": {}, 581 | "output_type": "execute_result" 582 | } 583 | ], 584 | "source": [ 585 | "X4 = tf.zeros_like(X1)\n", 586 | "X4.eval()" 587 | ] 588 | }, 589 | { 590 | "cell_type": "code", 591 | "execution_count": 26, 592 | "metadata": { 593 | "collapsed": false 594 | }, 595 | "outputs": [ 596 | { 597 | "data": { 598 | "text/plain": [ 599 | "array([[ 1., 1., 1.],\n", 600 | " [ 1., 1., 1.]], dtype=float32)" 601 | ] 602 | }, 603 | "execution_count": 26, 604 | "metadata": {}, 605 | "output_type": "execute_result" 606 | } 607 | ], 608 | "source": [ 609 | "X5 = tf.ones_like(X1)\n", 610 | "X5.eval()" 611 | ] 612 | }, 613 | { 614 | "cell_type": "markdown", 615 | "metadata": { 616 | "deletable": true, 617 | "editable": true 618 | }, 619 | "source": [ 620 | "Create some regularly spaced array." 621 | ] 622 | }, 623 | { 624 | "cell_type": "code", 625 | "execution_count": 27, 626 | "metadata": { 627 | "collapsed": false, 628 | "deletable": true, 629 | "editable": true 630 | }, 631 | "outputs": [ 632 | { 633 | "data": { 634 | "text/plain": [ 635 | "array([ 0. , 2.5, 5. , 7.5, 10. ])" 636 | ] 637 | }, 638 | "execution_count": 27, 639 | "metadata": {}, 640 | "output_type": "execute_result" 641 | } 642 | ], 643 | "source": [ 644 | "_x1 = np.linspace(0, 10, 5) # five elements from 0 to 10 (inclusive)\n", 645 | "_x1" 646 | ] 647 | }, 648 | { 649 | "cell_type": "code", 650 | "execution_count": 28, 651 | "metadata": { 652 | "collapsed": false 653 | }, 654 | "outputs": [ 655 | { 656 | "data": { 657 | "text/plain": [ 658 | "array([ 0., 2., 4., 6., 8.], dtype=float32)" 659 | ] 660 | }, 661 | "execution_count": 28, 662 | "metadata": {}, 663 | "output_type": "execute_result" 664 | } 665 | ], 666 | "source": [ 667 | "_x2 = np.arange(0, 10, 2, dtype=np.float32) # from 0 to 10 (exclusive), step=2\n", 668 | "_x2" 669 | ] 670 | }, 671 | { 672 | "cell_type": "markdown", 673 | "metadata": {}, 674 | "source": [ 675 | "Create some regularly spaced tensor." 676 | ] 677 | }, 678 | { 679 | "cell_type": "code", 680 | "execution_count": 29, 681 | "metadata": { 682 | "collapsed": false 683 | }, 684 | "outputs": [ 685 | { 686 | "data": { 687 | "text/plain": [ 688 | "array([ 0. , 2.5, 5. , 7.5, 10. ], dtype=float32)" 689 | ] 690 | }, 691 | "execution_count": 29, 692 | "metadata": {}, 693 | "output_type": "execute_result" 694 | } 695 | ], 696 | "source": [ 697 | "x1 = tf.linspace(0., 10, 5)\n", 698 | "x1.eval()" 699 | ] 700 | }, 701 | { 702 | "cell_type": "code", 703 | "execution_count": 30, 704 | "metadata": { 705 | "collapsed": false 706 | }, 707 | "outputs": [ 708 | { 709 | "data": { 710 | "text/plain": [ 711 | "array([0, 2, 4, 6, 8])" 712 | ] 713 | }, 714 | "execution_count": 30, 715 | "metadata": {}, 716 | "output_type": "execute_result" 717 | } 718 | ], 719 | "source": [ 720 | "x2 = tf.range(0, 10, 2)\n", 721 | "x2.eval()" 722 | ] 723 | }, 724 | { 725 | "cell_type": "markdown", 726 | "metadata": { 727 | "deletable": true, 728 | "editable": true 729 | }, 730 | "source": [ 731 | "Create random arrays" 732 | ] 733 | }, 734 | { 735 | "cell_type": "code", 736 | "execution_count": 31, 737 | "metadata": { 738 | "collapsed": false 739 | }, 740 | "outputs": [ 741 | { 742 | "data": { 743 | "text/plain": [ 744 | "array([[ 2.79778296, 3.31195815, 2.9572616 , 3.41099159],\n", 745 | " [ 3.06707386, 2.75770653, 3.56699116, 3.06269411],\n", 746 | " [ 2.87343592, 2.42140926, 2.90308584, 2.94035599],\n", 747 | " ..., \n", 748 | " [ 3.09170575, 2.83684115, 3.03489958, 2.87395914],\n", 749 | " [ 3.64564372, 2.97728388, 2.99041326, 3.1037937 ],\n", 750 | " [ 3.24632579, 3.38332561, 2.83951565, 2.95078544]])" 751 | ] 752 | }, 753 | "execution_count": 31, 754 | "metadata": {}, 755 | "output_type": "execute_result" 756 | } 757 | ], 758 | "source": [ 759 | "_x = np.random.normal(3, 0.3, [30000, 4])\n", 760 | "_x" 761 | ] 762 | }, 763 | { 764 | "cell_type": "code", 765 | "execution_count": 32, 766 | "metadata": { 767 | "collapsed": false, 768 | "deletable": true, 769 | "editable": true 770 | }, 771 | "outputs": [ 772 | { 773 | "data": { 774 | "text/plain": [ 775 | "array([[ 9.03397168, 6.85251358, 3.19748006, 9.27063369],\n", 776 | " [ 6.27354201, 7.78365266, 6.22690345, 4.15928007],\n", 777 | " [ 7.96648371, 6.904826 , 8.51664221, 7.45611329]])" 778 | ] 779 | }, 780 | "execution_count": 32, 781 | "metadata": {}, 782 | "output_type": "execute_result" 783 | } 784 | ], 785 | "source": [ 786 | "_x2 = np.random.uniform(3, 10, [3, 4])\n", 787 | "_x2" 788 | ] 789 | }, 790 | { 791 | "cell_type": "code", 792 | "execution_count": 33, 793 | "metadata": { 794 | "collapsed": false 795 | }, 796 | "outputs": [ 797 | { 798 | "data": { 799 | "text/plain": [ 800 | "array([[-2.1235378 , 0.42768423, -1.1226624 , 1.0635717 ],\n", 801 | " [-0.12094115, -2.04292045, 0.65923468, 0.66866386],\n", 802 | " [ 0.20845262, 1.15842827, 0.55973512, -0.33221781]])" 803 | ] 804 | }, 805 | "execution_count": 33, 806 | "metadata": {}, 807 | "output_type": "execute_result" 808 | } 809 | ], 810 | "source": [ 811 | "x1 = tf.random_normal([3, 4], 0, 1, dtype=tf.float64)\n", 812 | "x1.eval()" 813 | ] 814 | }, 815 | { 816 | "cell_type": "code", 817 | "execution_count": 34, 818 | "metadata": { 819 | "collapsed": false, 820 | "deletable": true, 821 | "editable": true 822 | }, 823 | "outputs": [ 824 | { 825 | "data": { 826 | "text/plain": [ 827 | "array([[3, 7, 7, 6],\n", 828 | " [6, 7, 5, 9],\n", 829 | " [4, 8, 7, 7]])" 830 | ] 831 | }, 832 | "execution_count": 34, 833 | "metadata": {}, 834 | "output_type": "execute_result" 835 | } 836 | ], 837 | "source": [ 838 | "x2 = tf.random_uniform([3, 4], 3, 10, dtype=tf.int32)\n", 839 | "x2.eval()" 840 | ] 841 | }, 842 | { 843 | "cell_type": "markdown", 844 | "metadata": { 845 | "deletable": true, 846 | "editable": true 847 | }, 848 | "source": [ 849 | "Save and load an array." 850 | ] 851 | }, 852 | { 853 | "cell_type": "code", 854 | "execution_count": 35, 855 | "metadata": { 856 | "collapsed": true, 857 | "deletable": true, 858 | "editable": true 859 | }, 860 | "outputs": [], 861 | "source": [ 862 | "np.save('_x.npy', _x)" 863 | ] 864 | }, 865 | { 866 | "cell_type": "code", 867 | "execution_count": 36, 868 | "metadata": { 869 | "collapsed": false, 870 | "deletable": true, 871 | "editable": true 872 | }, 873 | "outputs": [ 874 | { 875 | "data": { 876 | "text/plain": [ 877 | "array([[ 2.79778296, 3.31195815, 2.9572616 , 3.41099159],\n", 878 | " [ 3.06707386, 2.75770653, 3.56699116, 3.06269411],\n", 879 | " [ 2.87343592, 2.42140926, 2.90308584, 2.94035599],\n", 880 | " ..., \n", 881 | " [ 3.09170575, 2.83684115, 3.03489958, 2.87395914],\n", 882 | " [ 3.64564372, 2.97728388, 2.99041326, 3.1037937 ],\n", 883 | " [ 3.24632579, 3.38332561, 2.83951565, 2.95078544]])" 884 | ] 885 | }, 886 | "execution_count": 36, 887 | "metadata": {}, 888 | "output_type": "execute_result" 889 | } 890 | ], 891 | "source": [ 892 | "np.load('_x.npy')" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 37, 898 | "metadata": { 899 | "collapsed": true, 900 | "deletable": true, 901 | "editable": true 902 | }, 903 | "outputs": [], 904 | "source": [ 905 | "np.savez('_x_x2.npz', _x=_x, _x2=_x2) # multiple arrays" 906 | ] 907 | }, 908 | { 909 | "cell_type": "code", 910 | "execution_count": 38, 911 | "metadata": { 912 | "collapsed": true, 913 | "deletable": true, 914 | "editable": true 915 | }, 916 | "outputs": [], 917 | "source": [ 918 | "_x, _x2 = np.load('_x_x2.npz')['_x'], np.load('_x_x2.npz')['_x2']" 919 | ] 920 | }, 921 | { 922 | "cell_type": "code", 923 | "execution_count": 39, 924 | "metadata": { 925 | "collapsed": false, 926 | "deletable": true, 927 | "editable": true 928 | }, 929 | "outputs": [ 930 | { 931 | "data": { 932 | "text/plain": [ 933 | "array([[ 2.79778296, 3.31195815, 2.9572616 , 3.41099159],\n", 934 | " [ 3.06707386, 2.75770653, 3.56699116, 3.06269411],\n", 935 | " [ 2.87343592, 2.42140926, 2.90308584, 2.94035599],\n", 936 | " ..., \n", 937 | " [ 3.09170575, 2.83684115, 3.03489958, 2.87395914],\n", 938 | " [ 3.64564372, 2.97728388, 2.99041326, 3.1037937 ],\n", 939 | " [ 3.24632579, 3.38332561, 2.83951565, 2.95078544]])" 940 | ] 941 | }, 942 | "execution_count": 39, 943 | "metadata": {}, 944 | "output_type": "execute_result" 945 | } 946 | ], 947 | "source": [ 948 | "_x" 949 | ] 950 | }, 951 | { 952 | "cell_type": "code", 953 | "execution_count": 40, 954 | "metadata": { 955 | "collapsed": false, 956 | "deletable": true, 957 | "editable": true 958 | }, 959 | "outputs": [ 960 | { 961 | "data": { 962 | "text/plain": [ 963 | "array([[ 9.03397168, 6.85251358, 3.19748006, 9.27063369],\n", 964 | " [ 6.27354201, 7.78365266, 6.22690345, 4.15928007],\n", 965 | " [ 7.96648371, 6.904826 , 8.51664221, 7.45611329]])" 966 | ] 967 | }, 968 | "execution_count": 40, 969 | "metadata": {}, 970 | "output_type": "execute_result" 971 | } 972 | ], 973 | "source": [ 974 | "_x2" 975 | ] 976 | }, 977 | { 978 | "cell_type": "code", 979 | "execution_count": null, 980 | "metadata": { 981 | "collapsed": true 982 | }, 983 | "outputs": [], 984 | "source": [] 985 | } 986 | ], 987 | "metadata": { 988 | "anaconda-cloud": {}, 989 | "kernelspec": { 990 | "display_name": "Python [conda root]", 991 | "language": "python", 992 | "name": "conda-root-py" 993 | }, 994 | "language_info": { 995 | "codemirror_mode": { 996 | "name": "ipython", 997 | "version": 3 998 | }, 999 | "file_extension": ".py", 1000 | "mimetype": "text/x-python", 1001 | "name": "python", 1002 | "nbconvert_exporter": "python", 1003 | "pygments_lexer": "ipython3", 1004 | "version": "3.5.2" 1005 | } 1006 | }, 1007 | "nbformat": 4, 1008 | "nbformat_minor": 2 1009 | } 1010 | -------------------------------------------------------------------------------- /Demo2. Math.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true, 8 | "deletable": true, 9 | "editable": true 10 | }, 11 | "outputs": [], 12 | "source": [ 13 | "import numpy as np\n", 14 | "import tensorflow as tf\n", 15 | "sess = tf.InteractiveSession()" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "## Arithmetic operations" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 2, 28 | "metadata": { 29 | "collapsed": true 30 | }, 31 | "outputs": [], 32 | "source": [ 33 | "_x = np.array([1, 2, 3], np.float32)\n", 34 | "_y = np.array([4, 5, 6], np.float32)" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 3, 40 | "metadata": { 41 | "collapsed": false 42 | }, 43 | "outputs": [ 44 | { 45 | "data": { 46 | "text/plain": [ 47 | "array([ 5., 7., 9.], dtype=float32)" 48 | ] 49 | }, 50 | "execution_count": 3, 51 | "metadata": {}, 52 | "output_type": "execute_result" 53 | } 54 | ], 55 | "source": [ 56 | "_x + _y" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 4, 62 | "metadata": { 63 | "collapsed": false 64 | }, 65 | "outputs": [ 66 | { 67 | "data": { 68 | "text/plain": [ 69 | "array([-3., -3., -3.], dtype=float32)" 70 | ] 71 | }, 72 | "execution_count": 4, 73 | "metadata": {}, 74 | "output_type": "execute_result" 75 | } 76 | ], 77 | "source": [ 78 | "_x - _y" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 5, 84 | "metadata": { 85 | "collapsed": false 86 | }, 87 | "outputs": [ 88 | { 89 | "data": { 90 | "text/plain": [ 91 | "array([ 4., 10., 18.], dtype=float32)" 92 | ] 93 | }, 94 | "execution_count": 5, 95 | "metadata": {}, 96 | "output_type": "execute_result" 97 | } 98 | ], 99 | "source": [ 100 | "_x * _y" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 6, 106 | "metadata": { 107 | "collapsed": false 108 | }, 109 | "outputs": [ 110 | { 111 | "data": { 112 | "text/plain": [ 113 | "array([ 0.25 , 0.40000001, 0.5 ], dtype=float32)" 114 | ] 115 | }, 116 | "execution_count": 6, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | } 120 | ], 121 | "source": [ 122 | "_x / _y" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 7, 128 | "metadata": { 129 | "collapsed": false 130 | }, 131 | "outputs": [ 132 | { 133 | "data": { 134 | "text/plain": [ 135 | "array([ 5., 7., 9.], dtype=float32)" 136 | ] 137 | }, 138 | "execution_count": 7, 139 | "metadata": {}, 140 | "output_type": "execute_result" 141 | } 142 | ], 143 | "source": [ 144 | "np.add(_x, _y)" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 8, 150 | "metadata": { 151 | "collapsed": false 152 | }, 153 | "outputs": [ 154 | { 155 | "data": { 156 | "text/plain": [ 157 | "array([-3., -3., -3.], dtype=float32)" 158 | ] 159 | }, 160 | "execution_count": 8, 161 | "metadata": {}, 162 | "output_type": "execute_result" 163 | } 164 | ], 165 | "source": [ 166 | "np.subtract(_x, _y)" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 9, 172 | "metadata": { 173 | "collapsed": false 174 | }, 175 | "outputs": [ 176 | { 177 | "data": { 178 | "text/plain": [ 179 | "array([ 4., 10., 18.], dtype=float32)" 180 | ] 181 | }, 182 | "execution_count": 9, 183 | "metadata": {}, 184 | "output_type": "execute_result" 185 | } 186 | ], 187 | "source": [ 188 | "np.multiply(_x, _y)" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 10, 194 | "metadata": { 195 | "collapsed": false 196 | }, 197 | "outputs": [ 198 | { 199 | "data": { 200 | "text/plain": [ 201 | "array([ 0.25 , 0.40000001, 0.5 ], dtype=float32)" 202 | ] 203 | }, 204 | "execution_count": 10, 205 | "metadata": {}, 206 | "output_type": "execute_result" 207 | } 208 | ], 209 | "source": [ 210 | "np.divide(_x, _y)" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 11, 216 | "metadata": { 217 | "collapsed": true 218 | }, 219 | "outputs": [], 220 | "source": [ 221 | "x = tf.convert_to_tensor(_x)\n", 222 | "y = tf.convert_to_tensor(_y)" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": 12, 228 | "metadata": { 229 | "collapsed": false 230 | }, 231 | "outputs": [ 232 | { 233 | "name": "stdout", 234 | "output_type": "stream", 235 | "text": [ 236 | "Tensor(\"add:0\", shape=(3,), dtype=float32) Tensor(\"sub:0\", shape=(3,), dtype=float32) Tensor(\"mul:0\", shape=(3,), dtype=float32) Tensor(\"truediv:0\", shape=(3,), dtype=float32)\n" 237 | ] 238 | } 239 | ], 240 | "source": [ 241 | "print(x + y, x - y, x*y, x/y)" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": {}, 247 | "source": [ 248 | "## Sums, products, mean, max, min ...\n", 249 | "- np.sum(arry, axis) == tf.reduce_sum(tensor, axis)\n", 250 | "- np.prod(arry, axis) == tf.reduce_prod(tensor, axis)\n", 251 | "- np.mean(arry, axis) == tf.reduce_mean(tensor, axis)\n", 252 | "- np.max(arry, axis) == tf.reduce_max(tensor, axis)\n", 253 | "- np.min(arry, axis) == tf.reduce_min(tensor, axis)\n", 254 | "- np.argmax(arry, axis) == tf.argmax(tensor, axis)\n", 255 | "- np.argmin(arry, axis) == tf.argmin(tensor, axis)\n", 256 | "\n", 257 | "\n" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 13, 263 | "metadata": { 264 | "collapsed": false 265 | }, 266 | "outputs": [], 267 | "source": [ 268 | "_x = np.arange(1, 11).reshape((2, 5))" 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": 14, 274 | "metadata": { 275 | "collapsed": false 276 | }, 277 | "outputs": [ 278 | { 279 | "data": { 280 | "text/plain": [ 281 | "array([[ 1, 2, 3, 4, 5],\n", 282 | " [ 6, 7, 8, 9, 10]])" 283 | ] 284 | }, 285 | "execution_count": 14, 286 | "metadata": {}, 287 | "output_type": "execute_result" 288 | } 289 | ], 290 | "source": [ 291 | "_x" 292 | ] 293 | }, 294 | { 295 | "cell_type": "code", 296 | "execution_count": 15, 297 | "metadata": { 298 | "collapsed": false 299 | }, 300 | "outputs": [ 301 | { 302 | "data": { 303 | "text/plain": [ 304 | "array([15, 40])" 305 | ] 306 | }, 307 | "execution_count": 15, 308 | "metadata": {}, 309 | "output_type": "execute_result" 310 | } 311 | ], 312 | "source": [ 313 | "np.sum(_x, axis=1)" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 16, 319 | "metadata": { 320 | "collapsed": false 321 | }, 322 | "outputs": [ 323 | { 324 | "data": { 325 | "text/plain": [ 326 | "array([ 6, 14, 24, 36, 50])" 327 | ] 328 | }, 329 | "execution_count": 16, 330 | "metadata": {}, 331 | "output_type": "execute_result" 332 | } 333 | ], 334 | "source": [ 335 | "np.prod(_x, axis=0)" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": 17, 341 | "metadata": { 342 | "collapsed": false 343 | }, 344 | "outputs": [ 345 | { 346 | "data": { 347 | "text/plain": [ 348 | "array([ 6, 7, 8, 9, 10])" 349 | ] 350 | }, 351 | "execution_count": 17, 352 | "metadata": {}, 353 | "output_type": "execute_result" 354 | } 355 | ], 356 | "source": [ 357 | "np.max(_x, axis=0)" 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "execution_count": 18, 363 | "metadata": { 364 | "collapsed": false 365 | }, 366 | "outputs": [ 367 | { 368 | "data": { 369 | "text/plain": [ 370 | "1" 371 | ] 372 | }, 373 | "execution_count": 18, 374 | "metadata": {}, 375 | "output_type": "execute_result" 376 | } 377 | ], 378 | "source": [ 379 | "np.min(_x)" 380 | ] 381 | }, 382 | { 383 | "cell_type": "code", 384 | "execution_count": 19, 385 | "metadata": { 386 | "collapsed": false 387 | }, 388 | "outputs": [ 389 | { 390 | "data": { 391 | "text/plain": [ 392 | "9" 393 | ] 394 | }, 395 | "execution_count": 19, 396 | "metadata": {}, 397 | "output_type": "execute_result" 398 | } 399 | ], 400 | "source": [ 401 | "np.argmax(_x)" 402 | ] 403 | }, 404 | { 405 | "cell_type": "code", 406 | "execution_count": 20, 407 | "metadata": { 408 | "collapsed": false 409 | }, 410 | "outputs": [ 411 | { 412 | "data": { 413 | "text/plain": [ 414 | "array([4, 4], dtype=int64)" 415 | ] 416 | }, 417 | "execution_count": 20, 418 | "metadata": {}, 419 | "output_type": "execute_result" 420 | } 421 | ], 422 | "source": [ 423 | "np.argmax(_x, axis=1)" 424 | ] 425 | }, 426 | { 427 | "cell_type": "code", 428 | "execution_count": 21, 429 | "metadata": { 430 | "collapsed": false 431 | }, 432 | "outputs": [ 433 | { 434 | "data": { 435 | "text/plain": [ 436 | "array([ 3., 8.])" 437 | ] 438 | }, 439 | "execution_count": 21, 440 | "metadata": {}, 441 | "output_type": "execute_result" 442 | } 443 | ], 444 | "source": [ 445 | "np.mean(_x, axis=1)" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": 22, 451 | "metadata": { 452 | "collapsed": true 453 | }, 454 | "outputs": [], 455 | "source": [ 456 | "x = tf.constant(_x)" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "execution_count": 23, 462 | "metadata": { 463 | "collapsed": false 464 | }, 465 | "outputs": [ 466 | { 467 | "data": { 468 | "text/plain": [ 469 | "array([[ 1, 2, 3, 4, 5],\n", 470 | " [ 6, 7, 8, 9, 10]])" 471 | ] 472 | }, 473 | "execution_count": 23, 474 | "metadata": {}, 475 | "output_type": "execute_result" 476 | } 477 | ], 478 | "source": [ 479 | "x.eval()" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 24, 485 | "metadata": { 486 | "collapsed": false 487 | }, 488 | "outputs": [ 489 | { 490 | "data": { 491 | "text/plain": [ 492 | "55" 493 | ] 494 | }, 495 | "execution_count": 24, 496 | "metadata": {}, 497 | "output_type": "execute_result" 498 | } 499 | ], 500 | "source": [ 501 | "tf.reduce_sum(x).eval()" 502 | ] 503 | }, 504 | { 505 | "cell_type": "code", 506 | "execution_count": 25, 507 | "metadata": { 508 | "collapsed": false 509 | }, 510 | "outputs": [ 511 | { 512 | "data": { 513 | "text/plain": [ 514 | "array([15, 40])" 515 | ] 516 | }, 517 | "execution_count": 25, 518 | "metadata": {}, 519 | "output_type": "execute_result" 520 | } 521 | ], 522 | "source": [ 523 | "tf.reduce_sum(x, 1).eval()" 524 | ] 525 | }, 526 | { 527 | "cell_type": "code", 528 | "execution_count": 26, 529 | "metadata": { 530 | "collapsed": false 531 | }, 532 | "outputs": [ 533 | { 534 | "data": { 535 | "text/plain": [ 536 | "array([ 120, 30240])" 537 | ] 538 | }, 539 | "execution_count": 26, 540 | "metadata": {}, 541 | "output_type": "execute_result" 542 | } 543 | ], 544 | "source": [ 545 | "tf.reduce_prod(x, 1).eval()" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 27, 551 | "metadata": { 552 | "collapsed": false 553 | }, 554 | "outputs": [ 555 | { 556 | "data": { 557 | "text/plain": [ 558 | "array([ 6, 7, 8, 9, 10])" 559 | ] 560 | }, 561 | "execution_count": 27, 562 | "metadata": {}, 563 | "output_type": "execute_result" 564 | } 565 | ], 566 | "source": [ 567 | "tf.reduce_max(x, 0).eval()" 568 | ] 569 | }, 570 | { 571 | "cell_type": "code", 572 | "execution_count": 28, 573 | "metadata": { 574 | "collapsed": false 575 | }, 576 | "outputs": [ 577 | { 578 | "data": { 579 | "text/plain": [ 580 | "array([1, 6])" 581 | ] 582 | }, 583 | "execution_count": 28, 584 | "metadata": {}, 585 | "output_type": "execute_result" 586 | } 587 | ], 588 | "source": [ 589 | "tf.reduce_min(x, 1).eval()" 590 | ] 591 | }, 592 | { 593 | "cell_type": "code", 594 | "execution_count": 29, 595 | "metadata": { 596 | "collapsed": false 597 | }, 598 | "outputs": [ 599 | { 600 | "data": { 601 | "text/plain": [ 602 | "array([0, 0], dtype=int64)" 603 | ] 604 | }, 605 | "execution_count": 29, 606 | "metadata": {}, 607 | "output_type": "execute_result" 608 | } 609 | ], 610 | "source": [ 611 | "tf.argmin(x, 1).eval()" 612 | ] 613 | }, 614 | { 615 | "cell_type": "code", 616 | "execution_count": 30, 617 | "metadata": { 618 | "collapsed": false 619 | }, 620 | "outputs": [ 621 | { 622 | "data": { 623 | "text/plain": [ 624 | "array([3, 4, 5, 6, 7])" 625 | ] 626 | }, 627 | "execution_count": 30, 628 | "metadata": {}, 629 | "output_type": "execute_result" 630 | } 631 | ], 632 | "source": [ 633 | "tf.reduce_mean(x, 0).eval()" 634 | ] 635 | }, 636 | { 637 | "cell_type": "markdown", 638 | "metadata": {}, 639 | "source": [ 640 | "## Linear algebra" 641 | ] 642 | }, 643 | { 644 | "cell_type": "markdown", 645 | "metadata": {}, 646 | "source": [ 647 | "- np.dot(1d, 1d) == tf.reduce_sum(1d * 1d) \n", 648 | "- np.dot(2d, 2d) == tf.matmul(2d, 2d)" 649 | ] 650 | }, 651 | { 652 | "cell_type": "code", 653 | "execution_count": 31, 654 | "metadata": { 655 | "collapsed": true 656 | }, 657 | "outputs": [], 658 | "source": [ 659 | "_v1 = np.array([1, 2], np.float32)\n", 660 | "_v2 = np.array([3, 4], np.float32)\n", 661 | "_vv1 = np.array([[1, 2], [1, 2]], np.float32)\n", 662 | "_vv2 = np.array([[3, 4], [3, 4]], np.float32)" 663 | ] 664 | }, 665 | { 666 | "cell_type": "code", 667 | "execution_count": 32, 668 | "metadata": { 669 | "collapsed": false 670 | }, 671 | "outputs": [ 672 | { 673 | "data": { 674 | "text/plain": [ 675 | "11.0" 676 | ] 677 | }, 678 | "execution_count": 32, 679 | "metadata": {}, 680 | "output_type": "execute_result" 681 | } 682 | ], 683 | "source": [ 684 | "np.dot(_v1, _v2)" 685 | ] 686 | }, 687 | { 688 | "cell_type": "code", 689 | "execution_count": 33, 690 | "metadata": { 691 | "collapsed": false 692 | }, 693 | "outputs": [ 694 | { 695 | "data": { 696 | "text/plain": [ 697 | "11.0" 698 | ] 699 | }, 700 | "execution_count": 33, 701 | "metadata": {}, 702 | "output_type": "execute_result" 703 | } 704 | ], 705 | "source": [ 706 | "np.dot(_v2, _v1)" 707 | ] 708 | }, 709 | { 710 | "cell_type": "code", 711 | "execution_count": 34, 712 | "metadata": { 713 | "collapsed": false 714 | }, 715 | "outputs": [ 716 | { 717 | "data": { 718 | "text/plain": [ 719 | "array([[ 9., 12.],\n", 720 | " [ 9., 12.]], dtype=float32)" 721 | ] 722 | }, 723 | "execution_count": 34, 724 | "metadata": {}, 725 | "output_type": "execute_result" 726 | } 727 | ], 728 | "source": [ 729 | "np.dot(_vv1, _vv2)" 730 | ] 731 | }, 732 | { 733 | "cell_type": "code", 734 | "execution_count": 35, 735 | "metadata": { 736 | "collapsed": false 737 | }, 738 | "outputs": [], 739 | "source": [ 740 | "v1 = tf.convert_to_tensor(_v1)\n", 741 | "v2 = tf.convert_to_tensor(_v2)\n", 742 | "vv1 = tf.convert_to_tensor(_vv1)\n", 743 | "vv2 = tf.convert_to_tensor(_vv2)" 744 | ] 745 | }, 746 | { 747 | "cell_type": "code", 748 | "execution_count": 36, 749 | "metadata": { 750 | "collapsed": false 751 | }, 752 | "outputs": [ 753 | { 754 | "data": { 755 | "text/plain": [ 756 | "11.0" 757 | ] 758 | }, 759 | "execution_count": 36, 760 | "metadata": {}, 761 | "output_type": "execute_result" 762 | } 763 | ], 764 | "source": [ 765 | "tf.reduce_sum(v1 * v2).eval()" 766 | ] 767 | }, 768 | { 769 | "cell_type": "code", 770 | "execution_count": 37, 771 | "metadata": { 772 | "collapsed": false 773 | }, 774 | "outputs": [ 775 | { 776 | "data": { 777 | "text/plain": [ 778 | "array([[ 9., 12.],\n", 779 | " [ 9., 12.]], dtype=float32)" 780 | ] 781 | }, 782 | "execution_count": 37, 783 | "metadata": {}, 784 | "output_type": "execute_result" 785 | } 786 | ], 787 | "source": [ 788 | "tf.matmul(vv1, vv2).eval()" 789 | ] 790 | }, 791 | { 792 | "cell_type": "markdown", 793 | "metadata": {}, 794 | "source": [ 795 | "## Reshaping" 796 | ] 797 | }, 798 | { 799 | "cell_type": "markdown", 800 | "metadata": {}, 801 | "source": [ 802 | "- reshape(obj, newshape) OR np.ndarray.reshape(newshape)\n", 803 | "- expand_dims(obj, axis)\n", 804 | "- transpose(obj, axes)\n", 805 | "- squeeze(obj, axes)" 806 | ] 807 | }, 808 | { 809 | "cell_type": "code", 810 | "execution_count": 38, 811 | "metadata": { 812 | "collapsed": false 813 | }, 814 | "outputs": [], 815 | "source": [ 816 | "_x = np.arange(1, 9, dtype=np.int32)" 817 | ] 818 | }, 819 | { 820 | "cell_type": "code", 821 | "execution_count": 39, 822 | "metadata": { 823 | "collapsed": false 824 | }, 825 | "outputs": [ 826 | { 827 | "data": { 828 | "text/plain": [ 829 | "(8,)" 830 | ] 831 | }, 832 | "execution_count": 39, 833 | "metadata": {}, 834 | "output_type": "execute_result" 835 | } 836 | ], 837 | "source": [ 838 | "_x.shape" 839 | ] 840 | }, 841 | { 842 | "cell_type": "code", 843 | "execution_count": 40, 844 | "metadata": { 845 | "collapsed": false 846 | }, 847 | "outputs": [], 848 | "source": [ 849 | "_x2 = np.expand_dims(_x, -1)" 850 | ] 851 | }, 852 | { 853 | "cell_type": "code", 854 | "execution_count": 41, 855 | "metadata": { 856 | "collapsed": false 857 | }, 858 | "outputs": [ 859 | { 860 | "data": { 861 | "text/plain": [ 862 | "(8, 1)" 863 | ] 864 | }, 865 | "execution_count": 41, 866 | "metadata": {}, 867 | "output_type": "execute_result" 868 | } 869 | ], 870 | "source": [ 871 | "_x2.shape" 872 | ] 873 | }, 874 | { 875 | "cell_type": "code", 876 | "execution_count": 42, 877 | "metadata": { 878 | "collapsed": false 879 | }, 880 | "outputs": [ 881 | { 882 | "data": { 883 | "text/plain": [ 884 | "array([[1],\n", 885 | " [2],\n", 886 | " [3],\n", 887 | " [4],\n", 888 | " [5],\n", 889 | " [6],\n", 890 | " [7],\n", 891 | " [8]])" 892 | ] 893 | }, 894 | "execution_count": 42, 895 | "metadata": {}, 896 | "output_type": "execute_result" 897 | } 898 | ], 899 | "source": [ 900 | "_x2" 901 | ] 902 | }, 903 | { 904 | "cell_type": "code", 905 | "execution_count": 43, 906 | "metadata": { 907 | "collapsed": true 908 | }, 909 | "outputs": [], 910 | "source": [ 911 | "_x3 = np.reshape(_x, [4,2])" 912 | ] 913 | }, 914 | { 915 | "cell_type": "code", 916 | "execution_count": 44, 917 | "metadata": { 918 | "collapsed": false 919 | }, 920 | "outputs": [ 921 | { 922 | "data": { 923 | "text/plain": [ 924 | "array([[1, 2],\n", 925 | " [3, 4],\n", 926 | " [5, 6],\n", 927 | " [7, 8]])" 928 | ] 929 | }, 930 | "execution_count": 44, 931 | "metadata": {}, 932 | "output_type": "execute_result" 933 | } 934 | ], 935 | "source": [ 936 | "_x3" 937 | ] 938 | }, 939 | { 940 | "cell_type": "code", 941 | "execution_count": 45, 942 | "metadata": { 943 | "collapsed": false 944 | }, 945 | "outputs": [ 946 | { 947 | "data": { 948 | "text/plain": [ 949 | "(4, 2)" 950 | ] 951 | }, 952 | "execution_count": 45, 953 | "metadata": {}, 954 | "output_type": "execute_result" 955 | } 956 | ], 957 | "source": [ 958 | "_x3.shape" 959 | ] 960 | }, 961 | { 962 | "cell_type": "code", 963 | "execution_count": 46, 964 | "metadata": { 965 | "collapsed": true 966 | }, 967 | "outputs": [], 968 | "source": [ 969 | "_x4 = np.transpose(_x3, [1, 0])" 970 | ] 971 | }, 972 | { 973 | "cell_type": "code", 974 | "execution_count": 47, 975 | "metadata": { 976 | "collapsed": false 977 | }, 978 | "outputs": [ 979 | { 980 | "data": { 981 | "text/plain": [ 982 | "(8, 1)" 983 | ] 984 | }, 985 | "execution_count": 47, 986 | "metadata": {}, 987 | "output_type": "execute_result" 988 | } 989 | ], 990 | "source": [ 991 | "_x2.shape" 992 | ] 993 | }, 994 | { 995 | "cell_type": "code", 996 | "execution_count": 48, 997 | "metadata": { 998 | "collapsed": false 999 | }, 1000 | "outputs": [ 1001 | { 1002 | "data": { 1003 | "text/plain": [ 1004 | "(8,)" 1005 | ] 1006 | }, 1007 | "execution_count": 48, 1008 | "metadata": {}, 1009 | "output_type": "execute_result" 1010 | } 1011 | ], 1012 | "source": [ 1013 | "_x5 = np.squeeze(_x2)\n", 1014 | "_x5.shape" 1015 | ] 1016 | }, 1017 | { 1018 | "cell_type": "code", 1019 | "execution_count": 49, 1020 | "metadata": { 1021 | "collapsed": false 1022 | }, 1023 | "outputs": [ 1024 | { 1025 | "data": { 1026 | "text/plain": [ 1027 | "array([1, 2, 3, 4, 5, 6, 7, 8])" 1028 | ] 1029 | }, 1030 | "execution_count": 49, 1031 | "metadata": {}, 1032 | "output_type": "execute_result" 1033 | } 1034 | ], 1035 | "source": [ 1036 | "x = tf.convert_to_tensor(_x)\n", 1037 | "x.eval()" 1038 | ] 1039 | }, 1040 | { 1041 | "cell_type": "code", 1042 | "execution_count": 50, 1043 | "metadata": { 1044 | "collapsed": false 1045 | }, 1046 | "outputs": [ 1047 | { 1048 | "data": { 1049 | "text/plain": [ 1050 | "" 1051 | ] 1052 | }, 1053 | "execution_count": 50, 1054 | "metadata": {}, 1055 | "output_type": "execute_result" 1056 | } 1057 | ], 1058 | "source": [ 1059 | "X = tf.expand_dims(x, -1)\n", 1060 | "X" 1061 | ] 1062 | }, 1063 | { 1064 | "cell_type": "code", 1065 | "execution_count": 51, 1066 | "metadata": { 1067 | "collapsed": false 1068 | }, 1069 | "outputs": [ 1070 | { 1071 | "data": { 1072 | "text/plain": [ 1073 | "" 1074 | ] 1075 | }, 1076 | "execution_count": 51, 1077 | "metadata": {}, 1078 | "output_type": "execute_result" 1079 | } 1080 | ], 1081 | "source": [ 1082 | "x2 = tf.reshape(x, [4, 2])\n", 1083 | "x2" 1084 | ] 1085 | }, 1086 | { 1087 | "cell_type": "code", 1088 | "execution_count": 52, 1089 | "metadata": { 1090 | "collapsed": false 1091 | }, 1092 | "outputs": [ 1093 | { 1094 | "data": { 1095 | "text/plain": [ 1096 | "array([[1, 2, 3, 4, 5, 6, 7, 8]])" 1097 | ] 1098 | }, 1099 | "execution_count": 52, 1100 | "metadata": {}, 1101 | "output_type": "execute_result" 1102 | } 1103 | ], 1104 | "source": [ 1105 | "x3 = tf.transpose(X, [1, 0])\n", 1106 | "x3.eval()" 1107 | ] 1108 | }, 1109 | { 1110 | "cell_type": "code", 1111 | "execution_count": 53, 1112 | "metadata": { 1113 | "collapsed": false 1114 | }, 1115 | "outputs": [ 1116 | { 1117 | "data": { 1118 | "text/plain": [ 1119 | "" 1120 | ] 1121 | }, 1122 | "execution_count": 53, 1123 | "metadata": {}, 1124 | "output_type": "execute_result" 1125 | } 1126 | ], 1127 | "source": [ 1128 | "x4 = tf.squeeze(x3)\n", 1129 | "x4" 1130 | ] 1131 | }, 1132 | { 1133 | "cell_type": "code", 1134 | "execution_count": null, 1135 | "metadata": { 1136 | "collapsed": true 1137 | }, 1138 | "outputs": [], 1139 | "source": [] 1140 | } 1141 | ], 1142 | "metadata": { 1143 | "anaconda-cloud": {}, 1144 | "kernelspec": { 1145 | "display_name": "Python [conda root]", 1146 | "language": "python", 1147 | "name": "conda-root-py" 1148 | }, 1149 | "language_info": { 1150 | "codemirror_mode": { 1151 | "name": "ipython", 1152 | "version": 3 1153 | }, 1154 | "file_extension": ".py", 1155 | "mimetype": "text/x-python", 1156 | "name": "python", 1157 | "nbconvert_exporter": "python", 1158 | "pygments_lexer": "ipython3", 1159 | "version": "3.5.2" 1160 | } 1161 | }, 1162 | "nbformat": 4, 1163 | "nbformat_minor": 2 1164 | } 1165 | -------------------------------------------------------------------------------- /Demo3. Simple Linear Regression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import tensorflow as tf\n", 12 | "import numpy as np\n", 13 | "import matplotlib.pyplot as plt\n", 14 | "%matplotlib inline" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": { 21 | "collapsed": true 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "# For reproducibility\n", 26 | "np.random.seed(1)" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "Let's design overall scheme." 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 3, 39 | "metadata": { 40 | "collapsed": true 41 | }, 42 | "outputs": [], 43 | "source": [ 44 | "# inputs\n", 45 | "x = np.linspace(0, 1, 100, dtype=np.float32)\n", 46 | "\n", 47 | "# ground truth\n", 48 | "slopes = np.random.normal(1, 0.5, 100).astype(np.float32)\n", 49 | "intercept = 2.\n", 50 | "\n", 51 | "# outputs\n", 52 | "y = x * slopes + intercept" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": { 59 | "collapsed": false 60 | }, 61 | "outputs": [ 62 | { 63 | "data": { 64 | "text/plain": [ 65 | "array([ 1.81217265, 0.69412178, 0.73591411, 0.4635157 , 1.43270385,\n", 66 | " -0.15076935, 1.87240589, 0.61939657, 1.15951955, 0.87531483,\n", 67 | " 1.73105395, -0.03007036, 0.83879137, 0.80797285, 1.56688476,\n", 68 | " 0.45005438, 0.91378587, 0.5610708 , 1.02110684, 1.29140759,\n", 69 | " 0.4496904 , 1.57236183, 1.45079541, 1.25124717, 1.45042801,\n", 70 | " 0.65813607, 0.93855488, 0.53211528, 0.86605597, 1.26517773,\n", 71 | " 0.65416962, 0.80162323, 0.65641367, 0.57739717, 0.66437691,\n", 72 | " 0.99366772, 0.44134483, 1.11720788, 1.8299011 , 1.37102211,\n", 73 | " 0.90408224, 0.55618554, 0.62642086, 1.84622729, 1.02540386,\n", 74 | " 0.68150216, 1.09545779, 2.05012751, 1.06007946, 1.3086015 ,\n", 75 | " 1.15008521, 0.82387507, 0.42874089, 0.82532865, 0.89555287,\n", 76 | " 1.2933116 , 1.41949165, 1.46555102, 1.14279366, 1.44257057,\n", 77 | " 0.62280101, 1.62643409, 1.25646496, 0.85095358, 1.24425912,\n", 78 | " 0.96221417, 1.56581473, 1.75990844, 2.09278774, 0.30175182,\n", 79 | " 0.2779431 , 0.74776709, 1.08001852, 1.43808448, 1.15781748,\n", 80 | " -0.01110061, 0.84689802, 1.41398728, 1.11504734, 1.38100564,\n", 81 | " 0.88883591, 0.89962095, 1.09328067, 1.20502579, 1.09914982,\n", 82 | " 1.05950427, 0.66466886, 1.18878186, 1.06091058, 1.56474197,\n", 83 | " 1.59945893, 1.09257817, 0.81235754, 0.6806348 , 1.21174717,\n", 84 | " 1.03867006, 0.82807314, 1.02179837, 0.68999958, 1.34901607], dtype=float32)" 85 | ] 86 | }, 87 | "execution_count": 4, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | } 91 | ], 92 | "source": [ 93 | "slopes" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 5, 99 | "metadata": { 100 | "collapsed": false 101 | }, 102 | "outputs": [ 103 | { 104 | "data": { 105 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgsAAAFdCAYAAACNYC65AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xl8VPW9//HXN6MlghVDUeqGCAQE/YkG6oZsNRgI1/Va\nS8AoWnEHxdblXhVBb3Grxb2KVq+SS0pvtdqWkCAqIFixhgq3FTMhgLRFqxDEyiKQfH9/nElIJpnJ\nzOTMnDOT9/PxmIfmzJlzvnNI5nzmu3w+xlqLiIiISCRZXjdARERE/E3BgoiIiESlYEFERESiUrAg\nIiIiUSlYEBERkagULIiIiEhUChZEREQkqgO8bkBrjDHfAQqAjcBub1sjIiKSVrKBXkCFtXarGwf0\nZbCAEyj8j9eNEBERSWMTgXluHMivwcJGgJKSEgYMGOBxU7w1bdo0Zs+e7XUzfEHXwqHr4NB12E/X\nwqHr4Fi7di2XXnophO6lbvBrsLAbYMCAAeTl5XndFk917dq1w1+DBroWDl0Hh67DfroWDl2HFlwb\nxtcERxEREYlKwYKIiIhEpWBBREREolKw4HNFRUVeN8E3dC0cug4OXYf9dC0cug7JY6y1XrehBWNM\nHlBZWVmpySoiIiJxWLVqFYMHDwYYbK1d5cYx/boaQkTEFzZt2sSWLVu8boZIo+7du9OzZ8+UnlPB\ngohIBJs2bWLAgAHs3LnT66aINOrcuTNr165NacCgYEFEJIItW7awc+dOJYgT32hIuLRlyxYFCyIi\nfqIEcdLRxbUawhhzrTFmtTFme+jxrjFmTJT9Rxhj6sMedcaYw9vfdBEREUmFeHsW/gbcDlQDBpgE\nvG6MOdlauzbCayzQD/hX4wZrP4+/qSIiIuKFuIIFa+2CsE13GWOuA04HIgULAF9Ya7+Kt3EiIiLi\nvYSTMhljsowx44HOwB+j7Qp8aIzZbIxZZIw5M9FzioiISOrFHSwYY040xvwL+AZ4GrjQWvtxhN0/\nBa4B/h24CGcYY4kx5uQE2ysiItKmrKws7r33Xq+bEVGvXr0477zzvG5GzBLpWfgYGAScCvwCeNkY\nc3xrO1prg9ba56y1f7bWvmet/RHwLjAt4RaLiIi44NNPP2XmzJmsWbMmKcdfu3YtM2fOZNOmTS2e\nM8Yk5ZzJEvfSSWvtPmB96Mc/G2NOBW4CrovxEO8DQ2PZcdq0aXTt2rXZtqKiIuX/FhGRdtu8eTMz\nZ87kuOOO46STTnL9+B999BEzZ85k1KhRScuJUFpaSmlpabNt27dvd/08buRZyAI6xbH/yTjDE22a\nPXu21jaLiPiQtZY9e/bQqVM8H//+Em9tpF27dnHQQQfFdfxk9yC09gW6SW0I18SbZ2GWMWaYMebY\n0NyF+4ERQEno+fuNMS812f8mY8x5xpg+xpgTjDGPAqOAJ918EyIikpglS5YwZMgQDjroIHJzc5kz\nZw4zZswgK6v57SErK4upU6cyb948TjzxRLKzs6moqABg586d/PjHP6Znz55kZ2dz/PHH88gjjzR7\n/SeffEJWVhYvv/xyizaEzy9oOH9NTQ2TJk0iJyeHQw89lCuvvJLdu3c3e+2ePXuYNm0ahx9+OIcc\ncggXXHAB//jHP9p830uXLuXUU0/FGMOkSZPIysoiEAg0tm/kyJGcdNJJrFq1iuHDh9OlSxfuvPPO\nVtvboFevXlx55ZUAvPTSS1xyySWNx2o4/rJly5q9ZsWKFZx22mkcdNBB9OnTh7lz57bZdi/E27Nw\nOPAScASwHVgDnGOtfSv0/HeBY5rs/y3gEeBIYGdo/7Ottc2vloiIpNyf//xnxo4dy5FHHsl9993H\nvn37uO++++jevXur34jffPNNfv3rX3PjjTfSvXt3evXqBcC5557L0qVLueqqqxg0aBAVFRXceuut\nbN68uUXQEIuGc19yySX07t2bBx54gFWrVvH888/To0cP7r///sZ9f/SjHzFv3jwmTpzIGWecwVtv\nvcW4cePa/EY/YMAA7r33XqZPn84111zDsGHDADjzzDMb27BlyxYKCwsZP348l112GT169Iip3QDD\nhw9n6tSpPPHEE9x1110cf/zxjedtUF1dzQ9+8AN+9KMfMWnSJF544QWuuOIKhgwZ4r/04tZa3z2A\nPMBWVlZaERGvVFZW2kz+LDr33HPtwQcfbD/77LPGbTU1NfbAAw+0WVlZzfY1xtgDDjjAfvzxx822\nv/baa9YYY++///5m23/wgx/YQCBg169fb621duPGjdYYY1966aUW7TDG2JkzZzb+PGPGDGuMsZMn\nT26230UXXWQPO+ywxp9Xr15tjTF2ypQpzfabOHGizcrKanbM1nzwwQcR2zRy5EiblZVln3vuuTbb\n26BXr172iiuuaPz5N7/5jc3KyrJLly5tdd+srCy7YsWKxm1ffPGFzc7OtrfeemvENsfyO9mwD5Bn\n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\n2KBVywAAAABJRU5ErkJggg==\n", 106 | "text/plain": [ 107 | "" 108 | ] 109 | }, 110 | "metadata": {}, 111 | "output_type": "display_data" 112 | } 113 | ], 114 | "source": [ 115 | "plt.scatter(x, y)\n", 116 | "plt.plot(x, x * 1 + 2., label=\"ground truth\", c=\"r\")\n", 117 | "plt.legend()\n", 118 | "plt.show()" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "Build a graph" 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 6, 131 | "metadata": { 132 | "collapsed": false 133 | }, 134 | "outputs": [ 135 | { 136 | "data": { 137 | "text/plain": [ 138 | "dtype('float32')" 139 | ] 140 | }, 141 | "execution_count": 6, 142 | "metadata": {}, 143 | "output_type": "execute_result" 144 | } 145 | ], 146 | "source": [ 147 | "x.dtype" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 7, 153 | "metadata": { 154 | "collapsed": false 155 | }, 156 | "outputs": [ 157 | { 158 | "data": { 159 | "text/plain": [ 160 | "dtype('float32')" 161 | ] 162 | }, 163 | "execution_count": 7, 164 | "metadata": {}, 165 | "output_type": "execute_result" 166 | } 167 | ], 168 | "source": [ 169 | "y.dtype" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 8, 175 | "metadata": { 176 | "collapsed": false 177 | }, 178 | "outputs": [ 179 | { 180 | "data": { 181 | "text/plain": [ 182 | "(100,)" 183 | ] 184 | }, 185 | "execution_count": 8, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "x.shape" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 9, 197 | "metadata": { 198 | "collapsed": false 199 | }, 200 | "outputs": [ 201 | { 202 | "data": { 203 | "text/plain": [ 204 | "(100,)" 205 | ] 206 | }, 207 | "execution_count": 9, 208 | "metadata": {}, 209 | "output_type": "execute_result" 210 | } 211 | ], 212 | "source": [ 213 | "y.shape" 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": 10, 219 | "metadata": { 220 | "collapsed": false 221 | }, 222 | "outputs": [], 223 | "source": [ 224 | "# Inputs\n", 225 | "x_pl = tf.placeholder(tf.float32, [100,], name=\"x_pl\")\n", 226 | "y_pl = tf.placeholder(tf.float32, [100,], name=\"y_pl\")" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": 11, 232 | "metadata": { 233 | "collapsed": false 234 | }, 235 | "outputs": [], 236 | "source": [ 237 | "# Computation\n", 238 | "## Variables = Parameters = Weights\n", 239 | "w = tf.Variable(.1, tf.float32)\n", 240 | "b = tf.Variable(0., tf.float32)" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 12, 246 | "metadata": { 247 | "collapsed": true 248 | }, 249 | "outputs": [], 250 | "source": [ 251 | "## prediction = y_hat = hypothesis\n", 252 | "preds = x_pl * w + b # (100,)" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": 13, 258 | "metadata": { 259 | "collapsed": false 260 | }, 261 | "outputs": [], 262 | "source": [ 263 | "# objective = loss = cost\n", 264 | "loss = tf.reduce_mean(tf.square(preds - y)) # L2 loss" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": 14, 270 | "metadata": { 271 | "collapsed": true 272 | }, 273 | "outputs": [], 274 | "source": [ 275 | "# Optimization = Training\n", 276 | "optimizer = tf.train.GradientDescentOptimizer(learning_rate=.1)\n", 277 | "train_op = optimizer.minimize(loss)" 278 | ] 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "metadata": {}, 283 | "source": [ 284 | "Launch the graph" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 15, 290 | "metadata": { 291 | "collapsed": true 292 | }, 293 | "outputs": [], 294 | "source": [ 295 | "# start a session\n", 296 | "sess = tf.Session()" 297 | ] 298 | }, 299 | { 300 | "cell_type": "code", 301 | "execution_count": 16, 302 | "metadata": { 303 | "collapsed": true 304 | }, 305 | "outputs": [], 306 | "source": [ 307 | "# initialize all variables\n", 308 | "sess.run(tf.global_variables_initializer())" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 17, 314 | "metadata": { 315 | "collapsed": false 316 | }, 317 | "outputs": [], 318 | "source": [ 319 | "loss_list, w_list, b_list = [], [], []\n", 320 | "for epoch in range(1, 21):\n", 321 | " _, _loss, _w, _b = sess.run([train_op, loss, w, b], {x_pl:x, y_pl:y})\n", 322 | "# print(epoch, \"\\t\", _loss, \"\\t\", _w, \"\\t\", _b)\n", 323 | " loss_list.append(_loss)\n", 324 | " w_list.append(_w)\n", 325 | " b_list.append(_b)" 326 | ] 327 | }, 328 | { 329 | "cell_type": "code", 330 | "execution_count": 18, 331 | "metadata": { 332 | "collapsed": false 333 | }, 334 | "outputs": [ 335 | { 336 | "data": { 337 | "image/png": "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\n", 338 | "text/plain": [ 339 | "" 340 | ] 341 | }, 342 | "metadata": {}, 343 | "output_type": "display_data" 344 | } 345 | ], 346 | "source": [ 347 | "plt.plot(loss_list, label=\"loss\")\n", 348 | "plt.plot(w_list, label=\"w\")\n", 349 | "plt.plot(b_list, label=\"b\")\n", 350 | "plt.legend()\n", 351 | "plt.show()" 352 | ] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": null, 357 | "metadata": { 358 | "collapsed": true 359 | }, 360 | "outputs": [], 361 | "source": [] 362 | } 363 | ], 364 | "metadata": { 365 | "anaconda-cloud": {}, 366 | "kernelspec": { 367 | "display_name": "Python [conda root]", 368 | "language": "python", 369 | "name": "conda-root-py" 370 | }, 371 | "language_info": { 372 | "codemirror_mode": { 373 | "name": "ipython", 374 | "version": 3 375 | }, 376 | "file_extension": ".py", 377 | "mimetype": "text/x-python", 378 | "name": "python", 379 | "nbconvert_exporter": "python", 380 | "pygments_lexer": "ipython3", 381 | "version": "3.5.2" 382 | } 383 | }, 384 | "nbformat": 4, 385 | "nbformat_minor": 2 386 | } 387 | -------------------------------------------------------------------------------- /Ch3. Linear Regression-solution.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "* Note: These codes are partly adapted from TensorFlow Tutorial of Stanford cs224d course \n", 8 | " https://cs224d.stanford.edu/lectures/CS224d-Lecture7.pdf" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "Ex3. This is a simple exercise on linear regression in TensorFlow. Follow the instructions, and fill out the codes." 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 1, 21 | "metadata": { 22 | "collapsed": false 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "from __future__ import print_function\n", 27 | "import numpy as np\n", 28 | "import tensorflow as tf\n", 29 | "import matplotlib.pyplot as plt\n", 30 | "%matplotlib inline" 31 | ] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": {}, 36 | "source": [ 37 | "Overview" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 2, 43 | "metadata": { 44 | "collapsed": false 45 | }, 46 | "outputs": [], 47 | "source": [ 48 | "_x = np.arange(0, 100, .1)" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 3, 54 | "metadata": { 55 | "collapsed": false 56 | }, 57 | "outputs": [ 58 | { 59 | "data": { 60 | "text/plain": [ 61 | "array([ 77.9, 51.4, 59.8, 2.1, 19.3, 81.8, 83.7, 30.6, 4.4,\n", 62 | " 67.5, 40.8, 25.4, 1.5, 5.7, 42.5, 64.4, 21.2, 12.3,\n", 63 | " 60.6, 31.6, 49.6, 89.2, 50.4, 99.5, 12.2, 71.8, 92.5,\n", 64 | " 53.5, 18.6, 73.6, 13.8, 54.1, 92.9, 68.1, 79.1, 22.1,\n", 65 | " 30.4, 23.4, 75.7, 79.7, 86. , 98.4, 86.7, 5.9, 73.2,\n", 66 | " 7.1, 30. , 67.3, 3.6, 22.8, 53.4, 85.1, 53. , 97.2,\n", 67 | " 44.8, 18. , 26.6, 80.2, 52.3, 13.1, 46.3, 26.2, 84.3,\n", 68 | " 16.2, 54.4, 5.6, 18.3, 56.8, 80.7, 44.4, 29.1, 91.4,\n", 69 | " 15.5, 9.8, 79.9, 67.6, 95.6, 93.5, 82.8, 42.2, 70.4,\n", 70 | " 63.5, 78.7, 94.6, 55.5, 51.1, 19.8, 22.5, 38.4, 36.8,\n", 71 | " 38.1, 44. , 96.4, 93.6, 32.5, 6.8, 63.3, 37.3, 88.1, 41.2])" 72 | ] 73 | }, 74 | "execution_count": 3, 75 | "metadata": {}, 76 | "output_type": "execute_result" 77 | } 78 | ], 79 | "source": [ 80 | "np.random.shuffle(_x)\n", 81 | "_x[:100]" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 4, 87 | "metadata": { 88 | "collapsed": true 89 | }, 90 | "outputs": [], 91 | "source": [ 92 | "_y = _x + 20*np.sin(_x*.1)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 5, 98 | "metadata": { 99 | "collapsed": false 100 | }, 101 | "outputs": [ 102 | { 103 | "data": { 104 | "text/plain": [ 105 | "" 106 | ] 107 | }, 108 | "execution_count": 5, 109 | "metadata": {}, 110 | "output_type": "execute_result" 111 | }, 112 | { 113 | "data": { 114 | "image/png": "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\n", 115 | "text/plain": [ 116 | "" 117 | ] 118 | }, 119 | "metadata": {}, 120 | "output_type": "display_data" 121 | } 122 | ], 123 | "source": [ 124 | "plt.scatter(_x, _y)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "Build a graph" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 6, 137 | "metadata": { 138 | "collapsed": true 139 | }, 140 | "outputs": [], 141 | "source": [ 142 | "# Inputs, Outputs\n", 143 | "x_pl = tf.placeholder(tf.float32, [None, 1]) # 2-D\n", 144 | "y_pl = tf.placeholder(tf.float32, [None, 1]) # 2-D" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 7, 150 | "metadata": { 151 | "collapsed": true 152 | }, 153 | "outputs": [], 154 | "source": [ 155 | "# Variables\n", 156 | "W = tf.Variable(tf.random_normal([1, 1]), name=\"weight\")\n", 157 | "b = tf.Variable(tf.random_normal([1]), name=\"bias\")" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 8, 163 | "metadata": { 164 | "collapsed": false 165 | }, 166 | "outputs": [], 167 | "source": [ 168 | "# Hypothesis\n", 169 | "h = tf.matmul(x_pl, W) + b # (None, 1)" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 9, 175 | "metadata": { 176 | "collapsed": false 177 | }, 178 | "outputs": [ 179 | { 180 | "data": { 181 | "text/plain": [ 182 | "" 183 | ] 184 | }, 185 | "execution_count": 9, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "h" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 10, 197 | "metadata": { 198 | "collapsed": true 199 | }, 200 | "outputs": [], 201 | "source": [ 202 | "# loss\n", 203 | "loss = tf.reduce_mean(tf.square(y_pl - h))" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 11, 209 | "metadata": { 210 | "collapsed": true 211 | }, 212 | "outputs": [], 213 | "source": [ 214 | "# Optimization\n", 215 | "optimizer = tf.train.AdamOptimizer()\n", 216 | "train_op = optimizer.minimize(loss)" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 12, 222 | "metadata": { 223 | "collapsed": true 224 | }, 225 | "outputs": [], 226 | "source": [ 227 | "# Init\n", 228 | "init = tf.global_variables_initializer()" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 13, 234 | "metadata": { 235 | "collapsed": false 236 | }, 237 | "outputs": [], 238 | "source": [ 239 | "# Summary\n", 240 | "writer = tf.summary.FileWriter('asset', tf.get_default_graph())\n", 241 | "tf.summary.scalar(\"loss\", loss)\n", 242 | "tf.summary.scalar(\"W\", W[0, 0])\n", 243 | "tf.summary.scalar(\"b\", b[0])\n", 244 | "summaries = tf.summary.merge_all()" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": {}, 250 | "source": [ 251 | "Launch the graph" 252 | ] 253 | }, 254 | { 255 | "cell_type": "code", 256 | "execution_count": 14, 257 | "metadata": { 258 | "collapsed": true 259 | }, 260 | "outputs": [], 261 | "source": [ 262 | "# Start a session\n", 263 | "sess = tf.Session()\n", 264 | "\n", 265 | "# Initialize all variables\n", 266 | "sess.run(tf.global_variables_initializer())" 267 | ] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "execution_count": 15, 272 | "metadata": { 273 | "collapsed": true 274 | }, 275 | "outputs": [], 276 | "source": [ 277 | "def get_samples(x, y, size):\n", 278 | " assert len(x) == len(y), \"Two arrays must be the same in length!\"\n", 279 | " indices = np.random.choice(len(x), size)\n", 280 | " sample1 = x[indices]\n", 281 | " sample2 = y[indices]\n", 282 | " return np.expand_dims(sample1,1), np.expand_dims(sample2, 1)\n", 283 | " " 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 16, 289 | "metadata": { 290 | "collapsed": false 291 | }, 292 | "outputs": [], 293 | "source": [ 294 | "loss_list = []\n", 295 | "for i in range(1, 2001):\n", 296 | " x_batch, y_batch = get_samples(_x, _y, 100)\n", 297 | " sess.run(train_op, {x_pl:x_batch, y_pl:y_batch})\n", 298 | " _loss, _s = sess.run([loss, summaries], {x_pl:x_batch, y_pl:y_batch})\n", 299 | " writer.add_summary(_s)\n", 300 | " loss_list.append(_loss)\n", 301 | " " 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 17, 307 | "metadata": { 308 | "collapsed": false 309 | }, 310 | "outputs": [], 311 | "source": [ 312 | "_w, _b = sess.run([W, b])" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 19, 318 | "metadata": { 319 | "collapsed": false 320 | }, 321 | "outputs": [ 322 | { 323 | "data": { 324 | "text/plain": [ 325 | "[]" 326 | ] 327 | }, 328 | "execution_count": 19, 329 | "metadata": {}, 330 | "output_type": "execute_result" 331 | }, 332 | { 333 | "data": { 334 | "image/png": "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\n", 335 | "text/plain": [ 336 | "" 337 | ] 338 | }, 339 | "metadata": {}, 340 | "output_type": "display_data" 341 | } 342 | ], 343 | "source": [ 344 | "plt.scatter(_x, _y, c=\"r\")\n", 345 | "plt.plot(_x, _x * _w[0, 0] + _b[0])" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": null, 351 | "metadata": { 352 | "collapsed": true 353 | }, 354 | "outputs": [], 355 | "source": [] 356 | } 357 | ], 358 | "metadata": { 359 | "anaconda-cloud": {}, 360 | "kernelspec": { 361 | "display_name": "Python [conda root]", 362 | "language": "python", 363 | "name": "conda-root-py" 364 | }, 365 | "language_info": { 366 | "codemirror_mode": { 367 | "name": "ipython", 368 | "version": 3 369 | }, 370 | "file_extension": ".py", 371 | "mimetype": "text/x-python", 372 | "name": "python", 373 | "nbconvert_exporter": "python", 374 | "pygments_lexer": "ipython3", 375 | "version": "3.5.2" 376 | } 377 | }, 378 | "nbformat": 4, 379 | "nbformat_minor": 1 380 | } 381 | --------------------------------------------------------------------------------