diff --git a/talks/tensorflow/demos/tensorboard_demo.ipynb b/talks/tensorflow/demos/tensorboard_demo.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..5b4dff4367ce962134572b0cad979968287d372a --- /dev/null +++ b/talks/tensorflow/demos/tensorboard_demo.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Extracting /tmp/TensorBoard_demo/data/train-images-idx3-ubyte.gz\n", + "Extracting /tmp/TensorBoard_demo/data/train-labels-idx1-ubyte.gz\n", + "Extracting /tmp/TensorBoard_demo/data/t10k-images-idx3-ubyte.gz\n", + "Extracting /tmp/TensorBoard_demo/data/t10k-labels-idx1-ubyte.gz\n" + ] + } + ], + "source": [ + "import os\n", + "import os.path\n", + "import shutil\n", + "import tensorflow as tf\n", + "\n", + "LOGDIR = \"/tmp/TensorBoard_demo/\"\n", + "LABELS = os.path.join(os.getcwd(), \"labels_1024.tsv\")\n", + "SPRITES = os.path.join(os.getcwd(), \"sprite_1024.png\")\n", + "### MNIST EMBEDDINGS ###\n", + "mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=LOGDIR + \"data\", one_hot=True)\n", + "### Get a sprite and labels file for the embedding projector ###\n", + "\n", + "if not (os.path.isfile(LABELS) and os.path.isfile(SPRITES)):\n", + " print(\"Necessary data files were not found: LABELS and SPRITES\")\n", + " exit(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def conv_layer(input, size_in, size_out, name=\"conv\"):\n", + " with tf.name_scope(name):\n", + " w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name=\"W\")\n", + " b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\"B\")\n", + " conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding=\"SAME\")\n", + " act = tf.nn.relu(conv + b)\n", + " tf.summary.histogram(\"weights\", w)\n", + " tf.summary.histogram(\"biases\", b)\n", + " tf.summary.histogram(\"activations\", act)\n", + " return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\"SAME\")\n", + "\n", + "\n", + "def fc_layer(input, size_in, size_out, name=\"fc\"):\n", + " with tf.name_scope(name):\n", + " w = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1), name=\"W\")\n", + " b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\"B\")\n", + " act = tf.matmul(input, w) + b\n", + " tf.summary.histogram(\"weights\", w)\n", + " tf.summary.histogram(\"biases\", b)\n", + " tf.summary.histogram(\"activations\", act)\n", + " return act" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def mnist_model(learning_rate):\n", + " tf.reset_default_graph()\n", + " sess = tf.Session()\n", + "\n", + " # Setup placeholders, and reshape the data\n", + " x = tf.placeholder(tf.float32, shape=[None, 784], name=\"x\")\n", + " x_image = tf.reshape(x, [-1, 28, 28, 1])\n", + " tf.summary.image('input', x_image, 3)\n", + " y = tf.placeholder(tf.float32, shape=[None, 10], name=\"labels\")\n", + "\n", + " conv_out = conv_layer(x_image, 1, 16, \"conv\")\n", + "\n", + " flattened = tf.reshape(conv_out, [-1, 7 * 7 * 64])\n", + "\n", + " embedding_input = flattened\n", + " embedding_size = 7*7*64\n", + " logits = fc_layer(flattened, 7*7*64, 10, \"fc\")\n", + "\n", + " with tf.name_scope(\"xent\"):\n", + " xent = tf.reduce_mean(\n", + " tf.nn.softmax_cross_entropy_with_logits(\n", + " logits=logits, labels=y), name=\"xent\")\n", + " tf.summary.scalar(\"xent\", xent)\n", + "\n", + " with tf.name_scope(\"train\"):\n", + " train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)\n", + "\n", + " with tf.name_scope(\"accuracy\"):\n", + " correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))\n", + " accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", + " tf.summary.scalar(\"accuracy\", accuracy)\n", + "\n", + " summ = tf.summary.merge_all()\n", + "\n", + "\n", + " embedding = tf.Variable(tf.zeros([1024, embedding_size]), name=\"test_embedding\")\n", + " assignment = embedding.assign(embedding_input)\n", + " saver = tf.train.Saver()\n", + "\n", + " sess.run(tf.global_variables_initializer())\n", + " writer = tf.summary.FileWriter(LOGDIR)\n", + " writer.add_graph(sess.graph)\n", + "\n", + " config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()\n", + " embedding_config = config.embeddings.add()\n", + " embedding_config.tensor_name = embedding.name\n", + " embedding_config.sprite.image_path = SPRITES\n", + " embedding_config.metadata_path = LABELS\n", + " # Specify the width and height of a single thumbnail.\n", + " embedding_config.sprite.single_image_dim.extend([28, 28])\n", + " tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)\n", + "\n", + " for i in range(1,2001):\n", + " batch = mnist.train.next_batch(100)\n", + " if i % 5 == 0:\n", + " [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})\n", + " writer.add_summary(s, i)\n", + " if i % 500 == 0:\n", + " sess.run(assignment, feed_dict={x: mnist.test.images[:1024], y: mnist.test.labels[:1024]})\n", + " saver.save(sess, os.path.join(LOGDIR, \"model.ckpt\"), i)\n", + " sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done training!\n", + "Run `tensorboard --logdir=/tmp/TensorBoard_demo/` to see the results.\n", + "Running on mac? If you want to get rid of the dialogue asking to give network permissions to TensorBoard, you can provide this flag: --host=localhost\n" + ] + } + ], + "source": [ + "learning_rate = 1E-3\n", + "\n", + "mnist_model(learning_rate)\n", + "print('Done training!')\n", + "print('Run `tensorboard --logdir=%s` to see the results.' % LOGDIR)\n", + "print('Running on mac? If you want to get rid of the dialogue asking to give '\n", + " 'network permissions to TensorBoard, you can provide this flag: '\n", + " '--host=localhost')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting TensorBoard b'47' at http://0.0.0.0:6006\n", + "(Press CTRL+C to quit)\n", + "WARNING:tensorflow:Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events. Overwriting the graph with the newest event.\n", + "WARNING:tensorflow:Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events. Overwriting the graph with the newest event.\n", + "WARNING:tensorflow:Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events. Overwriting the graph with the newest event.\n", + "WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404\n", + "WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404\n", + "WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404\n", + "WARNING:tensorflow:path ../external/data/plugin/text/runs not found, sending 404\n", + "^C\n" + ] + } + ], + "source": [ + "!tensorboard --logdir=/tmp/TensorBoard_demo/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [conda env:tensorflow]", + "language": "python", + "name": "conda-env-tensorflow-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}