Deep-Learning-Course/ComputationalGraphs.ipynb

398 lines
388 KiB
Plaintext
Raw Normal View History

2017-10-08 09:42:12 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Computational Graphs (Basics)\n",
"\n",
"## What is a computational graph?\n",
"\n",
"Computational graph is a graphical representation of numerical computations. The mathematical operations are captured as nodes. The data flowing as input and output of the nodes is represented by the edges connecting them. \n",
"\n",
"## Why computational graphs?\n",
"\n",
"Computational graphs provide a way to *define* the computations that need to be done. They are like a visual programming language (declarative language). Once the computation is described, the libraries like Tensorflow and Theano, can execute them depending on the device configurations where the computation is executed. Thus once defined the computation can be run on CPUs, a distributed network of CPUs, GPUs, mobile phones etc.\n",
"\n",
"## Computational graph in Tensorflow\n",
"\n",
"In Tensorflow, you can use Python language to programmatically build a computational graph. Inputs for the graph are defined as placeholders and they are supplied at the time of executing the computations. To compute on the graph, a Tensorflow session is created and input data is provided. If you execute the run and provide the nodes whose values you seek as output. Tensorflow finds all *dependent* computation nodes necessary to compute the values of output nodes, and executes the computation only for the necessary paths. \n",
"\n",
"We will see in later sessions how more advanced computing is done in the context of neural networks, and also understand how Tensorflow computational graph provides automatic differentiation, necessary for learning algorithms like backpropagation."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from graphviz import Digraph\n",
"from IPython.core.display import display, SVG\n",
"\n",
"def tf_to_dot(graph):\n",
" dot = Digraph()\n",
"\n",
" for n in graph.as_graph_def().node:\n",
" name = n.name.split('/')[0]\n",
" dot.node(name, label=name)\n",
"\n",
" for src in n.input:\n",
" src = src.split('/')[0]\n",
" if src != name:\n",
" dot.edge(src, name)\n",
" display(SVG(dot._repr_svg_())) \n",
" return dot"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/svg+xml": [
"<svg height=\"116pt\" viewBox=\"0.00 0.00 141.55 116.00\" width=\"142pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\n",
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" points=\"-4,4 -4,-112 137.5473,-112 137.5473,4 -4,4\" stroke=\"transparent\"/>\n",
"<!-- a___ -->\n",
"<g class=\"node\" id=\"node1\">\n",
"<title>a___</title>\n",
"<ellipse cx=\"30.5473\" cy=\"-90\" fill=\"none\" rx=\"30.5947\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"30.5473\" y=\"-86.3\">a___</text>\n",
"</g>\n",
"<!-- addition -->\n",
"<g class=\"node\" id=\"node3\">\n",
"<title>addition</title>\n",
"<ellipse cx=\"68.5473\" cy=\"-18\" fill=\"none\" rx=\"48.9926\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"68.5473\" y=\"-14.3\">addition</text>\n",
"</g>\n",
"<!-- a___&#45;&gt;addition -->\n",
"<g class=\"edge\" id=\"edge1\">\n",
"<title>a___-&gt;addition</title>\n",
"<path d=\"M39.746,-72.5708C44.161,-64.2055 49.5484,-53.998 54.4641,-44.6839\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"57.597,-46.2464 59.1693,-35.7689 51.4063,-42.9791 57.597,-46.2464\" stroke=\"#000000\"/>\n",
"</g>\n",
"<!-- b -->\n",
"<g class=\"node\" id=\"node2\">\n",
"<title>b</title>\n",
"<ellipse cx=\"106.5473\" cy=\"-90\" fill=\"none\" rx=\"27\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"106.5473\" y=\"-86.3\">b</text>\n",
"</g>\n",
"<!-- b&#45;&gt;addition -->\n",
"<g class=\"edge\" id=\"edge2\">\n",
"<title>b-&gt;addition</title>\n",
"<path d=\"M97.5418,-72.937C93.0975,-64.5161 87.6331,-54.1627 82.6509,-44.7226\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"85.6479,-42.9026 77.885,-35.6924 79.4572,-46.17 85.6479,-42.9026\" stroke=\"#000000\"/>\n",
"</g>\n",
"</g>\n",
"</svg>"
],
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"16.0\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"\n",
"tf.reset_default_graph()\n",
"\n",
"node_a = tf.placeholder(dtype=tf.float32,name=\"a___\")\n",
"node_b = tf.constant(6.0,dtype=tf.float32, name=\"b\")\n",
"\n",
"adder_node = tf.add(node_a,node_b, name=\"addition\")\n",
"\n",
"\n",
"sess = tf.Session()\n",
"output = sess.run(adder_node,{node_a:10.0})\n",
"tf_to_dot(tf.get_default_graph())\n",
"sess.close()\n",
"\n",
"print output"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nRIngRkQo7khQMMG8oRP
"text/plain": [
"<matplotlib.figure.Figure at 0x7efb9463dad0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n8G632yoWi2YcGDvj8Vg
"text/plain": [
"<matplotlib.figure.Figure at 0x7efb981645d0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/svg+xml": [
"<svg height=\"332pt\" viewBox=\"0.00 0.00 248.14 332.00\" width=\"248pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n",
"<title>%3</title>\n",
"<polygon fill=\"#ffffff\" points=\"-4,4 -4,-328 244.1401,-328 244.1401,4 -4,4\" stroke=\"transparent\"/>\n",
"<!-- to_float -->\n",
"<g class=\"node\" id=\"node1\">\n",
"<title>to_float</title>\n",
"<ellipse cx=\"63.6943\" cy=\"-306\" fill=\"none\" rx=\"46.2923\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"63.6943\" y=\"-302.3\">to_float</text>\n",
"</g>\n",
"<!-- div_by_255 -->\n",
"<g class=\"node\" id=\"node2\">\n",
"<title>div_by_255</title>\n",
"<ellipse cx=\"63.6943\" cy=\"-234\" fill=\"none\" rx=\"63.8893\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"63.6943\" y=\"-230.3\">div_by_255</text>\n",
"</g>\n",
"<!-- to_float&#45;&gt;div_by_255 -->\n",
"<g class=\"edge\" id=\"edge1\">\n",
"<title>to_float-&gt;div_by_255</title>\n",
"<path d=\"M63.6943,-287.8314C63.6943,-280.131 63.6943,-270.9743 63.6943,-262.4166\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"67.1944,-262.4132 63.6943,-252.4133 60.1944,-262.4133 67.1944,-262.4132\" stroke=\"#000000\"/>\n",
"</g>\n",
"<!-- dot -->\n",
"<g class=\"node\" id=\"node4\">\n",
"<title>dot</title>\n",
"<ellipse cx=\"127.6943\" cy=\"-162\" fill=\"none\" rx=\"27\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"127.6943\" y=\"-158.3\">dot</text>\n",
"</g>\n",
"<!-- div_by_255&#45;&gt;dot -->\n",
"<g class=\"edge\" id=\"edge2\">\n",
"<title>div_by_255-&gt;dot</title>\n",
"<path d=\"M79.5146,-216.2022C87.8096,-206.8703 98.0731,-195.3239 106.9929,-185.2892\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"109.7672,-187.4362 113.795,-177.6368 104.5354,-182.7856 109.7672,-187.4362\" stroke=\"#000000\"/>\n",
"</g>\n",
"<!-- weights -->\n",
"<g class=\"node\" id=\"node3\">\n",
"<title>weights</title>\n",
"<ellipse cx=\"192.6943\" cy=\"-234\" fill=\"none\" rx=\"47.3916\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"192.6943\" y=\"-230.3\">weights</text>\n",
"</g>\n",
"<!-- weights&#45;&gt;dot -->\n",
"<g class=\"edge\" id=\"edge3\">\n",
"<title>weights-&gt;dot</title>\n",
"<path d=\"M177.2903,-216.937C168.6744,-207.3933 157.8177,-195.3674 148.4601,-185.002\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"150.9574,-182.5452 141.6584,-177.4679 145.7616,-187.236 150.9574,-182.5452\" stroke=\"#000000\"/>\n",
"</g>\n",
"<!-- mul_by_255 -->\n",
"<g class=\"node\" id=\"node5\">\n",
"<title>mul_by_255</title>\n",
"<ellipse cx=\"127.6943\" cy=\"-90\" fill=\"none\" rx=\"66.8882\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"127.6943\" y=\"-86.3\">mul_by_255</text>\n",
"</g>\n",
"<!-- dot&#45;&gt;mul_by_255 -->\n",
"<g class=\"edge\" id=\"edge4\">\n",
"<title>dot-&gt;mul_by_255</title>\n",
"<path d=\"M127.6943,-143.8314C127.6943,-136.131 127.6943,-126.9743 127.6943,-118.4166\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"131.1944,-118.4132 127.6943,-108.4133 124.1944,-118.4133 131.1944,-118.4132\" stroke=\"#000000\"/>\n",
"</g>\n",
"<!-- to_uint8 -->\n",
"<g class=\"node\" id=\"node6\">\n",
"<title>to_uint8</title>\n",
"<ellipse cx=\"127.6943\" cy=\"-18\" fill=\"none\" rx=\"49.2915\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"127.6943\" y=\"-14.3\">to_uint8</text>\n",
"</g>\n",
"<!-- mul_by_255&#45;&gt;to_uint8 -->\n",
"<g class=\"edge\" id=\"edge5\">\n",
"<title>mul_by_255-&gt;to_uint8</title>\n",
"<path d=\"M127.6943,-71.8314C127.6943,-64.131 127.6943,-54.9743 127.6943,-46.4166\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"131.1944,-46.4132 127.6943,-36.4133 124.1944,-46.4133 131.1944,-46.4132\" stroke=\"#000000\"/>\n",
"</g>\n",
"</g>\n",
"</svg>"
],
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from skimage import data as imgdata\n",
"import skimage.color as color\n",
"import matplotlib.pyplot as plt\n",
"import scipy.ndimage as ndimage\n",
"import numpy as np\n",
"\n",
"coffee_cup = imgdata.coffee()\n",
"plt.imshow(coffee_cup)\n",
"plt.show()\n",
"\n",
"def to_gray(img):\n",
" #img = tf.placeholder(tf.uint8,name=\"input____\")\n",
" img_float = tf.div(tf.cast(img,dtype=tf.float64,name=\"to_float\"),255.0,name='div_by_255')\n",
" weights = tf.constant([0.2125,0.7154,0.0721],dtype=tf.float64,name=\"weights\")\n",
" \n",
"# R = tf.slice(img_float,[0,0,0],[-1,-1,1],name='extract_red')\n",
"# G = tf.slice(img_float,[0,0,1],[-1,-1,1],name='extract_green')\n",
"# B = tf.slice(img_float,[0,0,2],[-1,-1,1],name='extract_blue')\n",
" \n",
" \n",
"# gray = 0.2125*R + 0.7154*G + 0.0721*B\n",
" gray = tf.tensordot(img_float,weights,axes=1,name=\"dot\")\n",
"# weighted = tf.multiply(img_float,weights,name=\"weighting\")\n",
"# gray = tf.reduce_sum(weighted,axis=2, name =\"weighted_sum\") \n",
" \n",
" output = tf.cast(tf.multiply(gray,255.0,name='mul_by_255'), tf.uint8, name=\"to_uint8\")\n",
" return output\n",
"\n",
"tf.reset_default_graph()\n",
"gray_graph = to_gray(coffee_cup)\n",
"#gray_graph = to_gray(coffee_cup)\n",
"\n",
"I = np.uint8(color.rgb2gray(coffee_cup)*255)\n",
"\n",
"with tf.Session() as sess:\n",
" gray_image = np.squeeze(sess.run(gray_graph))\n",
"# print gray_image.shape\n",
"# print I.shape\n",
"# print np.max(gray_image),np.min(gray_image),np.mean(gray_image)\n",
"# print np.max(I),np.min(I),np.mean(I)\n",
"# print np.max(np.abs(gray_image-I))\n",
" plt.imshow(np.squeeze(gray_image),'gray')\n",
" plt.show()\n",
"dot=tf_to_dot(tf.get_default_graph())\n",
"\n",
"\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 0 0]\n",
" [ 0 1]\n",
" [ 0 2]\n",
" ..., \n",
" [327 397]\n",
" [327 398]\n",
" [327 399]] [[ True True True ..., True True True]\n",
" [ True True True ..., True True True]\n",
" [ True True True ..., True True True]\n",
" ..., \n",
" [ True True True ..., True True True]\n",
" [ True True True ..., True True True]\n",
" [ True True True ..., True True True]]\n"
]
}
],
"source": [
"%matplotlib inline\n",
"import tensorflow as tf\n",
"import skimage.data as imgdata\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"horse = imgdata.horse().astype(np.uint8)\n",
"\n",
"def horse_color(img):\n",
"# horse_idx = tf.constant(img.)\n",
" horse = tf.constant(img.astype(bool),name='horse')\n",
"# white = tf.constant(np.ones((img.shape[0],img.shape[1],3),dtype=np.float64)*255)\n",
"# color = tf.constant(np.full((img.shape[0],img.shape[1],3),np.array([127.0,255.0,128.0]),dtype=np.float64))\n",
"# white = tf.constant(np.zeros(img.shape,dtype=np.uint8))\n",
"# color = tf.constant(np.ones(img.shape,dtype=np.uint8)*128)\n",
" horse_idx = tf.where(horse)\n",
"# colored_horse = tf.boolean_mask(color,horse)\n",
"# zero = tf.constant(0, dtype=tf.uint8)\n",
"# non_empty = tf.not_equal(horse, zero,name='horse_nonempty')\n",
"# unit8_nonempty_horse = tf.cast(tf.not_equal(horse, zero,name='horse_nonempty'),dtype=tf.uint8,name=\"to_uint8\")\n",
" return horse_idx\n",
"\n",
"tf.reset_default_graph()\n",
"horse_data = imgdata.horse()\n",
"horse_graph = horse_color(horse_data)\n",
"\n",
"with tf.Session() as sess:\n",
" horse_image = sess.run(horse_graph)\n",
" print horse_image,horse_data\n",
"# plt.imshow(horse_image)\n",
"# plt.show()\n",
"# dot=tf_to_dot(tf.get_default_graph())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python2",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.14"
}
},
"nbformat": 4,
"nbformat_minor": 1
}