From 6c18171e88efead7851ab17e6dfed011837162d5 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Thu, 17 Dec 2015 10:27:05 -0800 Subject: [PATCH 001/123] Initial notebooks and Docker spec for the Udacity course assignments. Note: these are not final. Change: 110420744 --- 1_notmnist.ipynb | 396 +++++++++++++++++++++++++++++++++++++ 2_fullyconnected.ipynb | 311 +++++++++++++++++++++++++++++ 3_regularization.ipynb | 196 +++++++++++++++++++ 4_convolutions.ipynb | 242 +++++++++++++++++++++++ 5_word2vec.ipynb | 402 ++++++++++++++++++++++++++++++++++++++ 6_lstm.ipynb | 433 +++++++++++++++++++++++++++++++++++++++++ Dockerfile | 6 + README.md | 12 ++ 8 files changed, 1998 insertions(+) create mode 100644 1_notmnist.ipynb create mode 100644 2_fullyconnected.ipynb create mode 100644 3_regularization.ipynb create mode 100644 4_convolutions.ipynb create mode 100644 5_word2vec.ipynb create mode 100644 6_lstm.ipynb create mode 100644 Dockerfile create mode 100644 README.md diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb new file mode 100644 index 00000000000..9c9888664c5 --- /dev/null +++ b/1_notmnist.ipynb @@ -0,0 +1,396 @@ +{ + "worksheets": [ + { + "cells": [ + { + "metadata": { + "id": "5hIbr52I7Z7U", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Deep Learning\n=============\n\nAssignment 1\n------------\n\nThe objective of this assignment is to learn about simple data curation practices, and familiarize you with some of the data we'll be reusing later.\n\nThis notebook uses the [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) dataset to be used with python experiments. This dataset is designed to look like the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset, while looking a little more like real data: it's a harder task, and the data is a lot less 'clean' than MNIST." + }, + { + "metadata": { + "id": "apJbCsBHl-2A", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport tarfile\nimport urllib\nfrom IPython.display import display, Image\nfrom scipy import ndimage\nfrom sklearn.linear_model import LogisticRegression\nimport cPickle as pickle", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "jNWGtZaXn-5j", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "First, we'll download the dataset to our local machine. The data consists of characters rendered in a variety of fonts on a 28x28 image. The labels are limited to 'A' through 'J' (10 classes). The training set has about 500k and the testset 19000 labelled examples. Given these sizes, it should be possible to train models quickly on any machine." + }, + { + "metadata": { + "id": "EYRJ4ICW6-da", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 186058, + "status": "ok", + "timestamp": 1444485672507, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "0d0f85df-155f-4a89-8e7e-ee32df36ec8d" + }, + "cell_type": "code", + "input": "url = 'http://yaroslavvb.com/upload/notMNIST/'\n\ndef maybe_download(filename, expected_bytes):\n \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n if not os.path.exists(filename):\n filename, _ = urllib.urlretrieve(url + filename, filename)\n statinfo = os.stat(filename)\n if statinfo.st_size == expected_bytes:\n print 'Found and verified', filename\n else:\n raise Exception(\n 'Failed to verify' + filename + '. Can you get to it with a browser?')\n return filename\n\ntrain_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\ntest_filename = maybe_download('notMNIST_small.tar.gz', 8458043)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Found and verified notMNIST_large.tar.gz\nFound and verified notMNIST_small.tar.gz\n" + } + ] + }, + { + "metadata": { + "id": "cC3p0oEyF8QT", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Extract the dataset from the compressed .tar.gz file.\nThis should give you a set of directories, labelled A through J." + }, + { + "metadata": { + "id": "H8CBE-WZ8nmj", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 186055, + "status": "ok", + "timestamp": 1444485672525, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "ef6c790c-2513-4b09-962e-27c79390c762" + }, + "cell_type": "code", + "input": "num_classes = 10\n\ndef extract(filename):\n tar = tarfile.open(filename)\n tar.extractall()\n tar.close()\n root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n if len(data_folders) != num_classes:\n raise Exception(\n 'Expected %d folders, one per class. Found %d instead.' % (\n num_folders, len(data_folders)))\n print data_folders\n return data_folders\n \ntrain_folders = extract(train_filename)\ntest_folders = extract(test_filename)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "['notMNIST_large/A', 'notMNIST_large/B', 'notMNIST_large/C', 'notMNIST_large/D', 'notMNIST_large/E', 'notMNIST_large/F', 'notMNIST_large/G', 'notMNIST_large/H', 'notMNIST_large/I', 'notMNIST_large/J']\n['notMNIST_small/A', 'notMNIST_small/B', 'notMNIST_small/C', 'notMNIST_small/D', 'notMNIST_small/E', 'notMNIST_small/F', 'notMNIST_small/G', 'notMNIST_small/H', 'notMNIST_small/I', 'notMNIST_small/J']\n" + } + ] + }, + { + "metadata": { + "id": "4riXK3IoHgx6", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 1\n---------\n\nLet's take a peek at some of the data to make sure it looks sensible. Each exemplar should be an image of a character A through J rendered in a different font. Display a sample of the images that we just downloaded. Hint: you can use the package IPython.display.\n\n---" + }, + { + "metadata": { + "id": "PBdkjESPK8tw", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Now let's load the data in a more manageable format.\n\nWe'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. The labels will be stored into a separate array of integers 0 through 9.\n\nA few images might not be readable, we'll just skip them." + }, + { + "metadata": { + "id": "h7q0XhG3MJdf", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 30 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 399874, + "status": "ok", + "timestamp": 1444485886378, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "92c391bb-86ff-431d-9ada-315568a19e59" + }, + "cell_type": "code", + "input": "image_size = 28 # Pixel width and height.\npixel_depth = 255.0 # Number of levels per pixel.\n\ndef load(data_folders, min_num_images, max_num_images):\n dataset = np.ndarray(\n shape=(max_num_images, image_size, image_size), dtype=np.float32)\n labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n label_index = 0\n image_index = 0\n for folder in data_folders:\n print folder\n for image in os.listdir(folder):\n if image_index >= max_num_images:\n raise Exception('More images than expected: %d >= %d' % (\n num_images, max_num_images))\n image_file = os.path.join(folder, image)\n try:\n image_data = (ndimage.imread(image_file).astype(float) -\n pixel_depth / 2) / pixel_depth\n if image_data.shape != (image_size, image_size):\n raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n dataset[image_index, :, :] = image_data\n labels[image_index] = label_index\n image_index += 1\n except IOError as e:\n print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n label_index += 1\n num_images = image_index\n dataset = dataset[0:num_images, :, :]\n labels = labels[0:num_images]\n if num_images < min_num_images:\n raise Exception('Many fewer images than expected: %d < %d' % (\n num_images, min_num_images))\n print 'Full dataset tensor:', dataset.shape\n print 'Mean:', np.mean(dataset)\n print 'Standard deviation:', np.std(dataset)\n print 'Labels:', labels.shape\n return dataset, labels\ntrain_dataset, train_labels = load(train_folders, 450000, 550000)\ntest_dataset, test_labels = load(test_folders, 18000, 20000)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "notMNIST_large/A\nCould not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\nCould not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\nCould not read: notMNIST_large/A/Um9tYW5hIEJvbGQucGZi.png : cannot identify image file - it's ok, skipping.\nnotMNIST_large/B\nCould not read: notMNIST_large/B/TmlraXNFRi1TZW1pQm9sZEl0YWxpYy5vdGY=.png : cannot identify image file - it's ok, skipping.\nnotMNIST_large/C\nnotMNIST_large/D\nCould not read: notMNIST_large/D/VHJhbnNpdCBCb2xkLnR0Zg==.png : cannot identify image file - it's ok, skipping.\nnotMNIST_large/E\nnotMNIST_large/F\nnotMNIST_large/G\nnotMNIST_large/H\nnotMNIST_large/I\nnotMNIST_large/J\nFull dataset tensor: (529114, 28, 28)\nMean: -0.0816593\nStandard deviation: 0.454232\nLabels: (529114,)\nnotMNIST_small/A\nCould not read: notMNIST_small/A/RGVtb2NyYXRpY2FCb2xkT2xkc3R5bGUgQm9sZC50dGY=.png : cannot identify image file - it's ok, skipping.\nnotMNIST_small/B\nnotMNIST_small/C\nnotMNIST_small/D\nnotMNIST_small/E\nnotMNIST_small/F\nCould not read: notMNIST_small/F/Q3Jvc3NvdmVyIEJvbGRPYmxpcXVlLnR0Zg==.png : cannot identify image file - it's ok, skipping.\nnotMNIST_small/G\nnotMNIST_small/H\nnotMNIST_small/I\nnotMNIST_small/J\nFull dataset tensor: (18724, 28, 28)\nMean: -0.0746364\nStandard deviation: 0.458622\nLabels: (18724,)\n" + } + ] + }, + { + "metadata": { + "id": "vUdbskYE2d87", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 2\n---------\n\nLet's verify that the data still looks good. Displaying a sample of the labels and images from the ndarray. Hint: you can use matplotlib.pyplot.\n\n---" + }, + { + "metadata": { + "id": "GPTCnjIcyuKN", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." + }, + { + "metadata": { + "id": "6WZ2l2tN2zOL", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "np.random.seed(133)\ndef randomize(dataset, labels):\n permutation = np.random.permutation(labels.shape[0])\n shuffled_dataset = dataset[permutation,:,:]\n shuffled_labels = labels[permutation]\n return shuffled_dataset, shuffled_labels\ntrain_dataset, train_labels = randomize(train_dataset, train_labels)\ntest_dataset, test_labels = randomize(test_dataset, test_labels)", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "puDUTe6t6USl", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 3\n---------\nConvince yourself that the data is still good after shuffling!\n\n---" + }, + { + "metadata": { + "id": "cYznx5jUwzoO", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 4\n---------\nAnother check: we expect the data to be balanced across classes. Verify that.\n\n---" + }, + { + "metadata": { + "id": "LA7M7K22ynCt", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune train_size as needed.\n\nAlso create a validation dataset for hyperparameter tuning." + }, + { + "metadata": { + "id": "s3mWgZLpyuzq", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 411281, + "status": "ok", + "timestamp": 1444485897869, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "8af66da6-902d-4719-bedc-7c9fb7ae7948" + }, + "cell_type": "code", + "input": "train_size = 200000\nvalid_size = 10000\n\nvalid_dataset = train_dataset[:valid_size,:,:]\nvalid_labels = train_labels[:valid_size]\ntrain_dataset = train_dataset[valid_size:valid_size+train_size,:,:]\ntrain_labels = train_labels[valid_size:valid_size+train_size]\nprint 'Training', train_dataset.shape, train_labels.shape\nprint 'Validation', valid_dataset.shape, valid_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training (200000, 28, 28) (200000,)\nValidation (10000, 28, 28) (10000,)\n" + } + ] + }, + { + "metadata": { + "id": "tIQJaJuwg5Hw", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Finally, let's save the data for later reuse:" + }, + { + "metadata": { + "id": "QiR_rETzem6C", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "pickle_file = 'notMNIST.pickle'\n\ntry:\n f = open(pickle_file, 'wb')\n save = {\n 'train_dataset': train_dataset,\n 'train_labels': train_labels,\n 'valid_dataset': valid_dataset,\n 'valid_labels': valid_labels,\n 'test_dataset': test_dataset,\n 'test_labels': test_labels,\n }\n pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n f.close()\nexcept Exception as e:\n print 'Unable to save data to', pickle_file, ':', e\n raise", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "hQbLjrW_iT39", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 413065, + "status": "ok", + "timestamp": 1444485899688, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "b440efc6-5ee1-4cbc-d02d-93db44ebd956" + }, + "cell_type": "code", + "input": "statinfo = os.stat(pickle_file)\nprint 'Compressed pickle size:', statinfo.st_size", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Compressed pickle size: 718193801\n" + } + ] + }, + { + "metadata": { + "id": "gE_cRAQB33lk", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 5\n---------\n\nBy construction, this dataset might contain a lot of overlapping samples, including training data that's also contained in the validation and test set! Overlap between training and test can skew the results if you expect to use your model in an environment where there is never an overlap, but are actually ok if you expect to see training samples recur when you use it.\nMeasure how much overlap there is between training, validation and test samples.\nOptional questions:\n- What about near duplicates between datasets? (images that are almost identical)\n- Create a sanitized validation and test set, and compare your accuracy on those in subsequent assignments.\n---" + }, + { + "metadata": { + "id": "L8oww1s4JMQx", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 6\n---------\n\nLet's get an idea of what an off-the-shelf classifier can give you on this data. It's always good to check that there is something to learn, and that it's a problem that is not so trivial that a canned solution solves it.\n\nTrain a simple model on this data using 50, 100, 1000 and 5000 training samples. Hint: you can use the LogisticRegression model from sklearn.linear_model.\n\nOptional question: train an off-the-shelf model on all the data!\n\n---" + } + ] + } + ], + "metadata": { + "name": "1_notmnist.ipynb", + "colabVersion": "0.3.2", + "colab_views": {}, + "colab_default_view": {} + }, + "nbformat": 3, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb new file mode 100644 index 00000000000..fb5be12ac04 --- /dev/null +++ b/2_fullyconnected.ipynb @@ -0,0 +1,311 @@ +{ + "worksheets": [ + { + "cells": [ + { + "metadata": { + "id": "kR-4eNdK6lYS", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Deep Learning\n=============\n\nAssignment 2\n------------\n\nPreviously in `1_notmnist.ipynb`, we created a pickle with formatted datasets for training, development and testing on the [notMNIST dataset](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html).\n\nThe goal of this assignment is to progressively train deeper and more accurate models using TensorFlow." + }, + { + "metadata": { + "id": "JLpLa8Jt7Vu4", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport cPickle as pickle\nimport numpy as np\nimport tensorflow as tf", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "1HrCK6e17WzV", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "First reload the data we generated in `1_notmist.ipynb`." + }, + { + "metadata": { + "id": "y3-cj1bpmuxc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 19456, + "status": "ok", + "timestamp": 1449847956073, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "0ddb1607-1fc4-4ddb-de28-6c7ab7fb0c33" + }, + "cell_type": "code", + "input": "pickle_file = 'notMNIST.pickle'\n\nwith open(pickle_file, 'rb') as f:\n save = pickle.load(f)\n train_dataset = save['train_dataset']\n train_labels = save['train_labels']\n valid_dataset = save['valid_dataset']\n valid_labels = save['valid_labels']\n test_dataset = save['test_dataset']\n test_labels = save['test_labels']\n del save # hint to help gc free up memory\n print 'Training set', train_dataset.shape, train_labels.shape\n print 'Validation set', valid_dataset.shape, valid_labels.shape\n print 'Test set', test_dataset.shape, test_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training set (200000, 28, 28) (200000,)\nValidation set (10000, 28, 28) (10000,)\nTest set (18724, 28, 28) (18724,)\n" + } + ] + }, + { + "metadata": { + "id": "L7aHrm6nGDMB", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Reformat into a shape that's more adapted to the models we're going to train:\n- data as a flat matrix,\n- labels as float 1-hot encodings." + }, + { + "metadata": { + "id": "IRSyYiIIGIzS", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 19723, + "status": "ok", + "timestamp": 1449847956364, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "2ba0fc75-1487-4ace-a562-cf81cae82793" + }, + "cell_type": "code", + "input": "image_size = 28\nnum_labels = 10\n\ndef reformat(dataset, labels):\n dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]\n labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n return dataset, labels\ntrain_dataset, train_labels = reformat(train_dataset, train_labels)\nvalid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\ntest_dataset, test_labels = reformat(test_dataset, test_labels)\nprint 'Training set', train_dataset.shape, train_labels.shape\nprint 'Validation set', valid_dataset.shape, valid_labels.shape\nprint 'Test set', test_dataset.shape, test_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training set (200000, 784) (200000, 10)\nValidation set (10000, 784) (10000, 10)\nTest set (18724, 784) (18724, 10)\n" + } + ] + }, + { + "metadata": { + "id": "nCLVqyQ5vPPH", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "We're first going to train a multinomial logistic regression using simple gradient descent.\n\nTensorFlow works like this:\n* First you describe the computation that you want to see performed: what the inputs, the variables, and the operations look like. These get created as nodes over a computation graph. This description is all contained within the block below:\n\n with graph.as_default():\n ...\n\n* Then you can run the operations on this graph as many times as you want by calling `session.run()`, providing it outputs to fetch from the graph that get returned. This runtime operation is all contained in the block below:\n\n with tf.Session(graph=graph) as session:\n ...\n\nLet's load all the data into TensorFlow and build the computation graph corresponding to our training:" + }, + { + "metadata": { + "id": "Nfv39qvtvOl_", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# With gradient descent training, even this much data is prohibitive.\n# Subset the training data for faster turnaround.\ntrain_subset = 10000\n\ngraph = tf.Graph()\nwith graph.as_default():\n\n # Input data.\n # Load the training, validation and test data into constants that are\n # attached to the graph.\n tf_train_dataset = tf.constant(train_dataset[:train_subset, :])\n tf_train_labels = tf.constant(train_labels[:train_subset])\n tf_valid_dataset = tf.constant(valid_dataset)\n tf_test_dataset = tf.constant(test_dataset)\n \n # Variables.\n # These are the parameters that we are going to be training. The weight\n # matrix will be initialized using random valued following a (truncated)\n # normal distribution. The biases get initialized to zero.\n weights = tf.Variable(\n tf.truncated_normal([image_size * image_size, num_labels]))\n biases = tf.Variable(tf.zeros([num_labels]))\n \n # Training computation.\n # We multiply the inputs with the weight matrix, and add biases. We compute\n # the softmax and cross-entropy (it's one operation in TensorFlow, because\n # it's very common, and it can be optimized). We take the average of this\n # cross-entropy across all training examples: that's our loss.\n logits = tf.matmul(tf_train_dataset, weights) + biases\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n \n # Optimizer.\n # We are going to find the minimum of this loss using gradient descent.\n optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n \n # Predictions for the training, validation, and test data.\n # These are not part of training, but merely here so that we can report\n # accuracy figures as we train.\n train_prediction = tf.nn.softmax(logits)\n valid_prediction = tf.nn.softmax(\n tf.matmul(tf_valid_dataset, weights) + biases)\n test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases)", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "KQcL4uqISHjP", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Let's run this computation and iterate:" + }, + { + "metadata": { + "id": "z2cjdenH869W", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 9 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 57454, + "status": "ok", + "timestamp": 1449847994134, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "4c037ba1-b526-4d8e-e632-91e2a0333267" + }, + "cell_type": "code", + "input": "num_steps = 801\n\ndef accuracy(predictions, labels):\n return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n / predictions.shape[0])\n\nwith tf.Session(graph=graph) as session:\n # This is a one-time operation which ensures the parameters get initialized as\n # we described in the graph: random weights for the matrix, zeros for the\n # biases. \n tf.initialize_all_variables().run()\n print 'Initialized'\n for step in xrange(num_steps):\n # Run the computations. We tell .run() that we want to run the optimizer,\n # and get the loss value and the training predictions returned as numpy\n # arrays.\n _, l, predictions = session.run([optimizer, loss, train_prediction])\n if (step % 100 == 0):\n print 'Loss at step', step, ':', l\n print 'Training accuracy: %.1f%%' % accuracy(\n predictions, train_labels[:train_subset, :])\n # Calling .eval() on valid_prediction is basically like calling run(), but\n # just to get that one numpy array. Note that it recomputes all its graph\n # dependencies.\n print 'Validation accuracy: %.1f%%' % accuracy(\n valid_prediction.eval(), valid_labels)\n print 'Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Initialized\nLoss at step 0 : 17.2939\nTraining accuracy: 10.8%\nValidation accuracy: 13.8%\nLoss at step 100 : 2.26903\nTraining accuracy: 72.3%\nValidation accuracy: 71.6%\nLoss at step 200 : 1.84895\nTraining accuracy: 74.9%\nValidation accuracy: 73.9%\nLoss at step 300 : 1.60701\nTraining accuracy: 76.0%\nValidation accuracy: 74.5%\nLoss at step 400 : 1.43912\nTraining accuracy: 76.8%\nValidation accuracy: 74.8%\nLoss at step 500 : 1.31349\nTraining accuracy: 77.5%\nValidation accuracy: 75.0%\nLoss at step 600 : 1.21501\nTraining accuracy: 78.1%\nValidation accuracy: 75.4%\nLoss at step 700 : 1.13515\nTraining accuracy: 78.6%\nValidation accuracy: 75.4%\nLoss at step 800 : 1.0687\nTraining accuracy: 79.2%\nValidation accuracy: 75.6%\nTest accuracy: 82.9%\n" + } + ] + }, + { + "metadata": { + "id": "x68f-hxRGm3H", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Let's now switch to stochastic gradient descent training instead, which is much faster.\n\nThe graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `sesion.run()`." + }, + { + "metadata": { + "id": "qhPMzWYRGrzM", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "batch_size = 128\n\ngraph = tf.Graph()\nwith graph.as_default():\n\n # Input data. For the training data, we use a placeholder that will be fed\n # at run time with a training minibatch.\n tf_train_dataset = tf.placeholder(tf.float32,\n shape=(batch_size, image_size * image_size))\n tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))\n tf_valid_dataset = tf.constant(valid_dataset)\n tf_test_dataset = tf.constant(test_dataset)\n \n # Variables.\n weights = tf.Variable(\n tf.truncated_normal([image_size * image_size, num_labels]))\n biases = tf.Variable(tf.zeros([num_labels]))\n \n # Training computation.\n logits = tf.matmul(tf_train_dataset, weights) + biases\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n \n # Optimizer.\n optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n \n # Predictions for the training, validation, and test data.\n train_prediction = tf.nn.softmax(logits)\n valid_prediction = tf.nn.softmax(\n tf.matmul(tf_valid_dataset, weights) + biases)\n test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases)", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "XmVZESmtG4JH", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Let's run it:" + }, + { + "metadata": { + "id": "FoF91pknG_YW", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 6 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 66292, + "status": "ok", + "timestamp": 1449848003013, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "d255c80e-954d-4183-ca1c-c7333ce91d0a" + }, + "cell_type": "code", + "input": "num_steps = 3001\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print \"Initialized\"\n for step in xrange(num_steps):\n # Pick an offset within the training data, which has been randomized.\n # Note: we could use better randomization across epochs.\n offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n # Generate a minibatch.\n batch_data = train_dataset[offset:(offset + batch_size), :]\n batch_labels = train_labels[offset:(offset + batch_size), :]\n # Prepare a dictionary telling the session where to feed the minibatch.\n # The key of the dictionary is the placeholder node of the graph to be fed,\n # and the value is the numpy array to feed to it.\n feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n _, l, predictions = session.run(\n [optimizer, loss, train_prediction], feed_dict=feed_dict)\n if (step % 500 == 0):\n print \"Minibatch loss at step\", step, \":\", l\n print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n print \"Validation accuracy: %.1f%%\" % accuracy(\n valid_prediction.eval(), valid_labels)\n print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Initialized\nMinibatch loss at step 0 : 16.8091\nMinibatch accuracy: 12.5%\nValidation accuracy: 14.0%\nMinibatch loss at step 500 : 1.75256\nMinibatch accuracy: 77.3%\nValidation accuracy: 75.0%\nMinibatch loss at step 1000 : 1.32283\nMinibatch accuracy: 77.3%\nValidation accuracy: 76.6%\nMinibatch loss at step 1500 : 0.944533\nMinibatch accuracy: 83.6%\nValidation accuracy: 76.5%\nMinibatch loss at step 2000 : 1.03795\nMinibatch accuracy: 78.9%\nValidation accuracy: 77.8%\nMinibatch loss at step 2500 : 1.10219\nMinibatch accuracy: 80.5%\nValidation accuracy: 78.0%\nMinibatch loss at step 3000 : 0.758874\nMinibatch accuracy: 82.8%\nValidation accuracy: 78.8%\nTest accuracy: 86.1%\n" + } + ] + }, + { + "metadata": { + "id": "7omWxtvLLxik", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem\n-------\n\nTurn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units (nn.relu()) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n\n---" + } + ] + } + ], + "metadata": { + "name": "2_fullyconnected.ipynb", + "colabVersion": "0.3.2", + "colab_views": {}, + "colab_default_view": {} + }, + "nbformat": 3, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/3_regularization.ipynb b/3_regularization.ipynb new file mode 100644 index 00000000000..e2e0b81922d --- /dev/null +++ b/3_regularization.ipynb @@ -0,0 +1,196 @@ +{ + "worksheets": [ + { + "cells": [ + { + "metadata": { + "id": "kR-4eNdK6lYS", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Deep Learning\n=============\n\nAssignment 3\n------------\n\nPreviously in `2_fullyconnected.ipynb`, you trained a logistic regression and a neural network model.\n\nThe goal of this assignment is to explore regularization techniques." + }, + { + "metadata": { + "id": "JLpLa8Jt7Vu4", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport cPickle as pickle\nimport numpy as np\nimport tensorflow as tf", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "1HrCK6e17WzV", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "First reload the data we generated in _notmist.ipynb_." + }, + { + "metadata": { + "id": "y3-cj1bpmuxc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 11777, + "status": "ok", + "timestamp": 1449849322348, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "e03576f1-ebbe-4838-c388-f1777bcc9873" + }, + "cell_type": "code", + "input": "pickle_file = 'notMNIST.pickle'\n\nwith open(pickle_file, 'rb') as f:\n save = pickle.load(f)\n train_dataset = save['train_dataset']\n train_labels = save['train_labels']\n valid_dataset = save['valid_dataset']\n valid_labels = save['valid_labels']\n test_dataset = save['test_dataset']\n test_labels = save['test_labels']\n del save # hint to help gc free up memory\n print 'Training set', train_dataset.shape, train_labels.shape\n print 'Validation set', valid_dataset.shape, valid_labels.shape\n print 'Test set', test_dataset.shape, test_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training set (200000, 28, 28) (200000,)\nValidation set (10000, 28, 28) (10000,)\nTest set (18724, 28, 28) (18724,)\n" + } + ] + }, + { + "metadata": { + "id": "L7aHrm6nGDMB", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Reformat into a shape that's more adapted to the models we're going to train:\n- data as a flat matrix,\n- labels as float 1-hot encodings." + }, + { + "metadata": { + "id": "IRSyYiIIGIzS", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 11728, + "status": "ok", + "timestamp": 1449849322356, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "3f8996ee-3574-4f44-c953-5c8a04636582" + }, + "cell_type": "code", + "input": "image_size = 28\nnum_labels = 10\n\ndef reformat(dataset, labels):\n dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]\n labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n return dataset, labels\ntrain_dataset, train_labels = reformat(train_dataset, train_labels)\nvalid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\ntest_dataset, test_labels = reformat(test_dataset, test_labels)\nprint 'Training set', train_dataset.shape, train_labels.shape\nprint 'Validation set', valid_dataset.shape, valid_labels.shape\nprint 'Test set', test_dataset.shape, test_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training set (200000, 784) (200000, 10)\nValidation set (10000, 784) (10000, 10)\nTest set (18724, 784) (18724, 10)\n" + } + ] + }, + { + "metadata": { + "id": "RajPLaL_ZW6w", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "def accuracy(predictions, labels):\n return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n / predictions.shape[0])", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "sgLbUAQ1CW-1", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 1\n---------\n\nIntroduce and tune L2 regularization for both logistic and neural network models. Remember that L2 amounts to adding a penalty on the norm of the weights to the loss. In TensorFlow, you can compue the L2 loss for a tensor `t` using `nn.l2_loss(t)`. The right amount of regularization should improve your validation / test accuracy.\n\n---" + }, + { + "metadata": { + "id": "na8xX2yHZzNF", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 2\n---------\nLet's demonstrate an extreme case of overfitting. Restrict your training data to just a few batches. What happens?\n\n---" + }, + { + "metadata": { + "id": "ww3SCBUdlkRc", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 3\n---------\nIntroduce Dropout on the hidden layer of the neural network. Remember: Dropout should only be introduced during training, not evaluation, otherwise your evaluation results would be stochastic as well. TensorFlow provides `nn.dropout()` for that, but you have to make sure it's only inserted during training.\n\nWhat happens to our extreme overfitting case?\n\n---" + }, + { + "metadata": { + "id": "-b1hTz3VWZjw", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 4\n---------\n\nTry to get the best performance you can using a multi-layer model! The best reported test accuracy using a deep network is [97.1%](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html?showComment=1391023266211#c8758720086795711595).\n\nOne avenue you can explore is to add multiple layers.\n\nAnother one is to use learning rate decay:\n\n global_step = tf.Variable(0) # count the number of steps taken.\n learning_rate = tf.train.exponential_decay(0.5, step, ...)\n optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)\n \n ---\n" + } + ] + } + ], + "metadata": { + "name": "3_regularization.ipynb", + "colabVersion": "0.3.2", + "colab_views": {}, + "colab_default_view": {} + }, + "nbformat": 3, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb new file mode 100644 index 00000000000..b53cb8115fd --- /dev/null +++ b/4_convolutions.ipynb @@ -0,0 +1,242 @@ +{ + "worksheets": [ + { + "cells": [ + { + "metadata": { + "id": "4embtkV0pNxM", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Deep Learning\n=============\n\nAssignment 4\n------------\n\nPreviously in `2_fullyconnected.ipynb` and `3_regularization.ipynb`, we trained fully connected networks to classify [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) characters.\n\nThe goal of this assignment is make the neural network convolutional." + }, + { + "metadata": { + "id": "tm2CQN_Cpwj0", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport cPickle as pickle\nimport numpy as np\nimport tensorflow as tf", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "y3-cj1bpmuxc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 11948, + "status": "ok", + "timestamp": 1446658914837, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "016b1a51-0290-4b08-efdb-8c95ffc3cd01" + }, + "cell_type": "code", + "input": "pickle_file = 'notMNIST.pickle'\n\nwith open(pickle_file, 'rb') as f:\n save = pickle.load(f)\n train_dataset = save['train_dataset']\n train_labels = save['train_labels']\n valid_dataset = save['valid_dataset']\n valid_labels = save['valid_labels']\n test_dataset = save['test_dataset']\n test_labels = save['test_labels']\n del save # hint to help gc free up memory\n print 'Training set', train_dataset.shape, train_labels.shape\n print 'Validation set', valid_dataset.shape, valid_labels.shape\n print 'Test set', test_dataset.shape, test_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training set (200000, 28, 28) (200000,)\nValidation set (10000, 28, 28) (10000,)\nTest set (18724, 28, 28) (18724,)\n" + } + ] + }, + { + "metadata": { + "id": "L7aHrm6nGDMB", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Reformat into a TensorFlow-friendly shape:\n- convolutions need the image data formatted as a cube (width by height by #channels)\n- labels as float 1-hot encodings." + }, + { + "metadata": { + "id": "IRSyYiIIGIzS", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 11952, + "status": "ok", + "timestamp": 1446658914857, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "650a208c-8359-4852-f4f5-8bf10e80ef6c" + }, + "cell_type": "code", + "input": "image_size = 28\nnum_labels = 10\nnum_channels = 1 # grayscale\n\nimport numpy as np\n\ndef reformat(dataset, labels):\n dataset = dataset.reshape(\n (-1, image_size, image_size, num_channels)).astype(np.float32)\n labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n return dataset, labels\ntrain_dataset, train_labels = reformat(train_dataset, train_labels)\nvalid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\ntest_dataset, test_labels = reformat(test_dataset, test_labels)\nprint 'Training set', train_dataset.shape, train_labels.shape\nprint 'Validation set', valid_dataset.shape, valid_labels.shape\nprint 'Test set', test_dataset.shape, test_labels.shape", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Training set (200000, 28, 28, 1) (200000, 10)\nValidation set (10000, 28, 28, 1) (10000, 10)\nTest set (18724, 28, 28, 1) (18724, 10)\n" + } + ] + }, + { + "metadata": { + "id": "AgQDIREv02p1", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "def accuracy(predictions, labels):\n return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n / predictions.shape[0])", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "5rhgjmROXu2O", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Let's build a small network with two convolutional layers, followed by one fully connected layer. Convolutional networks are more expensive computationally, so we'll limit its depth and number of fully connected nodes." + }, + { + "metadata": { + "id": "IZYv70SvvOan", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "batch_size = 16\npatch_size = 5\ndepth = 16\nnum_hidden = 64\n\ngraph = tf.Graph()\n\nwith graph.as_default():\n\n # Input data.\n tf_train_dataset = tf.placeholder(\n tf.float32, shape=(batch_size, image_size, image_size, num_channels))\n tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))\n tf_valid_dataset = tf.constant(valid_dataset)\n tf_test_dataset = tf.constant(test_dataset)\n \n # Variables.\n layer1_weights = tf.Variable(tf.truncated_normal(\n [patch_size, patch_size, num_channels, depth], stddev=0.1))\n layer1_biases = tf.Variable(tf.zeros([depth]))\n layer2_weights = tf.Variable(tf.truncated_normal(\n [patch_size, patch_size, depth, depth], stddev=0.1))\n layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))\n layer3_weights = tf.Variable(tf.truncated_normal(\n [image_size / 4 * image_size / 4 * depth, num_hidden], stddev=0.1))\n layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))\n layer4_weights = tf.Variable(tf.truncated_normal(\n [num_hidden, num_labels], stddev=0.1))\n layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]))\n \n # Model.\n def model(data):\n conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')\n hidden = tf.nn.relu(conv + layer1_biases)\n conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')\n hidden = tf.nn.relu(conv + layer2_biases)\n shape = hidden.get_shape().as_list()\n reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])\n hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)\n return tf.matmul(hidden, layer4_weights) + layer4_biases\n \n # Training computation.\n logits = model(tf_train_dataset)\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n \n # Optimizer.\n optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)\n \n # Predictions for the training, validation, and test data.\n train_prediction = tf.nn.softmax(logits)\n valid_prediction = tf.nn.softmax(model(tf_valid_dataset))\n test_prediction = tf.nn.softmax(model(tf_test_dataset))", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "noKFb2UovVFR", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 37 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 63292, + "status": "ok", + "timestamp": 1446658966251, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" + }, + "user_tz": 480 + }, + "outputId": "28941338-2ef9-4088-8bd1-44295661e628" + }, + "cell_type": "code", + "input": "num_steps = 1001\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print \"Initialized\"\n for step in xrange(num_steps):\n offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n batch_data = train_dataset[offset:(offset + batch_size), :, :, :]\n batch_labels = train_labels[offset:(offset + batch_size), :]\n feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n _, l, predictions = session.run(\n [optimizer, loss, train_prediction], feed_dict=feed_dict)\n if (step % 50 == 0):\n print \"Minibatch loss at step\", step, \":\", l\n print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n print \"Validation accuracy: %.1f%%\" % accuracy(\n valid_prediction.eval(), valid_labels)\n print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Initialized\nMinibatch loss at step 0 : 3.51275\nMinibatch accuracy: 6.2%\nValidation accuracy: 12.8%\nMinibatch loss at step 50 : 1.48703\nMinibatch accuracy: 43.8%\nValidation accuracy: 50.4%\nMinibatch loss at step 100 : 1.04377\nMinibatch accuracy: 68.8%\nValidation accuracy: 67.4%\nMinibatch loss at step 150 : 0.601682\nMinibatch accuracy: 68.8%\nValidation accuracy: 73.0%\nMinibatch loss at step 200 : 0.898649\nMinibatch accuracy: 75.0%\nValidation accuracy: 77.8%\nMinibatch loss at step 250 : 1.3637\nMinibatch accuracy: 56.2%\nValidation accuracy: 75.4%\nMinibatch loss at step 300 : 1.41968\nMinibatch accuracy: 62.5%\nValidation accuracy: 76.0%\nMinibatch loss at step 350 : 0.300648\nMinibatch accuracy: 81.2%\nValidation accuracy: 80.2%\nMinibatch loss at step 400 : 1.32092\nMinibatch accuracy: 56.2%\nValidation accuracy: 80.4%\nMinibatch loss at step 450 : 0.556701\nMinibatch accuracy: 81.2%\nValidation accuracy: 79.4%\nMinibatch loss at step 500 : 1.65595\nMinibatch accuracy: 43.8%\nValidation accuracy: 79.6%\nMinibatch loss at step 550 : 1.06995\nMinibatch accuracy: 75.0%\nValidation accuracy: 81.2%\nMinibatch loss at step 600 : 0.223684\nMinibatch accuracy: 100.0%\nValidation accuracy: 82.3%\nMinibatch loss at step 650 : 0.619602\nMinibatch accuracy: 87.5%\nValidation accuracy: 81.8%\nMinibatch loss at step 700 : 0.812091\nMinibatch accuracy: 75.0%\nValidation accuracy: 82.4%\nMinibatch loss at step 750 : 0.276302\nMinibatch accuracy: 87.5%\nValidation accuracy: 82.3%\nMinibatch loss at step 800 : 0.450241\nMinibatch accuracy: 81.2%\nValidation accuracy: 82.3%\nMinibatch loss at step 850 : 0.137139\nMinibatch accuracy: 93.8%\nValidation accuracy: 82.3%\nMinibatch loss at step 900 : 0.52664\nMinibatch accuracy: 75.0%\nValidation accuracy: 82.2%\nMinibatch loss at step 950 : 0.623835\nMinibatch accuracy: 87.5%\nValidation accuracy: 82.1%\nMinibatch loss at step 1000 : 0.243114\nMinibatch accuracy: 93.8%\nValidation accuracy: 82.9%\nTest accuracy: 90.0%\n" + } + ] + }, + { + "metadata": { + "id": "KedKkn4EutIK", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 1\n---------\n\nThe convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n\n---" + }, + { + "metadata": { + "id": "klf21gpbAgb-", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 2\n---------\n\nTry to get the best performance you can using a convolutional net. Look for example at the classic [LeNet5](http://yann.lecun.com/exdb/lenet/) architecture, adding Dropout, and/or adding learning rate decay.\n\n---" + } + ] + } + ], + "metadata": { + "name": "4_convolutions.ipynb", + "colabVersion": "0.3.2", + "colab_views": {}, + "colab_default_view": {} + }, + "nbformat": 3, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb new file mode 100644 index 00000000000..95e89b4e566 --- /dev/null +++ b/5_word2vec.ipynb @@ -0,0 +1,402 @@ +{ + "worksheets": [ + { + "cells": [ + { + "metadata": { + "id": "D7tqLMoKF6uq", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Deep Learning\n=============\n\nAssignment 5\n------------\n\nThe goal of this assignment is to train a skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." + }, + { + "metadata": { + "id": "0K1ZyLn04QZf", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport collections\nimport math\nimport numpy as np\nimport os\nimport random\nimport tensorflow as tf\nimport urllib\nimport zipfile\nfrom matplotlib import pylab\nfrom sklearn.manifold import TSNE", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "aCjPJE944bkV", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Download the data from the source website if necessary." + }, + { + "metadata": { + "id": "RJ-o3UBUFtCw", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 14640, + "status": "ok", + "timestamp": 1445964482948, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "c4ec222c-80b5-4298-e635-93ca9f79c3b7" + }, + "cell_type": "code", + "input": "url = 'http://mattmahoney.net/dc/'\n\ndef maybe_download(filename, expected_bytes):\n \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n if not os.path.exists(filename):\n filename, _ = urllib.urlretrieve(url + filename, filename)\n statinfo = os.stat(filename)\n if statinfo.st_size == expected_bytes:\n print 'Found and verified', filename\n else:\n print statinfo.st_size\n raise Exception(\n 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n return filename\n\nfilename = maybe_download('text8.zip', 31344016)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Found and verified text8.zip\n" + } + ] + }, + { + "metadata": { + "id": "Zqz3XiqI4mZT", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Read the data into a string." + }, + { + "metadata": { + "id": "Mvf09fjugFU_", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 28844, + "status": "ok", + "timestamp": 1445964497165, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "e3a928b4-1645-4fe8-be17-fcf47de5716d" + }, + "cell_type": "code", + "input": "def read_data(filename):\n f = zipfile.ZipFile(filename)\n for name in f.namelist():\n return f.read(name).split()\n f.close()\n \nwords = read_data(filename)\nprint 'Data size', len(words)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Data size 17005207\n" + } + ] + }, + { + "metadata": { + "id": "Zdw6i4F8glpp", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Build the dictionary and replace rare words with UNK token." + }, + { + "metadata": { + "id": "gAL1EECXeZsD", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 28849, + "status": "ok", + "timestamp": 1445964497178, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "3fb4ecd1-df67-44b6-a2dc-2291730970b2" + }, + "cell_type": "code", + "input": "vocabulary_size = 50000\n\ndef build_dataset(words):\n count = [['UNK', -1]]\n count.extend(collections.Counter(words).most_common(vocabulary_size - 1))\n dictionary = dict()\n for word, _ in count:\n dictionary[word] = len(dictionary)\n data = list()\n unk_count = 0\n for word in words:\n if word in dictionary:\n index = dictionary[word]\n else:\n index = 0 # dictionary['UNK']\n unk_count = unk_count + 1\n data.append(index)\n count[0][1] = unk_count\n reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys())) \n return data, count, dictionary, reverse_dictionary\n\ndata, count, dictionary, reverse_dictionary = build_dataset(words)\nprint 'Most common words (+UNK)', count[:5]\nprint 'Sample data', data[:10]\ndel words # Hint to reduce memory.", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Most common words (+UNK) [['UNK', 418391], ('the', 1061396), ('of', 593677), ('and', 416629), ('one', 411764)]\nSample data [5243, 3083, 12, 6, 195, 2, 3136, 46, 59, 156]\n" + } + ] + }, + { + "metadata": { + "id": "lFwoyygOmWsL", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Function to generate a training batch for the skip-gram model." + }, + { + "metadata": { + "id": "w9APjA-zmfjV", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 113, + "status": "ok", + "timestamp": 1445964901989, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "67cccb02-cdaf-4e47-d489-43bcc8d57bb8" + }, + "cell_type": "code", + "input": "data_index = 0\n\ndef generate_batch(batch_size, num_skips, skip_window):\n global data_index\n assert batch_size % num_skips == 0\n assert num_skips <= 2 * skip_window\n batch = np.ndarray(shape=(batch_size), dtype=np.int32)\n labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)\n span = 2 * skip_window + 1 # [ skip_window target skip_window ]\n buffer = collections.deque(maxlen=span)\n for _ in range(span):\n buffer.append(data[data_index])\n data_index = (data_index + 1) % len(data)\n for i in range(batch_size / num_skips):\n target = skip_window # target label at the center of the buffer\n targets_to_avoid = [ skip_window ]\n for j in range(num_skips):\n while target in targets_to_avoid:\n target = random.randint(0, span - 1)\n targets_to_avoid.append(target)\n batch[i * num_skips + j] = buffer[skip_window]\n labels[i * num_skips + j, 0] = buffer[target]\n buffer.append(data[data_index])\n data_index = (data_index + 1) % len(data)\n return batch, labels\n\nbatch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)\nfor i in range(8):\n print batch[i], '->', labels[i, 0]\n print reverse_dictionary[batch[i]], '->', reverse_dictionary[labels[i, 0]]", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": " 3083 -> 5243\noriginated -> anarchism\n3083 -> 12\noriginated -> as\n12 -> 3083\nas -> originated\n12 -> 6\nas -> a\n6 -> 12\na -> as\n6 -> 195\na -> term\n195 -> 6\nterm -> a\n195 -> 2\nterm -> of\n" + } + ] + }, + { + "metadata": { + "id": "Ofd1MbBuwiva", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Train a skip-gram model." + }, + { + "metadata": { + "id": "8pQKsV4Vwlzy", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "batch_size = 128\nembedding_size = 128 # Dimension of the embedding vector.\nskip_window = 1 # How many words to consider left and right.\nnum_skips = 2 # How many times to reuse an input to generate a label.\n# We pick a random validation set to sample nearest neighbors. here we limit the\n# validation samples to the words that have a low numeric ID, which by\n# construction are also the most frequent. \nvalid_size = 16 # Random set of words to evaluate similarity on.\nvalid_window = 100 # Only pick dev samples in the head of the distribution.\nvalid_examples = np.array(random.sample(xrange(valid_window), valid_size))\nnum_sampled = 64 # Number of negative examples to sample.\n\ngraph = tf.Graph()\n\nwith graph.as_default():\n\n # Input data.\n train_dataset = tf.placeholder(tf.int32, shape=[batch_size])\n train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])\n valid_dataset = tf.constant(valid_examples, dtype=tf.int32)\n \n # Variables.\n embeddings = tf.Variable(\n tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))\n softmax_weights = tf.Variable(\n tf.truncated_normal([vocabulary_size, embedding_size],\n stddev=1.0 / math.sqrt(embedding_size)))\n softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))\n \n # Model.\n # Look up embeddings for inputs.\n embed = tf.nn.embedding_lookup(embeddings, train_dataset)\n # Compute the softmax loss, using a sample of the negative labels each time.\n loss = tf.reduce_mean(\n tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,\n train_labels, num_sampled, vocabulary_size))\n\n # Optimizer.\n optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)\n \n # Compute the similarity between minibatch examples and all embeddings.\n # We use the cosine distance:\n norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))\n normalized_embeddings = embeddings / norm\n valid_embeddings = tf.nn.embedding_lookup(\n normalized_embeddings, valid_dataset)\n similarity = tf.matmul(valid_embeddings, tf.transpose(normalized_embeddings))", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "1bQFGceBxrWW", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 23 + }, + { + "item_id": 48 + }, + { + "item_id": 61 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 436189, + "status": "ok", + "timestamp": 1445965429787, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "5ebd6d9a-33c6-4bcd-bf6d-252b0b6055e4" + }, + "cell_type": "code", + "input": "num_steps = 100001\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print \"Initialized\"\n average_loss = 0\n for step in xrange(num_steps):\n batch_data, batch_labels = generate_batch(\n batch_size, num_skips, skip_window)\n feed_dict = {train_dataset : batch_data, train_labels : batch_labels}\n _, l = session.run([optimizer, loss], feed_dict=feed_dict)\n average_loss += l\n if step % 2000 == 0:\n if step > 0:\n average_loss = average_loss / 2000\n # The average loss is an estimate of the loss over the last 2000 batches.\n print \"Average loss at step\", step, \":\", average_loss\n average_loss = 0\n # note that this is expensive (~20% slowdown if computed every 500 steps)\n if step % 10000 == 0:\n sim = similarity.eval()\n for i in xrange(valid_size):\n valid_word = reverse_dictionary[valid_examples[i]]\n top_k = 8 # number of nearest neighbors\n nearest = (-sim[i, :]).argsort()[1:top_k+1]\n log = \"Nearest to %s:\" % valid_word\n for k in xrange(top_k):\n close_word = reverse_dictionary[nearest[k]]\n log = \"%s %s,\" % (log, close_word)\n print log\n final_embeddings = normalized_embeddings.eval()", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Initialized\nAverage loss at step 0 : 8.58149623871\nNearest to been: unfavourably, marmara, ancestral, legal, bogart, glossaries, worst, rooms,\nNearest to time: conformist, strawberries, sindhi, waterfall, xia, nominates, psp, sensitivity,\nNearest to over: overlord, panda, golden, semigroup, rawlings, involved, shreveport, handling,\nNearest to not: hymenoptera, reintroducing, lamiaceae, because, davao, omnipotent, combustion, debilitating,\nNearest to three: catalog, koza, gn, braque, holstein, postgresql, luddite, justine,\nNearest to if: chilled, vince, fiddler, represented, sandinistas, happiness, lya, glands,\nNearest to there: coast, photosynthetic, kimmei, legally, inner, illyricum, formats, fullmetal,\nNearest to between: chuvash, prinz, suitability, wolfe, guideline, computability, diminutive, paulo,\nNearest to from: tanganyika, workshop, elphinstone, spearhead, resurrected, kevlar, shangri, loves,\nNearest to state: sextus, wuppertal, glaring, inches, unrounded, courageous, adler, connie,\nNearest to on: gino, phocas, rhine, jg, macrocosm, jackass, jays, theorie,\nNearest to and: standings, towed, reyes, willard, equality, juggling, wladislaus, faked,\nNearest to eight: gresham, dogg, moko, tennis, superseded, telegraphy, scramble, vinod,\nNearest to they: prisons, divisor, coder, ribeira, willingness, factional, nne, lotta,\nNearest to more: blues, fur, sterling, tangier, khwarizmi, discouraged, cal, deicide,\nNearest to other: enemies, bogged, brassicaceae, lascaux, dispense, alexandrians, crimea, dou,\nAverage loss at step 2000 : 4.39983723116\nAverage loss at step 4000 : 3.86921076906\nAverage loss at step 6000 : 3.72542127335\nAverage loss at step 8000 : 3.57835536212\nAverage loss at step 10000 : 3.61056993055\nNearest to been: glossaries, legal, unfavourably, be, hadad, wore, scarcity, were,\nNearest to time: strawberries, conformist, gleichschaltung, waterfall, molality, nominates, baal, dole,\nNearest to over: golden, semigroup, catus, motorways, brick, shehri, mussolini, overlord,\nNearest to not: hinayana, it, often, they, boots, also, noaa, lindsey,\nNearest to three: four, seven, six, five, nine, eight, two, zero,\nNearest to if: glands, euros, wallpaper, redefine, toho, confuse, unsound, shepherd,\nNearest to there: it, they, fullmetal, pace, legally, harpsichord, mma, bug,\nNearest to between: chuvash, wandering, from, kirsch, pursuant, eurocents, suitability, jackie,\nNearest to from: into, in, workshop, to, at, misogynist, elphinstone, spearhead,\nNearest to state: sextus, glaring, connie, adler, esoteric, didactic, handedness, presidents,\nNearest to on: in, at, for, ruminants, wakefulness, torrey, foley, gino,\nNearest to and: or, who, but, zelda, of, for, thirst, chisel,\nNearest to eight: nine, six, seven, five, four, three, zero, two,\nNearest to they: he, prisons, there, we, hydrate, it, not, cumbersome,\nNearest to more: skye, blues, trypomastigotes, deicide, most, readable, used, sterling,\nNearest to other: trochaic, hush, surveyors, joachim, differentiation, attackers, reverence, attestation,\nAverage loss at step 12000 : 3.66169466591\nAverage loss at step 14000 : 3.60342905837\nAverage loss at step 16000 : 3.57761328053\nAverage loss at step 18000 : 3.57667332476\nAverage loss at step 20000 : 3.53310145146\nNearest to been: be, become, was, hadad, unfavourably, were, wore, partido,\nNearest to time: gleichschaltung, strawberries, year, nominates, conformist, etch, admittedly, treasuries,\nNearest to over: golden, semigroup, motorways, rawlings, triangle, trey, ustawa, mattingly,\nNearest to not: they, boots, often, dieppe, still, hinayana, nearly, be,\nNearest to three: two, four, five, seven, eight, six, nine, one,\nNearest to if: wallpaper, euros, before, toho, unsound, so, bg, pfc,\nNearest to there: they, it, he, usually, which, we, not, transactions,\nNearest to between: from, with, about, near, reactance, eurocents, wandering, voltaire,\nNearest to from: into, workshop, by, between, in, on, elphinstone, under,\nNearest to state: glaring, esoteric, succeeding, sextus, vorarlberg, presidents, depends, connie,\nNearest to on: in, at, upon, during, from, janis, foley, nubian,\nNearest to and: or, thirst, but, where, s, who, pfaff, including,\nNearest to eight: nine, seven, six, five, four, three, zero, one,\nNearest to they: there, he, we, not, it, you, prisons, who,\nNearest to more: less, most, deicide, skye, trypomastigotes, interventionism, toed, drummond,\nNearest to other: such, joachim, hush, attackers, surveyors, trochaic, differentiation, reverence,\nAverage loss at step 22000 : 3.59519316927\nAverage loss at step 24000 : 3.55378576797\nAverage loss at step 26000 : 3.56455037558\nAverage loss at step 28000 : 3.5040882225\nAverage loss at step 30000 : 3.39208897972\nNearest to been: become, be, were, was, spotless, hadad, by, hausdorff,\nNearest to time: gleichschaltung, year, day, nominates, jesus, strawberries, way, admittedly,\nNearest to over: golden, semigroup, motorways, rawlings, interventionism, counternarcotics, adaption, brick,\nNearest to not: often, they, it, never, still, nor, boots, pki,\nNearest to three: four, six, two, eight, five, seven, nine, zero,\nNearest to if: when, before, so, should, toho, where, bg, wallpaper,\nNearest to there: they, it, which, usually, he, that, also, now,\nNearest to between: with, from, in, panasonic, presupposes, churchmen, hijacking, where,\nNearest to from: into, elphinstone, workshop, between, through, speculates, sosa, in,\nNearest to state: esoteric, glaring, presidents, vorarlberg, atmosphere, succeeding, lute, connie,\nNearest to on: upon, in, janis, during, torrey, against, infield, catalans,\nNearest to and: or, thirst, in, but, of, sobib, cleaves, including,\nNearest to eight: nine, six, four, seven, three, zero, five, one,\nNearest to they: we, there, he, you, it, these, who, i,\nNearest to more: less, most, deicide, faster, toed, very, skye, tonic,\nNearest to other: different, attackers, joachim, various, such, many, differentiation, these,\nAverage loss at step 32000 : 3.49501452419\nAverage loss at step 34000 : 3.48593705952\nAverage loss at step 36000 : 3.50112806576\nAverage loss at step" + }, + { + "output_type": "stream", + "stream": "stdout", + "text": " 38000 : 3.49244426501\nAverage loss at step 40000 : 3.3890105716\nNearest to been: become, be, were, was, jolie, hausdorff, spotless, had,\nNearest to time: year, way, gleichschaltung, period, day, stanislav, stage, outcome,\nNearest to over: through, semigroup, rawlings, golden, about, brick, on, motorways,\nNearest to not: they, radiated, never, pki, still, omnipotent, hinayana, really,\nNearest to three: four, six, five, two, seven, eight, one, nine,\nNearest to if: when, before, where, then, bg, because, can, should,\nNearest to there: they, it, he, usually, this, typically, still, often,\nNearest to between: with, in, from, about, against, churchmen, johansen, presupposes,\nNearest to from: into, through, elphinstone, in, workshop, between, suing, under,\nNearest to state: esoteric, presidents, atmosphere, vorarlberg, lute, succeeding, glaring, didactic,\nNearest to on: upon, at, in, during, unitarians, under, catalans, batavians,\nNearest to and: or, but, s, incapacitation, including, while, of, which,\nNearest to eight: nine, six, seven, four, five, three, one, two,\nNearest to they: we, he, there, you, she, i, not, it,\nNearest to more: less, most, deicide, toed, greater, faster, quite, longer,\nNearest to other: various, different, attackers, joachim, clutter, nz, trochaic, apulia,\nAverage loss at step 42000 : 3.45294014364\nAverage loss at step 44000 : 3.47660055941\nAverage loss at step 46000 : 3.47458503014\nAverage loss at step 48000 : 3.47261548793\nAverage loss at step 50000 : 3.45390708435\nNearest to been: become, be, had, was, were, hausdorff, prem, remained,\nNearest to time: way, year, period, stv, day, gleichschaltung, stage, outcome,\nNearest to over: through, golden, semigroup, about, brick, counternarcotics, theremin, mattingly,\nNearest to not: they, still, never, really, sometimes, it, kiwifruit, nearly,\nNearest to three: five, four, six, seven, two, eight, one, nine,\nNearest to if: when, before, where, because, connexion, though, so, whether,\nNearest to there: they, it, he, this, now, often, usually, still,\nNearest to between: with, from, fashioned, churchmen, panasonic, explores, within, racial,\nNearest to from: into, through, under, elphinstone, between, workshop, circumpolar, idiom,\nNearest to state: atmosphere, vorarlberg, esoteric, presidents, madhya, majority, moulin, bowmen,\nNearest to on: upon, in, catalans, tezuka, minotaurs, wakefulness, batavians, guglielmo,\nNearest to and: or, but, thirst, signifier, which, however, including, unattractive,\nNearest to eight: six, nine, seven, five, four, three, zero, two,\nNearest to they: we, there, he, you, it, she, these, not,\nNearest to more: less, most, quite, very, further, faster, toed, deicide,\nNearest to other: various, different, many, attackers, are, joachim, nihilo, reject,\nAverage loss at step 52000 : 3.43597227755\nAverage loss at step 54000 : 3.25126817495\nAverage loss at step 56000 : 3.35102432287\nAverage loss at step 58000 : 3.44654818082\nAverage loss at step 60000 : 3.4287913968\nNearest to been: become, be, was, prem, had, remained, hadad, stanislavsky,\nNearest to time: year, way, period, stv, barely, name, stage, restoring,\nNearest to over: about, through, golden, adaption, counternarcotics, up, mattingly, brick,\nNearest to not: still, never, nor, kiwifruit, they, nearly, therefore, rarely,\nNearest to three: two, five, four, six, seven, eight, one, nine,\nNearest to if: when, though, before, where, although, because, can, could,\nNearest to there: they, it, he, still, she, we, this, often,\nNearest to between: with, from, churchmen, among, ethical, within, vma, panasonic,\nNearest to from: through, into, under, during, between, in, suing, across,\nNearest to state: atmosphere, infringe, madhya, vorarlberg, government, bowmen, vargas, republic,\nNearest to on: upon, through, within, ridiculous, janis, in, under, over,\nNearest to and: or, while, including, but, of, like, whose, bannister,\nNearest to eight: nine, six, five, four, seven, zero, three, two,\nNearest to they: we, there, you, he, it, these, she, prisons,\nNearest to more: less, most, quite, further, toed, very, faster, rather,\nNearest to other: different, various, many, nihilo, these, amour, including, screenplays,\nAverage loss at step 62000 : 3.38358767056\nAverage loss at step 64000 : 3.41693099326\nAverage loss at step 66000 : 3.39588000977\nAverage loss at step 68000 : 3.35567189544\nAverage loss at step 70000 : 3.38878934443\nNearest to been: become, be, was, prem, remained, were, being, discounts,\nNearest to time: year, way, day, period, barely, ethos, stage, reason,\nNearest to over: about, through, fortunately, semigroup, theremin, off, loudest, up,\nNearest to not: still, nor, never, they, actually, nearly, unelected, therefore,\nNearest to three: five, two, four, six, seven, eight, nine, zero,\nNearest to if: when, though, before, where, because, then, after, since,\nNearest to there: they, it, he, often, she, we, usually, still,\nNearest to between: among, with, within, from, ethical, churchmen, racial, prentice,\nNearest to from: through, into, within, during, under, until, between, across,\nNearest to state: city, atmosphere, desks, surrounding, preservation, bohr, principal, republic,\nNearest to on: upon, tezuka, through, within, wakefulness, catalans, at, ingeborg,\nNearest to and: or, but, while, including, thirst, jerzy, massing, abadan,\nNearest to eight: seven, six, nine, five, four, three, two, zero,\nNearest to they: we, you, he, there, she, it, prisons, who,\nNearest to more: less, most, quite, very, faster, smaller, further, larger,\nNearest to other: various, different, some, screenplays, lab, many, including, debugging,\nAverage loss at step 72000 : 3.41103189731\nAverage loss at step 74000 : 3.44926435578\nAverage loss at step 76000 : 3.4423020488\nAverage loss at step 78000 : 3.41976813722\nAverage loss at step 80000 : 3.39511853886\nNearest to been: become, be, remained, was, grown, were, prem, already," + }, + { + "output_type": "stream", + "stream": "stdout", + "text": "\nNearest to time: year, way, period, reason, barely, distance, stage, day,\nNearest to over: about, fortunately, through, semigroup, further, mattingly, rawlings, golden,\nNearest to not: still, they, nor, never, we, kiwifruit, noaa, really,\nNearest to three: five, two, seven, four, eight, six, nine, zero,\nNearest to if: when, where, though, before, since, because, although, follows,\nNearest to there: they, it, he, we, she, still, typically, actually,\nNearest to between: with, among, within, in, racial, around, from, serapeum,\nNearest to from: into, through, in, within, under, using, during, towards,\nNearest to state: city, atmosphere, ferro, vorarlberg, surrounding, republic, madhya, national,\nNearest to on: upon, poll, in, from, tezuka, janis, through, within,\nNearest to and: or, but, including, while, s, which, thirst, although,\nNearest to eight: nine, seven, six, five, four, three, zero, two,\nNearest to they: we, you, there, he, she, it, these, not,\nNearest to more: less, most, smaller, very, faster, quite, rather, larger,\nNearest to other: various, different, joachim, including, theos, smaller, individual, screenplays,\nAverage loss at step 82000 : 3.40933967865\nAverage loss at step 84000 : 3.41618054378\nAverage loss at step 86000 : 3.31485116804\nAverage loss at step 88000 : 3.37068593091\nAverage loss at step 90000 : 3.2785516749\nNearest to been: become, be, was, prem, remained, grown, recently, already,\nNearest to time: year, way, period, day, barely, battle, buds, name,\nNearest to over: through, about, fortunately, off, theremin, semigroup, extraterrestrial, mattingly,\nNearest to not: nor, still, never, otherwise, generally, separately, gown, hydrate,\nNearest to three: four, five, six, two, eight, seven, nine, zero,\nNearest to if: when, where, before, though, because, since, then, while,\nNearest to there: they, it, he, we, she, still, typically, fiorello,\nNearest to between: with, among, within, from, churchmen, prentice, racial, panasonic,\nNearest to from: through, into, across, during, towards, until, at, within,\nNearest to state: bohr, city, atmosphere, ferro, bowmen, republic, retaliation, vorarlberg,\nNearest to on: upon, in, tezuka, at, during, within, via, catalans,\nNearest to and: or, including, but, while, like, thirst, with, schuman,\nNearest to eight: seven, nine, six, five, four, three, zero, two,\nNearest to they: we, there, he, you, she, it, prisons, these,\nNearest to more: less, most, very, faster, larger, quite, smaller, better,\nNearest to other: different, various, tamara, prosthetic, including, individual, failing, restaurants,\nAverage loss at step 92000 : 3.40355363208\nAverage loss at step 94000 : 3.35647508007\nAverage loss at step 96000 : 3.34374570692\nAverage loss at step 98000 : 3.4230104093\nAverage loss at step 100000 : 3.36909827\nNearest to been: become, be, grown, was, being, already, remained, prem,\nNearest to time: way, year, day, period, years, days, mothersbaugh, separators,\nNearest to over: through, about, semigroup, further, fortunately, off, into, theremin,\nNearest to not: never, nor, still, dieppe, really, unelected, actually, now,\nNearest to three: four, two, five, seven, six, eight, nine, zero,\nNearest to if: when, though, where, before, is, abe, then, follows,\nNearest to there: they, it, he, we, still, she, typically, often,\nNearest to between: within, with, among, churchmen, around, explores, from, reactance,\nNearest to from: into, through, within, across, in, between, using, workshop,\nNearest to state: atmosphere, bohr, national, ferro, germ, desks, city, unpaid,\nNearest to on: upon, in, within, tezuka, janis, batavians, about, macrocosm,\nNearest to and: or, but, purview, thirst, sukkot, epr, including, honesty,\nNearest to eight: seven, nine, six, four, five, three, zero, one,\nNearest to they: we, there, you, he, she, prisons, it, these,\nNearest to more: less, most, very, quite, faster, larger, rather, smaller,\nNearest to other: various, different, tamara, theos, some, cope, many, others,\n" + } + ] + }, + { + "metadata": { + "id": "jjJXYA_XzV79", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "num_points = 400\n\ntsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000)\ntwo_d_embeddings = tsne.fit_transform(final_embeddings[1:num_points+1, :])", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "o_e0D_UezcDe", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 4763, + "status": "ok", + "timestamp": 1445965465525, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "df22e4a5-e8ec-4e5e-d384-c6cf37c68c34" + }, + "cell_type": "code", + "input": "def plot(embeddings, labels):\n assert embeddings.shape[0] >= len(labels), 'More labels than embeddings'\n pylab.figure(figsize=(15,15)) # in inches\n for i, label in enumerate(labels):\n x, y = embeddings[i,:]\n pylab.scatter(x, y)\n pylab.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points',\n ha='right', va='bottom')\n pylab.show()\n\nwords = [reverse_dictionary[i] for i in xrange(1, num_points+1)]\nplot(two_d_embeddings, words)", + "language": "python", + "outputs": [ + { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3MAAANpCAYAAAChBGCHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdAldUfx/H3BdlbQEVzoyDukZaae5aZ5tbcIzUz9x5Z\njhwNNXMVztTExFHqT9Ny50hFc+ZKEVBwAbLh/v4gSXILChc/r3+69/Lc53yfewL8cM5zjsFoNBoR\nERERERERk2KW0QWIiIiIiIjI01OYExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiY\nIIU5ERERERERE5TmMBceHk7fvn1p2LAhb775JgEBAdy6dYvOnTtTv359unTpQnh4eHrUKiIiIiIi\nIv8wpHWfuaFDh/Lqq6/SvHlzEhISiI6OZvbs2bi4uNC9e3fmzZtHeHg4gwYNSq+aRUREREREXnpp\nGpmLiIjg4MGDNG/eHIBs2bLh4ODAtm3baNq0KQBNmzbll19+SXulIiIiIiIikiJbWt4cGBhI9uzZ\nGT58OKdOnaJ48eKMGDGC69ev4+bmBoCbmxvXr19Pl2JFREREREQkWZpG5hISEjhx4gRt2rTB398f\nGxsb5s2bl+oYg8GAwWBIU5EiIiIiIiKSWprCXK5cuciZMyelSpUCoH79+pw4cQI3NzdCQ0MBuHbt\nGtmzZ3/kedJ4256IiIiIiMhLJ03TLN3d3fHw8ODChQsULFiQvXv34unpiaenJ/7+/vTo0YM1a9ZQ\np06dR57HYDAQGhqRllIkE3N3d1D/ZmHq36xLfZu1qX+zLvVt1qb+zbrc3R2e+j1pCnMAo0ePZtCg\nQcTHx5MvXz4mTZpEYmIi/fr148cffyRPnjx89dVXaW1GRERERERE7pHmMOft7c2PP/543+sLFy5M\n66lFRERERETkIdK8abiIiIiIiIi8eApzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgghTkRERER\nERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiImSGFORERE\nRETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiICVKYExER\nERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIiYoIU5kRE\nREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgghTkR\nERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiImSGFO\nRERERETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiICVKY\nExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIiYoIU\n5kREREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgg\nhTkRERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiIm\nSGFORERERETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiI\nCVKYExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIi\nYoIU5kREREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiI\niJgghTkRERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIi\nIiImSGFORERERETEBCnMiYiIiIiImCCFOREREREREROULaMLEBERkcxnxYqlbNiwHoBGjZpQrVoN\nBg78kFKlyvLnnwG4u+dg0qTPsbKy4sqVQL74Ygq3bt3E2tqaoUNHki9fgYy9ABGRl4BG5kRERCSV\nU6dOsnHjT8yfv4i5cxeyfr0/ERHhBAZeplmzlixZshJ7ewe2b98GwJQpE+jffzDffbeE3r0/4vPP\nJ2fwFYiIvBw0MiciIiKpHD16hGrVamJlZQ1A9eq1CAg4jIdHHjw9iwDg5eVNcHAQ0dHRHDt2lNGj\nh6a8Pz4+IUPqFhF52SjMiYiISCoGg+GBr1taWqQ8NjMzJykpDqMxCQcHBxYsWPaiyhMRkX9omqWI\niIikUrp0GXbs+I3Y2Biio6PZseNXSpcue99xRqMRW1s7cufOza+//pLy2tmzf73okkVEXkoamRMR\n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\ntt/uu1FQ2bDhLEFBPQExoMrp093Yu/ckLi7/y/djfWxO5s2bN9i8eT0gx9KyEiNGjEVNTQ0Xl9Y0\nauTEpUsXSEh4J9yiq6tLr159cHRsDLz7jsXERHPunCKgmj17AdOmTSQlJQWAUaPGY2VlQ9++PYmI\neMy4cSNo2bINwcFBbNu2mTlzFhAf/5axY4cTHR2NpqYWDx7cx9m5FdHRUcyc6Z2jR+GX8PBhJMuX\nh5CRIaZLl7LY22d9efCz/WYICHwJX2faIiAgIPAfYsaMtqxaFcK0aTvZtcvim86XyzQmNzcvz+rV\ny1i/fg0tWrThyJFDnDhxJJtJup1ddfbs2cWsWdOUfXxokr5u3RbWrduCv/82fH0XK9t9yiQ90+Kh\nYPBzeZaWKlWa3bt30L27K4mJibi4uDFt2mxWrFhMz55d6dWrK7dv3/jo/rq6elhZ2TB+/BRiYqLx\n919DerqU4cMV3mdt2rTj4cP7tGjRmEOH9pGQkMjz58/Q0dFFXV0DH5+pnDlzSilYkUlmiaa9vT2g\nKNHM5MqVixw+fIBevbrSr19P4uPfEhn5FJFIRKVKVShc2ASRSET58hWJiYnh8uWbpKVpkXlvYmIa\nsW/fgxzPJzExkd27d37RtXRxaU18/Nsv2vdX5enTCDp0cGXTpgB0dHTYunUTM2d6M3XqLPbt24dM\nJlNeb5FIhJ6eHv7+2+jYsRMLF85Xrs9K9u+YkZERCxYsxc9vE97eM/nzT0Wpd//+g7GxsWPdui10\n6tQ1yz5r167EwqIS/v5b6ddvINOnTwIUnnuXLoVQpkxr5s5dxLp1qz86p+5zvH79hp49b+Lv78bG\nja707fuasLDHnz0fAYFfDSEzJyAgIJBLRCIRrVo5fJdjFRST9IJIcnIyY8eOICEhHplMym+/9ade\nvYZs2bIBdXV1XFzcWLRoPg8e3GfhwuVcvXqFAwf+UqrnfS/EYjETJ2Y9ZoUKFVmyZFW2tosXr8yy\n7Orahb//Pq3cZ9iwUezatYPw8LtKURszs5I0auSUo4rf6tX+BAVd5vTpEwQG7mDhwuXZ2mTyoRCF\nl9coatSonWVdcHBQlkBfLFZBJpNSpIghItH7D+MS9D6irJ2QEM/u3QG0b++SbZtUqigJ/BCZTIZY\nLM5xrlRBw929Pvv3r/+3zFKGo+MW2rbNfq75xYdzMtevX0Px4maUKFESUJQlBgbuoFOnLgA0adJM\n+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\nw9DPMeWzadOmYunSpcWzzz5bFEVh2yqyYsWK4sMPPyyKoigGBgaKCxcuXPO+w/rOXG1t7dArvhcv\nXhz6cPG9e/emtbU1lUol48ePz4QJE/7yrh23vq1bt2bx4sWpVCpJkpqamiS2rSbr16/P8uXL/3LN\nvtXh0UcfzciRf/zz8NBDD+XkyZNJ7FsNenp6MmHChIwfPz6VSiWtra3Zu3fvcB+LG1BbW5v7778/\nSXL77bdn4sSJ6evrS1dXV2bNmpUkmTVrVvbs2TOcx+Q6nTx5Mvv27cvTTz89dM221eHixYs5ePBg\n5syZkyQZPXp07rzzzmved1hjbtmyZeno6Mjjjz+eN954I8uWLUuSnDp1KvX19UPPq6+vT19f33Ad\nk+vQ29ubgwcPZu7cuZk/f34OHTqUxLbVYs+ePamvr8/kyZP/ct2+1Wf79u157LHHkti3GvT19WXc\nuHFDX9fV1dmwihw/fjzff/99GhoacubMmYwdOzZJMnbs2Jw5c2aYT8f1eP3117NixYqhF9iS2LZK\nHD9+PDU1NXnppZcya9asrF69Or/99ts173vdHxr+by1cuDCnT5/+2/X29vZs2bIlq1evzpNPPplP\nPvkkK1euzObNm//x+/jg8VvP1bYdHBzM+fPns23btvT09KS9vf2Kr/7a9tZ0tX03btyYTZs2DV0r\nrvJxlfa9NV1p3xdeeCFTp05NkrzzzjupVCqZMWPGFb+PfcvFXtXr119/zZIlS7Jq1arccccdf3ls\nxIgRti+hzz77LGPGjMkDDzyQr7766h+fY9vyunz5cg4fPpw1a9akoaEhr7322t9+j/nf7Ps/j7kr\nxVmSLF++PO+9916SpLm5OatXr07yxyuFf97Wk/zxFvOft2By67jatlu3bk1TU1OSpKGhISNHjszZ\ns2dtWyJX2veHH37I8ePH09bWluSPV/pnz56dbdu22bdErvbzmyQ7duzIvn378v777w9ds2/51dXV\n5cSJE0Nf27A6DAwMZMmSJWlra0tjY2OSZMyYMfn5559TW1ubU6dODf26A+Xx7bffpqurK/v27Ut/\nf38uXbqU5cuX27ZK1NfXp66uLg0NDUmSadOmZePGjRk7duw17Tust1nefffd+frrr5Mk3d3dueee\ne5IkU6dOza5du9Lf359jx46lt7d36C9KOTQ2Nqa7uztJcvTo0QwMDKSmpsa2VeDee+/NF198ka6u\nrnR1daWuri47duzI2LFj7Vsl9u/fn3fffTdvv/12/vOf/wxdt2/5Pfjgg+nt7c3x48fT39+f3bt3\n54knnhjuY3EDiqLIqlWrMnHixCxYsGDo+tSpU/PRRx8lST7++OOhyKM8li5dmn379qWrqytvvvlm\nHnnkkXR2dtq2StTW1mbcuHE5evRokuTLL7/MpEmTMmXKlGva93/+ztzVrFu3LuvWrUt/f39uu+22\nvPLKK0mSSZMmpaWlJa2trRk1alTWrl3rLeSSmT17dlauXJkZM2akUqmko6MjiW2r0f/fz77V4dVX\nX83AwEAWLVqUJHn44Yfz8ssv27cKjB49OmvWrMkzzzyT33//PXPmzMnEiROH+1jcgG+++SY7d+7M\nfffdl5kzZyb5IwIWL16c9vb2bN++PXfddVfeeuutYT4pN4ttq8eaNWvy4osvZmBgIBMmTMj69esz\nODh4TfuOKK72yy4AAADckob1NksAAACuj5gDAAAoITEHAABQQmIOAACghMQcAABACYk5AACAEhJz\nAAAAJSTmAAAASuj/AKSSWUR2kw4CAAAAAElFTkSuQmCC\n", + "metadata": {}, + "output_type": "display_data", + "text/plain": "" + } + ] + } + ] + } + ], + "metadata": { + "name": "5_word2vec.ipynb", + "colabVersion": "0.3.2", + "colab_views": {}, + "colab_default_view": {} + }, + "nbformat": 3, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/6_lstm.ipynb b/6_lstm.ipynb new file mode 100644 index 00000000000..1db35d23152 --- /dev/null +++ b/6_lstm.ipynb @@ -0,0 +1,433 @@ +{ + "worksheets": [ + { + "cells": [ + { + "metadata": { + "id": "8tQJd2YSCfWR", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "" + }, + { + "metadata": { + "id": "D7tqLMoKF6uq", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Deep Learning\n=============\n\nAssignment 6\n------------\n\nAfter training a skip-gram model in `5_word2vec.ipynb`, the goal of this notebook is to train a LSTM character model over [Text8](http://mattmahoney.net/dc/textdata) data." + }, + { + "metadata": { + "id": "MvEblsgEXxrd", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport os\nimport numpy as np\nimport random\nimport string\nimport tensorflow as tf\nimport urllib\nimport zipfile", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "RJ-o3UBUFtCw", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 5993, + "status": "ok", + "timestamp": 1445965582896, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "d530534e-0791-4a94-ca6d-1c8f1b908a9e" + }, + "cell_type": "code", + "input": "url = 'http://mattmahoney.net/dc/'\n\ndef maybe_download(filename, expected_bytes):\n \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n if not os.path.exists(filename):\n filename, _ = urllib.urlretrieve(url + filename, filename)\n statinfo = os.stat(filename)\n if statinfo.st_size == expected_bytes:\n print 'Found and verified', filename\n else:\n print statinfo.st_size\n raise Exception(\n 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n return filename\n\nfilename = maybe_download('text8.zip', 31344016)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Found and verified text8.zip\n" + } + ] + }, + { + "metadata": { + "id": "Mvf09fjugFU_", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 5982, + "status": "ok", + "timestamp": 1445965582916, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "8f75db58-3862-404b-a0c3-799380597390" + }, + "cell_type": "code", + "input": "def read_data(filename):\n f = zipfile.ZipFile(filename)\n for name in f.namelist():\n return f.read(name)\n f.close()\n \ntext = read_data(filename)\nprint \"Data size\", len(text)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Data size 100000000\n" + } + ] + }, + { + "metadata": { + "id": "ga2CYACE-ghb", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Create a small validation set." + }, + { + "metadata": { + "id": "w-oBpfFG-j43", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 6184, + "status": "ok", + "timestamp": 1445965583138, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "bdb96002-d021-4379-f6de-a977924f0d02" + }, + "cell_type": "code", + "input": "valid_size = 1000\nvalid_text = text[:valid_size]\ntrain_text = text[valid_size:]\ntrain_size = len(train_text)\nprint train_size, train_text[:64]\nprint valid_size, valid_text[:64]", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "99999000 ons anarchists advocate social relations based upon voluntary as\n1000 anarchism originated as a term of abuse first used against earl\n" + } + ] + }, + { + "metadata": { + "id": "Zdw6i4F8glpp", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Utility functions to map characters to vocabulary IDs and back." + }, + { + "metadata": { + "id": "gAL1EECXeZsD", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 6276, + "status": "ok", + "timestamp": 1445965583249, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "88fc9032-feb9-45ff-a9a0-a26759cc1f2e" + }, + "cell_type": "code", + "input": "vocabulary_size = len(string.ascii_lowercase) + 1 # [a-z] + ' '\nfirst_letter = ord(string.ascii_lowercase[0])\n\ndef char2id(char):\n if char in string.ascii_lowercase:\n return ord(char) - first_letter + 1\n elif char == ' ':\n return 0\n else:\n print 'Unexpected character:', char\n return 0\n \ndef id2char(dictid):\n if dictid > 0:\n return chr(dictid + first_letter - 1)\n else:\n return ' '\n\nprint char2id('a'), char2id('z'), char2id(' '), char2id('\u00ef')\nprint id2char(1), id2char(26), id2char(0)", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "1 26 0 Unexpected character: \u00ef\n0\na z \n" + } + ] + }, + { + "metadata": { + "id": "lFwoyygOmWsL", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Function to generate a training batch for the LSTM model." + }, + { + "metadata": { + "id": "d9wMtjy5hCj9", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 1 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 6473, + "status": "ok", + "timestamp": 1445965583467, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "3dd79c80-454a-4be0-8b71-4a4a357b3367" + }, + "cell_type": "code", + "input": "batch_size=64\nnum_unrollings=10\n\nclass BatchGenerator(object):\n def __init__(self, text, batch_size, num_unrollings):\n self._text = text\n self._text_size = len(text)\n self._batch_size = batch_size\n self._num_unrollings = num_unrollings\n segment = self._text_size / batch_size\n self._cursor = [ offset * segment for offset in xrange(batch_size)]\n self._last_batch = self._next_batch()\n \n def _next_batch(self):\n \"\"\"Generate a single batch from the current cursor position in the data.\"\"\"\n batch = np.zeros(shape=(self._batch_size, vocabulary_size), dtype=np.float)\n for b in xrange(self._batch_size):\n batch[b, char2id(self._text[self._cursor[b]])] = 1.0\n self._cursor[b] = (self._cursor[b] + 1) % self._text_size\n return batch\n \n def next(self):\n \"\"\"Generate the next array of batches from the data. The array consists of\n the last batch of the previous array, followed by num_unrollings new ones.\n \"\"\"\n batches = [self._last_batch]\n for step in xrange(self._num_unrollings):\n batches.append(self._next_batch())\n self._last_batch = batches[-1]\n return batches\n\ndef characters(probabilities):\n \"\"\"Turn a 1-hot encoding or a probability distribution over the possible\n characters back into its (mostl likely) character representation.\"\"\"\n return [id2char(c) for c in np.argmax(probabilities, 1)]\n\ndef batches2string(batches):\n \"\"\"Convert a sequence of batches back into their (most likely) string\n representation.\"\"\"\n s = [''] * batches[0].shape[0]\n for b in batches:\n s = [''.join(x) for x in zip(s, characters(b))]\n return s\n\ntrain_batches = BatchGenerator(train_text, batch_size, num_unrollings)\nvalid_batches = BatchGenerator(valid_text, 1, 1)\n\nprint batches2string(train_batches.next())\nprint batches2string(train_batches.next())\nprint batches2string(valid_batches.next())\nprint batches2string(valid_batches.next())", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "['ons anarchi', 'when milita', 'lleria arch', ' abbeys and', 'married urr', 'hel and ric', 'y and litur', 'ay opened f', 'tion from t', 'migration t', 'new york ot', 'he boeing s', 'e listed wi', 'eber has pr', 'o be made t', 'yer who rec', 'ore signifi', 'a fierce cr', ' two six ei', 'aristotle s', 'ity can be ', ' and intrac', 'tion of the', 'dy to pass ', 'f certain d', 'at it will ', 'e convince ', 'ent told hi', 'ampaign and', 'rver side s', 'ious texts ', 'o capitaliz', 'a duplicate', 'gh ann es d', 'ine january', 'ross zero t', 'cal theorie', 'ast instanc', ' dimensiona', 'most holy m', 't s support', 'u is still ', 'e oscillati', 'o eight sub', 'of italy la', 's the tower', 'klahoma pre', 'erprise lin', 'ws becomes ', 'et in a naz', 'the fabian ', 'etchy to re', ' sharman ne', 'ised empero', 'ting in pol', 'd neo latin', 'th risky ri', 'encyclopedi', 'fense the a', 'duating fro', 'treet grid ', 'ations more', 'appeal of d', 'si have mad']\n['ists advoca', 'ary governm', 'hes nationa', 'd monasteri', 'raca prince', 'chard baer ', 'rgical lang', 'for passeng', 'the nationa', 'took place ', 'ther well k', 'seven six s', 'ith a gloss', 'robably bee', 'to recogniz', 'ceived the ', 'icant than ', 'ritic of th', 'ight in sig', 's uncaused ', ' lost as in', 'cellular ic', 'e size of t', ' him a stic', 'drugs confu', ' take to co', ' the priest', 'im to name ', 'd barred at', 'standard fo', ' such as es', 'ze on the g', 'e of the or', 'd hiver one', 'y eight mar', 'the lead ch', 'es classica', 'ce the non ', 'al analysis', 'mormons bel', 't or at lea', ' disagreed ', 'ing system ', 'btypes base', 'anguages th', 'r commissio', 'ess one nin', 'nux suse li', ' the first ', 'zi concentr', ' society ne', 'elatively s', 'etworks sha', 'or hirohito', 'litical ini', 'n most of t', 'iskerdoo ri', 'ic overview', 'air compone', 'om acnm acc', ' centerline', 'e than any ', 'devotional ', 'de such dev']\n[' a']\n['an']\n" + } + ] + }, + { + "metadata": { + "id": "KyVd8FxT5QBc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "def logprob(predictions, labels):\n \"\"\"Log-probability of the true labels in a predicted batch.\"\"\"\n predictions[predictions < 1e-10] = 1e-10\n return np.sum(np.multiply(labels, -np.log(predictions))) / labels.shape[0]\n\ndef sample_distribution(distribution):\n \"\"\"Sample one element from a distribution assumed to be an array of normalized\n probabilities.\n \"\"\"\n r = random.uniform(0, 1)\n s = 0\n for i in xrange(len(distribution)):\n s += distribution[i]\n if s >= r:\n return i\n return len(distribution) - 1\n\ndef sample(prediction):\n \"\"\"Turn a (column) prediction into 1-hot encoded samples.\"\"\"\n p = np.zeros(shape=[1, vocabulary_size], dtype=np.float)\n p[0, sample_distribution(prediction[0])] = 1.0\n return p\n\ndef random_distribution():\n \"\"\"Generate a random column of probabilities.\"\"\"\n b = np.random.uniform(0.0, 1.0, size=[1, vocabulary_size])\n return b/np.sum(b, 1)[:,None]", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "K8f67YXaDr4C", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "Simple LSTM Model." + }, + { + "metadata": { + "id": "Q5rxZK6RDuGe", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "cell_type": "code", + "input": "num_nodes = 64\n\ngraph = tf.Graph()\nwith graph.as_default():\n \n # Parameters:\n # Input gate: input, previous output, and bias.\n ix = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n im = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n ib = tf.Variable(tf.zeros([1, num_nodes]))\n # Forget gate: input, previous output, and bias.\n fx = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n fm = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n fb = tf.Variable(tf.zeros([1, num_nodes]))\n # Memory cell: input, state and bias. \n cx = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n cm = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n cb = tf.Variable(tf.zeros([1, num_nodes]))\n # Output gate: input, previous output, and bias.\n ox = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n om = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n ob = tf.Variable(tf.zeros([1, num_nodes]))\n # Variables saving state across unrollings.\n saved_output = tf.Variable(tf.zeros([batch_size, num_nodes]), trainable=False)\n saved_state = tf.Variable(tf.zeros([batch_size, num_nodes]), trainable=False)\n # Classifier weights and biases.\n w = tf.Variable(tf.truncated_normal([num_nodes, vocabulary_size], -0.1, 0.1))\n b = tf.Variable(tf.zeros([vocabulary_size]))\n \n # Definition of the cell computation.\n def lstm_cell(i, o, state):\n \"\"\"Create a LSTM cell. See e.g.: http://arxiv.org/pdf/1402.1128v1.pdf\n Note that in this formulation, we omit the various connections between the\n previous state and the gates.\"\"\"\n input_gate = tf.sigmoid(tf.matmul(i, ix) + tf.matmul(o, im) + ib)\n forget_gate = tf.sigmoid(tf.matmul(i, fx) + tf.matmul(o, fm) + fb)\n update = tf.matmul(i, cx) + tf.matmul(o, cm) + cb\n state = forget_gate * state + input_gate * tf.tanh(update)\n output_gate = tf.sigmoid(tf.matmul(i, ox) + tf.matmul(o, om) + ob)\n return output_gate * tf.tanh(state), state\n\n # Input data.\n train_data = list()\n for _ in xrange(num_unrollings + 1):\n train_data.append(\n tf.placeholder(tf.float32, shape=[batch_size,vocabulary_size]))\n train_inputs = train_data[:num_unrollings]\n train_labels = train_data[1:] # labels are inputs shifted by one time step.\n\n # Unrolled LSTM loop.\n outputs = list()\n output = saved_output\n state = saved_state\n for i in train_inputs:\n output, state = lstm_cell(i, output, state)\n outputs.append(output)\n\n # State saving across unrollings.\n with tf.control_dependencies([saved_output.assign(output),\n saved_state.assign(state)]):\n # Classifier.\n logits = tf.nn.xw_plus_b(tf.concat(0, outputs), w, b)\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(\n logits, tf.concat(0, train_labels)))\n\n # Optimizer.\n global_step = tf.Variable(0)\n learning_rate = tf.train.exponential_decay(\n 10.0, global_step, 5000, 0.1, staircase=True)\n optimizer = tf.train.GradientDescentOptimizer(learning_rate)\n gradients, v = zip(*optimizer.compute_gradients(loss))\n gradients, _ = tf.clip_by_global_norm(gradients, 1.25)\n optimizer = optimizer.apply_gradients(\n zip(gradients, v), global_step=global_step)\n\n # Predictions.\n train_prediction = tf.nn.softmax(logits)\n \n # Sampling and validation eval: batch 1, no unrolling.\n sample_input = tf.placeholder(tf.float32, shape=[1, vocabulary_size])\n saved_sample_output = tf.Variable(tf.zeros([1, num_nodes]))\n saved_sample_state = tf.Variable(tf.zeros([1, num_nodes]))\n reset_sample_state = tf.group(\n saved_sample_output.assign(tf.zeros([1, num_nodes])),\n saved_sample_state.assign(tf.zeros([1, num_nodes])))\n sample_output, sample_state = lstm_cell(\n sample_input, saved_sample_output, saved_sample_state)\n with tf.control_dependencies([saved_sample_output.assign(sample_output),\n saved_sample_state.assign(sample_state)]):\n sample_prediction = tf.nn.softmax(tf.nn.xw_plus_b(sample_output, w, b))", + "language": "python", + "outputs": [] + }, + { + "metadata": { + "id": "RD9zQCZTEaEm", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "output_extras": [ + { + "item_id": 41 + }, + { + "item_id": 80 + }, + { + "item_id": 126 + }, + { + "item_id": 144 + } + ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 199909, + "status": "ok", + "timestamp": 1445965877333, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "5e868466-2532-4545-ce35-b403cf5d9de6" + }, + "cell_type": "code", + "input": "num_steps = 7001\nsummary_frequency = 100\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print 'Initialized'\n mean_loss = 0\n for step in xrange(num_steps):\n batches = train_batches.next()\n feed_dict = dict()\n for i in xrange(num_unrollings + 1):\n feed_dict[train_data[i]] = batches[i]\n _, l, predictions, lr = session.run(\n [optimizer, loss, train_prediction, learning_rate], feed_dict=feed_dict)\n mean_loss += l\n if step % summary_frequency == 0:\n if step > 0:\n mean_loss = mean_loss / summary_frequency\n # The mean loss is an estimate of the loss over the last few batches.\n print 'Average loss at step', step, ':', mean_loss, 'learning rate:', lr\n mean_loss = 0\n labels = np.concatenate(list(batches)[1:])\n print 'Minibatch perplexity: %.2f' % float(\n np.exp(logprob(predictions, labels)))\n if step % (summary_frequency * 10) == 0:\n # Generate some samples.\n print '=' * 80\n for _ in xrange(5):\n feed = sample(random_distribution())\n sentence = characters(feed)[0]\n reset_sample_state.run()\n for _ in xrange(79):\n prediction = sample_prediction.eval({sample_input: feed})\n feed = sample(prediction)\n sentence += characters(feed)[0]\n print sentence\n print '=' * 80\n # Measure validation set perplexity.\n reset_sample_state.run()\n valid_logprob = 0\n for _ in xrange(valid_size):\n b = valid_batches.next()\n predictions = sample_prediction.eval({sample_input: b[0]})\n valid_logprob = valid_logprob + logprob(predictions, b[1])\n print 'Validation set perplexity: %.2f' % float(np.exp(\n valid_logprob / valid_size))", + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": "Initialized\nAverage loss at step 0 : 3.29904174805 learning rate: 10.0\nMinibatch perplexity: 27.09\n================================================================================\nsrk dwmrnuldtbbgg tapootidtu xsciu sgokeguw hi ieicjq lq piaxhazvc s fht wjcvdlh\nlhrvallvbeqqquc dxd y siqvnle bzlyw nr rwhkalezo siie o deb e lpdg storq u nx o\nmeieu nantiouie gdys qiuotblci loc hbiznauiccb cqzed acw l tsm adqxplku gn oaxet\nunvaouc oxchywdsjntdh zpklaejvxitsokeerloemee htphisb th eaeqseibumh aeeyj j orw\nogmnictpycb whtup otnilnesxaedtekiosqet liwqarysmt arj flioiibtqekycbrrgoysj\n================================================================================\nValidation set perplexity: 19.99\nAverage loss at step 100 : 2.59553678274 learning rate: 10.0\nMinibatch perplexity: 9.57\nValidation set perplexity: 10.60\nAverage loss at step 200 : 2.24747137785 learning rate: 10.0\nMinibatch perplexity: 7.68\nValidation set perplexity: 8.84\nAverage loss at step 300 : 2.09438110709 learning rate: 10.0\nMinibatch perplexity: 7.41\nValidation set perplexity: 8.13\nAverage loss at step 400 : 1.99440989017 learning rate: 10.0\nMinibatch perplexity: 6.46\nValidation set perplexity: 7.58\nAverage loss at step 500 : 1.9320810616 learning rate: 10.0\nMinibatch perplexity: 6.30\nValidation set perplexity: 6.88\nAverage loss at step 600 : 1.90935629249 learning rate: 10.0\nMinibatch perplexity: 7.21\nValidation set perplexity: 6.91\nAverage loss at step 700 : 1.85583009005 learning rate: 10.0\nMinibatch perplexity: 6.13\nValidation set perplexity: 6.60\nAverage loss at step 800 : 1.82152368546 learning rate: 10.0\nMinibatch perplexity: 6.01\nValidation set perplexity: 6.37\nAverage loss at step 900 : 1.83169809818 learning rate: 10.0\nMinibatch perplexity: 7.20\nValidation set perplexity: 6.23\nAverage loss at step 1000 : 1.82217029214 learning rate: 10.0\nMinibatch perplexity: 6.73\n================================================================================\nle action b of the tert sy ofter selvorang previgned stischdy yocal chary the co\nle relganis networks partucy cetinning wilnchan sics rumeding a fulch laks oftes\nhian andoris ret the ecause bistory l pidect one eight five lack du that the ses\naiv dromery buskocy becomer worils resism disele retery exterrationn of hide in \nmer miter y sught esfectur of the upission vain is werms is vul ugher compted by\n================================================================================\nValidation set perplexity: 6.07\nAverage loss at step 1100 : 1.77301145077 learning rate: 10.0\nMinibatch perplexity: 6.03\nValidation set perplexity: 5.89\nAverage loss at step 1200 : 1.75306463003 learning rate: 10.0\nMinibatch perplexity: 6.50\nValidation set perplexity: 5.61\nAverage loss at step 1300 : 1.72937195778 learning rate: 10.0\nMinibatch perplexity: 5.00\nValidation set perplexity: 5.60\nAverage loss at step 1400 : 1.74773373723 learning rate: 10.0\nMinibatch perplexity: 6.48\nValidation set perplexity: 5.66\nAverage loss at step 1500 : 1.7368799901 learning rate: 10.0\nMinibatch perplexity: 5.22\nValidation set perplexity: 5.44\nAverage loss at step 1600 : 1.74528762937 learning rate: 10.0\nMinibatch perplexity: 5.85\nValidation set perplexity: 5.33\nAverage loss at step 1700 : 1.70881183743 learning rate: 10.0\nMinibatch perplexity: 5.33\nValidation set perplexity: 5.56\nAverage loss at step 1800 : 1.67776108027 learning rate: 10.0\nMinibatch perplexity: 5.33\nValidation set perplexity: 5.29\nAverage loss at step 1900 : 1.64935536742 learning rate: 10.0\nMinibatch perplexity: 5.29\nValidation set perplexity: 5.15\nAverage loss at step" + }, + { + "output_type": "stream", + "stream": "stdout", + "text": " 2000 : 1.69528644681 learning rate: 10.0\nMinibatch perplexity: 5.13\n================================================================================\nvers soqually have one five landwing to docial page kagan lower with ther batern\nctor son alfortmandd tethre k skin the known purated to prooust caraying the fit\nje in beverb is the sournction bainedy wesce tu sture artualle lines digra forme\nm rousively haldio ourso ond anvary was for the seven solies hild buil s to te\nzall for is it is one nine eight eight one neval to the kime typer oene where he\n================================================================================\nValidation set perplexity: 5.25\nAverage loss at step 2100 : 1.68808053017 learning rate: 10.0\nMinibatch perplexity: 5.17\nValidation set perplexity: 5.01\nAverage loss at step 2200 : 1.68322490931 learning rate: 10.0\nMinibatch perplexity: 5.09\nValidation set perplexity: 5.15\nAverage loss at step 2300 : 1.64465074301 learning rate: 10.0\nMinibatch perplexity: 5.51\nValidation set perplexity: 5.00\nAverage loss at step 2400 : 1.66408578038 learning rate: 10.0\nMinibatch perplexity: 5.86\nValidation set perplexity: 4.80\nAverage loss at step 2500 : 1.68515402555 learning rate: 10.0\nMinibatch perplexity: 5.75\nValidation set perplexity: 4.82\nAverage loss at step 2600 : 1.65405208349 learning rate: 10.0\nMinibatch perplexity: 5.38\nValidation set perplexity: 4.85\nAverage loss at step 2700 : 1.65706222177 learning rate: 10.0\nMinibatch perplexity: 5.46\nValidation set perplexity: 4.78\nAverage loss at step 2800 : 1.65204829812 learning rate: 10.0\nMinibatch perplexity: 5.06\nValidation set perplexity: 4.64\nAverage loss at step 2900 : 1.65107253551 learning rate: 10.0\nMinibatch perplexity: 5.00\nValidation set perplexity: 4.61\nAverage loss at step 3000 : 1.6495274055 learning rate: 10.0\nMinibatch perplexity: 4.53\n================================================================================\nject covered in belo one six six to finsh that all di rozial sime it a the lapse\nble which the pullic bocades record r to sile dric two one four nine seven six f\n originally ame the playa ishaps the stotchational in a p dstambly name which as\nore volum to bay riwer foreal in nuily operety can and auscham frooripm however \nkan traogey was lacous revision the mott coupofiteditey the trando insended frop\n================================================================================\nValidation set perplexity: 4.76\nAverage loss at step 3100 : 1.63705502152 learning rate: 10.0\nMinibatch perplexity: 5.50\nValidation set perplexity: 4.76\nAverage loss at step 3200 : 1.64740695596 learning rate: 10.0\nMinibatch perplexity: 4.84\nValidation set perplexity: 4.67\nAverage loss at step 3300 : 1.64711504817 learning rate: 10.0\nMinibatch perplexity: 5.39\nValidation set perplexity: 4.57\nAverage loss at step 3400 : 1.67113256454 learning rate: 10.0\nMinibatch perplexity: 5.56\nValidation set perplexity: 4.71\nAverage loss at step 3500 : 1.65637169957 learning rate: 10.0\nMinibatch perplexity: 5.03\nValidation set perplexity: 4.80\nAverage loss at step 3600 : 1.66601825476 learning rate: 10.0\nMinibatch perplexity: 4.63\nValidation set perplexity: 4.52\nAverage loss at step 3700 : 1.65021387935 learning rate: 10.0\nMinibatch perplexity: 5.50\nValidation set perplexity: 4.56\nAverage loss at step 3800 : 1.64481814981 learning rate: 10.0\nMinibatch perplexity: 4.60\nValidation set perplexity: 4.54\nAverage loss at step 3900 : 1.642069453 learning rate: 10.0\nMinibatch perplexity: 4.91\nValidation set perplexity: 4.54\nAverage loss at step 4000 : 1.65179730773 learning rate: 10.0\nMinibatch perplexity: 4.77\n================================================================================\nk s rasbonish roctes the nignese at heacle was sito of beho anarchys and with ro\njusar two sue wletaus of chistical in causations d ow trancic bruthing ha laters\nde and speacy pulted yoftret worksy zeatlating to eight d had to ie bue seven si" + }, + { + "output_type": "stream", + "stream": "stdout", + "text": "\ns fiction of the feelly constive suq flanch earlied curauking bjoventation agent\nquen s playing it calana our seopity also atbellisionaly comexing the revideve i\n================================================================================\nValidation set perplexity: 4.58\nAverage loss at step 4100 : 1.63794238806 learning rate: 10.0\nMinibatch perplexity: 5.47\nValidation set perplexity: 4.79\nAverage loss at step 4200 : 1.63822438836 learning rate: 10.0\nMinibatch perplexity: 5.30\nValidation set perplexity: 4.54\nAverage loss at step 4300 : 1.61844664574 learning rate: 10.0\nMinibatch perplexity: 4.69\nValidation set perplexity: 4.54\nAverage loss at step 4400 : 1.61255454302 learning rate: 10.0\nMinibatch perplexity: 4.67\nValidation set perplexity: 4.54\nAverage loss at step 4500 : 1.61543365479 learning rate: 10.0\nMinibatch perplexity: 4.83\nValidation set perplexity: 4.69\nAverage loss at step 4600 : 1.61607327104 learning rate: 10.0\nMinibatch perplexity: 5.18\nValidation set perplexity: 4.64\nAverage loss at step 4700 : 1.62757282495 learning rate: 10.0\nMinibatch perplexity: 4.24\nValidation set perplexity: 4.66\nAverage loss at step 4800 : 1.63222063541 learning rate: 10.0\nMinibatch perplexity: 5.30\nValidation set perplexity: 4.53\nAverage loss at step 4900 : 1.63678096652 learning rate: 10.0\nMinibatch perplexity: 5.43\nValidation set perplexity: 4.64\nAverage loss at step 5000 : 1.610340662 learning rate: 1.0\nMinibatch perplexity: 5.10\n================================================================================\nin b one onarbs revieds the kimiluge that fondhtic fnoto cre one nine zero zero \n of is it of marking panzia t had wap ironicaghni relly deah the omber b h menba\nong messified it his the likdings ara subpore the a fames distaled self this int\ny advante authors the end languarle meit common tacing bevolitione and eight one\nzes that materly difild inllaring the fusts not panition assertian causecist bas\n================================================================================\nValidation set perplexity: 4.69\nAverage loss at step 5100 : 1.60593637228 learning rate: 1.0\nMinibatch perplexity: 4.69\nValidation set perplexity: 4.47\nAverage loss at step 5200 : 1.58993269444 learning rate: 1.0\nMinibatch perplexity: 4.65\nValidation set perplexity: 4.39\nAverage loss at step 5300 : 1.57930587292 learning rate: 1.0\nMinibatch perplexity: 5.11\nValidation set perplexity: 4.39\nAverage loss at step 5400 : 1.58022856832 learning rate: 1.0\nMinibatch perplexity: 5.19\nValidation set perplexity: 4.37\nAverage loss at step 5500 : 1.56654450059 learning rate: 1.0\nMinibatch perplexity: 4.69\nValidation set perplexity: 4.33\nAverage loss at step 5600 : 1.58013380885 learning rate: 1.0\nMinibatch perplexity: 5.13\nValidation set perplexity: 4.35\nAverage loss at step 5700 : 1.56974959254 learning rate: 1.0\nMinibatch perplexity: 5.00\nValidation set perplexity: 4.34\nAverage loss at step 5800 : 1.5839582932 learning rate: 1.0\nMinibatch perplexity: 4.88\nValidation set perplexity: 4.31\nAverage loss at step 5900 : 1.57129439116 learning rate: 1.0\nMinibatch perplexity: 4.66\nValidation set perplexity: 4.32\nAverage loss at step 6000 : 1.55144061089 learning rate: 1.0\nMinibatch perplexity: 4.55\n================================================================================\nutic clositical poopy stribe addi nixe one nine one zero zero eight zero b ha ex\nzerns b one internequiption of the secordy way anti proble akoping have fictiona\nphare united from has poporarly cities book ins sweden emperor a sass in origina\nquulk destrebinist and zeilazar and on low and by in science over country weilti\nx are holivia work missincis ons in the gages to starsle histon one icelanctrotu\n================================================================================\nValidation set perplexity: 4.30\nAverage loss at step 6100 : 1.56450940847 learning rate: 1.0\nMinibatch perplexity: 4.77\nValidation set perplexity: 4.27" + }, + { + "output_type": "stream", + "stream": "stdout", + "text": "\nAverage loss at step 6200 : 1.53433164835 learning rate: 1.0\nMinibatch perplexity: 4.77\nValidation set perplexity: 4.27\nAverage loss at step 6300 : 1.54773445129 learning rate: 1.0\nMinibatch perplexity: 4.76\nValidation set perplexity: 4.25\nAverage loss at step 6400 : 1.54021131516 learning rate: 1.0\nMinibatch perplexity: 4.56\nValidation set perplexity: 4.24\nAverage loss at step 6500 : 1.56153374553 learning rate: 1.0\nMinibatch perplexity: 5.43\nValidation set perplexity: 4.27\nAverage loss at step 6600 : 1.59556478739 learning rate: 1.0\nMinibatch perplexity: 4.92\nValidation set perplexity: 4.28\nAverage loss at step 6700 : 1.58076951623 learning rate: 1.0\nMinibatch perplexity: 4.77\nValidation set perplexity: 4.30\nAverage loss at step 6800 : 1.6070714438 learning rate: 1.0\nMinibatch perplexity: 4.98\nValidation set perplexity: 4.28\nAverage loss at step 6900 : 1.58413293839 learning rate: 1.0\nMinibatch perplexity: 4.61\nValidation set perplexity: 4.29\nAverage loss at step 7000 : 1.57905534983 learning rate: 1.0\nMinibatch perplexity: 5.08\n================================================================================\njague are officiencinels ored by film voon higherise haik one nine on the iffirc\noshe provision that manned treatists on smalle bodariturmeristing the girto in s\nkis would softwenn mustapultmine truativersakys bersyim by s of confound esc bub\nry of the using one four six blain ira mannom marencies g with fextificallise re\n one son vit even an conderouss to person romer i a lebapter at obiding are iuse\n================================================================================\nValidation set perplexity: 4.25\n" + } + ] + }, + { + "metadata": { + "id": "pl4vtmFfa5nn", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 1\n---------\n\nYou might have noticed that the definition of the LSTM cell involves 4 matrix multiplications with the input, and 4 matrix multiplications with the output. Simplify the expression by using a single matrix multiply for each, and variables that are 4 times larger.\n\n---" + }, + { + "metadata": { + "id": "4eErTCTybtph", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 2\n---------\n\nWe want to train a LSTM over bigrams, that is pairs of consecutive characters like 'ab' instead of single characters like 'a'. Since the number of possible bigrams is large, feeding them directly to the LSTM using 1-hot encodings will lead to a very sparse representation that is very wasteful computationally.\n\na- Introduce an embedding lookup on the inputs, and feed the embeddings to the LSTM cell instead of the inputs themselves.\n\nb- Write a bigram-based LSTM, modeled on the character LSTM above.\n\nc- Introduce Dropout. For best practices on how to use Dropout in LSTMs, refer to this [article](http://arxiv.org/abs/1409.2329).\n\n---" + }, + { + "metadata": { + "id": "Y5tapX3kpcqZ", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": "---\nProblem 3\n---------\n\n(difficult!)\n\nWrite a sequence-to-sequence LSTM which mirrors all the words in a sentence. For example, if your input is:\n\n the quick brown fox\n \nthe model should attempt to output:\n\n eht kciuq nworb xof\n \nRefer to the lecture on how to put together a sequence-to-sequence model, as well as [this article](http://arxiv.org/abs/1409.3215) for best practices.\n\n---" + } + ] + } + ], + "metadata": { + "name": "6_lstm.ipynb", + "colabVersion": "0.3.2", + "colab_views": {}, + "colab_default_view": {} + }, + "nbformat": 3, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000000..59ae4abca82 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM b.gcr.io/tensorflow/tensorflow:latest +MAINTAINER Vincent Vanhoucke +RUN pip install scikit-learn +ADD *.ipynb /notebooks/ +WORKDIR /notebooks +CMD ["/run_jupyter.sh"] diff --git a/README.md b/README.md new file mode 100644 index 00000000000..812a1dc45ec --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +Assignments for Udacity Deep Learning class with TensorFlow +=========================================================== + +Building the Docker container +----------------------------- + + docker build -t $USER/assignments . + +Running the container +--------------------- + + docker run -p 8888:8888 -it --rm $USER/assignments From f0c25eaf725904b5f2c7d632aee27a4a4be2ec21 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Thu, 7 Jan 2016 07:45:47 -0800 Subject: [PATCH 002/123] Update assignment #5 with problem. Change: 111574654 --- 5_word2vec.ipynb | 1180 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 834 insertions(+), 346 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 95e89b4e566..d2da9828d01 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -1,402 +1,890 @@ { - "worksheets": [ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "version": "0.3.2", + "views": {}, + "default_view": {}, + "name": "5_word2vec.ipynb" + } + }, + "cells": [ { - "cells": [ - { - "metadata": { - "id": "D7tqLMoKF6uq", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Deep Learning\n=============\n\nAssignment 5\n------------\n\nThe goal of this assignment is to train a skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." - }, - { - "metadata": { - "id": "0K1ZyLn04QZf", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport collections\nimport math\nimport numpy as np\nimport os\nimport random\nimport tensorflow as tf\nimport urllib\nimport zipfile\nfrom matplotlib import pylab\nfrom sklearn.manifold import TSNE", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "aCjPJE944bkV", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Download the data from the source website if necessary." + "cell_type": "markdown", + "metadata": { + "id": "D7tqLMoKF6uq", + "colab_type": "text" + }, + "source": [ + "Deep Learning\n", + "=============\n", + "\n", + "Assignment 5\n", + "------------\n", + "\n", + "The goal of this assignment is to train a skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "0K1ZyLn04QZf", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "RJ-o3UBUFtCw", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 14640, - "status": "ok", - "timestamp": 1445964482948, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2f1ffade4c9f20de", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "c4ec222c-80b5-4298-e635-93ca9f79c3b7" + "cellView": "both" + }, + "source": [ + "# These are all the modules we'll be using later. Make sure you can import them\n", + "# before proceeding further.\n", + "import collections\n", + "import math\n", + "import numpy as np\n", + "import os\n", + "import random\n", + "import tensorflow as tf\n", + "import urllib\n", + "import zipfile\n", + "from matplotlib import pylab\n", + "from sklearn.manifold import TSNE" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aCjPJE944bkV", + "colab_type": "text" + }, + "source": [ + "Download the data from the source website if necessary." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RJ-o3UBUFtCw", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "url = 'http://mattmahoney.net/dc/'\n\ndef maybe_download(filename, expected_bytes):\n \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n if not os.path.exists(filename):\n filename, _ = urllib.urlretrieve(url + filename, filename)\n statinfo = os.stat(filename)\n if statinfo.st_size == expected_bytes:\n print 'Found and verified', filename\n else:\n print statinfo.st_size\n raise Exception(\n 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n return filename\n\nfilename = maybe_download('text8.zip', 31344016)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Found and verified text8.zip\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "Zqz3XiqI4mZT", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 14640, + "status": "ok", + "timestamp": 1445964482948, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Read the data into a string." + "user_tz": 420 }, + "outputId": "c4ec222c-80b5-4298-e635-93ca9f79c3b7" + }, + "source": [ + "url = 'http://mattmahoney.net/dc/'\n", + "\n", + "def maybe_download(filename, expected_bytes):\n", + " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", + " if not os.path.exists(filename):\n", + " filename, _ = urllib.urlretrieve(url + filename, filename)\n", + " statinfo = os.stat(filename)\n", + " if statinfo.st_size == expected_bytes:\n", + " print 'Found and verified', filename\n", + " else:\n", + " print statinfo.st_size\n", + " raise Exception(\n", + " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", + " return filename\n", + "\n", + "filename = maybe_download('text8.zip', 31344016)" + ], + "outputs": [ { - "metadata": { - "id": "Mvf09fjugFU_", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 28844, - "status": "ok", - "timestamp": 1445964497165, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2f1ffade4c9f20de", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "e3a928b4-1645-4fe8-be17-fcf47de5716d" + "output_type": "stream", + "text": [ + "Found and verified text8.zip\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Zqz3XiqI4mZT", + "colab_type": "text" + }, + "source": [ + "Read the data into a string." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Mvf09fjugFU_", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "def read_data(filename):\n f = zipfile.ZipFile(filename)\n for name in f.namelist():\n return f.read(name).split()\n f.close()\n \nwords = read_data(filename)\nprint 'Data size', len(words)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Data size 17005207\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "Zdw6i4F8glpp", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 28844, + "status": "ok", + "timestamp": 1445964497165, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Build the dictionary and replace rare words with UNK token." + "user_tz": 420 }, + "outputId": "e3a928b4-1645-4fe8-be17-fcf47de5716d" + }, + "source": [ + "def read_data(filename):\n", + " f = zipfile.ZipFile(filename)\n", + " for name in f.namelist():\n", + " return f.read(name).split()\n", + " f.close()\n", + " \n", + "words = read_data(filename)\n", + "print 'Data size', len(words)" + ], + "outputs": [ { - "metadata": { - "id": "gAL1EECXeZsD", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 28849, - "status": "ok", - "timestamp": 1445964497178, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2f1ffade4c9f20de", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "3fb4ecd1-df67-44b6-a2dc-2291730970b2" + "output_type": "stream", + "text": [ + "Data size 17005207\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Zdw6i4F8glpp", + "colab_type": "text" + }, + "source": [ + "Build the dictionary and replace rare words with UNK token." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gAL1EECXeZsD", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "vocabulary_size = 50000\n\ndef build_dataset(words):\n count = [['UNK', -1]]\n count.extend(collections.Counter(words).most_common(vocabulary_size - 1))\n dictionary = dict()\n for word, _ in count:\n dictionary[word] = len(dictionary)\n data = list()\n unk_count = 0\n for word in words:\n if word in dictionary:\n index = dictionary[word]\n else:\n index = 0 # dictionary['UNK']\n unk_count = unk_count + 1\n data.append(index)\n count[0][1] = unk_count\n reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys())) \n return data, count, dictionary, reverse_dictionary\n\ndata, count, dictionary, reverse_dictionary = build_dataset(words)\nprint 'Most common words (+UNK)', count[:5]\nprint 'Sample data', data[:10]\ndel words # Hint to reduce memory.", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Most common words (+UNK) [['UNK', 418391], ('the', 1061396), ('of', 593677), ('and', 416629), ('one', 411764)]\nSample data [5243, 3083, 12, 6, 195, 2, 3136, 46, 59, 156]\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "lFwoyygOmWsL", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 28849, + "status": "ok", + "timestamp": 1445964497178, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Function to generate a training batch for the skip-gram model." + "user_tz": 420 }, + "outputId": "3fb4ecd1-df67-44b6-a2dc-2291730970b2" + }, + "source": [ + "vocabulary_size = 50000\n", + "\n", + "def build_dataset(words):\n", + " count = [['UNK', -1]]\n", + " count.extend(collections.Counter(words).most_common(vocabulary_size - 1))\n", + " dictionary = dict()\n", + " for word, _ in count:\n", + " dictionary[word] = len(dictionary)\n", + " data = list()\n", + " unk_count = 0\n", + " for word in words:\n", + " if word in dictionary:\n", + " index = dictionary[word]\n", + " else:\n", + " index = 0 # dictionary['UNK']\n", + " unk_count = unk_count + 1\n", + " data.append(index)\n", + " count[0][1] = unk_count\n", + " reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys())) \n", + " return data, count, dictionary, reverse_dictionary\n", + "\n", + "data, count, dictionary, reverse_dictionary = build_dataset(words)\n", + "print 'Most common words (+UNK)', count[:5]\n", + "print 'Sample data', data[:10]\n", + "del words # Hint to reduce memory." + ], + "outputs": [ { - "metadata": { - "id": "w9APjA-zmfjV", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 113, - "status": "ok", - "timestamp": 1445964901989, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2f1ffade4c9f20de", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "67cccb02-cdaf-4e47-d489-43bcc8d57bb8" + "output_type": "stream", + "text": [ + "Most common words (+UNK) [['UNK', 418391], ('the', 1061396), ('of', 593677), ('and', 416629), ('one', 411764)]\n", + "Sample data [5243, 3083, 12, 6, 195, 2, 3136, 46, 59, 156]\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lFwoyygOmWsL", + "colab_type": "text" + }, + "source": [ + "Function to generate a training batch for the skip-gram model." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "w9APjA-zmfjV", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "data_index = 0\n\ndef generate_batch(batch_size, num_skips, skip_window):\n global data_index\n assert batch_size % num_skips == 0\n assert num_skips <= 2 * skip_window\n batch = np.ndarray(shape=(batch_size), dtype=np.int32)\n labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)\n span = 2 * skip_window + 1 # [ skip_window target skip_window ]\n buffer = collections.deque(maxlen=span)\n for _ in range(span):\n buffer.append(data[data_index])\n data_index = (data_index + 1) % len(data)\n for i in range(batch_size / num_skips):\n target = skip_window # target label at the center of the buffer\n targets_to_avoid = [ skip_window ]\n for j in range(num_skips):\n while target in targets_to_avoid:\n target = random.randint(0, span - 1)\n targets_to_avoid.append(target)\n batch[i * num_skips + j] = buffer[skip_window]\n labels[i * num_skips + j, 0] = buffer[target]\n buffer.append(data[data_index])\n data_index = (data_index + 1) % len(data)\n return batch, labels\n\nbatch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)\nfor i in range(8):\n print batch[i], '->', labels[i, 0]\n print reverse_dictionary[batch[i]], '->', reverse_dictionary[labels[i, 0]]", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": " 3083 -> 5243\noriginated -> anarchism\n3083 -> 12\noriginated -> as\n12 -> 3083\nas -> originated\n12 -> 6\nas -> a\n6 -> 12\na -> as\n6 -> 195\na -> term\n195 -> 6\nterm -> a\n195 -> 2\nterm -> of\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "Ofd1MbBuwiva", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 113, + "status": "ok", + "timestamp": 1445964901989, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Train a skip-gram model." + "user_tz": 420 }, + "outputId": "67cccb02-cdaf-4e47-d489-43bcc8d57bb8" + }, + "source": [ + "data_index = 0\n", + "\n", + "def generate_batch(batch_size, num_skips, skip_window):\n", + " global data_index\n", + " assert batch_size % num_skips == 0\n", + " assert num_skips <= 2 * skip_window\n", + " batch = np.ndarray(shape=(batch_size), dtype=np.int32)\n", + " labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)\n", + " span = 2 * skip_window + 1 # [ skip_window target skip_window ]\n", + " buffer = collections.deque(maxlen=span)\n", + " for _ in range(span):\n", + " buffer.append(data[data_index])\n", + " data_index = (data_index + 1) % len(data)\n", + " for i in range(batch_size / num_skips):\n", + " target = skip_window # target label at the center of the buffer\n", + " targets_to_avoid = [ skip_window ]\n", + " for j in range(num_skips):\n", + " while target in targets_to_avoid:\n", + " target = random.randint(0, span - 1)\n", + " targets_to_avoid.append(target)\n", + " batch[i * num_skips + j] = buffer[skip_window]\n", + " labels[i * num_skips + j, 0] = buffer[target]\n", + " buffer.append(data[data_index])\n", + " data_index = (data_index + 1) % len(data)\n", + " return batch, labels\n", + "\n", + "batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)\n", + "for i in range(8):\n", + " print batch[i], '->', labels[i, 0]\n", + " print reverse_dictionary[batch[i]], '->', reverse_dictionary[labels[i, 0]]" + ], + "outputs": [ { - "metadata": { - "id": "8pQKsV4Vwlzy", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "batch_size = 128\nembedding_size = 128 # Dimension of the embedding vector.\nskip_window = 1 # How many words to consider left and right.\nnum_skips = 2 # How many times to reuse an input to generate a label.\n# We pick a random validation set to sample nearest neighbors. here we limit the\n# validation samples to the words that have a low numeric ID, which by\n# construction are also the most frequent. \nvalid_size = 16 # Random set of words to evaluate similarity on.\nvalid_window = 100 # Only pick dev samples in the head of the distribution.\nvalid_examples = np.array(random.sample(xrange(valid_window), valid_size))\nnum_sampled = 64 # Number of negative examples to sample.\n\ngraph = tf.Graph()\n\nwith graph.as_default():\n\n # Input data.\n train_dataset = tf.placeholder(tf.int32, shape=[batch_size])\n train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])\n valid_dataset = tf.constant(valid_examples, dtype=tf.int32)\n \n # Variables.\n embeddings = tf.Variable(\n tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))\n softmax_weights = tf.Variable(\n tf.truncated_normal([vocabulary_size, embedding_size],\n stddev=1.0 / math.sqrt(embedding_size)))\n softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))\n \n # Model.\n # Look up embeddings for inputs.\n embed = tf.nn.embedding_lookup(embeddings, train_dataset)\n # Compute the softmax loss, using a sample of the negative labels each time.\n loss = tf.reduce_mean(\n tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,\n train_labels, num_sampled, vocabulary_size))\n\n # Optimizer.\n optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)\n \n # Compute the similarity between minibatch examples and all embeddings.\n # We use the cosine distance:\n norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))\n normalized_embeddings = embeddings / norm\n valid_embeddings = tf.nn.embedding_lookup(\n normalized_embeddings, valid_dataset)\n similarity = tf.matmul(valid_embeddings, tf.transpose(normalized_embeddings))", - "language": "python", - "outputs": [] + "output_type": "stream", + "text": [ + " 3083 -> 5243\n", + "originated -> anarchism\n", + "3083 -> 12\n", + "originated -> as\n", + "12 -> 3083\n", + "as -> originated\n", + "12 -> 6\n", + "as -> a\n", + "6 -> 12\n", + "a -> as\n", + "6 -> 195\n", + "a -> term\n", + "195 -> 6\n", + "term -> a\n", + "195 -> 2\n", + "term -> of\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ofd1MbBuwiva", + "colab_type": "text" + }, + "source": [ + "Train a skip-gram model." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8pQKsV4Vwlzy", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "1bQFGceBxrWW", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 23 - }, - { - "item_id": 48 - }, - { - "item_id": 61 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 436189, - "status": "ok", - "timestamp": 1445965429787, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2f1ffade4c9f20de", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "5ebd6d9a-33c6-4bcd-bf6d-252b0b6055e4" + "cellView": "both" + }, + "source": [ + "batch_size = 128\n", + "embedding_size = 128 # Dimension of the embedding vector.\n", + "skip_window = 1 # How many words to consider left and right.\n", + "num_skips = 2 # How many times to reuse an input to generate a label.\n", + "# We pick a random validation set to sample nearest neighbors. here we limit the\n", + "# validation samples to the words that have a low numeric ID, which by\n", + "# construction are also the most frequent. \n", + "valid_size = 16 # Random set of words to evaluate similarity on.\n", + "valid_window = 100 # Only pick dev samples in the head of the distribution.\n", + "valid_examples = np.array(random.sample(xrange(valid_window), valid_size))\n", + "num_sampled = 64 # Number of negative examples to sample.\n", + "\n", + "graph = tf.Graph()\n", + "\n", + "with graph.as_default():\n", + "\n", + " # Input data.\n", + " train_dataset = tf.placeholder(tf.int32, shape=[batch_size])\n", + " train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])\n", + " valid_dataset = tf.constant(valid_examples, dtype=tf.int32)\n", + " \n", + " # Variables.\n", + " embeddings = tf.Variable(\n", + " tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))\n", + " softmax_weights = tf.Variable(\n", + " tf.truncated_normal([vocabulary_size, embedding_size],\n", + " stddev=1.0 / math.sqrt(embedding_size)))\n", + " softmax_biases = tf.Variable(tf.zeros([vocabulary_size]))\n", + " \n", + " # Model.\n", + " # Look up embeddings for inputs.\n", + " embed = tf.nn.embedding_lookup(embeddings, train_dataset)\n", + " # Compute the softmax loss, using a sample of the negative labels each time.\n", + " loss = tf.reduce_mean(\n", + " tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,\n", + " train_labels, num_sampled, vocabulary_size))\n", + "\n", + " # Optimizer.\n", + " optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)\n", + " \n", + " # Compute the similarity between minibatch examples and all embeddings.\n", + " # We use the cosine distance:\n", + " norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))\n", + " normalized_embeddings = embeddings / norm\n", + " valid_embeddings = tf.nn.embedding_lookup(\n", + " normalized_embeddings, valid_dataset)\n", + " similarity = tf.matmul(valid_embeddings, tf.transpose(normalized_embeddings))" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "1bQFGceBxrWW", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "num_steps = 100001\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print \"Initialized\"\n average_loss = 0\n for step in xrange(num_steps):\n batch_data, batch_labels = generate_batch(\n batch_size, num_skips, skip_window)\n feed_dict = {train_dataset : batch_data, train_labels : batch_labels}\n _, l = session.run([optimizer, loss], feed_dict=feed_dict)\n average_loss += l\n if step % 2000 == 0:\n if step > 0:\n average_loss = average_loss / 2000\n # The average loss is an estimate of the loss over the last 2000 batches.\n print \"Average loss at step\", step, \":\", average_loss\n average_loss = 0\n # note that this is expensive (~20% slowdown if computed every 500 steps)\n if step % 10000 == 0:\n sim = similarity.eval()\n for i in xrange(valid_size):\n valid_word = reverse_dictionary[valid_examples[i]]\n top_k = 8 # number of nearest neighbors\n nearest = (-sim[i, :]).argsort()[1:top_k+1]\n log = \"Nearest to %s:\" % valid_word\n for k in xrange(top_k):\n close_word = reverse_dictionary[nearest[k]]\n log = \"%s %s,\" % (log, close_word)\n print log\n final_embeddings = normalized_embeddings.eval()", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Initialized\nAverage loss at step 0 : 8.58149623871\nNearest to been: unfavourably, marmara, ancestral, legal, bogart, glossaries, worst, rooms,\nNearest to time: conformist, strawberries, sindhi, waterfall, xia, nominates, psp, sensitivity,\nNearest to over: overlord, panda, golden, semigroup, rawlings, involved, shreveport, handling,\nNearest to not: hymenoptera, reintroducing, lamiaceae, because, davao, omnipotent, combustion, debilitating,\nNearest to three: catalog, koza, gn, braque, holstein, postgresql, luddite, justine,\nNearest to if: chilled, vince, fiddler, represented, sandinistas, happiness, lya, glands,\nNearest to there: coast, photosynthetic, kimmei, legally, inner, illyricum, formats, fullmetal,\nNearest to between: chuvash, prinz, suitability, wolfe, guideline, computability, diminutive, paulo,\nNearest to from: tanganyika, workshop, elphinstone, spearhead, resurrected, kevlar, shangri, loves,\nNearest to state: sextus, wuppertal, glaring, inches, unrounded, courageous, adler, connie,\nNearest to on: gino, phocas, rhine, jg, macrocosm, jackass, jays, theorie,\nNearest to and: standings, towed, reyes, willard, equality, juggling, wladislaus, faked,\nNearest to eight: gresham, dogg, moko, tennis, superseded, telegraphy, scramble, vinod,\nNearest to they: prisons, divisor, coder, ribeira, willingness, factional, nne, lotta,\nNearest to more: blues, fur, sterling, tangier, khwarizmi, discouraged, cal, deicide,\nNearest to other: enemies, bogged, brassicaceae, lascaux, dispense, alexandrians, crimea, dou,\nAverage loss at step 2000 : 4.39983723116\nAverage loss at step 4000 : 3.86921076906\nAverage loss at step 6000 : 3.72542127335\nAverage loss at step 8000 : 3.57835536212\nAverage loss at step 10000 : 3.61056993055\nNearest to been: glossaries, legal, unfavourably, be, hadad, wore, scarcity, were,\nNearest to time: strawberries, conformist, gleichschaltung, waterfall, molality, nominates, baal, dole,\nNearest to over: golden, semigroup, catus, motorways, brick, shehri, mussolini, overlord,\nNearest to not: hinayana, it, often, they, boots, also, noaa, lindsey,\nNearest to three: four, seven, six, five, nine, eight, two, zero,\nNearest to if: glands, euros, wallpaper, redefine, toho, confuse, unsound, shepherd,\nNearest to there: it, they, fullmetal, pace, legally, harpsichord, mma, bug,\nNearest to between: chuvash, wandering, from, kirsch, pursuant, eurocents, suitability, jackie,\nNearest to from: into, in, workshop, to, at, misogynist, elphinstone, spearhead,\nNearest to state: sextus, glaring, connie, adler, esoteric, didactic, handedness, presidents,\nNearest to on: in, at, for, ruminants, wakefulness, torrey, foley, gino,\nNearest to and: or, who, but, zelda, of, for, thirst, chisel,\nNearest to eight: nine, six, seven, five, four, three, zero, two,\nNearest to they: he, prisons, there, we, hydrate, it, not, cumbersome,\nNearest to more: skye, blues, trypomastigotes, deicide, most, readable, used, sterling,\nNearest to other: trochaic, hush, surveyors, joachim, differentiation, attackers, reverence, attestation,\nAverage loss at step 12000 : 3.66169466591\nAverage loss at step 14000 : 3.60342905837\nAverage loss at step 16000 : 3.57761328053\nAverage loss at step 18000 : 3.57667332476\nAverage loss at step 20000 : 3.53310145146\nNearest to been: be, become, was, hadad, unfavourably, were, wore, partido,\nNearest to time: gleichschaltung, strawberries, year, nominates, conformist, etch, admittedly, treasuries,\nNearest to over: golden, semigroup, motorways, rawlings, triangle, trey, ustawa, mattingly,\nNearest to not: they, boots, often, dieppe, still, hinayana, nearly, be,\nNearest to three: two, four, five, seven, eight, six, nine, one,\nNearest to if: wallpaper, euros, before, toho, unsound, so, bg, pfc,\nNearest to there: they, it, he, usually, which, we, not, transactions,\nNearest to between: from, with, about, near, reactance, eurocents, wandering, voltaire,\nNearest to from: into, workshop, by, between, in, on, elphinstone, under,\nNearest to state: glaring, esoteric, succeeding, sextus, vorarlberg, presidents, depends, connie,\nNearest to on: in, at, upon, during, from, janis, foley, nubian,\nNearest to and: or, thirst, but, where, s, who, pfaff, including,\nNearest to eight: nine, seven, six, five, four, three, zero, one,\nNearest to they: there, he, we, not, it, you, prisons, who,\nNearest to more: less, most, deicide, skye, trypomastigotes, interventionism, toed, drummond,\nNearest to other: such, joachim, hush, attackers, surveyors, trochaic, differentiation, reverence,\nAverage loss at step 22000 : 3.59519316927\nAverage loss at step 24000 : 3.55378576797\nAverage loss at step 26000 : 3.56455037558\nAverage loss at step 28000 : 3.5040882225\nAverage loss at step 30000 : 3.39208897972\nNearest to been: become, be, were, was, spotless, hadad, by, hausdorff,\nNearest to time: gleichschaltung, year, day, nominates, jesus, strawberries, way, admittedly,\nNearest to over: golden, semigroup, motorways, rawlings, interventionism, counternarcotics, adaption, brick,\nNearest to not: often, they, it, never, still, nor, boots, pki,\nNearest to three: four, six, two, eight, five, seven, nine, zero,\nNearest to if: when, before, so, should, toho, where, bg, wallpaper,\nNearest to there: they, it, which, usually, he, that, also, now,\nNearest to between: with, from, in, panasonic, presupposes, churchmen, hijacking, where,\nNearest to from: into, elphinstone, workshop, between, through, speculates, sosa, in,\nNearest to state: esoteric, glaring, presidents, vorarlberg, atmosphere, succeeding, lute, connie,\nNearest to on: upon, in, janis, during, torrey, against, infield, catalans,\nNearest to and: or, thirst, in, but, of, sobib, cleaves, including,\nNearest to eight: nine, six, four, seven, three, zero, five, one,\nNearest to they: we, there, he, you, it, these, who, i,\nNearest to more: less, most, deicide, faster, toed, very, skye, tonic,\nNearest to other: different, attackers, joachim, various, such, many, differentiation, these,\nAverage loss at step 32000 : 3.49501452419\nAverage loss at step 34000 : 3.48593705952\nAverage loss at step 36000 : 3.50112806576\nAverage loss at step" + "item_id": 23 }, { - "output_type": "stream", - "stream": "stdout", - "text": " 38000 : 3.49244426501\nAverage loss at step 40000 : 3.3890105716\nNearest to been: become, be, were, was, jolie, hausdorff, spotless, had,\nNearest to time: year, way, gleichschaltung, period, day, stanislav, stage, outcome,\nNearest to over: through, semigroup, rawlings, golden, about, brick, on, motorways,\nNearest to not: they, radiated, never, pki, still, omnipotent, hinayana, really,\nNearest to three: four, six, five, two, seven, eight, one, nine,\nNearest to if: when, before, where, then, bg, because, can, should,\nNearest to there: they, it, he, usually, this, typically, still, often,\nNearest to between: with, in, from, about, against, churchmen, johansen, presupposes,\nNearest to from: into, through, elphinstone, in, workshop, between, suing, under,\nNearest to state: esoteric, presidents, atmosphere, vorarlberg, lute, succeeding, glaring, didactic,\nNearest to on: upon, at, in, during, unitarians, under, catalans, batavians,\nNearest to and: or, but, s, incapacitation, including, while, of, which,\nNearest to eight: nine, six, seven, four, five, three, one, two,\nNearest to they: we, he, there, you, she, i, not, it,\nNearest to more: less, most, deicide, toed, greater, faster, quite, longer,\nNearest to other: various, different, attackers, joachim, clutter, nz, trochaic, apulia,\nAverage loss at step 42000 : 3.45294014364\nAverage loss at step 44000 : 3.47660055941\nAverage loss at step 46000 : 3.47458503014\nAverage loss at step 48000 : 3.47261548793\nAverage loss at step 50000 : 3.45390708435\nNearest to been: become, be, had, was, were, hausdorff, prem, remained,\nNearest to time: way, year, period, stv, day, gleichschaltung, stage, outcome,\nNearest to over: through, golden, semigroup, about, brick, counternarcotics, theremin, mattingly,\nNearest to not: they, still, never, really, sometimes, it, kiwifruit, nearly,\nNearest to three: five, four, six, seven, two, eight, one, nine,\nNearest to if: when, before, where, because, connexion, though, so, whether,\nNearest to there: they, it, he, this, now, often, usually, still,\nNearest to between: with, from, fashioned, churchmen, panasonic, explores, within, racial,\nNearest to from: into, through, under, elphinstone, between, workshop, circumpolar, idiom,\nNearest to state: atmosphere, vorarlberg, esoteric, presidents, madhya, majority, moulin, bowmen,\nNearest to on: upon, in, catalans, tezuka, minotaurs, wakefulness, batavians, guglielmo,\nNearest to and: or, but, thirst, signifier, which, however, including, unattractive,\nNearest to eight: six, nine, seven, five, four, three, zero, two,\nNearest to they: we, there, he, you, it, she, these, not,\nNearest to more: less, most, quite, very, further, faster, toed, deicide,\nNearest to other: various, different, many, attackers, are, joachim, nihilo, reject,\nAverage loss at step 52000 : 3.43597227755\nAverage loss at step 54000 : 3.25126817495\nAverage loss at step 56000 : 3.35102432287\nAverage loss at step 58000 : 3.44654818082\nAverage loss at step 60000 : 3.4287913968\nNearest to been: become, be, was, prem, had, remained, hadad, stanislavsky,\nNearest to time: year, way, period, stv, barely, name, stage, restoring,\nNearest to over: about, through, golden, adaption, counternarcotics, up, mattingly, brick,\nNearest to not: still, never, nor, kiwifruit, they, nearly, therefore, rarely,\nNearest to three: two, five, four, six, seven, eight, one, nine,\nNearest to if: when, though, before, where, although, because, can, could,\nNearest to there: they, it, he, still, she, we, this, often,\nNearest to between: with, from, churchmen, among, ethical, within, vma, panasonic,\nNearest to from: through, into, under, during, between, in, suing, across,\nNearest to state: atmosphere, infringe, madhya, vorarlberg, government, bowmen, vargas, republic,\nNearest to on: upon, through, within, ridiculous, janis, in, under, over,\nNearest to and: or, while, including, but, of, like, whose, bannister,\nNearest to eight: nine, six, five, four, seven, zero, three, two,\nNearest to they: we, there, you, he, it, these, she, prisons,\nNearest to more: less, most, quite, further, toed, very, faster, rather,\nNearest to other: different, various, many, nihilo, these, amour, including, screenplays,\nAverage loss at step 62000 : 3.38358767056\nAverage loss at step 64000 : 3.41693099326\nAverage loss at step 66000 : 3.39588000977\nAverage loss at step 68000 : 3.35567189544\nAverage loss at step 70000 : 3.38878934443\nNearest to been: become, be, was, prem, remained, were, being, discounts,\nNearest to time: year, way, day, period, barely, ethos, stage, reason,\nNearest to over: about, through, fortunately, semigroup, theremin, off, loudest, up,\nNearest to not: still, nor, never, they, actually, nearly, unelected, therefore,\nNearest to three: five, two, four, six, seven, eight, nine, zero,\nNearest to if: when, though, before, where, because, then, after, since,\nNearest to there: they, it, he, often, she, we, usually, still,\nNearest to between: among, with, within, from, ethical, churchmen, racial, prentice,\nNearest to from: through, into, within, during, under, until, between, across,\nNearest to state: city, atmosphere, desks, surrounding, preservation, bohr, principal, republic,\nNearest to on: upon, tezuka, through, within, wakefulness, catalans, at, ingeborg,\nNearest to and: or, but, while, including, thirst, jerzy, massing, abadan,\nNearest to eight: seven, six, nine, five, four, three, two, zero,\nNearest to they: we, you, he, there, she, it, prisons, who,\nNearest to more: less, most, quite, very, faster, smaller, further, larger,\nNearest to other: various, different, some, screenplays, lab, many, including, debugging,\nAverage loss at step 72000 : 3.41103189731\nAverage loss at step 74000 : 3.44926435578\nAverage loss at step 76000 : 3.4423020488\nAverage loss at step 78000 : 3.41976813722\nAverage loss at step 80000 : 3.39511853886\nNearest to been: become, be, remained, was, grown, were, prem, already," + "item_id": 48 }, { - "output_type": "stream", - "stream": "stdout", - "text": "\nNearest to time: year, way, period, reason, barely, distance, stage, day,\nNearest to over: about, fortunately, through, semigroup, further, mattingly, rawlings, golden,\nNearest to not: still, they, nor, never, we, kiwifruit, noaa, really,\nNearest to three: five, two, seven, four, eight, six, nine, zero,\nNearest to if: when, where, though, before, since, because, although, follows,\nNearest to there: they, it, he, we, she, still, typically, actually,\nNearest to between: with, among, within, in, racial, around, from, serapeum,\nNearest to from: into, through, in, within, under, using, during, towards,\nNearest to state: city, atmosphere, ferro, vorarlberg, surrounding, republic, madhya, national,\nNearest to on: upon, poll, in, from, tezuka, janis, through, within,\nNearest to and: or, but, including, while, s, which, thirst, although,\nNearest to eight: nine, seven, six, five, four, three, zero, two,\nNearest to they: we, you, there, he, she, it, these, not,\nNearest to more: less, most, smaller, very, faster, quite, rather, larger,\nNearest to other: various, different, joachim, including, theos, smaller, individual, screenplays,\nAverage loss at step 82000 : 3.40933967865\nAverage loss at step 84000 : 3.41618054378\nAverage loss at step 86000 : 3.31485116804\nAverage loss at step 88000 : 3.37068593091\nAverage loss at step 90000 : 3.2785516749\nNearest to been: become, be, was, prem, remained, grown, recently, already,\nNearest to time: year, way, period, day, barely, battle, buds, name,\nNearest to over: through, about, fortunately, off, theremin, semigroup, extraterrestrial, mattingly,\nNearest to not: nor, still, never, otherwise, generally, separately, gown, hydrate,\nNearest to three: four, five, six, two, eight, seven, nine, zero,\nNearest to if: when, where, before, though, because, since, then, while,\nNearest to there: they, it, he, we, she, still, typically, fiorello,\nNearest to between: with, among, within, from, churchmen, prentice, racial, panasonic,\nNearest to from: through, into, across, during, towards, until, at, within,\nNearest to state: bohr, city, atmosphere, ferro, bowmen, republic, retaliation, vorarlberg,\nNearest to on: upon, in, tezuka, at, during, within, via, catalans,\nNearest to and: or, including, but, while, like, thirst, with, schuman,\nNearest to eight: seven, nine, six, five, four, three, zero, two,\nNearest to they: we, there, he, you, she, it, prisons, these,\nNearest to more: less, most, very, faster, larger, quite, smaller, better,\nNearest to other: different, various, tamara, prosthetic, including, individual, failing, restaurants,\nAverage loss at step 92000 : 3.40355363208\nAverage loss at step 94000 : 3.35647508007\nAverage loss at step 96000 : 3.34374570692\nAverage loss at step 98000 : 3.4230104093\nAverage loss at step 100000 : 3.36909827\nNearest to been: become, be, grown, was, being, already, remained, prem,\nNearest to time: way, year, day, period, years, days, mothersbaugh, separators,\nNearest to over: through, about, semigroup, further, fortunately, off, into, theremin,\nNearest to not: never, nor, still, dieppe, really, unelected, actually, now,\nNearest to three: four, two, five, seven, six, eight, nine, zero,\nNearest to if: when, though, where, before, is, abe, then, follows,\nNearest to there: they, it, he, we, still, she, typically, often,\nNearest to between: within, with, among, churchmen, around, explores, from, reactance,\nNearest to from: into, through, within, across, in, between, using, workshop,\nNearest to state: atmosphere, bohr, national, ferro, germ, desks, city, unpaid,\nNearest to on: upon, in, within, tezuka, janis, batavians, about, macrocosm,\nNearest to and: or, but, purview, thirst, sukkot, epr, including, honesty,\nNearest to eight: seven, nine, six, four, five, three, zero, one,\nNearest to they: we, there, you, he, she, prisons, it, these,\nNearest to more: less, most, very, quite, faster, larger, rather, smaller,\nNearest to other: various, different, tamara, theos, some, cope, many, others,\n" + "item_id": 61 } ] }, - { - "metadata": { - "id": "jjJXYA_XzV79", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" + "cellView": "both", + "executionInfo": { + "elapsed": 436189, + "status": "ok", + "timestamp": 1445965429787, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" }, - "cell_type": "code", - "input": "num_points = 400\n\ntsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000)\ntwo_d_embeddings = tsne.fit_transform(final_embeddings[1:num_points+1, :])", - "language": "python", - "outputs": [] + "user_tz": 420 }, + "outputId": "5ebd6d9a-33c6-4bcd-bf6d-252b0b6055e4" + }, + "source": [ + "num_steps = 100001\n", + "\n", + "with tf.Session(graph=graph) as session:\n", + " tf.initialize_all_variables().run()\n", + " print \"Initialized\"\n", + " average_loss = 0\n", + " for step in xrange(num_steps):\n", + " batch_data, batch_labels = generate_batch(\n", + " batch_size, num_skips, skip_window)\n", + " feed_dict = {train_dataset : batch_data, train_labels : batch_labels}\n", + " _, l = session.run([optimizer, loss], feed_dict=feed_dict)\n", + " average_loss += l\n", + " if step % 2000 == 0:\n", + " if step > 0:\n", + " average_loss = average_loss / 2000\n", + " # The average loss is an estimate of the loss over the last 2000 batches.\n", + " print \"Average loss at step\", step, \":\", average_loss\n", + " average_loss = 0\n", + " # note that this is expensive (~20% slowdown if computed every 500 steps)\n", + " if step % 10000 == 0:\n", + " sim = similarity.eval()\n", + " for i in xrange(valid_size):\n", + " valid_word = reverse_dictionary[valid_examples[i]]\n", + " top_k = 8 # number of nearest neighbors\n", + " nearest = (-sim[i, :]).argsort()[1:top_k+1]\n", + " log = \"Nearest to %s:\" % valid_word\n", + " for k in xrange(top_k):\n", + " close_word = reverse_dictionary[nearest[k]]\n", + " log = \"%s %s,\" % (log, close_word)\n", + " print log\n", + " final_embeddings = normalized_embeddings.eval()" + ], + "outputs": [ { - "metadata": { - "id": "o_e0D_UezcDe", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 4763, - "status": "ok", - "timestamp": 1445965465525, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2f1ffade4c9f20de", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "df22e4a5-e8ec-4e5e-d384-c6cf37c68c34" + "output_type": "stream", + "text": [ + "Initialized\n", + "Average loss at step 0 : 8.58149623871\n", + "Nearest to been: unfavourably, marmara, ancestral, legal, bogart, glossaries, worst, rooms,\n", + "Nearest to time: conformist, strawberries, sindhi, waterfall, xia, nominates, psp, sensitivity,\n", + "Nearest to over: overlord, panda, golden, semigroup, rawlings, involved, shreveport, handling,\n", + "Nearest to not: hymenoptera, reintroducing, lamiaceae, because, davao, omnipotent, combustion, debilitating,\n", + "Nearest to three: catalog, koza, gn, braque, holstein, postgresql, luddite, justine,\n", + "Nearest to if: chilled, vince, fiddler, represented, sandinistas, happiness, lya, glands,\n", + "Nearest to there: coast, photosynthetic, kimmei, legally, inner, illyricum, formats, fullmetal,\n", + "Nearest to between: chuvash, prinz, suitability, wolfe, guideline, computability, diminutive, paulo,\n", + "Nearest to from: tanganyika, workshop, elphinstone, spearhead, resurrected, kevlar, shangri, loves,\n", + "Nearest to state: sextus, wuppertal, glaring, inches, unrounded, courageous, adler, connie,\n", + "Nearest to on: gino, phocas, rhine, jg, macrocosm, jackass, jays, theorie,\n", + "Nearest to and: standings, towed, reyes, willard, equality, juggling, wladislaus, faked,\n", + "Nearest to eight: gresham, dogg, moko, tennis, superseded, telegraphy, scramble, vinod,\n", + "Nearest to they: prisons, divisor, coder, ribeira, willingness, factional, nne, lotta,\n", + "Nearest to more: blues, fur, sterling, tangier, khwarizmi, discouraged, cal, deicide,\n", + "Nearest to other: enemies, bogged, brassicaceae, lascaux, dispense, alexandrians, crimea, dou,\n", + "Average loss at step 2000 : 4.39983723116\n", + "Average loss at step 4000 : 3.86921076906\n", + "Average loss at step 6000 : 3.72542127335\n", + "Average loss at step 8000 : 3.57835536212\n", + "Average loss at step 10000 : 3.61056993055\n", + "Nearest to been: glossaries, legal, unfavourably, be, hadad, wore, scarcity, were,\n", + "Nearest to time: strawberries, conformist, gleichschaltung, waterfall, molality, nominates, baal, dole,\n", + "Nearest to over: golden, semigroup, catus, motorways, brick, shehri, mussolini, overlord,\n", + "Nearest to not: hinayana, it, often, they, boots, also, noaa, lindsey,\n", + "Nearest to three: four, seven, six, five, nine, eight, two, zero,\n", + "Nearest to if: glands, euros, wallpaper, redefine, toho, confuse, unsound, shepherd,\n", + "Nearest to there: it, they, fullmetal, pace, legally, harpsichord, mma, bug,\n", + "Nearest to between: chuvash, wandering, from, kirsch, pursuant, eurocents, suitability, jackie,\n", + "Nearest to from: into, in, workshop, to, at, misogynist, elphinstone, spearhead,\n", + "Nearest to state: sextus, glaring, connie, adler, esoteric, didactic, handedness, presidents,\n", + "Nearest to on: in, at, for, ruminants, wakefulness, torrey, foley, gino,\n", + "Nearest to and: or, who, but, zelda, of, for, thirst, chisel,\n", + "Nearest to eight: nine, six, seven, five, four, three, zero, two,\n", + "Nearest to they: he, prisons, there, we, hydrate, it, not, cumbersome,\n", + "Nearest to more: skye, blues, trypomastigotes, deicide, most, readable, used, sterling,\n", + "Nearest to other: trochaic, hush, surveyors, joachim, differentiation, attackers, reverence, attestation,\n", + "Average loss at step 12000 : 3.66169466591\n", + "Average loss at step 14000 : 3.60342905837\n", + "Average loss at step 16000 : 3.57761328053\n", + "Average loss at step 18000 : 3.57667332476\n", + "Average loss at step 20000 : 3.53310145146\n", + "Nearest to been: be, become, was, hadad, unfavourably, were, wore, partido,\n", + "Nearest to time: gleichschaltung, strawberries, year, nominates, conformist, etch, admittedly, treasuries,\n", + "Nearest to over: golden, semigroup, motorways, rawlings, triangle, trey, ustawa, mattingly,\n", + "Nearest to not: they, boots, often, dieppe, still, hinayana, nearly, be,\n", + "Nearest to three: two, four, five, seven, eight, six, nine, one,\n", + "Nearest to if: wallpaper, euros, before, toho, unsound, so, bg, pfc,\n", + "Nearest to there: they, it, he, usually, which, we, not, transactions,\n", + "Nearest to between: from, with, about, near, reactance, eurocents, wandering, voltaire,\n", + "Nearest to from: into, workshop, by, between, in, on, elphinstone, under,\n", + "Nearest to state: glaring, esoteric, succeeding, sextus, vorarlberg, presidents, depends, connie,\n", + "Nearest to on: in, at, upon, during, from, janis, foley, nubian,\n", + "Nearest to and: or, thirst, but, where, s, who, pfaff, including,\n", + "Nearest to eight: nine, seven, six, five, four, three, zero, one,\n", + "Nearest to they: there, he, we, not, it, you, prisons, who,\n", + "Nearest to more: less, most, deicide, skye, trypomastigotes, interventionism, toed, drummond,\n", + "Nearest to other: such, joachim, hush, attackers, surveyors, trochaic, differentiation, reverence,\n", + "Average loss at step 22000 : 3.59519316927\n", + "Average loss at step 24000 : 3.55378576797\n", + "Average loss at step 26000 : 3.56455037558\n", + "Average loss at step 28000 : 3.5040882225\n", + "Average loss at step 30000 : 3.39208897972\n", + "Nearest to been: become, be, were, was, spotless, hadad, by, hausdorff,\n", + "Nearest to time: gleichschaltung, year, day, nominates, jesus, strawberries, way, admittedly,\n", + "Nearest to over: golden, semigroup, motorways, rawlings, interventionism, counternarcotics, adaption, brick,\n", + "Nearest to not: often, they, it, never, still, nor, boots, pki,\n", + "Nearest to three: four, six, two, eight, five, seven, nine, zero,\n", + "Nearest to if: when, before, so, should, toho, where, bg, wallpaper,\n", + "Nearest to there: they, it, which, usually, he, that, also, now,\n", + "Nearest to between: with, from, in, panasonic, presupposes, churchmen, hijacking, where,\n", + "Nearest to from: into, elphinstone, workshop, between, through, speculates, sosa, in,\n", + "Nearest to state: esoteric, glaring, presidents, vorarlberg, atmosphere, succeeding, lute, connie,\n", + "Nearest to on: upon, in, janis, during, torrey, against, infield, catalans,\n", + "Nearest to and: or, thirst, in, but, of, sobib, cleaves, including,\n", + "Nearest to eight: nine, six, four, seven, three, zero, five, one,\n", + "Nearest to they: we, there, he, you, it, these, who, i,\n", + "Nearest to more: less, most, deicide, faster, toed, very, skye, tonic,\n", + "Nearest to other: different, attackers, joachim, various, such, many, differentiation, these,\n", + "Average loss at step 32000 : 3.49501452419\n", + "Average loss at step 34000 : 3.48593705952\n", + "Average loss at step 36000 : 3.50112806576\n", + "Average loss at step" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + " 38000 : 3.49244426501\n", + "Average loss at step 40000 : 3.3890105716\n", + "Nearest to been: become, be, were, was, jolie, hausdorff, spotless, had,\n", + "Nearest to time: year, way, gleichschaltung, period, day, stanislav, stage, outcome,\n", + "Nearest to over: through, semigroup, rawlings, golden, about, brick, on, motorways,\n", + "Nearest to not: they, radiated, never, pki, still, omnipotent, hinayana, really,\n", + "Nearest to three: four, six, five, two, seven, eight, one, nine,\n", + "Nearest to if: when, before, where, then, bg, because, can, should,\n", + "Nearest to there: they, it, he, usually, this, typically, still, often,\n", + "Nearest to between: with, in, from, about, against, churchmen, johansen, presupposes,\n", + "Nearest to from: into, through, elphinstone, in, workshop, between, suing, under,\n", + "Nearest to state: esoteric, presidents, atmosphere, vorarlberg, lute, succeeding, glaring, didactic,\n", + "Nearest to on: upon, at, in, during, unitarians, under, catalans, batavians,\n", + "Nearest to and: or, but, s, incapacitation, including, while, of, which,\n", + "Nearest to eight: nine, six, seven, four, five, three, one, two,\n", + "Nearest to they: we, he, there, you, she, i, not, it,\n", + "Nearest to more: less, most, deicide, toed, greater, faster, quite, longer,\n", + "Nearest to other: various, different, attackers, joachim, clutter, nz, trochaic, apulia,\n", + "Average loss at step 42000 : 3.45294014364\n", + "Average loss at step 44000 : 3.47660055941\n", + "Average loss at step 46000 : 3.47458503014\n", + "Average loss at step 48000 : 3.47261548793\n", + "Average loss at step 50000 : 3.45390708435\n", + "Nearest to been: become, be, had, was, were, hausdorff, prem, remained,\n", + "Nearest to time: way, year, period, stv, day, gleichschaltung, stage, outcome,\n", + "Nearest to over: through, golden, semigroup, about, brick, counternarcotics, theremin, mattingly,\n", + "Nearest to not: they, still, never, really, sometimes, it, kiwifruit, nearly,\n", + "Nearest to three: five, four, six, seven, two, eight, one, nine,\n", + "Nearest to if: when, before, where, because, connexion, though, so, whether,\n", + "Nearest to there: they, it, he, this, now, often, usually, still,\n", + "Nearest to between: with, from, fashioned, churchmen, panasonic, explores, within, racial,\n", + "Nearest to from: into, through, under, elphinstone, between, workshop, circumpolar, idiom,\n", + "Nearest to state: atmosphere, vorarlberg, esoteric, presidents, madhya, majority, moulin, bowmen,\n", + "Nearest to on: upon, in, catalans, tezuka, minotaurs, wakefulness, batavians, guglielmo,\n", + "Nearest to and: or, but, thirst, signifier, which, however, including, unattractive,\n", + "Nearest to eight: six, nine, seven, five, four, three, zero, two,\n", + "Nearest to they: we, there, he, you, it, she, these, not,\n", + "Nearest to more: less, most, quite, very, further, faster, toed, deicide,\n", + "Nearest to other: various, different, many, attackers, are, joachim, nihilo, reject,\n", + "Average loss at step 52000 : 3.43597227755\n", + "Average loss at step 54000 : 3.25126817495\n", + "Average loss at step 56000 : 3.35102432287\n", + "Average loss at step 58000 : 3.44654818082\n", + "Average loss at step 60000 : 3.4287913968\n", + "Nearest to been: become, be, was, prem, had, remained, hadad, stanislavsky,\n", + "Nearest to time: year, way, period, stv, barely, name, stage, restoring,\n", + "Nearest to over: about, through, golden, adaption, counternarcotics, up, mattingly, brick,\n", + "Nearest to not: still, never, nor, kiwifruit, they, nearly, therefore, rarely,\n", + "Nearest to three: two, five, four, six, seven, eight, one, nine,\n", + "Nearest to if: when, though, before, where, although, because, can, could,\n", + "Nearest to there: they, it, he, still, she, we, this, often,\n", + "Nearest to between: with, from, churchmen, among, ethical, within, vma, panasonic,\n", + "Nearest to from: through, into, under, during, between, in, suing, across,\n", + "Nearest to state: atmosphere, infringe, madhya, vorarlberg, government, bowmen, vargas, republic,\n", + "Nearest to on: upon, through, within, ridiculous, janis, in, under, over,\n", + "Nearest to and: or, while, including, but, of, like, whose, bannister,\n", + "Nearest to eight: nine, six, five, four, seven, zero, three, two,\n", + "Nearest to they: we, there, you, he, it, these, she, prisons,\n", + "Nearest to more: less, most, quite, further, toed, very, faster, rather,\n", + "Nearest to other: different, various, many, nihilo, these, amour, including, screenplays,\n", + "Average loss at step 62000 : 3.38358767056\n", + "Average loss at step 64000 : 3.41693099326\n", + "Average loss at step 66000 : 3.39588000977\n", + "Average loss at step 68000 : 3.35567189544\n", + "Average loss at step 70000 : 3.38878934443\n", + "Nearest to been: become, be, was, prem, remained, were, being, discounts,\n", + "Nearest to time: year, way, day, period, barely, ethos, stage, reason,\n", + "Nearest to over: about, through, fortunately, semigroup, theremin, off, loudest, up,\n", + "Nearest to not: still, nor, never, they, actually, nearly, unelected, therefore,\n", + "Nearest to three: five, two, four, six, seven, eight, nine, zero,\n", + "Nearest to if: when, though, before, where, because, then, after, since,\n", + "Nearest to there: they, it, he, often, she, we, usually, still,\n", + "Nearest to between: among, with, within, from, ethical, churchmen, racial, prentice,\n", + "Nearest to from: through, into, within, during, under, until, between, across,\n", + "Nearest to state: city, atmosphere, desks, surrounding, preservation, bohr, principal, republic,\n", + "Nearest to on: upon, tezuka, through, within, wakefulness, catalans, at, ingeborg,\n", + "Nearest to and: or, but, while, including, thirst, jerzy, massing, abadan,\n", + "Nearest to eight: seven, six, nine, five, four, three, two, zero,\n", + "Nearest to they: we, you, he, there, she, it, prisons, who,\n", + "Nearest to more: less, most, quite, very, faster, smaller, further, larger,\n", + "Nearest to other: various, different, some, screenplays, lab, many, including, debugging,\n", + "Average loss at step 72000 : 3.41103189731\n", + "Average loss at step 74000 : 3.44926435578\n", + "Average loss at step 76000 : 3.4423020488\n", + "Average loss at step 78000 : 3.41976813722\n", + "Average loss at step 80000 : 3.39511853886\n", + "Nearest to been: become, be, remained, was, grown, were, prem, already," + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "\n", + "Nearest to time: year, way, period, reason, barely, distance, stage, day,\n", + "Nearest to over: about, fortunately, through, semigroup, further, mattingly, rawlings, golden,\n", + "Nearest to not: still, they, nor, never, we, kiwifruit, noaa, really,\n", + "Nearest to three: five, two, seven, four, eight, six, nine, zero,\n", + "Nearest to if: when, where, though, before, since, because, although, follows,\n", + "Nearest to there: they, it, he, we, she, still, typically, actually,\n", + "Nearest to between: with, among, within, in, racial, around, from, serapeum,\n", + "Nearest to from: into, through, in, within, under, using, during, towards,\n", + "Nearest to state: city, atmosphere, ferro, vorarlberg, surrounding, republic, madhya, national,\n", + "Nearest to on: upon, poll, in, from, tezuka, janis, through, within,\n", + "Nearest to and: or, but, including, while, s, which, thirst, although,\n", + "Nearest to eight: nine, seven, six, five, four, three, zero, two,\n", + "Nearest to they: we, you, there, he, she, it, these, not,\n", + "Nearest to more: less, most, smaller, very, faster, quite, rather, larger,\n", + "Nearest to other: various, different, joachim, including, theos, smaller, individual, screenplays,\n", + "Average loss at step 82000 : 3.40933967865\n", + "Average loss at step 84000 : 3.41618054378\n", + "Average loss at step 86000 : 3.31485116804\n", + "Average loss at step 88000 : 3.37068593091\n", + "Average loss at step 90000 : 3.2785516749\n", + "Nearest to been: become, be, was, prem, remained, grown, recently, already,\n", + "Nearest to time: year, way, period, day, barely, battle, buds, name,\n", + "Nearest to over: through, about, fortunately, off, theremin, semigroup, extraterrestrial, mattingly,\n", + "Nearest to not: nor, still, never, otherwise, generally, separately, gown, hydrate,\n", + "Nearest to three: four, five, six, two, eight, seven, nine, zero,\n", + "Nearest to if: when, where, before, though, because, since, then, while,\n", + "Nearest to there: they, it, he, we, she, still, typically, fiorello,\n", + "Nearest to between: with, among, within, from, churchmen, prentice, racial, panasonic,\n", + "Nearest to from: through, into, across, during, towards, until, at, within,\n", + "Nearest to state: bohr, city, atmosphere, ferro, bowmen, republic, retaliation, vorarlberg,\n", + "Nearest to on: upon, in, tezuka, at, during, within, via, catalans,\n", + "Nearest to and: or, including, but, while, like, thirst, with, schuman,\n", + "Nearest to eight: seven, nine, six, five, four, three, zero, two,\n", + "Nearest to they: we, there, he, you, she, it, prisons, these,\n", + "Nearest to more: less, most, very, faster, larger, quite, smaller, better,\n", + "Nearest to other: different, various, tamara, prosthetic, including, individual, failing, restaurants,\n", + "Average loss at step 92000 : 3.40355363208\n", + "Average loss at step 94000 : 3.35647508007\n", + "Average loss at step 96000 : 3.34374570692\n", + "Average loss at step 98000 : 3.4230104093\n", + "Average loss at step 100000 : 3.36909827\n", + "Nearest to been: become, be, grown, was, being, already, remained, prem,\n", + "Nearest to time: way, year, day, period, years, days, mothersbaugh, separators,\n", + "Nearest to over: through, about, semigroup, further, fortunately, off, into, theremin,\n", + "Nearest to not: never, nor, still, dieppe, really, unelected, actually, now,\n", + "Nearest to three: four, two, five, seven, six, eight, nine, zero,\n", + "Nearest to if: when, though, where, before, is, abe, then, follows,\n", + "Nearest to there: they, it, he, we, still, she, typically, often,\n", + "Nearest to between: within, with, among, churchmen, around, explores, from, reactance,\n", + "Nearest to from: into, through, within, across, in, between, using, workshop,\n", + "Nearest to state: atmosphere, bohr, national, ferro, germ, desks, city, unpaid,\n", + "Nearest to on: upon, in, within, tezuka, janis, batavians, about, macrocosm,\n", + "Nearest to and: or, but, purview, thirst, sukkot, epr, including, honesty,\n", + "Nearest to eight: seven, nine, six, four, five, three, zero, one,\n", + "Nearest to they: we, there, you, he, she, prisons, it, these,\n", + "Nearest to more: less, most, very, quite, faster, larger, rather, smaller,\n", + "Nearest to other: various, different, tamara, theos, some, cope, many, others,\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "jjJXYA_XzV79", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "source": [ + "num_points = 400\n", + "\n", + "tsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000)\n", + "two_d_embeddings = tsne.fit_transform(final_embeddings[1:num_points+1, :])" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "o_e0D_UezcDe", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "def plot(embeddings, labels):\n assert embeddings.shape[0] >= len(labels), 'More labels than embeddings'\n pylab.figure(figsize=(15,15)) # in inches\n for i, label in enumerate(labels):\n x, y = embeddings[i,:]\n pylab.scatter(x, y)\n pylab.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points',\n ha='right', va='bottom')\n pylab.show()\n\nwords = [reverse_dictionary[i] for i in xrange(1, num_points+1)]\nplot(two_d_embeddings, words)", - "language": "python", - "outputs": [ + "output_extras": [ { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3MAAANpCAYAAAChBGCHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdAldUfx/H3BdlbQEVzoyDukZaae5aZ5tbcIzUz9x5Z\njhwNNXMVztTExFHqT9Ny50hFc+ZKEVBwAbLh/v4gSXILChc/r3+69/Lc53yfewL8cM5zjsFoNBoR\nERERERERk2KW0QWIiIiIiIjI01OYExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiY\nIIU5ERERERERE5TmMBceHk7fvn1p2LAhb775JgEBAdy6dYvOnTtTv359unTpQnh4eHrUKiIiIiIi\nIv8wpHWfuaFDh/Lqq6/SvHlzEhISiI6OZvbs2bi4uNC9e3fmzZtHeHg4gwYNSq+aRUREREREXnpp\nGpmLiIjg4MGDNG/eHIBs2bLh4ODAtm3baNq0KQBNmzbll19+SXulIiIiIiIikiJbWt4cGBhI9uzZ\nGT58OKdOnaJ48eKMGDGC69ev4+bmBoCbmxvXr19Pl2JFREREREQkWZpG5hISEjhx4gRt2rTB398f\nGxsb5s2bl+oYg8GAwWBIU5EiIiIiIiKSWprCXK5cuciZMyelSpUCoH79+pw4cQI3NzdCQ0MBuHbt\nGtmzZ3/kedJ4256IiIiIiMhLJ03TLN3d3fHw8ODChQsULFiQvXv34unpiaenJ/7+/vTo0YM1a9ZQ\np06dR57HYDAQGhqRllIkE3N3d1D/ZmHq36xLfZu1qX+zLvVt1qb+zbrc3R2e+j1pCnMAo0ePZtCg\nQcTHx5MvXz4mTZpEYmIi/fr148cffyRPnjx89dVXaW1GRERERERE7pHmMOft7c2PP/543+sLFy5M\n66lFRERERETkIdK8abiIiIiIiIi8eApzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgghTkRERER\nERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiImSGFORERE\nRETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiICVKYExER\nERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIiYoIU5kRE\nREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgghTkR\nERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiImSGFO\nRERERETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiICVKY\nExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIiYoIU\n5kREREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgg\nhTkRERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiIm\nSGFORERERETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiI\nCVKYExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIi\nYoIU5kREREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiI\niJgghTkRERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIi\nIiImSGFORERERETEBCnMiYiIiIiImCCFOREREREREROULaMLEBERkcxnxYqlbNiwHoBGjZpQrVoN\nBg78kFKlyvLnnwG4u+dg0qTPsbKy4sqVQL74Ygq3bt3E2tqaoUNHki9fgYy9ABGRl4BG5kRERCSV\nU6dOsnHjT8yfv4i5cxeyfr0/ERHhBAZeplmzlixZshJ7ewe2b98GwJQpE+jffzDffbeE3r0/4vPP\nJ2fwFYiIvBw0MiciIiKpHD16hGrVamJlZQ1A9eq1CAg4jIdHHjw9iwDg5eVNcHAQ0dHRHDt2lNGj\nh6a8Pz4+IUPqFhF52SjMiYiISCoGg+GBr1taWqQ8NjMzJykpDqMxCQcHBxYsWPaiyhMRkX9omqWI\niIikUrp0GXbs+I3Y2Biio6PZseNXSpcue99xRqMRW1s7cufOza+//pLy2tmzf73okkVEXkoamRMR\n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\ntt/uu1FQ2bDhLEFBPQExoMrp093Yu/ckLi7/y/djfWxO5s2bN9i8eT0gx9KyEiNGjEVNTQ0Xl9Y0\nauTEpUsXSEh4J9yiq6tLr159cHRsDLz7jsXERHPunCKgmj17AdOmTSQlJQWAUaPGY2VlQ9++PYmI\neMy4cSNo2bINwcFBbNu2mTlzFhAf/5axY4cTHR2NpqYWDx7cx9m5FdHRUcyc6Z2jR+GX8PBhJMuX\nh5CRIaZLl7LY22d9efCz/WYICHwJX2faIiAgIPAfYsaMtqxaFcK0aTvZtcvim86XyzQmNzcvz+rV\ny1i/fg0tWrThyJFDnDhxJJtJup1ddfbs2cWsWdOUfXxokr5u3RbWrduCv/82fH0XK9t9yiQ90+Kh\nYPBzeZaWKlWa3bt30L27K4mJibi4uDFt2mxWrFhMz55d6dWrK7dv3/jo/rq6elhZ2TB+/BRiYqLx\n919DerqU4cMV3mdt2rTj4cP7tGjRmEOH9pGQkMjz58/Q0dFFXV0DH5+pnDlzSilYkUlmiaa9vT2g\nKNHM5MqVixw+fIBevbrSr19P4uPfEhn5FJFIRKVKVShc2ASRSET58hWJiYnh8uWbpKVpkXlvYmIa\nsW/fgxzPJzExkd27d37RtXRxaU18/Nsv2vdX5enTCDp0cGXTpgB0dHTYunUTM2d6M3XqLPbt24dM\nJlNeb5FIhJ6eHv7+2+jYsRMLF85Xrs9K9u+YkZERCxYsxc9vE97eM/nzT0Wpd//+g7GxsWPdui10\n6tQ1yz5r167EwqIS/v5b6ddvINOnTwIUnnuXLoVQpkxr5s5dxLp1qz86p+5zvH79hp49b+Lv78bG\nja707fuasLDHnz0fAYFfDSEzJyAgIJBLRCIRrVo5fJdjFRST9IJIcnIyY8eOICEhHplMym+/9ade\nvYZs2bIBdXV1XFzcWLRoPg8e3GfhwuVcvXqFAwf+UqrnfS/EYjETJ2Y9ZoUKFVmyZFW2tosXr8yy\n7Orahb//Pq3cZ9iwUezatYPw8LtKURszs5I0auSUo4rf6tX+BAVd5vTpEwQG7mDhwuXZ2mTyoRCF\nl9coatSonWVdcHBQlkBfLFZBJpNSpIghItH7D+MS9D6irJ2QEM/u3QG0b++SbZtUqigJ/BCZTIZY\nLM5xrlRBw929Pvv3r/+3zFKGo+MW2rbNfq75xYdzMtevX0Px4maUKFESUJQlBgbuoFOnLgA0adJM\n+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\nw9DPMeWzadOmYunSpcWzzz5bFEVh2yqyYsWK4sMPPyyKoigGBgaKCxcuXPO+w/rOXG1t7dArvhcv\nXhz6cPG9e/emtbU1lUol48ePz4QJE/7yrh23vq1bt2bx4sWpVCpJkpqamiS2rSbr16/P8uXL/3LN\nvtXh0UcfzciRf/zz8NBDD+XkyZNJ7FsNenp6MmHChIwfPz6VSiWtra3Zu3fvcB+LG1BbW5v7778/\nSXL77bdn4sSJ6evrS1dXV2bNmpUkmTVrVvbs2TOcx+Q6nTx5Mvv27cvTTz89dM221eHixYs5ePBg\n5syZkyQZPXp07rzzzmved1hjbtmyZeno6Mjjjz+eN954I8uWLUuSnDp1KvX19UPPq6+vT19f33Ad\nk+vQ29ubgwcPZu7cuZk/f34OHTqUxLbVYs+ePamvr8/kyZP/ct2+1Wf79u157LHHkti3GvT19WXc\nuHFDX9fV1dmwihw/fjzff/99GhoacubMmYwdOzZJMnbs2Jw5c2aYT8f1eP3117NixYqhF9iS2LZK\nHD9+PDU1NXnppZcya9asrF69Or/99ts173vdHxr+by1cuDCnT5/+2/X29vZs2bIlq1evzpNPPplP\nPvkkK1euzObNm//x+/jg8VvP1bYdHBzM+fPns23btvT09KS9vf2Kr/7a9tZ0tX03btyYTZs2DV0r\nrvJxlfa9NV1p3xdeeCFTp05NkrzzzjupVCqZMWPGFb+PfcvFXtXr119/zZIlS7Jq1arccccdf3ls\nxIgRti+hzz77LGPGjMkDDzyQr7766h+fY9vyunz5cg4fPpw1a9akoaEhr7322t9+j/nf7Ps/j7kr\nxVmSLF++PO+9916SpLm5OatXr07yxyuFf97Wk/zxFvOft2By67jatlu3bk1TU1OSpKGhISNHjszZ\ns2dtWyJX2veHH37I8ePH09bWluSPV/pnz56dbdu22bdErvbzmyQ7duzIvn378v777w9ds2/51dXV\n5cSJE0Nf27A6DAwMZMmSJWlra0tjY2OSZMyYMfn5559TW1ubU6dODf26A+Xx7bffpqurK/v27Ut/\nf38uXbqU5cuX27ZK1NfXp66uLg0NDUmSadOmZePGjRk7duw17Tust1nefffd+frrr5Mk3d3dueee\ne5IkU6dOza5du9Lf359jx46lt7d36C9KOTQ2Nqa7uztJcvTo0QwMDKSmpsa2VeDee+/NF198ka6u\nrnR1daWuri47duzI2LFj7Vsl9u/fn3fffTdvv/12/vOf/wxdt2/5Pfjgg+nt7c3x48fT39+f3bt3\n54knnhjuY3EDiqLIqlWrMnHixCxYsGDo+tSpU/PRRx8lST7++OOhyKM8li5dmn379qWrqytvvvlm\nHnnkkXR2dtq2StTW1mbcuHE5evRokuTLL7/MpEmTMmXKlGva93/+ztzVrFu3LuvWrUt/f39uu+22\nvPLKK0mSSZMmpaWlJa2trRk1alTWrl3rLeSSmT17dlauXJkZM2akUqmko6MjiW2r0f/fz77V4dVX\nX83AwEAWLVqUJHn44Yfz8ssv27cKjB49OmvWrMkzzzyT33//PXPmzMnEiROH+1jcgG+++SY7d+7M\nfffdl5kzZyb5IwIWL16c9vb2bN++PXfddVfeeuutYT4pN4ttq8eaNWvy4osvZmBgIBMmTMj69esz\nODh4TfuOKK72yy4AAADckob1NksAAACuj5gDAAAoITEHAABQQmIOAACghMQcAABACYk5AACAEhJz\nAAAAJSTmAAAASuj/AKSSWUR2kw4CAAAAAElFTkSuQmCC\n", - "metadata": {}, - "output_type": "display_data", - "text/plain": "" + "item_id": 1 } ] + }, + "cellView": "both", + "executionInfo": { + "elapsed": 4763, + "status": "ok", + "timestamp": 1445965465525, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2f1ffade4c9f20de", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "df22e4a5-e8ec-4e5e-d384-c6cf37c68c34" + }, + "source": [ + "def plot(embeddings, labels):\n", + " assert embeddings.shape[0] >= len(labels), 'More labels than embeddings'\n", + " pylab.figure(figsize=(15,15)) # in inches\n", + " for i, label in enumerate(labels):\n", + " x, y = embeddings[i,:]\n", + " pylab.scatter(x, y)\n", + " pylab.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points',\n", + " ha='right', va='bottom')\n", + " pylab.show()\n", + "\n", + "words = [reverse_dictionary[i] for i in xrange(1, num_points+1)]\n", + "plot(two_d_embeddings, words)" + ], + "outputs": [ + { + "output_type": "display_data", + "metadata": {}, + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3MAAANpCAYAAAChBGCHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdAldUfx/H3BdlbQEVzoyDukZaae5aZ5tbcIzUz9x5Z\njhwNNXMVztTExFHqT9Ny50hFc+ZKEVBwAbLh/v4gSXILChc/r3+69/Lc53yfewL8cM5zjsFoNBoR\nERERERERk2KW0QWIiIiIiIjI01OYExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiY\nIIU5ERERERERE5TmMBceHk7fvn1p2LAhb775JgEBAdy6dYvOnTtTv359unTpQnh4eHrUKiIiIiIi\nIv8wpHWfuaFDh/Lqq6/SvHlzEhISiI6OZvbs2bi4uNC9e3fmzZtHeHg4gwYNSq+aRUREREREXnpp\nGpmLiIjg4MGDNG/eHIBs2bLh4ODAtm3baNq0KQBNmzbll19+SXulIiIiIiIikiJbWt4cGBhI9uzZ\nGT58OKdOnaJ48eKMGDGC69ev4+bmBoCbmxvXr19Pl2JFREREREQkWZpG5hISEjhx4gRt2rTB398f\nGxsb5s2bl+oYg8GAwWBIU5EiIiIiIiKSWprCXK5cuciZMyelSpUCoH79+pw4cQI3NzdCQ0MBuHbt\nGtmzZ3/kedJ4256IiIiIiMhLJ03TLN3d3fHw8ODChQsULFiQvXv34unpiaenJ/7+/vTo0YM1a9ZQ\np06dR57HYDAQGhqRllIkE3N3d1D/ZmHq36xLfZu1qX+zLvVt1qb+zbrc3R2e+j1pCnMAo0ePZtCg\nQcTHx5MvXz4mTZpEYmIi/fr148cffyRPnjx89dVXaW1GRERERERE7pHmMOft7c2PP/543+sLFy5M\n66lFRERERETkIdK8abiIiIiIiIi8eApzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgghTkRERER\nERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiImSGFORERE\nRETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiICVKYExER\nERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIiYoIU5kRE\nREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgghTkR\nERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiImSGFO\nRERERETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiICVKY\nExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIiYoIU\n5kREREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiIiJgg\nhTkRERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIiIiIm\nSGFORERERETEBCnMiYiIiIiImCCFOREREREREROkMCciIiIiImKCFOZERERERERMkMKciIiIiIiI\nCVKYExERERERMUEKcyIiIiIiIiZIYU5ERERERMQEKcyJiIiIiIiYIIU5ERERERERE6QwJyIiIiIi\nYoIU5kREREREREyQwpyIiIiIiIgJUpgTERERERExQQpzIiIiIiIiJkhhTkRERERExAQpzImIiIiI\niJgghTkRERERERETpDAnIiIiIiJighTmRERERERETJDCnIiIiIiIiAlSmBMRERERETFBCnMiIiIi\nIiImSGFORERERETEBCnMiYiIiIiImCCFOREREREREROULaMLEBERkcxnxYqlbNiwHoBGjZpQrVoN\nBg78kFKlyvLnnwG4u+dg0qTPsbKy4sqVQL74Ygq3bt3E2tqaoUNHki9fgYy9ABGRl4BG5kRERCSV\nU6dOsnHjT8yfv4i5cxeyfr0/ERHhBAZeplmzlixZshJ7ewe2b98GwJQpE+jffzDffbeE3r0/4vPP\nJ2fwFYiIvBw0MiciIiKpHD16hGrVamJlZQ1A9eq1CAg4jIdHHjw9iwDg5eVNcHAQ0dHRHDt2lNGj\nh6a8Pz4+IUPqFhF52SjMiYiISCoGg+GBr1taWqQ8NjMzJykpDqMxCQcHBxYsWPaiyhMRkX9omqWI\niIikUrp0GXbs+I3Y2Biio6PZseNXSpcue99xRqMRW1s7cufOza+//pLy2tmzf73okkVEXkoamRMR\n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\ntt/uu1FQ2bDhLEFBPQExoMrp093Yu/ckLi7/y/djfWxO5s2bN9i8eT0gx9KyEiNGjEVNTQ0Xl9Y0\nauTEpUsXSEh4J9yiq6tLr159cHRsDLz7jsXERHPunCKgmj17AdOmTSQlJQWAUaPGY2VlQ9++PYmI\neMy4cSNo2bINwcFBbNu2mTlzFhAf/5axY4cTHR2NpqYWDx7cx9m5FdHRUcyc6Z2jR+GX8PBhJMuX\nh5CRIaZLl7LY22d9efCz/WYICHwJX2faIiAgIPAfYsaMtqxaFcK0aTvZtcvim86XyzQmNzcvz+rV\ny1i/fg0tWrThyJFDnDhxJJtJup1ddfbs2cWsWdOUfXxokr5u3RbWrduCv/82fH0XK9t9yiQ90+Kh\nYPBzeZaWKlWa3bt30L27K4mJibi4uDFt2mxWrFhMz55d6dWrK7dv3/jo/rq6elhZ2TB+/BRiYqLx\n919DerqU4cMV3mdt2rTj4cP7tGjRmEOH9pGQkMjz58/Q0dFFXV0DH5+pnDlzSilYkUlmiaa9vT2g\nKNHM5MqVixw+fIBevbrSr19P4uPfEhn5FJFIRKVKVShc2ASRSET58hWJiYnh8uWbpKVpkXlvYmIa\nsW/fgxzPJzExkd27d37RtXRxaU18/Nsv2vdX5enTCDp0cGXTpgB0dHTYunUTM2d6M3XqLPbt24dM\nJlNeb5FIhJ6eHv7+2+jYsRMLF85Xrs9K9u+YkZERCxYsxc9vE97eM/nzT0Wpd//+g7GxsWPdui10\n6tQ1yz5r167EwqIS/v5b6ddvINOnTwIUnnuXLoVQpkxr5s5dxLp1qz86p+5zvH79hp49b+Lv78bG\nja707fuasLDHnz0fAYFfDSEzJyAgIJBLRCIRrVo5fJdjFRST9IJIcnIyY8eOICEhHplMym+/9ade\nvYZs2bIBdXV1XFzcWLRoPg8e3GfhwuVcvXqFAwf+UqrnfS/EYjETJ2Y9ZoUKFVmyZFW2tosXr8yy\n7Orahb//Pq3cZ9iwUezatYPw8LtKURszs5I0auSUo4rf6tX+BAVd5vTpEwQG7mDhwuXZ2mTyoRCF\nl9coatSonWVdcHBQlkBfLFZBJpNSpIghItH7D+MS9D6irJ2QEM/u3QG0b++SbZtUqigJ/BCZTIZY\nLM5xrlRBw929Pvv3r/+3zFKGo+MW2rbNfq75xYdzMtevX0Px4maUKFESUJQlBgbuoFOnLgA0adJM\n+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\nw9DPMeWzadOmYunSpcWzzz5bFEVh2yqyYsWK4sMPPyyKoigGBgaKCxcuXPO+w/rOXG1t7dArvhcv\nXhz6cPG9e/emtbU1lUol48ePz4QJE/7yrh23vq1bt2bx4sWpVCpJkpqamiS2rSbr16/P8uXL/3LN\nvtXh0UcfzciRf/zz8NBDD+XkyZNJ7FsNenp6MmHChIwfPz6VSiWtra3Zu3fvcB+LG1BbW5v7778/\nSXL77bdn4sSJ6evrS1dXV2bNmpUkmTVrVvbs2TOcx+Q6nTx5Mvv27cvTTz89dM221eHixYs5ePBg\n5syZkyQZPXp07rzzzmved1hjbtmyZeno6Mjjjz+eN954I8uWLUuSnDp1KvX19UPPq6+vT19f33Ad\nk+vQ29ubgwcPZu7cuZk/f34OHTqUxLbVYs+ePamvr8/kyZP/ct2+1Wf79u157LHHkti3GvT19WXc\nuHFDX9fV1dmwihw/fjzff/99GhoacubMmYwdOzZJMnbs2Jw5c2aYT8f1eP3117NixYqhF9iS2LZK\nHD9+PDU1NXnppZcya9asrF69Or/99ts173vdHxr+by1cuDCnT5/+2/X29vZs2bIlq1evzpNPPplP\nPvkkK1euzObNm//x+/jg8VvP1bYdHBzM+fPns23btvT09KS9vf2Kr/7a9tZ0tX03btyYTZs2DV0r\nrvJxlfa9NV1p3xdeeCFTp05NkrzzzjupVCqZMWPGFb+PfcvFXtXr119/zZIlS7Jq1arccccdf3ls\nxIgRti+hzz77LGPGjMkDDzyQr7766h+fY9vyunz5cg4fPpw1a9akoaEhr7322t9+j/nf7Ps/j7kr\nxVmSLF++PO+9916SpLm5OatXr07yxyuFf97Wk/zxFvOft2By67jatlu3bk1TU1OSpKGhISNHjszZ\ns2dtWyJX2veHH37I8ePH09bWluSPV/pnz56dbdu22bdErvbzmyQ7duzIvn378v777w9ds2/51dXV\n5cSJE0Nf27A6DAwMZMmSJWlra0tjY2OSZMyYMfn5559TW1ubU6dODf26A+Xx7bffpqurK/v27Ut/\nf38uXbqU5cuX27ZK1NfXp66uLg0NDUmSadOmZePGjRk7duw17Tust1nefffd+frrr5Mk3d3dueee\ne5IkU6dOza5du9Lf359jx46lt7d36C9KOTQ2Nqa7uztJcvTo0QwMDKSmpsa2VeDee+/NF198ka6u\nrnR1daWuri47duzI2LFj7Vsl9u/fn3fffTdvv/12/vOf/wxdt2/5Pfjgg+nt7c3x48fT39+f3bt3\n54knnhjuY3EDiqLIqlWrMnHixCxYsGDo+tSpU/PRRx8lST7++OOhyKM8li5dmn379qWrqytvvvlm\nHnnkkXR2dtq2StTW1mbcuHE5evRokuTLL7/MpEmTMmXKlGva93/+ztzVrFu3LuvWrUt/f39uu+22\nvPLKK0mSSZMmpaWlJa2trRk1alTWrl3rLeSSmT17dlauXJkZM2akUqmko6MjiW2r0f/fz77V4dVX\nX83AwEAWLVqUJHn44Yfz8ssv27cKjB49OmvWrMkzzzyT33//PXPmzMnEiROH+1jcgG+++SY7d+7M\nfffdl5kzZyb5IwIWL16c9vb2bN++PXfddVfeeuutYT4pN4ttq8eaNWvy4osvZmBgIBMmTMj69esz\nODh4TfuOKK72yy4AAADckob1NksAAACuj5gDAAAoITEHAABQQmIOAACghMQcAABACYk5AACAEhJz\nAAAAJSTmAAAASuj/AKSSWUR2kw4CAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + } } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QB5EFrBnpNnc", + "colab_type": "text" + }, + "source": [ + "---\n", + "\n", + "Problem\n", + "-------\n", + "\n", + "An alternative to Word2Vec is called [CBOW](http://arxiv.org/abs/1301.3781) (Continuous Bag of Words). In the CBOW model, instead of predicting a context word from a word vector, you predict a word from the sum of all the word vectors in its context. Implement and evaluate a CBOW model trained on the text8 dataset.\n", + "\n", + "---" ] } - ], - "metadata": { - "name": "5_word2vec.ipynb", - "colabVersion": "0.3.2", - "colab_views": {}, - "colab_default_view": {} - }, - "nbformat": 3, - "nbformat_minor": 0 + ] } \ No newline at end of file From fcf17982618ba0a4d732d01bf89f8d05da77170a Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 12 Jan 2016 16:54:28 -0800 Subject: [PATCH 003/123] Update README file with instructions to update and download from GCE. Change: 111994516 --- README.md | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 812a1dc45ec..bab75c79735 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,37 @@ Assignments for Udacity Deep Learning class with TensorFlow =========================================================== -Building the Docker container ------------------------------ +Running the Docker container from the Google Cloud repository +------------------------------------------------------------- + docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments + +Accessing the Notebooks +----------------------- + +On linux, go to: http://127.0.0.1:8888 + +On mac, find the virtual machine's IP using: + + docker-machine ip default + +Then go to: http://IP:8888 (likely http://192.168.99.100:8888) + +Building a local Docker container +--------------------------------- + + cd tensorflow/examples/udacity docker build -t $USER/assignments . -Running the container ---------------------- +Running the local container +--------------------------- docker run -p 8888:8888 -it --rm $USER/assignments + +Pushing a Google Cloud release +------------------------------ + + V=0.1.0 + docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:$V + docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest + gcloud docker push b.gcr.io/tensorflow-udacity/assignments From 421dc7c8ac962fdeaf07a48f9e1ab4ea806fb6b1 Mon Sep 17 00:00:00 2001 From: Niklas Riekenbrauck Date: Sat, 23 Jan 2016 10:52:18 +0100 Subject: [PATCH 004/123] Fix Undefined Error on Exception --- 1_notmnist.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 9c9888664c5..f39fc0f07a0 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -123,7 +123,7 @@ "outputId": "ef6c790c-2513-4b09-962e-27c79390c762" }, "cell_type": "code", - "input": "num_classes = 10\n\ndef extract(filename):\n tar = tarfile.open(filename)\n tar.extractall()\n tar.close()\n root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n if len(data_folders) != num_classes:\n raise Exception(\n 'Expected %d folders, one per class. Found %d instead.' % (\n num_folders, len(data_folders)))\n print data_folders\n return data_folders\n \ntrain_folders = extract(train_filename)\ntest_folders = extract(test_filename)", + "input": "num_classes = 10\n\ndef extract(filename):\n tar = tarfile.open(filename)\n tar.extractall()\n tar.close()\n root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n if len(data_folders) != num_classes:\n raise Exception(\n 'Expected %d folders, one per class. Found %d instead.' % (\n num_classes, len(data_folders)))\n print data_folders\n return data_folders\n \ntrain_folders = extract(train_filename)\ntest_folders = extract(test_filename)", "language": "python", "outputs": [ { @@ -393,4 +393,4 @@ }, "nbformat": 3, "nbformat_minor": 0 -} \ No newline at end of file +} From ad5db1e7a991f08a07e2abaa84da3d56f4127b77 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Sun, 24 Jan 2016 18:27:31 +0100 Subject: [PATCH 005/123] Fix small missing [by] I think there is the word `by` missing: > Replace the strides [by] a max pooling operation [...] --- 4_convolutions.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index b53cb8115fd..2ddc8ca30e7 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -218,7 +218,7 @@ "colab_type": "text" }, "cell_type": "markdown", - "source": "---\nProblem 1\n---------\n\nThe convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n\n---" + "source": "---\nProblem 1\n---------\n\nThe convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides by a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n\n---" }, { "metadata": { @@ -239,4 +239,4 @@ }, "nbformat": 3, "nbformat_minor": 0 -} \ No newline at end of file +} From 44200dd57aa4458274ce8581ece39328acb05297 Mon Sep 17 00:00:00 2001 From: Krishna Sankar Date: Sat, 23 Jan 2016 22:40:41 -0800 Subject: [PATCH 006/123] .DS_Store in OSX is not an image file and gives error. So skip over this file --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index f39fc0f07a0..bd6940b9842 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -184,7 +184,7 @@ "outputId": "92c391bb-86ff-431d-9ada-315568a19e59" }, "cell_type": "code", - "input": "image_size = 28 # Pixel width and height.\npixel_depth = 255.0 # Number of levels per pixel.\n\ndef load(data_folders, min_num_images, max_num_images):\n dataset = np.ndarray(\n shape=(max_num_images, image_size, image_size), dtype=np.float32)\n labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n label_index = 0\n image_index = 0\n for folder in data_folders:\n print folder\n for image in os.listdir(folder):\n if image_index >= max_num_images:\n raise Exception('More images than expected: %d >= %d' % (\n num_images, max_num_images))\n image_file = os.path.join(folder, image)\n try:\n image_data = (ndimage.imread(image_file).astype(float) -\n pixel_depth / 2) / pixel_depth\n if image_data.shape != (image_size, image_size):\n raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n dataset[image_index, :, :] = image_data\n labels[image_index] = label_index\n image_index += 1\n except IOError as e:\n print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n label_index += 1\n num_images = image_index\n dataset = dataset[0:num_images, :, :]\n labels = labels[0:num_images]\n if num_images < min_num_images:\n raise Exception('Many fewer images than expected: %d < %d' % (\n num_images, min_num_images))\n print 'Full dataset tensor:', dataset.shape\n print 'Mean:', np.mean(dataset)\n print 'Standard deviation:', np.std(dataset)\n print 'Labels:', labels.shape\n return dataset, labels\ntrain_dataset, train_labels = load(train_folders, 450000, 550000)\ntest_dataset, test_labels = load(test_folders, 18000, 20000)", + "input": "image_size = 28 # Pixel width and height.\npixel_depth = 255.0 # Number of levels per pixel.\n\ndef load(data_folders, min_num_images, max_num_images):\n dataset = np.ndarray(\n shape=(max_num_images, image_size, image_size), dtype=np.float32)\n labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n label_index = 0\n image_index = 0\n for folder in data_folders:\n print folder\n if (".DS_Store" in folder ): # Need to skip over these files in OSX\n continue\n for image in os.listdir(folder):\n if image_index >= max_num_images:\n raise Exception('More images than expected: %d >= %d' % (\n num_images, max_num_images))\n image_file = os.path.join(folder, image)\n try:\n image_data = (ndimage.imread(image_file).astype(float) -\n pixel_depth / 2) / pixel_depth\n if image_data.shape != (image_size, image_size):\n raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n dataset[image_index, :, :] = image_data\n labels[image_index] = label_index\n image_index += 1\n except IOError as e:\n print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n label_index += 1\n num_images = image_index\n dataset = dataset[0:num_images, :, :]\n labels = labels[0:num_images]\n if num_images < min_num_images:\n raise Exception('Many fewer images than expected: %d < %d' % (\n num_images, min_num_images))\n print 'Full dataset tensor:', dataset.shape\n print 'Mean:', np.mean(dataset)\n print 'Standard deviation:', np.std(dataset)\n print 'Labels:', labels.shape\n return dataset, labels\ntrain_dataset, train_labels = load(train_folders, 450000, 550000)\ntest_dataset, test_labels = load(test_folders, 18000, 20000)", "language": "python", "outputs": [ { From ffb4c7ce4495a20cb2854c32e3bc5cdbd9e491a9 Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Sun, 24 Jan 2016 13:24:53 -0800 Subject: [PATCH 007/123] Revert ".DS_Store in OSX is not an image file and gives error. So skip over this file" This reverts commit 5245952da4c493d1960bb3ddf4c8aa3207b24fb5. --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index bd6940b9842..f39fc0f07a0 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -184,7 +184,7 @@ "outputId": "92c391bb-86ff-431d-9ada-315568a19e59" }, "cell_type": "code", - "input": "image_size = 28 # Pixel width and height.\npixel_depth = 255.0 # Number of levels per pixel.\n\ndef load(data_folders, min_num_images, max_num_images):\n dataset = np.ndarray(\n shape=(max_num_images, image_size, image_size), dtype=np.float32)\n labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n label_index = 0\n image_index = 0\n for folder in data_folders:\n print folder\n if (".DS_Store" in folder ): # Need to skip over these files in OSX\n continue\n for image in os.listdir(folder):\n if image_index >= max_num_images:\n raise Exception('More images than expected: %d >= %d' % (\n num_images, max_num_images))\n image_file = os.path.join(folder, image)\n try:\n image_data = (ndimage.imread(image_file).astype(float) -\n pixel_depth / 2) / pixel_depth\n if image_data.shape != (image_size, image_size):\n raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n dataset[image_index, :, :] = image_data\n labels[image_index] = label_index\n image_index += 1\n except IOError as e:\n print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n label_index += 1\n num_images = image_index\n dataset = dataset[0:num_images, :, :]\n labels = labels[0:num_images]\n if num_images < min_num_images:\n raise Exception('Many fewer images than expected: %d < %d' % (\n num_images, min_num_images))\n print 'Full dataset tensor:', dataset.shape\n print 'Mean:', np.mean(dataset)\n print 'Standard deviation:', np.std(dataset)\n print 'Labels:', labels.shape\n return dataset, labels\ntrain_dataset, train_labels = load(train_folders, 450000, 550000)\ntest_dataset, test_labels = load(test_folders, 18000, 20000)", + "input": "image_size = 28 # Pixel width and height.\npixel_depth = 255.0 # Number of levels per pixel.\n\ndef load(data_folders, min_num_images, max_num_images):\n dataset = np.ndarray(\n shape=(max_num_images, image_size, image_size), dtype=np.float32)\n labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n label_index = 0\n image_index = 0\n for folder in data_folders:\n print folder\n for image in os.listdir(folder):\n if image_index >= max_num_images:\n raise Exception('More images than expected: %d >= %d' % (\n num_images, max_num_images))\n image_file = os.path.join(folder, image)\n try:\n image_data = (ndimage.imread(image_file).astype(float) -\n pixel_depth / 2) / pixel_depth\n if image_data.shape != (image_size, image_size):\n raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n dataset[image_index, :, :] = image_data\n labels[image_index] = label_index\n image_index += 1\n except IOError as e:\n print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n label_index += 1\n num_images = image_index\n dataset = dataset[0:num_images, :, :]\n labels = labels[0:num_images]\n if num_images < min_num_images:\n raise Exception('Many fewer images than expected: %d < %d' % (\n num_images, min_num_images))\n print 'Full dataset tensor:', dataset.shape\n print 'Mean:', np.mean(dataset)\n print 'Standard deviation:', np.std(dataset)\n print 'Labels:', labels.shape\n return dataset, labels\ntrain_dataset, train_labels = load(train_folders, 450000, 550000)\ntest_dataset, test_labels = load(test_folders, 18000, 20000)", "language": "python", "outputs": [ { From 4c433523a2f9ea205df65c35bdd6e4f6055697a5 Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Sun, 24 Jan 2016 23:05:22 -0800 Subject: [PATCH 008/123] Running our linter on a lot of files. Change: 112920860 --- 1_notmnist.ipynb | 4 ++-- 4_convolutions.ipynb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 9c9888664c5..f39fc0f07a0 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -123,7 +123,7 @@ "outputId": "ef6c790c-2513-4b09-962e-27c79390c762" }, "cell_type": "code", - "input": "num_classes = 10\n\ndef extract(filename):\n tar = tarfile.open(filename)\n tar.extractall()\n tar.close()\n root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n if len(data_folders) != num_classes:\n raise Exception(\n 'Expected %d folders, one per class. Found %d instead.' % (\n num_folders, len(data_folders)))\n print data_folders\n return data_folders\n \ntrain_folders = extract(train_filename)\ntest_folders = extract(test_filename)", + "input": "num_classes = 10\n\ndef extract(filename):\n tar = tarfile.open(filename)\n tar.extractall()\n tar.close()\n root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n if len(data_folders) != num_classes:\n raise Exception(\n 'Expected %d folders, one per class. Found %d instead.' % (\n num_classes, len(data_folders)))\n print data_folders\n return data_folders\n \ntrain_folders = extract(train_filename)\ntest_folders = extract(test_filename)", "language": "python", "outputs": [ { @@ -393,4 +393,4 @@ }, "nbformat": 3, "nbformat_minor": 0 -} \ No newline at end of file +} diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index b53cb8115fd..2ddc8ca30e7 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -218,7 +218,7 @@ "colab_type": "text" }, "cell_type": "markdown", - "source": "---\nProblem 1\n---------\n\nThe convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n\n---" + "source": "---\nProblem 1\n---------\n\nThe convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides by a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n\n---" }, { "metadata": { @@ -239,4 +239,4 @@ }, "nbformat": 3, "nbformat_minor": 0 -} \ No newline at end of file +} From 81ee34d7f263d4c2e4d29cce8044d862036c78df Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Mon, 25 Jan 2016 10:43:05 -0800 Subject: [PATCH 009/123] Switch notebooks to v4 format. Should be a no-op functionally. Change: 112965179 --- 1_notmnist.ipynb | 952 ++++++++++++++++++---------- 2_fullyconnected.ipynb | 817 ++++++++++++++++-------- 3_regularization.ipynb | 449 ++++++++----- 4_convolutions.ipynb | 641 +++++++++++++------ 5_word2vec.ipynb | 3 +- 6_lstm.ipynb | 1373 +++++++++++++++++++++++++++++----------- 6 files changed, 2861 insertions(+), 1374 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index f39fc0f07a0..e32e4bf030c 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -1,396 +1,652 @@ { - "worksheets": [ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "version": "0.3.2", + "views": {}, + "default_view": {}, + "name": "1_notmnist.ipynb", + "provenance": [] + } + }, + "cells": [ { - "cells": [ - { - "metadata": { - "id": "5hIbr52I7Z7U", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Deep Learning\n=============\n\nAssignment 1\n------------\n\nThe objective of this assignment is to learn about simple data curation practices, and familiarize you with some of the data we'll be reusing later.\n\nThis notebook uses the [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) dataset to be used with python experiments. This dataset is designed to look like the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset, while looking a little more like real data: it's a harder task, and the data is a lot less 'clean' than MNIST." - }, - { - "metadata": { - "id": "apJbCsBHl-2A", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport tarfile\nimport urllib\nfrom IPython.display import display, Image\nfrom scipy import ndimage\nfrom sklearn.linear_model import LogisticRegression\nimport cPickle as pickle", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "jNWGtZaXn-5j", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "First, we'll download the dataset to our local machine. The data consists of characters rendered in a variety of fonts on a 28x28 image. The labels are limited to 'A' through 'J' (10 classes). The training set has about 500k and the testset 19000 labelled examples. Given these sizes, it should be possible to train models quickly on any machine." + "cell_type": "markdown", + "metadata": { + "id": "5hIbr52I7Z7U", + "colab_type": "text" + }, + "source": [ + "Deep Learning\n", + "=============\n", + "\n", + "Assignment 1\n", + "------------\n", + "\n", + "The objective of this assignment is to learn about simple data curation practices, and familiarize you with some of the data we'll be reusing later.\n", + "\n", + "This notebook uses the [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) dataset to be used with python experiments. This dataset is designed to look like the classic [MNIST](http://yann.lecun.com/exdb/mnist/) dataset, while looking a little more like real data: it's a harder task, and the data is a lot less 'clean' than MNIST." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "apJbCsBHl-2A", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "EYRJ4ICW6-da", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 186058, - "status": "ok", - "timestamp": 1444485672507, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2a0a5e044bb03b66", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "0d0f85df-155f-4a89-8e7e-ee32df36ec8d" + "cellView": "both" + }, + "source": [ + "# These are all the modules we'll be using later. Make sure you can import them\n", + "# before proceeding further.\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import os\n", + "import tarfile\n", + "import urllib\n", + "from IPython.display import display, Image\n", + "from scipy import ndimage\n", + "from sklearn.linear_model import LogisticRegression\n", + "import cPickle as pickle" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jNWGtZaXn-5j", + "colab_type": "text" + }, + "source": [ + "First, we'll download the dataset to our local machine. The data consists of characters rendered in a variety of fonts on a 28x28 image. The labels are limited to 'A' through 'J' (10 classes). The training set has about 500k and the testset 19000 labelled examples. Given these sizes, it should be possible to train models quickly on any machine." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EYRJ4ICW6-da", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "url = 'http://yaroslavvb.com/upload/notMNIST/'\n\ndef maybe_download(filename, expected_bytes):\n \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n if not os.path.exists(filename):\n filename, _ = urllib.urlretrieve(url + filename, filename)\n statinfo = os.stat(filename)\n if statinfo.st_size == expected_bytes:\n print 'Found and verified', filename\n else:\n raise Exception(\n 'Failed to verify' + filename + '. Can you get to it with a browser?')\n return filename\n\ntrain_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\ntest_filename = maybe_download('notMNIST_small.tar.gz', 8458043)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Found and verified notMNIST_large.tar.gz\nFound and verified notMNIST_small.tar.gz\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "cC3p0oEyF8QT", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 186058, + "status": "ok", + "timestamp": 1444485672507, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Extract the dataset from the compressed .tar.gz file.\nThis should give you a set of directories, labelled A through J." + "user_tz": 420 }, + "outputId": "0d0f85df-155f-4a89-8e7e-ee32df36ec8d" + }, + "source": [ + "url = 'http://yaroslavvb.com/upload/notMNIST/'\n", + "\n", + "def maybe_download(filename, expected_bytes):\n", + " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", + " if not os.path.exists(filename):\n", + " filename, _ = urllib.urlretrieve(url + filename, filename)\n", + " statinfo = os.stat(filename)\n", + " if statinfo.st_size == expected_bytes:\n", + " print 'Found and verified', filename\n", + " else:\n", + " raise Exception(\n", + " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", + " return filename\n", + "\n", + "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", + "test_filename = maybe_download('notMNIST_small.tar.gz', 8458043)" + ], + "outputs": [ { - "metadata": { - "id": "H8CBE-WZ8nmj", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 186055, - "status": "ok", - "timestamp": 1444485672525, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2a0a5e044bb03b66", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "ef6c790c-2513-4b09-962e-27c79390c762" + "output_type": "stream", + "text": [ + "Found and verified notMNIST_large.tar.gz\n", + "Found and verified notMNIST_small.tar.gz\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cC3p0oEyF8QT", + "colab_type": "text" + }, + "source": [ + "Extract the dataset from the compressed .tar.gz file.\n", + "This should give you a set of directories, labelled A through J." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H8CBE-WZ8nmj", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "num_classes = 10\n\ndef extract(filename):\n tar = tarfile.open(filename)\n tar.extractall()\n tar.close()\n root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n if len(data_folders) != num_classes:\n raise Exception(\n 'Expected %d folders, one per class. Found %d instead.' % (\n num_classes, len(data_folders)))\n print data_folders\n return data_folders\n \ntrain_folders = extract(train_filename)\ntest_folders = extract(test_filename)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "['notMNIST_large/A', 'notMNIST_large/B', 'notMNIST_large/C', 'notMNIST_large/D', 'notMNIST_large/E', 'notMNIST_large/F', 'notMNIST_large/G', 'notMNIST_large/H', 'notMNIST_large/I', 'notMNIST_large/J']\n['notMNIST_small/A', 'notMNIST_small/B', 'notMNIST_small/C', 'notMNIST_small/D', 'notMNIST_small/E', 'notMNIST_small/F', 'notMNIST_small/G', 'notMNIST_small/H', 'notMNIST_small/I', 'notMNIST_small/J']\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "4riXK3IoHgx6", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 1\n---------\n\nLet's take a peek at some of the data to make sure it looks sensible. Each exemplar should be an image of a character A through J rendered in a different font. Display a sample of the images that we just downloaded. Hint: you can use the package IPython.display.\n\n---" - }, - { - "metadata": { - "id": "PBdkjESPK8tw", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 186055, + "status": "ok", + "timestamp": 1444485672525, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Now let's load the data in a more manageable format.\n\nWe'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. The labels will be stored into a separate array of integers 0 through 9.\n\nA few images might not be readable, we'll just skip them." + "user_tz": 420 }, + "outputId": "ef6c790c-2513-4b09-962e-27c79390c762" + }, + "source": [ + "num_classes = 10\n", + "\n", + "def extract(filename):\n", + " tar = tarfile.open(filename)\n", + " tar.extractall()\n", + " tar.close()\n", + " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", + " data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n", + " if len(data_folders) != num_classes:\n", + " raise Exception(\n", + " 'Expected %d folders, one per class. Found %d instead.' % (\n", + " num_classes, len(data_folders)))\n", + " print data_folders\n", + " return data_folders\n", + " \n", + "train_folders = extract(train_filename)\n", + "test_folders = extract(test_filename)" + ], + "outputs": [ { - "metadata": { - "id": "h7q0XhG3MJdf", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 30 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 399874, - "status": "ok", - "timestamp": 1444485886378, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2a0a5e044bb03b66", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "92c391bb-86ff-431d-9ada-315568a19e59" + "output_type": "stream", + "text": [ + "['notMNIST_large/A', 'notMNIST_large/B', 'notMNIST_large/C', 'notMNIST_large/D', 'notMNIST_large/E', 'notMNIST_large/F', 'notMNIST_large/G', 'notMNIST_large/H', 'notMNIST_large/I', 'notMNIST_large/J']\n", + "['notMNIST_small/A', 'notMNIST_small/B', 'notMNIST_small/C', 'notMNIST_small/D', 'notMNIST_small/E', 'notMNIST_small/F', 'notMNIST_small/G', 'notMNIST_small/H', 'notMNIST_small/I', 'notMNIST_small/J']\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4riXK3IoHgx6", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 1\n", + "---------\n", + "\n", + "Let's take a peek at some of the data to make sure it looks sensible. Each exemplar should be an image of a character A through J rendered in a different font. Display a sample of the images that we just downloaded. Hint: you can use the package IPython.display.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PBdkjESPK8tw", + "colab_type": "text" + }, + "source": [ + "Now let's load the data in a more manageable format.\n", + "\n", + "We'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. The labels will be stored into a separate array of integers 0 through 9.\n", + "\n", + "A few images might not be readable, we'll just skip them." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "h7q0XhG3MJdf", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "image_size = 28 # Pixel width and height.\npixel_depth = 255.0 # Number of levels per pixel.\n\ndef load(data_folders, min_num_images, max_num_images):\n dataset = np.ndarray(\n shape=(max_num_images, image_size, image_size), dtype=np.float32)\n labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n label_index = 0\n image_index = 0\n for folder in data_folders:\n print folder\n for image in os.listdir(folder):\n if image_index >= max_num_images:\n raise Exception('More images than expected: %d >= %d' % (\n num_images, max_num_images))\n image_file = os.path.join(folder, image)\n try:\n image_data = (ndimage.imread(image_file).astype(float) -\n pixel_depth / 2) / pixel_depth\n if image_data.shape != (image_size, image_size):\n raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n dataset[image_index, :, :] = image_data\n labels[image_index] = label_index\n image_index += 1\n except IOError as e:\n print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n label_index += 1\n num_images = image_index\n dataset = dataset[0:num_images, :, :]\n labels = labels[0:num_images]\n if num_images < min_num_images:\n raise Exception('Many fewer images than expected: %d < %d' % (\n num_images, min_num_images))\n print 'Full dataset tensor:', dataset.shape\n print 'Mean:', np.mean(dataset)\n print 'Standard deviation:', np.std(dataset)\n print 'Labels:', labels.shape\n return dataset, labels\ntrain_dataset, train_labels = load(train_folders, 450000, 550000)\ntest_dataset, test_labels = load(test_folders, 18000, 20000)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "notMNIST_large/A\nCould not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\nCould not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\nCould not read: notMNIST_large/A/Um9tYW5hIEJvbGQucGZi.png : cannot identify image file - it's ok, skipping.\nnotMNIST_large/B\nCould not read: notMNIST_large/B/TmlraXNFRi1TZW1pQm9sZEl0YWxpYy5vdGY=.png : cannot identify image file - it's ok, skipping.\nnotMNIST_large/C\nnotMNIST_large/D\nCould not read: notMNIST_large/D/VHJhbnNpdCBCb2xkLnR0Zg==.png : cannot identify image file - it's ok, skipping.\nnotMNIST_large/E\nnotMNIST_large/F\nnotMNIST_large/G\nnotMNIST_large/H\nnotMNIST_large/I\nnotMNIST_large/J\nFull dataset tensor: (529114, 28, 28)\nMean: -0.0816593\nStandard deviation: 0.454232\nLabels: (529114,)\nnotMNIST_small/A\nCould not read: notMNIST_small/A/RGVtb2NyYXRpY2FCb2xkT2xkc3R5bGUgQm9sZC50dGY=.png : cannot identify image file - it's ok, skipping.\nnotMNIST_small/B\nnotMNIST_small/C\nnotMNIST_small/D\nnotMNIST_small/E\nnotMNIST_small/F\nCould not read: notMNIST_small/F/Q3Jvc3NvdmVyIEJvbGRPYmxpcXVlLnR0Zg==.png : cannot identify image file - it's ok, skipping.\nnotMNIST_small/G\nnotMNIST_small/H\nnotMNIST_small/I\nnotMNIST_small/J\nFull dataset tensor: (18724, 28, 28)\nMean: -0.0746364\nStandard deviation: 0.458622\nLabels: (18724,)\n" + "item_id": 30 } ] }, - { - "metadata": { - "id": "vUdbskYE2d87", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 399874, + "status": "ok", + "timestamp": 1444485886378, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "---\nProblem 2\n---------\n\nLet's verify that the data still looks good. Displaying a sample of the labels and images from the ndarray. Hint: you can use matplotlib.pyplot.\n\n---" + "user_tz": 420 }, + "outputId": "92c391bb-86ff-431d-9ada-315568a19e59" + }, + "source": [ + "image_size = 28 # Pixel width and height.\n", + "pixel_depth = 255.0 # Number of levels per pixel.\n", + "\n", + "def load(data_folders, min_num_images, max_num_images):\n", + " dataset = np.ndarray(\n", + " shape=(max_num_images, image_size, image_size), dtype=np.float32)\n", + " labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n", + " label_index = 0\n", + " image_index = 0\n", + " for folder in data_folders:\n", + " print folder\n", + " for image in os.listdir(folder):\n", + " if image_index >= max_num_images:\n", + " raise Exception('More images than expected: %d >= %d' % (\n", + " num_images, max_num_images))\n", + " image_file = os.path.join(folder, image)\n", + " try:\n", + " image_data = (ndimage.imread(image_file).astype(float) -\n", + " pixel_depth / 2) / pixel_depth\n", + " if image_data.shape != (image_size, image_size):\n", + " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", + " dataset[image_index, :, :] = image_data\n", + " labels[image_index] = label_index\n", + " image_index += 1\n", + " except IOError as e:\n", + " print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n", + " label_index += 1\n", + " num_images = image_index\n", + " dataset = dataset[0:num_images, :, :]\n", + " labels = labels[0:num_images]\n", + " if num_images < min_num_images:\n", + " raise Exception('Many fewer images than expected: %d < %d' % (\n", + " num_images, min_num_images))\n", + " print 'Full dataset tensor:', dataset.shape\n", + " print 'Mean:', np.mean(dataset)\n", + " print 'Standard deviation:', np.std(dataset)\n", + " print 'Labels:', labels.shape\n", + " return dataset, labels\n", + "train_dataset, train_labels = load(train_folders, 450000, 550000)\n", + "test_dataset, test_labels = load(test_folders, 18000, 20000)" + ], + "outputs": [ { - "metadata": { - "id": "GPTCnjIcyuKN", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." - }, - { - "metadata": { - "id": "6WZ2l2tN2zOL", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "np.random.seed(133)\ndef randomize(dataset, labels):\n permutation = np.random.permutation(labels.shape[0])\n shuffled_dataset = dataset[permutation,:,:]\n shuffled_labels = labels[permutation]\n return shuffled_dataset, shuffled_labels\ntrain_dataset, train_labels = randomize(train_dataset, train_labels)\ntest_dataset, test_labels = randomize(test_dataset, test_labels)", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "puDUTe6t6USl", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 3\n---------\nConvince yourself that the data is still good after shuffling!\n\n---" - }, - { - "metadata": { - "id": "cYznx5jUwzoO", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 4\n---------\nAnother check: we expect the data to be balanced across classes. Verify that.\n\n---" - }, - { - "metadata": { - "id": "LA7M7K22ynCt", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune train_size as needed.\n\nAlso create a validation dataset for hyperparameter tuning." + "output_type": "stream", + "text": [ + "notMNIST_large/A\n", + "Could not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\n", + "Could not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Could not read: notMNIST_large/A/Um9tYW5hIEJvbGQucGZi.png : cannot identify image file - it's ok, skipping.\n", + "notMNIST_large/B\n", + "Could not read: notMNIST_large/B/TmlraXNFRi1TZW1pQm9sZEl0YWxpYy5vdGY=.png : cannot identify image file - it's ok, skipping.\n", + "notMNIST_large/C\n", + "notMNIST_large/D\n", + "Could not read: notMNIST_large/D/VHJhbnNpdCBCb2xkLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "notMNIST_large/E\n", + "notMNIST_large/F\n", + "notMNIST_large/G\n", + "notMNIST_large/H\n", + "notMNIST_large/I\n", + "notMNIST_large/J\n", + "Full dataset tensor: (529114, 28, 28)\n", + "Mean: -0.0816593\n", + "Standard deviation: 0.454232\n", + "Labels: (529114,)\n", + "notMNIST_small/A\n", + "Could not read: notMNIST_small/A/RGVtb2NyYXRpY2FCb2xkT2xkc3R5bGUgQm9sZC50dGY=.png : cannot identify image file - it's ok, skipping.\n", + "notMNIST_small/B\n", + "notMNIST_small/C\n", + "notMNIST_small/D\n", + "notMNIST_small/E\n", + "notMNIST_small/F\n", + "Could not read: notMNIST_small/F/Q3Jvc3NvdmVyIEJvbGRPYmxpcXVlLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "notMNIST_small/G\n", + "notMNIST_small/H\n", + "notMNIST_small/I\n", + "notMNIST_small/J\n", + "Full dataset tensor: (18724, 28, 28)\n", + "Mean: -0.0746364\n", + "Standard deviation: 0.458622\n", + "Labels: (18724,)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vUdbskYE2d87", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 2\n", + "---------\n", + "\n", + "Let's verify that the data still looks good. Displaying a sample of the labels and images from the ndarray. Hint: you can use matplotlib.pyplot.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GPTCnjIcyuKN", + "colab_type": "text" + }, + "source": [ + "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6WZ2l2tN2zOL", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "s3mWgZLpyuzq", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 411281, - "status": "ok", - "timestamp": 1444485897869, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2a0a5e044bb03b66", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "8af66da6-902d-4719-bedc-7c9fb7ae7948" + "cellView": "both" + }, + "source": [ + "np.random.seed(133)\n", + "def randomize(dataset, labels):\n", + " permutation = np.random.permutation(labels.shape[0])\n", + " shuffled_dataset = dataset[permutation,:,:]\n", + " shuffled_labels = labels[permutation]\n", + " return shuffled_dataset, shuffled_labels\n", + "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", + "test_dataset, test_labels = randomize(test_dataset, test_labels)" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "puDUTe6t6USl", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 3\n", + "---------\n", + "Convince yourself that the data is still good after shuffling!\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cYznx5jUwzoO", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 4\n", + "---------\n", + "Another check: we expect the data to be balanced across classes. Verify that.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LA7M7K22ynCt", + "colab_type": "text" + }, + "source": [ + "Prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune train_size as needed.\n", + "\n", + "Also create a validation dataset for hyperparameter tuning." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "s3mWgZLpyuzq", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "train_size = 200000\nvalid_size = 10000\n\nvalid_dataset = train_dataset[:valid_size,:,:]\nvalid_labels = train_labels[:valid_size]\ntrain_dataset = train_dataset[valid_size:valid_size+train_size,:,:]\ntrain_labels = train_labels[valid_size:valid_size+train_size]\nprint 'Training', train_dataset.shape, train_labels.shape\nprint 'Validation', valid_dataset.shape, valid_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training (200000, 28, 28) (200000,)\nValidation (10000, 28, 28) (10000,)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "tIQJaJuwg5Hw", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 411281, + "status": "ok", + "timestamp": 1444485897869, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Finally, let's save the data for later reuse:" + "user_tz": 420 }, + "outputId": "8af66da6-902d-4719-bedc-7c9fb7ae7948" + }, + "source": [ + "train_size = 200000\n", + "valid_size = 10000\n", + "\n", + "valid_dataset = train_dataset[:valid_size,:,:]\n", + "valid_labels = train_labels[:valid_size]\n", + "train_dataset = train_dataset[valid_size:valid_size+train_size,:,:]\n", + "train_labels = train_labels[valid_size:valid_size+train_size]\n", + "print 'Training', train_dataset.shape, train_labels.shape\n", + "print 'Validation', valid_dataset.shape, valid_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "QiR_rETzem6C", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "pickle_file = 'notMNIST.pickle'\n\ntry:\n f = open(pickle_file, 'wb')\n save = {\n 'train_dataset': train_dataset,\n 'train_labels': train_labels,\n 'valid_dataset': valid_dataset,\n 'valid_labels': valid_labels,\n 'test_dataset': test_dataset,\n 'test_labels': test_labels,\n }\n pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n f.close()\nexcept Exception as e:\n print 'Unable to save data to', pickle_file, ':', e\n raise", - "language": "python", - "outputs": [] + "output_type": "stream", + "text": [ + "Training (200000, 28, 28) (200000,)\n", + "Validation (10000, 28, 28) (10000,)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tIQJaJuwg5Hw", + "colab_type": "text" + }, + "source": [ + "Finally, let's save the data for later reuse:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QiR_rETzem6C", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "hQbLjrW_iT39", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 413065, - "status": "ok", - "timestamp": 1444485899688, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "2a0a5e044bb03b66", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "b440efc6-5ee1-4cbc-d02d-93db44ebd956" + "cellView": "both" + }, + "source": [ + "pickle_file = 'notMNIST.pickle'\n", + "\n", + "try:\n", + " f = open(pickle_file, 'wb')\n", + " save = {\n", + " 'train_dataset': train_dataset,\n", + " 'train_labels': train_labels,\n", + " 'valid_dataset': valid_dataset,\n", + " 'valid_labels': valid_labels,\n", + " 'test_dataset': test_dataset,\n", + " 'test_labels': test_labels,\n", + " }\n", + " pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n", + " f.close()\n", + "except Exception as e:\n", + " print 'Unable to save data to', pickle_file, ':', e\n", + " raise" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "hQbLjrW_iT39", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "statinfo = os.stat(pickle_file)\nprint 'Compressed pickle size:', statinfo.st_size", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Compressed pickle size: 718193801\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "gE_cRAQB33lk", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 413065, + "status": "ok", + "timestamp": 1444485899688, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "2a0a5e044bb03b66", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "---\nProblem 5\n---------\n\nBy construction, this dataset might contain a lot of overlapping samples, including training data that's also contained in the validation and test set! Overlap between training and test can skew the results if you expect to use your model in an environment where there is never an overlap, but are actually ok if you expect to see training samples recur when you use it.\nMeasure how much overlap there is between training, validation and test samples.\nOptional questions:\n- What about near duplicates between datasets? (images that are almost identical)\n- Create a sanitized validation and test set, and compare your accuracy on those in subsequent assignments.\n---" + "user_tz": 420 }, + "outputId": "b440efc6-5ee1-4cbc-d02d-93db44ebd956" + }, + "source": [ + "statinfo = os.stat(pickle_file)\n", + "print 'Compressed pickle size:', statinfo.st_size" + ], + "outputs": [ { - "metadata": { - "id": "L8oww1s4JMQx", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 6\n---------\n\nLet's get an idea of what an off-the-shelf classifier can give you on this data. It's always good to check that there is something to learn, and that it's a problem that is not so trivial that a canned solution solves it.\n\nTrain a simple model on this data using 50, 100, 1000 and 5000 training samples. Hint: you can use the LogisticRegression model from sklearn.linear_model.\n\nOptional question: train an off-the-shelf model on all the data!\n\n---" + "output_type": "stream", + "text": [ + "Compressed pickle size: 718193801\n" + ], + "name": "stdout" } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gE_cRAQB33lk", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 5\n", + "---------\n", + "\n", + "By construction, this dataset might contain a lot of overlapping samples, including training data that's also contained in the validation and test set! Overlap between training and test can skew the results if you expect to use your model in an environment where there is never an overlap, but are actually ok if you expect to see training samples recur when you use it.\n", + "Measure how much overlap there is between training, validation and test samples.\n", + "Optional questions:\n", + "- What about near duplicates between datasets? (images that are almost identical)\n", + "- Create a sanitized validation and test set, and compare your accuracy on those in subsequent assignments.\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L8oww1s4JMQx", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 6\n", + "---------\n", + "\n", + "Let's get an idea of what an off-the-shelf classifier can give you on this data. It's always good to check that there is something to learn, and that it's a problem that is not so trivial that a canned solution solves it.\n", + "\n", + "Train a simple model on this data using 50, 100, 1000 and 5000 training samples. Hint: you can use the LogisticRegression model from sklearn.linear_model.\n", + "\n", + "Optional question: train an off-the-shelf model on all the data!\n", + "\n", + "---" ] } - ], - "metadata": { - "name": "1_notmnist.ipynb", - "colabVersion": "0.3.2", - "colab_views": {}, - "colab_default_view": {} - }, - "nbformat": 3, - "nbformat_minor": 0 -} + ] +} \ No newline at end of file diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index fb5be12ac04..5abcfd3be91 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -1,311 +1,584 @@ { - "worksheets": [ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "version": "0.3.2", + "views": {}, + "default_view": {}, + "name": "2_fullyconnected.ipynb", + "provenance": [] + } + }, + "cells": [ { - "cells": [ - { - "metadata": { - "id": "kR-4eNdK6lYS", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Deep Learning\n=============\n\nAssignment 2\n------------\n\nPreviously in `1_notmnist.ipynb`, we created a pickle with formatted datasets for training, development and testing on the [notMNIST dataset](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html).\n\nThe goal of this assignment is to progressively train deeper and more accurate models using TensorFlow." - }, - { - "metadata": { - "id": "JLpLa8Jt7Vu4", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport cPickle as pickle\nimport numpy as np\nimport tensorflow as tf", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "1HrCK6e17WzV", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "First reload the data we generated in `1_notmist.ipynb`." + "cell_type": "markdown", + "metadata": { + "id": "kR-4eNdK6lYS", + "colab_type": "text" + }, + "source": [ + "Deep Learning\n", + "=============\n", + "\n", + "Assignment 2\n", + "------------\n", + "\n", + "Previously in `1_notmnist.ipynb`, we created a pickle with formatted datasets for training, development and testing on the [notMNIST dataset](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html).\n", + "\n", + "The goal of this assignment is to progressively train deeper and more accurate models using TensorFlow." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JLpLa8Jt7Vu4", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "y3-cj1bpmuxc", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 19456, - "status": "ok", - "timestamp": 1449847956073, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "0ddb1607-1fc4-4ddb-de28-6c7ab7fb0c33" + "cellView": "both" + }, + "source": [ + "# These are all the modules we'll be using later. Make sure you can import them\n", + "# before proceeding further.\n", + "import cPickle as pickle\n", + "import numpy as np\n", + "import tensorflow as tf" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1HrCK6e17WzV", + "colab_type": "text" + }, + "source": [ + "First reload the data we generated in `1_notmist.ipynb`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "y3-cj1bpmuxc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "pickle_file = 'notMNIST.pickle'\n\nwith open(pickle_file, 'rb') as f:\n save = pickle.load(f)\n train_dataset = save['train_dataset']\n train_labels = save['train_labels']\n valid_dataset = save['valid_dataset']\n valid_labels = save['valid_labels']\n test_dataset = save['test_dataset']\n test_labels = save['test_labels']\n del save # hint to help gc free up memory\n print 'Training set', train_dataset.shape, train_labels.shape\n print 'Validation set', valid_dataset.shape, valid_labels.shape\n print 'Test set', test_dataset.shape, test_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training set (200000, 28, 28) (200000,)\nValidation set (10000, 28, 28) (10000,)\nTest set (18724, 28, 28) (18724,)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "L7aHrm6nGDMB", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 19456, + "status": "ok", + "timestamp": 1449847956073, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "Reformat into a shape that's more adapted to the models we're going to train:\n- data as a flat matrix,\n- labels as float 1-hot encodings." + "user_tz": 480 }, + "outputId": "0ddb1607-1fc4-4ddb-de28-6c7ab7fb0c33" + }, + "source": [ + "pickle_file = 'notMNIST.pickle'\n", + "\n", + "with open(pickle_file, 'rb') as f:\n", + " save = pickle.load(f)\n", + " train_dataset = save['train_dataset']\n", + " train_labels = save['train_labels']\n", + " valid_dataset = save['valid_dataset']\n", + " valid_labels = save['valid_labels']\n", + " test_dataset = save['test_dataset']\n", + " test_labels = save['test_labels']\n", + " del save # hint to help gc free up memory\n", + " print 'Training set', train_dataset.shape, train_labels.shape\n", + " print 'Validation set', valid_dataset.shape, valid_labels.shape\n", + " print 'Test set', test_dataset.shape, test_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "IRSyYiIIGIzS", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 19723, - "status": "ok", - "timestamp": 1449847956364, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "2ba0fc75-1487-4ace-a562-cf81cae82793" + "output_type": "stream", + "text": [ + "Training set (200000, 28, 28) (200000,)\n", + "Validation set (10000, 28, 28) (10000,)\n", + "Test set (18724, 28, 28) (18724,)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L7aHrm6nGDMB", + "colab_type": "text" + }, + "source": [ + "Reformat into a shape that's more adapted to the models we're going to train:\n", + "- data as a flat matrix,\n", + "- labels as float 1-hot encodings." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IRSyYiIIGIzS", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "image_size = 28\nnum_labels = 10\n\ndef reformat(dataset, labels):\n dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]\n labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n return dataset, labels\ntrain_dataset, train_labels = reformat(train_dataset, train_labels)\nvalid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\ntest_dataset, test_labels = reformat(test_dataset, test_labels)\nprint 'Training set', train_dataset.shape, train_labels.shape\nprint 'Validation set', valid_dataset.shape, valid_labels.shape\nprint 'Test set', test_dataset.shape, test_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training set (200000, 784) (200000, 10)\nValidation set (10000, 784) (10000, 10)\nTest set (18724, 784) (18724, 10)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "nCLVqyQ5vPPH", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "We're first going to train a multinomial logistic regression using simple gradient descent.\n\nTensorFlow works like this:\n* First you describe the computation that you want to see performed: what the inputs, the variables, and the operations look like. These get created as nodes over a computation graph. This description is all contained within the block below:\n\n with graph.as_default():\n ...\n\n* Then you can run the operations on this graph as many times as you want by calling `session.run()`, providing it outputs to fetch from the graph that get returned. This runtime operation is all contained in the block below:\n\n with tf.Session(graph=graph) as session:\n ...\n\nLet's load all the data into TensorFlow and build the computation graph corresponding to our training:" - }, - { - "metadata": { - "id": "Nfv39qvtvOl_", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" + "cellView": "both", + "executionInfo": { + "elapsed": 19723, + "status": "ok", + "timestamp": 1449847956364, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "code", - "input": "# With gradient descent training, even this much data is prohibitive.\n# Subset the training data for faster turnaround.\ntrain_subset = 10000\n\ngraph = tf.Graph()\nwith graph.as_default():\n\n # Input data.\n # Load the training, validation and test data into constants that are\n # attached to the graph.\n tf_train_dataset = tf.constant(train_dataset[:train_subset, :])\n tf_train_labels = tf.constant(train_labels[:train_subset])\n tf_valid_dataset = tf.constant(valid_dataset)\n tf_test_dataset = tf.constant(test_dataset)\n \n # Variables.\n # These are the parameters that we are going to be training. The weight\n # matrix will be initialized using random valued following a (truncated)\n # normal distribution. The biases get initialized to zero.\n weights = tf.Variable(\n tf.truncated_normal([image_size * image_size, num_labels]))\n biases = tf.Variable(tf.zeros([num_labels]))\n \n # Training computation.\n # We multiply the inputs with the weight matrix, and add biases. We compute\n # the softmax and cross-entropy (it's one operation in TensorFlow, because\n # it's very common, and it can be optimized). We take the average of this\n # cross-entropy across all training examples: that's our loss.\n logits = tf.matmul(tf_train_dataset, weights) + biases\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n \n # Optimizer.\n # We are going to find the minimum of this loss using gradient descent.\n optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n \n # Predictions for the training, validation, and test data.\n # These are not part of training, but merely here so that we can report\n # accuracy figures as we train.\n train_prediction = tf.nn.softmax(logits)\n valid_prediction = tf.nn.softmax(\n tf.matmul(tf_valid_dataset, weights) + biases)\n test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases)", - "language": "python", - "outputs": [] + "user_tz": 480 }, + "outputId": "2ba0fc75-1487-4ace-a562-cf81cae82793" + }, + "source": [ + "image_size = 28\n", + "num_labels = 10\n", + "\n", + "def reformat(dataset, labels):\n", + " dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n", + " # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]\n", + " labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n", + " return dataset, labels\n", + "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", + "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n", + "test_dataset, test_labels = reformat(test_dataset, test_labels)\n", + "print 'Training set', train_dataset.shape, train_labels.shape\n", + "print 'Validation set', valid_dataset.shape, valid_labels.shape\n", + "print 'Test set', test_dataset.shape, test_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "KQcL4uqISHjP", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Let's run this computation and iterate:" + "output_type": "stream", + "text": [ + "Training set (200000, 784) (200000, 10)\n", + "Validation set (10000, 784) (10000, 10)\n", + "Test set (18724, 784) (18724, 10)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nCLVqyQ5vPPH", + "colab_type": "text" + }, + "source": [ + "We're first going to train a multinomial logistic regression using simple gradient descent.\n", + "\n", + "TensorFlow works like this:\n", + "* First you describe the computation that you want to see performed: what the inputs, the variables, and the operations look like. These get created as nodes over a computation graph. This description is all contained within the block below:\n", + "\n", + " with graph.as_default():\n", + " ...\n", + "\n", + "* Then you can run the operations on this graph as many times as you want by calling `session.run()`, providing it outputs to fetch from the graph that get returned. This runtime operation is all contained in the block below:\n", + "\n", + " with tf.Session(graph=graph) as session:\n", + " ...\n", + "\n", + "Let's load all the data into TensorFlow and build the computation graph corresponding to our training:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Nfv39qvtvOl_", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "z2cjdenH869W", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 9 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 57454, - "status": "ok", - "timestamp": 1449847994134, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "4c037ba1-b526-4d8e-e632-91e2a0333267" + "cellView": "both" + }, + "source": [ + "# With gradient descent training, even this much data is prohibitive.\n", + "# Subset the training data for faster turnaround.\n", + "train_subset = 10000\n", + "\n", + "graph = tf.Graph()\n", + "with graph.as_default():\n", + "\n", + " # Input data.\n", + " # Load the training, validation and test data into constants that are\n", + " # attached to the graph.\n", + " tf_train_dataset = tf.constant(train_dataset[:train_subset, :])\n", + " tf_train_labels = tf.constant(train_labels[:train_subset])\n", + " tf_valid_dataset = tf.constant(valid_dataset)\n", + " tf_test_dataset = tf.constant(test_dataset)\n", + " \n", + " # Variables.\n", + " # These are the parameters that we are going to be training. The weight\n", + " # matrix will be initialized using random valued following a (truncated)\n", + " # normal distribution. The biases get initialized to zero.\n", + " weights = tf.Variable(\n", + " tf.truncated_normal([image_size * image_size, num_labels]))\n", + " biases = tf.Variable(tf.zeros([num_labels]))\n", + " \n", + " # Training computation.\n", + " # We multiply the inputs with the weight matrix, and add biases. We compute\n", + " # the softmax and cross-entropy (it's one operation in TensorFlow, because\n", + " # it's very common, and it can be optimized). We take the average of this\n", + " # cross-entropy across all training examples: that's our loss.\n", + " logits = tf.matmul(tf_train_dataset, weights) + biases\n", + " loss = tf.reduce_mean(\n", + " tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n", + " \n", + " # Optimizer.\n", + " # We are going to find the minimum of this loss using gradient descent.\n", + " optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n", + " \n", + " # Predictions for the training, validation, and test data.\n", + " # These are not part of training, but merely here so that we can report\n", + " # accuracy figures as we train.\n", + " train_prediction = tf.nn.softmax(logits)\n", + " valid_prediction = tf.nn.softmax(\n", + " tf.matmul(tf_valid_dataset, weights) + biases)\n", + " test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases)" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KQcL4uqISHjP", + "colab_type": "text" + }, + "source": [ + "Let's run this computation and iterate:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "z2cjdenH869W", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "num_steps = 801\n\ndef accuracy(predictions, labels):\n return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n / predictions.shape[0])\n\nwith tf.Session(graph=graph) as session:\n # This is a one-time operation which ensures the parameters get initialized as\n # we described in the graph: random weights for the matrix, zeros for the\n # biases. \n tf.initialize_all_variables().run()\n print 'Initialized'\n for step in xrange(num_steps):\n # Run the computations. We tell .run() that we want to run the optimizer,\n # and get the loss value and the training predictions returned as numpy\n # arrays.\n _, l, predictions = session.run([optimizer, loss, train_prediction])\n if (step % 100 == 0):\n print 'Loss at step', step, ':', l\n print 'Training accuracy: %.1f%%' % accuracy(\n predictions, train_labels[:train_subset, :])\n # Calling .eval() on valid_prediction is basically like calling run(), but\n # just to get that one numpy array. Note that it recomputes all its graph\n # dependencies.\n print 'Validation accuracy: %.1f%%' % accuracy(\n valid_prediction.eval(), valid_labels)\n print 'Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Initialized\nLoss at step 0 : 17.2939\nTraining accuracy: 10.8%\nValidation accuracy: 13.8%\nLoss at step 100 : 2.26903\nTraining accuracy: 72.3%\nValidation accuracy: 71.6%\nLoss at step 200 : 1.84895\nTraining accuracy: 74.9%\nValidation accuracy: 73.9%\nLoss at step 300 : 1.60701\nTraining accuracy: 76.0%\nValidation accuracy: 74.5%\nLoss at step 400 : 1.43912\nTraining accuracy: 76.8%\nValidation accuracy: 74.8%\nLoss at step 500 : 1.31349\nTraining accuracy: 77.5%\nValidation accuracy: 75.0%\nLoss at step 600 : 1.21501\nTraining accuracy: 78.1%\nValidation accuracy: 75.4%\nLoss at step 700 : 1.13515\nTraining accuracy: 78.6%\nValidation accuracy: 75.4%\nLoss at step 800 : 1.0687\nTraining accuracy: 79.2%\nValidation accuracy: 75.6%\nTest accuracy: 82.9%\n" + "item_id": 9 } ] }, - { - "metadata": { - "id": "x68f-hxRGm3H", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 57454, + "status": "ok", + "timestamp": 1449847994134, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "Let's now switch to stochastic gradient descent training instead, which is much faster.\n\nThe graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `sesion.run()`." + "user_tz": 480 }, + "outputId": "4c037ba1-b526-4d8e-e632-91e2a0333267" + }, + "source": [ + "num_steps = 801\n", + "\n", + "def accuracy(predictions, labels):\n", + " return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n", + " / predictions.shape[0])\n", + "\n", + "with tf.Session(graph=graph) as session:\n", + " # This is a one-time operation which ensures the parameters get initialized as\n", + " # we described in the graph: random weights for the matrix, zeros for the\n", + " # biases. \n", + " tf.initialize_all_variables().run()\n", + " print 'Initialized'\n", + " for step in xrange(num_steps):\n", + " # Run the computations. We tell .run() that we want to run the optimizer,\n", + " # and get the loss value and the training predictions returned as numpy\n", + " # arrays.\n", + " _, l, predictions = session.run([optimizer, loss, train_prediction])\n", + " if (step % 100 == 0):\n", + " print 'Loss at step', step, ':', l\n", + " print 'Training accuracy: %.1f%%' % accuracy(\n", + " predictions, train_labels[:train_subset, :])\n", + " # Calling .eval() on valid_prediction is basically like calling run(), but\n", + " # just to get that one numpy array. Note that it recomputes all its graph\n", + " # dependencies.\n", + " print 'Validation accuracy: %.1f%%' % accuracy(\n", + " valid_prediction.eval(), valid_labels)\n", + " print 'Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels)" + ], + "outputs": [ { - "metadata": { - "id": "qhPMzWYRGrzM", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "batch_size = 128\n\ngraph = tf.Graph()\nwith graph.as_default():\n\n # Input data. For the training data, we use a placeholder that will be fed\n # at run time with a training minibatch.\n tf_train_dataset = tf.placeholder(tf.float32,\n shape=(batch_size, image_size * image_size))\n tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))\n tf_valid_dataset = tf.constant(valid_dataset)\n tf_test_dataset = tf.constant(test_dataset)\n \n # Variables.\n weights = tf.Variable(\n tf.truncated_normal([image_size * image_size, num_labels]))\n biases = tf.Variable(tf.zeros([num_labels]))\n \n # Training computation.\n logits = tf.matmul(tf_train_dataset, weights) + biases\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n \n # Optimizer.\n optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n \n # Predictions for the training, validation, and test data.\n train_prediction = tf.nn.softmax(logits)\n valid_prediction = tf.nn.softmax(\n tf.matmul(tf_valid_dataset, weights) + biases)\n test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases)", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "XmVZESmtG4JH", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Let's run it:" + "output_type": "stream", + "text": [ + "Initialized\n", + "Loss at step 0 : 17.2939\n", + "Training accuracy: 10.8%\n", + "Validation accuracy: 13.8%\n", + "Loss at step 100 : 2.26903\n", + "Training accuracy: 72.3%\n", + "Validation accuracy: 71.6%\n", + "Loss at step 200 : 1.84895\n", + "Training accuracy: 74.9%\n", + "Validation accuracy: 73.9%\n", + "Loss at step 300 : 1.60701\n", + "Training accuracy: 76.0%\n", + "Validation accuracy: 74.5%\n", + "Loss at step 400 : 1.43912\n", + "Training accuracy: 76.8%\n", + "Validation accuracy: 74.8%\n", + "Loss at step 500 : 1.31349\n", + "Training accuracy: 77.5%\n", + "Validation accuracy: 75.0%\n", + "Loss at step 600 : 1.21501\n", + "Training accuracy: 78.1%\n", + "Validation accuracy: 75.4%\n", + "Loss at step 700 : 1.13515\n", + "Training accuracy: 78.6%\n", + "Validation accuracy: 75.4%\n", + "Loss at step 800 : 1.0687\n", + "Training accuracy: 79.2%\n", + "Validation accuracy: 75.6%\n", + "Test accuracy: 82.9%\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x68f-hxRGm3H", + "colab_type": "text" + }, + "source": [ + "Let's now switch to stochastic gradient descent training instead, which is much faster.\n", + "\n", + "The graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `sesion.run()`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qhPMzWYRGrzM", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "FoF91pknG_YW", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 6 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 66292, - "status": "ok", - "timestamp": 1449848003013, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "d255c80e-954d-4183-ca1c-c7333ce91d0a" + "cellView": "both" + }, + "source": [ + "batch_size = 128\n", + "\n", + "graph = tf.Graph()\n", + "with graph.as_default():\n", + "\n", + " # Input data. For the training data, we use a placeholder that will be fed\n", + " # at run time with a training minibatch.\n", + " tf_train_dataset = tf.placeholder(tf.float32,\n", + " shape=(batch_size, image_size * image_size))\n", + " tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))\n", + " tf_valid_dataset = tf.constant(valid_dataset)\n", + " tf_test_dataset = tf.constant(test_dataset)\n", + " \n", + " # Variables.\n", + " weights = tf.Variable(\n", + " tf.truncated_normal([image_size * image_size, num_labels]))\n", + " biases = tf.Variable(tf.zeros([num_labels]))\n", + " \n", + " # Training computation.\n", + " logits = tf.matmul(tf_train_dataset, weights) + biases\n", + " loss = tf.reduce_mean(\n", + " tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n", + " \n", + " # Optimizer.\n", + " optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n", + " \n", + " # Predictions for the training, validation, and test data.\n", + " train_prediction = tf.nn.softmax(logits)\n", + " valid_prediction = tf.nn.softmax(\n", + " tf.matmul(tf_valid_dataset, weights) + biases)\n", + " test_prediction = tf.nn.softmax(tf.matmul(tf_test_dataset, weights) + biases)" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XmVZESmtG4JH", + "colab_type": "text" + }, + "source": [ + "Let's run it:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FoF91pknG_YW", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "num_steps = 3001\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print \"Initialized\"\n for step in xrange(num_steps):\n # Pick an offset within the training data, which has been randomized.\n # Note: we could use better randomization across epochs.\n offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n # Generate a minibatch.\n batch_data = train_dataset[offset:(offset + batch_size), :]\n batch_labels = train_labels[offset:(offset + batch_size), :]\n # Prepare a dictionary telling the session where to feed the minibatch.\n # The key of the dictionary is the placeholder node of the graph to be fed,\n # and the value is the numpy array to feed to it.\n feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n _, l, predictions = session.run(\n [optimizer, loss, train_prediction], feed_dict=feed_dict)\n if (step % 500 == 0):\n print \"Minibatch loss at step\", step, \":\", l\n print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n print \"Validation accuracy: %.1f%%\" % accuracy(\n valid_prediction.eval(), valid_labels)\n print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Initialized\nMinibatch loss at step 0 : 16.8091\nMinibatch accuracy: 12.5%\nValidation accuracy: 14.0%\nMinibatch loss at step 500 : 1.75256\nMinibatch accuracy: 77.3%\nValidation accuracy: 75.0%\nMinibatch loss at step 1000 : 1.32283\nMinibatch accuracy: 77.3%\nValidation accuracy: 76.6%\nMinibatch loss at step 1500 : 0.944533\nMinibatch accuracy: 83.6%\nValidation accuracy: 76.5%\nMinibatch loss at step 2000 : 1.03795\nMinibatch accuracy: 78.9%\nValidation accuracy: 77.8%\nMinibatch loss at step 2500 : 1.10219\nMinibatch accuracy: 80.5%\nValidation accuracy: 78.0%\nMinibatch loss at step 3000 : 0.758874\nMinibatch accuracy: 82.8%\nValidation accuracy: 78.8%\nTest accuracy: 86.1%\n" + "item_id": 6 } ] }, - { - "metadata": { - "id": "7omWxtvLLxik", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 66292, + "status": "ok", + "timestamp": 1449848003013, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "---\nProblem\n-------\n\nTurn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units (nn.relu()) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n\n---" + "user_tz": 480 + }, + "outputId": "d255c80e-954d-4183-ca1c-c7333ce91d0a" + }, + "source": [ + "num_steps = 3001\n", + "\n", + "with tf.Session(graph=graph) as session:\n", + " tf.initialize_all_variables().run()\n", + " print \"Initialized\"\n", + " for step in xrange(num_steps):\n", + " # Pick an offset within the training data, which has been randomized.\n", + " # Note: we could use better randomization across epochs.\n", + " offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n", + " # Generate a minibatch.\n", + " batch_data = train_dataset[offset:(offset + batch_size), :]\n", + " batch_labels = train_labels[offset:(offset + batch_size), :]\n", + " # Prepare a dictionary telling the session where to feed the minibatch.\n", + " # The key of the dictionary is the placeholder node of the graph to be fed,\n", + " # and the value is the numpy array to feed to it.\n", + " feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n", + " _, l, predictions = session.run(\n", + " [optimizer, loss, train_prediction], feed_dict=feed_dict)\n", + " if (step % 500 == 0):\n", + " print \"Minibatch loss at step\", step, \":\", l\n", + " print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n", + " print \"Validation accuracy: %.1f%%\" % accuracy(\n", + " valid_prediction.eval(), valid_labels)\n", + " print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)" + ], + "outputs": [ + { + "output_type": "stream", + "text": [ + "Initialized\n", + "Minibatch loss at step 0 : 16.8091\n", + "Minibatch accuracy: 12.5%\n", + "Validation accuracy: 14.0%\n", + "Minibatch loss at step 500 : 1.75256\n", + "Minibatch accuracy: 77.3%\n", + "Validation accuracy: 75.0%\n", + "Minibatch loss at step 1000 : 1.32283\n", + "Minibatch accuracy: 77.3%\n", + "Validation accuracy: 76.6%\n", + "Minibatch loss at step 1500 : 0.944533\n", + "Minibatch accuracy: 83.6%\n", + "Validation accuracy: 76.5%\n", + "Minibatch loss at step 2000 : 1.03795\n", + "Minibatch accuracy: 78.9%\n", + "Validation accuracy: 77.8%\n", + "Minibatch loss at step 2500 : 1.10219\n", + "Minibatch accuracy: 80.5%\n", + "Validation accuracy: 78.0%\n", + "Minibatch loss at step 3000 : 0.758874\n", + "Minibatch accuracy: 82.8%\n", + "Validation accuracy: 78.8%\n", + "Test accuracy: 86.1%\n" + ], + "name": "stdout" } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7omWxtvLLxik", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem\n", + "-------\n", + "\n", + "Turn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units (nn.relu()) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n", + "\n", + "---" ] } - ], - "metadata": { - "name": "2_fullyconnected.ipynb", - "colabVersion": "0.3.2", - "colab_views": {}, - "colab_default_view": {} - }, - "nbformat": 3, - "nbformat_minor": 0 + ] } \ No newline at end of file diff --git a/3_regularization.ipynb b/3_regularization.ipynb index e2e0b81922d..a61f7f4859a 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -1,196 +1,299 @@ { - "worksheets": [ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "version": "0.3.2", + "views": {}, + "default_view": {}, + "name": "3_regularization.ipynb", + "provenance": [] + } + }, + "cells": [ { - "cells": [ - { - "metadata": { - "id": "kR-4eNdK6lYS", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Deep Learning\n=============\n\nAssignment 3\n------------\n\nPreviously in `2_fullyconnected.ipynb`, you trained a logistic regression and a neural network model.\n\nThe goal of this assignment is to explore regularization techniques." - }, - { - "metadata": { - "id": "JLpLa8Jt7Vu4", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport cPickle as pickle\nimport numpy as np\nimport tensorflow as tf", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "1HrCK6e17WzV", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "First reload the data we generated in _notmist.ipynb_." + "cell_type": "markdown", + "metadata": { + "id": "kR-4eNdK6lYS", + "colab_type": "text" + }, + "source": [ + "Deep Learning\n", + "=============\n", + "\n", + "Assignment 3\n", + "------------\n", + "\n", + "Previously in `2_fullyconnected.ipynb`, you trained a logistic regression and a neural network model.\n", + "\n", + "The goal of this assignment is to explore regularization techniques." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JLpLa8Jt7Vu4", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "y3-cj1bpmuxc", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 11777, - "status": "ok", - "timestamp": 1449849322348, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "e03576f1-ebbe-4838-c388-f1777bcc9873" + "cellView": "both" + }, + "source": [ + "# These are all the modules we'll be using later. Make sure you can import them\n", + "# before proceeding further.\n", + "import cPickle as pickle\n", + "import numpy as np\n", + "import tensorflow as tf" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1HrCK6e17WzV", + "colab_type": "text" + }, + "source": [ + "First reload the data we generated in _notmist.ipynb_." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "y3-cj1bpmuxc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "pickle_file = 'notMNIST.pickle'\n\nwith open(pickle_file, 'rb') as f:\n save = pickle.load(f)\n train_dataset = save['train_dataset']\n train_labels = save['train_labels']\n valid_dataset = save['valid_dataset']\n valid_labels = save['valid_labels']\n test_dataset = save['test_dataset']\n test_labels = save['test_labels']\n del save # hint to help gc free up memory\n print 'Training set', train_dataset.shape, train_labels.shape\n print 'Validation set', valid_dataset.shape, valid_labels.shape\n print 'Test set', test_dataset.shape, test_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training set (200000, 28, 28) (200000,)\nValidation set (10000, 28, 28) (10000,)\nTest set (18724, 28, 28) (18724,)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "L7aHrm6nGDMB", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 11777, + "status": "ok", + "timestamp": 1449849322348, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "Reformat into a shape that's more adapted to the models we're going to train:\n- data as a flat matrix,\n- labels as float 1-hot encodings." + "user_tz": 480 }, + "outputId": "e03576f1-ebbe-4838-c388-f1777bcc9873" + }, + "source": [ + "pickle_file = 'notMNIST.pickle'\n", + "\n", + "with open(pickle_file, 'rb') as f:\n", + " save = pickle.load(f)\n", + " train_dataset = save['train_dataset']\n", + " train_labels = save['train_labels']\n", + " valid_dataset = save['valid_dataset']\n", + " valid_labels = save['valid_labels']\n", + " test_dataset = save['test_dataset']\n", + " test_labels = save['test_labels']\n", + " del save # hint to help gc free up memory\n", + " print 'Training set', train_dataset.shape, train_labels.shape\n", + " print 'Validation set', valid_dataset.shape, valid_labels.shape\n", + " print 'Test set', test_dataset.shape, test_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "IRSyYiIIGIzS", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 11728, - "status": "ok", - "timestamp": 1449849322356, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "3f8996ee-3574-4f44-c953-5c8a04636582" + "output_type": "stream", + "text": [ + "Training set (200000, 28, 28) (200000,)\n", + "Validation set (10000, 28, 28) (10000,)\n", + "Test set (18724, 28, 28) (18724,)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L7aHrm6nGDMB", + "colab_type": "text" + }, + "source": [ + "Reformat into a shape that's more adapted to the models we're going to train:\n", + "- data as a flat matrix,\n", + "- labels as float 1-hot encodings." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IRSyYiIIGIzS", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "image_size = 28\nnum_labels = 10\n\ndef reformat(dataset, labels):\n dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]\n labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n return dataset, labels\ntrain_dataset, train_labels = reformat(train_dataset, train_labels)\nvalid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\ntest_dataset, test_labels = reformat(test_dataset, test_labels)\nprint 'Training set', train_dataset.shape, train_labels.shape\nprint 'Validation set', valid_dataset.shape, valid_labels.shape\nprint 'Test set', test_dataset.shape, test_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training set (200000, 784) (200000, 10)\nValidation set (10000, 784) (10000, 10)\nTest set (18724, 784) (18724, 10)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "RajPLaL_ZW6w", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "def accuracy(predictions, labels):\n return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n / predictions.shape[0])", - "language": "python", - "outputs": [] - }, - { - "metadata": { - "id": "sgLbUAQ1CW-1", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 11728, + "status": "ok", + "timestamp": 1449849322356, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "---\nProblem 1\n---------\n\nIntroduce and tune L2 regularization for both logistic and neural network models. Remember that L2 amounts to adding a penalty on the norm of the weights to the loss. In TensorFlow, you can compue the L2 loss for a tensor `t` using `nn.l2_loss(t)`. The right amount of regularization should improve your validation / test accuracy.\n\n---" + "user_tz": 480 }, + "outputId": "3f8996ee-3574-4f44-c953-5c8a04636582" + }, + "source": [ + "image_size = 28\n", + "num_labels = 10\n", + "\n", + "def reformat(dataset, labels):\n", + " dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n", + " # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]\n", + " labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n", + " return dataset, labels\n", + "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", + "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n", + "test_dataset, test_labels = reformat(test_dataset, test_labels)\n", + "print 'Training set', train_dataset.shape, train_labels.shape\n", + "print 'Validation set', valid_dataset.shape, valid_labels.shape\n", + "print 'Test set', test_dataset.shape, test_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "na8xX2yHZzNF", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 2\n---------\nLet's demonstrate an extreme case of overfitting. Restrict your training data to just a few batches. What happens?\n\n---" - }, - { - "metadata": { - "id": "ww3SCBUdlkRc", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 3\n---------\nIntroduce Dropout on the hidden layer of the neural network. Remember: Dropout should only be introduced during training, not evaluation, otherwise your evaluation results would be stochastic as well. TensorFlow provides `nn.dropout()` for that, but you have to make sure it's only inserted during training.\n\nWhat happens to our extreme overfitting case?\n\n---" - }, - { - "metadata": { - "id": "-b1hTz3VWZjw", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 4\n---------\n\nTry to get the best performance you can using a multi-layer model! The best reported test accuracy using a deep network is [97.1%](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html?showComment=1391023266211#c8758720086795711595).\n\nOne avenue you can explore is to add multiple layers.\n\nAnother one is to use learning rate decay:\n\n global_step = tf.Variable(0) # count the number of steps taken.\n learning_rate = tf.train.exponential_decay(0.5, step, ...)\n optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)\n \n ---\n" + "output_type": "stream", + "text": [ + "Training set (200000, 784) (200000, 10)\n", + "Validation set (10000, 784) (10000, 10)\n", + "Test set (18724, 784) (18724, 10)\n" + ], + "name": "stdout" } + ], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "RajPLaL_ZW6w", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "source": [ + "def accuracy(predictions, labels):\n", + " return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n", + " / predictions.shape[0])" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sgLbUAQ1CW-1", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 1\n", + "---------\n", + "\n", + "Introduce and tune L2 regularization for both logistic and neural network models. Remember that L2 amounts to adding a penalty on the norm of the weights to the loss. In TensorFlow, you can compue the L2 loss for a tensor `t` using `nn.l2_loss(t)`. The right amount of regularization should improve your validation / test accuracy.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "na8xX2yHZzNF", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 2\n", + "---------\n", + "Let's demonstrate an extreme case of overfitting. Restrict your training data to just a few batches. What happens?\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ww3SCBUdlkRc", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 3\n", + "---------\n", + "Introduce Dropout on the hidden layer of the neural network. Remember: Dropout should only be introduced during training, not evaluation, otherwise your evaluation results would be stochastic as well. TensorFlow provides `nn.dropout()` for that, but you have to make sure it's only inserted during training.\n", + "\n", + "What happens to our extreme overfitting case?\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-b1hTz3VWZjw", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 4\n", + "---------\n", + "\n", + "Try to get the best performance you can using a multi-layer model! The best reported test accuracy using a deep network is [97.1%](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html?showComment=1391023266211#c8758720086795711595).\n", + "\n", + "One avenue you can explore is to add multiple layers.\n", + "\n", + "Another one is to use learning rate decay:\n", + "\n", + " global_step = tf.Variable(0) # count the number of steps taken.\n", + " learning_rate = tf.train.exponential_decay(0.5, step, ...)\n", + " optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)\n", + " \n", + " ---\n" ] } - ], - "metadata": { - "name": "3_regularization.ipynb", - "colabVersion": "0.3.2", - "colab_views": {}, - "colab_default_view": {} - }, - "nbformat": 3, - "nbformat_minor": 0 + ] } \ No newline at end of file diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 2ddc8ca30e7..94266663b07 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -1,242 +1,463 @@ { - "worksheets": [ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "version": "0.3.2", + "views": {}, + "default_view": {}, + "name": "4_convolutions.ipynb", + "provenance": [] + } + }, + "cells": [ { - "cells": [ - { - "metadata": { - "id": "4embtkV0pNxM", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Deep Learning\n=============\n\nAssignment 4\n------------\n\nPreviously in `2_fullyconnected.ipynb` and `3_regularization.ipynb`, we trained fully connected networks to classify [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) characters.\n\nThe goal of this assignment is make the neural network convolutional." - }, - { - "metadata": { - "id": "tm2CQN_Cpwj0", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport cPickle as pickle\nimport numpy as np\nimport tensorflow as tf", - "language": "python", - "outputs": [] + "cell_type": "markdown", + "metadata": { + "id": "4embtkV0pNxM", + "colab_type": "text" + }, + "source": [ + "Deep Learning\n", + "=============\n", + "\n", + "Assignment 4\n", + "------------\n", + "\n", + "Previously in `2_fullyconnected.ipynb` and `3_regularization.ipynb`, we trained fully connected networks to classify [notMNIST](http://yaroslavvb.blogspot.com/2011/09/notmnist-dataset.html) characters.\n", + "\n", + "The goal of this assignment is make the neural network convolutional." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "tm2CQN_Cpwj0", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "y3-cj1bpmuxc", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 11948, - "status": "ok", - "timestamp": 1446658914837, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "016b1a51-0290-4b08-efdb-8c95ffc3cd01" + "cellView": "both" + }, + "source": [ + "# These are all the modules we'll be using later. Make sure you can import them\n", + "# before proceeding further.\n", + "import cPickle as pickle\n", + "import numpy as np\n", + "import tensorflow as tf" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "y3-cj1bpmuxc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "pickle_file = 'notMNIST.pickle'\n\nwith open(pickle_file, 'rb') as f:\n save = pickle.load(f)\n train_dataset = save['train_dataset']\n train_labels = save['train_labels']\n valid_dataset = save['valid_dataset']\n valid_labels = save['valid_labels']\n test_dataset = save['test_dataset']\n test_labels = save['test_labels']\n del save # hint to help gc free up memory\n print 'Training set', train_dataset.shape, train_labels.shape\n print 'Validation set', valid_dataset.shape, valid_labels.shape\n print 'Test set', test_dataset.shape, test_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training set (200000, 28, 28) (200000,)\nValidation set (10000, 28, 28) (10000,)\nTest set (18724, 28, 28) (18724,)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "L7aHrm6nGDMB", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 11948, + "status": "ok", + "timestamp": 1446658914837, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "Reformat into a TensorFlow-friendly shape:\n- convolutions need the image data formatted as a cube (width by height by #channels)\n- labels as float 1-hot encodings." + "user_tz": 480 }, + "outputId": "016b1a51-0290-4b08-efdb-8c95ffc3cd01" + }, + "source": [ + "pickle_file = 'notMNIST.pickle'\n", + "\n", + "with open(pickle_file, 'rb') as f:\n", + " save = pickle.load(f)\n", + " train_dataset = save['train_dataset']\n", + " train_labels = save['train_labels']\n", + " valid_dataset = save['valid_dataset']\n", + " valid_labels = save['valid_labels']\n", + " test_dataset = save['test_dataset']\n", + " test_labels = save['test_labels']\n", + " del save # hint to help gc free up memory\n", + " print 'Training set', train_dataset.shape, train_labels.shape\n", + " print 'Validation set', valid_dataset.shape, valid_labels.shape\n", + " print 'Test set', test_dataset.shape, test_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "IRSyYiIIGIzS", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 11952, - "status": "ok", - "timestamp": 1446658914857, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "650a208c-8359-4852-f4f5-8bf10e80ef6c" + "output_type": "stream", + "text": [ + "Training set (200000, 28, 28) (200000,)\n", + "Validation set (10000, 28, 28) (10000,)\n", + "Test set (18724, 28, 28) (18724,)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L7aHrm6nGDMB", + "colab_type": "text" + }, + "source": [ + "Reformat into a TensorFlow-friendly shape:\n", + "- convolutions need the image data formatted as a cube (width by height by #channels)\n", + "- labels as float 1-hot encodings." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IRSyYiIIGIzS", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "image_size = 28\nnum_labels = 10\nnum_channels = 1 # grayscale\n\nimport numpy as np\n\ndef reformat(dataset, labels):\n dataset = dataset.reshape(\n (-1, image_size, image_size, num_channels)).astype(np.float32)\n labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n return dataset, labels\ntrain_dataset, train_labels = reformat(train_dataset, train_labels)\nvalid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\ntest_dataset, test_labels = reformat(test_dataset, test_labels)\nprint 'Training set', train_dataset.shape, train_labels.shape\nprint 'Validation set', valid_dataset.shape, valid_labels.shape\nprint 'Test set', test_dataset.shape, test_labels.shape", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Training set (200000, 28, 28, 1) (200000, 10)\nValidation set (10000, 28, 28, 1) (10000, 10)\nTest set (18724, 28, 28, 1) (18724, 10)\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "AgQDIREv02p1", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" + "cellView": "both", + "executionInfo": { + "elapsed": 11952, + "status": "ok", + "timestamp": 1446658914857, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "code", - "input": "def accuracy(predictions, labels):\n return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n / predictions.shape[0])", - "language": "python", - "outputs": [] + "user_tz": 480 }, + "outputId": "650a208c-8359-4852-f4f5-8bf10e80ef6c" + }, + "source": [ + "image_size = 28\n", + "num_labels = 10\n", + "num_channels = 1 # grayscale\n", + "\n", + "import numpy as np\n", + "\n", + "def reformat(dataset, labels):\n", + " dataset = dataset.reshape(\n", + " (-1, image_size, image_size, num_channels)).astype(np.float32)\n", + " labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n", + " return dataset, labels\n", + "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", + "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n", + "test_dataset, test_labels = reformat(test_dataset, test_labels)\n", + "print 'Training set', train_dataset.shape, train_labels.shape\n", + "print 'Validation set', valid_dataset.shape, valid_labels.shape\n", + "print 'Test set', test_dataset.shape, test_labels.shape" + ], + "outputs": [ { - "metadata": { - "id": "5rhgjmROXu2O", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Let's build a small network with two convolutional layers, followed by one fully connected layer. Convolutional networks are more expensive computationally, so we'll limit its depth and number of fully connected nodes." + "output_type": "stream", + "text": [ + "Training set (200000, 28, 28, 1) (200000, 10)\n", + "Validation set (10000, 28, 28, 1) (10000, 10)\n", + "Test set (18724, 28, 28, 1) (18724, 10)\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "AgQDIREv02p1", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "IZYv70SvvOan", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "batch_size = 16\npatch_size = 5\ndepth = 16\nnum_hidden = 64\n\ngraph = tf.Graph()\n\nwith graph.as_default():\n\n # Input data.\n tf_train_dataset = tf.placeholder(\n tf.float32, shape=(batch_size, image_size, image_size, num_channels))\n tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))\n tf_valid_dataset = tf.constant(valid_dataset)\n tf_test_dataset = tf.constant(test_dataset)\n \n # Variables.\n layer1_weights = tf.Variable(tf.truncated_normal(\n [patch_size, patch_size, num_channels, depth], stddev=0.1))\n layer1_biases = tf.Variable(tf.zeros([depth]))\n layer2_weights = tf.Variable(tf.truncated_normal(\n [patch_size, patch_size, depth, depth], stddev=0.1))\n layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))\n layer3_weights = tf.Variable(tf.truncated_normal(\n [image_size / 4 * image_size / 4 * depth, num_hidden], stddev=0.1))\n layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))\n layer4_weights = tf.Variable(tf.truncated_normal(\n [num_hidden, num_labels], stddev=0.1))\n layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]))\n \n # Model.\n def model(data):\n conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')\n hidden = tf.nn.relu(conv + layer1_biases)\n conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')\n hidden = tf.nn.relu(conv + layer2_biases)\n shape = hidden.get_shape().as_list()\n reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])\n hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)\n return tf.matmul(hidden, layer4_weights) + layer4_biases\n \n # Training computation.\n logits = model(tf_train_dataset)\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n \n # Optimizer.\n optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)\n \n # Predictions for the training, validation, and test data.\n train_prediction = tf.nn.softmax(logits)\n valid_prediction = tf.nn.softmax(model(tf_valid_dataset))\n test_prediction = tf.nn.softmax(model(tf_test_dataset))", - "language": "python", - "outputs": [] + "cellView": "both" + }, + "source": [ + "def accuracy(predictions, labels):\n", + " return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))\n", + " / predictions.shape[0])" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5rhgjmROXu2O", + "colab_type": "text" + }, + "source": [ + "Let's build a small network with two convolutional layers, followed by one fully connected layer. Convolutional networks are more expensive computationally, so we'll limit its depth and number of fully connected nodes." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IZYv70SvvOan", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "noKFb2UovVFR", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 37 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 63292, - "status": "ok", - "timestamp": 1446658966251, - "user": { - "color": "", - "displayName": "", - "isAnonymous": false, - "isMe": true, - "permissionId": "", - "photoUrl": "", - "sessionId": "0", - "userId": "" - }, - "user_tz": 480 - }, - "outputId": "28941338-2ef9-4088-8bd1-44295661e628" + "cellView": "both" + }, + "source": [ + "batch_size = 16\n", + "patch_size = 5\n", + "depth = 16\n", + "num_hidden = 64\n", + "\n", + "graph = tf.Graph()\n", + "\n", + "with graph.as_default():\n", + "\n", + " # Input data.\n", + " tf_train_dataset = tf.placeholder(\n", + " tf.float32, shape=(batch_size, image_size, image_size, num_channels))\n", + " tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))\n", + " tf_valid_dataset = tf.constant(valid_dataset)\n", + " tf_test_dataset = tf.constant(test_dataset)\n", + " \n", + " # Variables.\n", + " layer1_weights = tf.Variable(tf.truncated_normal(\n", + " [patch_size, patch_size, num_channels, depth], stddev=0.1))\n", + " layer1_biases = tf.Variable(tf.zeros([depth]))\n", + " layer2_weights = tf.Variable(tf.truncated_normal(\n", + " [patch_size, patch_size, depth, depth], stddev=0.1))\n", + " layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))\n", + " layer3_weights = tf.Variable(tf.truncated_normal(\n", + " [image_size / 4 * image_size / 4 * depth, num_hidden], stddev=0.1))\n", + " layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))\n", + " layer4_weights = tf.Variable(tf.truncated_normal(\n", + " [num_hidden, num_labels], stddev=0.1))\n", + " layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]))\n", + " \n", + " # Model.\n", + " def model(data):\n", + " conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')\n", + " hidden = tf.nn.relu(conv + layer1_biases)\n", + " conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')\n", + " hidden = tf.nn.relu(conv + layer2_biases)\n", + " shape = hidden.get_shape().as_list()\n", + " reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])\n", + " hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)\n", + " return tf.matmul(hidden, layer4_weights) + layer4_biases\n", + " \n", + " # Training computation.\n", + " logits = model(tf_train_dataset)\n", + " loss = tf.reduce_mean(\n", + " tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n", + " \n", + " # Optimizer.\n", + " optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)\n", + " \n", + " # Predictions for the training, validation, and test data.\n", + " train_prediction = tf.nn.softmax(logits)\n", + " valid_prediction = tf.nn.softmax(model(tf_valid_dataset))\n", + " test_prediction = tf.nn.softmax(model(tf_test_dataset))" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "noKFb2UovVFR", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "num_steps = 1001\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print \"Initialized\"\n for step in xrange(num_steps):\n offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n batch_data = train_dataset[offset:(offset + batch_size), :, :, :]\n batch_labels = train_labels[offset:(offset + batch_size), :]\n feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n _, l, predictions = session.run(\n [optimizer, loss, train_prediction], feed_dict=feed_dict)\n if (step % 50 == 0):\n print \"Minibatch loss at step\", step, \":\", l\n print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n print \"Validation accuracy: %.1f%%\" % accuracy(\n valid_prediction.eval(), valid_labels)\n print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Initialized\nMinibatch loss at step 0 : 3.51275\nMinibatch accuracy: 6.2%\nValidation accuracy: 12.8%\nMinibatch loss at step 50 : 1.48703\nMinibatch accuracy: 43.8%\nValidation accuracy: 50.4%\nMinibatch loss at step 100 : 1.04377\nMinibatch accuracy: 68.8%\nValidation accuracy: 67.4%\nMinibatch loss at step 150 : 0.601682\nMinibatch accuracy: 68.8%\nValidation accuracy: 73.0%\nMinibatch loss at step 200 : 0.898649\nMinibatch accuracy: 75.0%\nValidation accuracy: 77.8%\nMinibatch loss at step 250 : 1.3637\nMinibatch accuracy: 56.2%\nValidation accuracy: 75.4%\nMinibatch loss at step 300 : 1.41968\nMinibatch accuracy: 62.5%\nValidation accuracy: 76.0%\nMinibatch loss at step 350 : 0.300648\nMinibatch accuracy: 81.2%\nValidation accuracy: 80.2%\nMinibatch loss at step 400 : 1.32092\nMinibatch accuracy: 56.2%\nValidation accuracy: 80.4%\nMinibatch loss at step 450 : 0.556701\nMinibatch accuracy: 81.2%\nValidation accuracy: 79.4%\nMinibatch loss at step 500 : 1.65595\nMinibatch accuracy: 43.8%\nValidation accuracy: 79.6%\nMinibatch loss at step 550 : 1.06995\nMinibatch accuracy: 75.0%\nValidation accuracy: 81.2%\nMinibatch loss at step 600 : 0.223684\nMinibatch accuracy: 100.0%\nValidation accuracy: 82.3%\nMinibatch loss at step 650 : 0.619602\nMinibatch accuracy: 87.5%\nValidation accuracy: 81.8%\nMinibatch loss at step 700 : 0.812091\nMinibatch accuracy: 75.0%\nValidation accuracy: 82.4%\nMinibatch loss at step 750 : 0.276302\nMinibatch accuracy: 87.5%\nValidation accuracy: 82.3%\nMinibatch loss at step 800 : 0.450241\nMinibatch accuracy: 81.2%\nValidation accuracy: 82.3%\nMinibatch loss at step 850 : 0.137139\nMinibatch accuracy: 93.8%\nValidation accuracy: 82.3%\nMinibatch loss at step 900 : 0.52664\nMinibatch accuracy: 75.0%\nValidation accuracy: 82.2%\nMinibatch loss at step 950 : 0.623835\nMinibatch accuracy: 87.5%\nValidation accuracy: 82.1%\nMinibatch loss at step 1000 : 0.243114\nMinibatch accuracy: 93.8%\nValidation accuracy: 82.9%\nTest accuracy: 90.0%\n" + "item_id": 37 } ] }, - { - "metadata": { - "id": "KedKkn4EutIK", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 63292, + "status": "ok", + "timestamp": 1446658966251, + "user": { + "color": "", + "displayName": "", + "isAnonymous": false, + "isMe": true, + "permissionId": "", + "photoUrl": "", + "sessionId": "0", + "userId": "" }, - "cell_type": "markdown", - "source": "---\nProblem 1\n---------\n\nThe convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides by a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n\n---" + "user_tz": 480 }, + "outputId": "28941338-2ef9-4088-8bd1-44295661e628" + }, + "source": [ + "num_steps = 1001\n", + "\n", + "with tf.Session(graph=graph) as session:\n", + " tf.initialize_all_variables().run()\n", + " print \"Initialized\"\n", + " for step in xrange(num_steps):\n", + " offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n", + " batch_data = train_dataset[offset:(offset + batch_size), :, :, :]\n", + " batch_labels = train_labels[offset:(offset + batch_size), :]\n", + " feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}\n", + " _, l, predictions = session.run(\n", + " [optimizer, loss, train_prediction], feed_dict=feed_dict)\n", + " if (step % 50 == 0):\n", + " print \"Minibatch loss at step\", step, \":\", l\n", + " print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n", + " print \"Validation accuracy: %.1f%%\" % accuracy(\n", + " valid_prediction.eval(), valid_labels)\n", + " print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)" + ], + "outputs": [ { - "metadata": { - "id": "klf21gpbAgb-", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 2\n---------\n\nTry to get the best performance you can using a convolutional net. Look for example at the classic [LeNet5](http://yann.lecun.com/exdb/lenet/) architecture, adding Dropout, and/or adding learning rate decay.\n\n---" + "output_type": "stream", + "text": [ + "Initialized\n", + "Minibatch loss at step 0 : 3.51275\n", + "Minibatch accuracy: 6.2%\n", + "Validation accuracy: 12.8%\n", + "Minibatch loss at step 50 : 1.48703\n", + "Minibatch accuracy: 43.8%\n", + "Validation accuracy: 50.4%\n", + "Minibatch loss at step 100 : 1.04377\n", + "Minibatch accuracy: 68.8%\n", + "Validation accuracy: 67.4%\n", + "Minibatch loss at step 150 : 0.601682\n", + "Minibatch accuracy: 68.8%\n", + "Validation accuracy: 73.0%\n", + "Minibatch loss at step 200 : 0.898649\n", + "Minibatch accuracy: 75.0%\n", + "Validation accuracy: 77.8%\n", + "Minibatch loss at step 250 : 1.3637\n", + "Minibatch accuracy: 56.2%\n", + "Validation accuracy: 75.4%\n", + "Minibatch loss at step 300 : 1.41968\n", + "Minibatch accuracy: 62.5%\n", + "Validation accuracy: 76.0%\n", + "Minibatch loss at step 350 : 0.300648\n", + "Minibatch accuracy: 81.2%\n", + "Validation accuracy: 80.2%\n", + "Minibatch loss at step 400 : 1.32092\n", + "Minibatch accuracy: 56.2%\n", + "Validation accuracy: 80.4%\n", + "Minibatch loss at step 450 : 0.556701\n", + "Minibatch accuracy: 81.2%\n", + "Validation accuracy: 79.4%\n", + "Minibatch loss at step 500 : 1.65595\n", + "Minibatch accuracy: 43.8%\n", + "Validation accuracy: 79.6%\n", + "Minibatch loss at step 550 : 1.06995\n", + "Minibatch accuracy: 75.0%\n", + "Validation accuracy: 81.2%\n", + "Minibatch loss at step 600 : 0.223684\n", + "Minibatch accuracy: 100.0%\n", + "Validation accuracy: 82.3%\n", + "Minibatch loss at step 650 : 0.619602\n", + "Minibatch accuracy: 87.5%\n", + "Validation accuracy: 81.8%\n", + "Minibatch loss at step 700 : 0.812091\n", + "Minibatch accuracy: 75.0%\n", + "Validation accuracy: 82.4%\n", + "Minibatch loss at step 750 : 0.276302\n", + "Minibatch accuracy: 87.5%\n", + "Validation accuracy: 82.3%\n", + "Minibatch loss at step 800 : 0.450241\n", + "Minibatch accuracy: 81.2%\n", + "Validation accuracy: 82.3%\n", + "Minibatch loss at step 850 : 0.137139\n", + "Minibatch accuracy: 93.8%\n", + "Validation accuracy: 82.3%\n", + "Minibatch loss at step 900 : 0.52664\n", + "Minibatch accuracy: 75.0%\n", + "Validation accuracy: 82.2%\n", + "Minibatch loss at step 950 : 0.623835\n", + "Minibatch accuracy: 87.5%\n", + "Validation accuracy: 82.1%\n", + "Minibatch loss at step 1000 : 0.243114\n", + "Minibatch accuracy: 93.8%\n", + "Validation accuracy: 82.9%\n", + "Test accuracy: 90.0%\n" + ], + "name": "stdout" } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KedKkn4EutIK", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 1\n", + "---------\n", + "\n", + "The convolutional model above uses convolutions with stride 2 to reduce the dimensionality. Replace the strides by a max pooling operation (`nn.max_pool()`) of stride 2 and kernel size 2.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "klf21gpbAgb-", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 2\n", + "---------\n", + "\n", + "Try to get the best performance you can using a convolutional net. Look for example at the classic [LeNet5](http://yann.lecun.com/exdb/lenet/) architecture, adding Dropout, and/or adding learning rate decay.\n", + "\n", + "---" ] } - ], - "metadata": { - "name": "4_convolutions.ipynb", - "colabVersion": "0.3.2", - "colab_views": {}, - "colab_default_view": {} - }, - "nbformat": 3, - "nbformat_minor": 0 -} + ] +} \ No newline at end of file diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index d2da9828d01..cf704cecb45 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -6,7 +6,8 @@ "version": "0.3.2", "views": {}, "default_view": {}, - "name": "5_word2vec.ipynb" + "name": "5_word2vec.ipynb", + "provenance": [] } }, "cells": [ diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 1db35d23152..8e755dfc958 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -1,433 +1,1066 @@ { - "worksheets": [ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "version": "0.3.2", + "views": {}, + "default_view": {}, + "name": "6_lstm.ipynb", + "provenance": [] + } + }, + "cells": [ { - "cells": [ - { - "metadata": { - "id": "8tQJd2YSCfWR", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "" - }, - { - "metadata": { - "id": "D7tqLMoKF6uq", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Deep Learning\n=============\n\nAssignment 6\n------------\n\nAfter training a skip-gram model in `5_word2vec.ipynb`, the goal of this notebook is to train a LSTM character model over [Text8](http://mattmahoney.net/dc/textdata) data." - }, - { - "metadata": { - "id": "MvEblsgEXxrd", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "# These are all the modules we'll be using later. Make sure you can import them\n# before proceeding further.\nimport os\nimport numpy as np\nimport random\nimport string\nimport tensorflow as tf\nimport urllib\nimport zipfile", - "language": "python", - "outputs": [] + "cell_type": "markdown", + "metadata": { + "id": "8tQJd2YSCfWR", + "colab_type": "text" + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D7tqLMoKF6uq", + "colab_type": "text" + }, + "source": [ + "Deep Learning\n", + "=============\n", + "\n", + "Assignment 6\n", + "------------\n", + "\n", + "After training a skip-gram model in `5_word2vec.ipynb`, the goal of this notebook is to train a LSTM character model over [Text8](http://mattmahoney.net/dc/textdata) data." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "MvEblsgEXxrd", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "RJ-o3UBUFtCw", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 5993, - "status": "ok", - "timestamp": 1445965582896, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "6f6f07b359200c46", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "d530534e-0791-4a94-ca6d-1c8f1b908a9e" + "cellView": "both" + }, + "source": [ + "# These are all the modules we'll be using later. Make sure you can import them\n", + "# before proceeding further.\n", + "import os\n", + "import numpy as np\n", + "import random\n", + "import string\n", + "import tensorflow as tf\n", + "import urllib\n", + "import zipfile" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "RJ-o3UBUFtCw", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "url = 'http://mattmahoney.net/dc/'\n\ndef maybe_download(filename, expected_bytes):\n \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n if not os.path.exists(filename):\n filename, _ = urllib.urlretrieve(url + filename, filename)\n statinfo = os.stat(filename)\n if statinfo.st_size == expected_bytes:\n print 'Found and verified', filename\n else:\n print statinfo.st_size\n raise Exception(\n 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n return filename\n\nfilename = maybe_download('text8.zip', 31344016)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Found and verified text8.zip\n" + "item_id": 1 } ] }, + "cellView": "both", + "executionInfo": { + "elapsed": 5993, + "status": "ok", + "timestamp": 1445965582896, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" + }, + "user_tz": 420 + }, + "outputId": "d530534e-0791-4a94-ca6d-1c8f1b908a9e" + }, + "source": [ + "url = 'http://mattmahoney.net/dc/'\n", + "\n", + "def maybe_download(filename, expected_bytes):\n", + " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", + " if not os.path.exists(filename):\n", + " filename, _ = urllib.urlretrieve(url + filename, filename)\n", + " statinfo = os.stat(filename)\n", + " if statinfo.st_size == expected_bytes:\n", + " print 'Found and verified', filename\n", + " else:\n", + " print statinfo.st_size\n", + " raise Exception(\n", + " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", + " return filename\n", + "\n", + "filename = maybe_download('text8.zip', 31344016)" + ], + "outputs": [ { - "metadata": { - "id": "Mvf09fjugFU_", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 5982, - "status": "ok", - "timestamp": 1445965582916, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "6f6f07b359200c46", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "8f75db58-3862-404b-a0c3-799380597390" + "output_type": "stream", + "text": [ + "Found and verified text8.zip\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "Mvf09fjugFU_", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "def read_data(filename):\n f = zipfile.ZipFile(filename)\n for name in f.namelist():\n return f.read(name)\n f.close()\n \ntext = read_data(filename)\nprint \"Data size\", len(text)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Data size 100000000\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "ga2CYACE-ghb", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 5982, + "status": "ok", + "timestamp": 1445965582916, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Create a small validation set." + "user_tz": 420 }, + "outputId": "8f75db58-3862-404b-a0c3-799380597390" + }, + "source": [ + "def read_data(filename):\n", + " f = zipfile.ZipFile(filename)\n", + " for name in f.namelist():\n", + " return f.read(name)\n", + " f.close()\n", + " \n", + "text = read_data(filename)\n", + "print \"Data size\", len(text)" + ], + "outputs": [ { - "metadata": { - "id": "w-oBpfFG-j43", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 6184, - "status": "ok", - "timestamp": 1445965583138, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "6f6f07b359200c46", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "bdb96002-d021-4379-f6de-a977924f0d02" + "output_type": "stream", + "text": [ + "Data size 100000000\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ga2CYACE-ghb", + "colab_type": "text" + }, + "source": [ + "Create a small validation set." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "w-oBpfFG-j43", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "valid_size = 1000\nvalid_text = text[:valid_size]\ntrain_text = text[valid_size:]\ntrain_size = len(train_text)\nprint train_size, train_text[:64]\nprint valid_size, valid_text[:64]", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "99999000 ons anarchists advocate social relations based upon voluntary as\n1000 anarchism originated as a term of abuse first used against earl\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "Zdw6i4F8glpp", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 6184, + "status": "ok", + "timestamp": 1445965583138, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Utility functions to map characters to vocabulary IDs and back." + "user_tz": 420 }, + "outputId": "bdb96002-d021-4379-f6de-a977924f0d02" + }, + "source": [ + "valid_size = 1000\n", + "valid_text = text[:valid_size]\n", + "train_text = text[valid_size:]\n", + "train_size = len(train_text)\n", + "print train_size, train_text[:64]\n", + "print valid_size, valid_text[:64]" + ], + "outputs": [ { - "metadata": { - "id": "gAL1EECXeZsD", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 6276, - "status": "ok", - "timestamp": 1445965583249, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "6f6f07b359200c46", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "88fc9032-feb9-45ff-a9a0-a26759cc1f2e" + "output_type": "stream", + "text": [ + "99999000 ons anarchists advocate social relations based upon voluntary as\n", + "1000 anarchism originated as a term of abuse first used against earl\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Zdw6i4F8glpp", + "colab_type": "text" + }, + "source": [ + "Utility functions to map characters to vocabulary IDs and back." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gAL1EECXeZsD", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "vocabulary_size = len(string.ascii_lowercase) + 1 # [a-z] + ' '\nfirst_letter = ord(string.ascii_lowercase[0])\n\ndef char2id(char):\n if char in string.ascii_lowercase:\n return ord(char) - first_letter + 1\n elif char == ' ':\n return 0\n else:\n print 'Unexpected character:', char\n return 0\n \ndef id2char(dictid):\n if dictid > 0:\n return chr(dictid + first_letter - 1)\n else:\n return ' '\n\nprint char2id('a'), char2id('z'), char2id(' '), char2id('\u00ef')\nprint id2char(1), id2char(26), id2char(0)", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "1 26 0 Unexpected character: \u00ef\n0\na z \n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "lFwoyygOmWsL", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 6276, + "status": "ok", + "timestamp": 1445965583249, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "Function to generate a training batch for the LSTM model." + "user_tz": 420 }, + "outputId": "88fc9032-feb9-45ff-a9a0-a26759cc1f2e" + }, + "source": [ + "vocabulary_size = len(string.ascii_lowercase) + 1 # [a-z] + ' '\n", + "first_letter = ord(string.ascii_lowercase[0])\n", + "\n", + "def char2id(char):\n", + " if char in string.ascii_lowercase:\n", + " return ord(char) - first_letter + 1\n", + " elif char == ' ':\n", + " return 0\n", + " else:\n", + " print 'Unexpected character:', char\n", + " return 0\n", + " \n", + "def id2char(dictid):\n", + " if dictid > 0:\n", + " return chr(dictid + first_letter - 1)\n", + " else:\n", + " return ' '\n", + "\n", + "print char2id('a'), char2id('z'), char2id(' '), char2id('\u00ef')\n", + "print id2char(1), id2char(26), id2char(0)" + ], + "outputs": [ { - "metadata": { - "id": "d9wMtjy5hCj9", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 1 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 6473, - "status": "ok", - "timestamp": 1445965583467, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "6f6f07b359200c46", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "3dd79c80-454a-4be0-8b71-4a4a357b3367" + "output_type": "stream", + "text": [ + "1 26 0 Unexpected character: \u00ef\n", + "0\n", + "a z \n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lFwoyygOmWsL", + "colab_type": "text" + }, + "source": [ + "Function to generate a training batch for the LSTM model." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "d9wMtjy5hCj9", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "batch_size=64\nnum_unrollings=10\n\nclass BatchGenerator(object):\n def __init__(self, text, batch_size, num_unrollings):\n self._text = text\n self._text_size = len(text)\n self._batch_size = batch_size\n self._num_unrollings = num_unrollings\n segment = self._text_size / batch_size\n self._cursor = [ offset * segment for offset in xrange(batch_size)]\n self._last_batch = self._next_batch()\n \n def _next_batch(self):\n \"\"\"Generate a single batch from the current cursor position in the data.\"\"\"\n batch = np.zeros(shape=(self._batch_size, vocabulary_size), dtype=np.float)\n for b in xrange(self._batch_size):\n batch[b, char2id(self._text[self._cursor[b]])] = 1.0\n self._cursor[b] = (self._cursor[b] + 1) % self._text_size\n return batch\n \n def next(self):\n \"\"\"Generate the next array of batches from the data. The array consists of\n the last batch of the previous array, followed by num_unrollings new ones.\n \"\"\"\n batches = [self._last_batch]\n for step in xrange(self._num_unrollings):\n batches.append(self._next_batch())\n self._last_batch = batches[-1]\n return batches\n\ndef characters(probabilities):\n \"\"\"Turn a 1-hot encoding or a probability distribution over the possible\n characters back into its (mostl likely) character representation.\"\"\"\n return [id2char(c) for c in np.argmax(probabilities, 1)]\n\ndef batches2string(batches):\n \"\"\"Convert a sequence of batches back into their (most likely) string\n representation.\"\"\"\n s = [''] * batches[0].shape[0]\n for b in batches:\n s = [''.join(x) for x in zip(s, characters(b))]\n return s\n\ntrain_batches = BatchGenerator(train_text, batch_size, num_unrollings)\nvalid_batches = BatchGenerator(valid_text, 1, 1)\n\nprint batches2string(train_batches.next())\nprint batches2string(train_batches.next())\nprint batches2string(valid_batches.next())\nprint batches2string(valid_batches.next())", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "['ons anarchi', 'when milita', 'lleria arch', ' abbeys and', 'married urr', 'hel and ric', 'y and litur', 'ay opened f', 'tion from t', 'migration t', 'new york ot', 'he boeing s', 'e listed wi', 'eber has pr', 'o be made t', 'yer who rec', 'ore signifi', 'a fierce cr', ' two six ei', 'aristotle s', 'ity can be ', ' and intrac', 'tion of the', 'dy to pass ', 'f certain d', 'at it will ', 'e convince ', 'ent told hi', 'ampaign and', 'rver side s', 'ious texts ', 'o capitaliz', 'a duplicate', 'gh ann es d', 'ine january', 'ross zero t', 'cal theorie', 'ast instanc', ' dimensiona', 'most holy m', 't s support', 'u is still ', 'e oscillati', 'o eight sub', 'of italy la', 's the tower', 'klahoma pre', 'erprise lin', 'ws becomes ', 'et in a naz', 'the fabian ', 'etchy to re', ' sharman ne', 'ised empero', 'ting in pol', 'd neo latin', 'th risky ri', 'encyclopedi', 'fense the a', 'duating fro', 'treet grid ', 'ations more', 'appeal of d', 'si have mad']\n['ists advoca', 'ary governm', 'hes nationa', 'd monasteri', 'raca prince', 'chard baer ', 'rgical lang', 'for passeng', 'the nationa', 'took place ', 'ther well k', 'seven six s', 'ith a gloss', 'robably bee', 'to recogniz', 'ceived the ', 'icant than ', 'ritic of th', 'ight in sig', 's uncaused ', ' lost as in', 'cellular ic', 'e size of t', ' him a stic', 'drugs confu', ' take to co', ' the priest', 'im to name ', 'd barred at', 'standard fo', ' such as es', 'ze on the g', 'e of the or', 'd hiver one', 'y eight mar', 'the lead ch', 'es classica', 'ce the non ', 'al analysis', 'mormons bel', 't or at lea', ' disagreed ', 'ing system ', 'btypes base', 'anguages th', 'r commissio', 'ess one nin', 'nux suse li', ' the first ', 'zi concentr', ' society ne', 'elatively s', 'etworks sha', 'or hirohito', 'litical ini', 'n most of t', 'iskerdoo ri', 'ic overview', 'air compone', 'om acnm acc', ' centerline', 'e than any ', 'devotional ', 'de such dev']\n[' a']\n['an']\n" + "item_id": 1 } ] }, - { - "metadata": { - "id": "KyVd8FxT5QBc", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" + "cellView": "both", + "executionInfo": { + "elapsed": 6473, + "status": "ok", + "timestamp": 1445965583467, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" }, - "cell_type": "code", - "input": "def logprob(predictions, labels):\n \"\"\"Log-probability of the true labels in a predicted batch.\"\"\"\n predictions[predictions < 1e-10] = 1e-10\n return np.sum(np.multiply(labels, -np.log(predictions))) / labels.shape[0]\n\ndef sample_distribution(distribution):\n \"\"\"Sample one element from a distribution assumed to be an array of normalized\n probabilities.\n \"\"\"\n r = random.uniform(0, 1)\n s = 0\n for i in xrange(len(distribution)):\n s += distribution[i]\n if s >= r:\n return i\n return len(distribution) - 1\n\ndef sample(prediction):\n \"\"\"Turn a (column) prediction into 1-hot encoded samples.\"\"\"\n p = np.zeros(shape=[1, vocabulary_size], dtype=np.float)\n p[0, sample_distribution(prediction[0])] = 1.0\n return p\n\ndef random_distribution():\n \"\"\"Generate a random column of probabilities.\"\"\"\n b = np.random.uniform(0.0, 1.0, size=[1, vocabulary_size])\n return b/np.sum(b, 1)[:,None]", - "language": "python", - "outputs": [] + "user_tz": 420 }, + "outputId": "3dd79c80-454a-4be0-8b71-4a4a357b3367" + }, + "source": [ + "batch_size=64\n", + "num_unrollings=10\n", + "\n", + "class BatchGenerator(object):\n", + " def __init__(self, text, batch_size, num_unrollings):\n", + " self._text = text\n", + " self._text_size = len(text)\n", + " self._batch_size = batch_size\n", + " self._num_unrollings = num_unrollings\n", + " segment = self._text_size / batch_size\n", + " self._cursor = [ offset * segment for offset in xrange(batch_size)]\n", + " self._last_batch = self._next_batch()\n", + " \n", + " def _next_batch(self):\n", + " \"\"\"Generate a single batch from the current cursor position in the data.\"\"\"\n", + " batch = np.zeros(shape=(self._batch_size, vocabulary_size), dtype=np.float)\n", + " for b in xrange(self._batch_size):\n", + " batch[b, char2id(self._text[self._cursor[b]])] = 1.0\n", + " self._cursor[b] = (self._cursor[b] + 1) % self._text_size\n", + " return batch\n", + " \n", + " def next(self):\n", + " \"\"\"Generate the next array of batches from the data. The array consists of\n", + " the last batch of the previous array, followed by num_unrollings new ones.\n", + " \"\"\"\n", + " batches = [self._last_batch]\n", + " for step in xrange(self._num_unrollings):\n", + " batches.append(self._next_batch())\n", + " self._last_batch = batches[-1]\n", + " return batches\n", + "\n", + "def characters(probabilities):\n", + " \"\"\"Turn a 1-hot encoding or a probability distribution over the possible\n", + " characters back into its (mostl likely) character representation.\"\"\"\n", + " return [id2char(c) for c in np.argmax(probabilities, 1)]\n", + "\n", + "def batches2string(batches):\n", + " \"\"\"Convert a sequence of batches back into their (most likely) string\n", + " representation.\"\"\"\n", + " s = [''] * batches[0].shape[0]\n", + " for b in batches:\n", + " s = [''.join(x) for x in zip(s, characters(b))]\n", + " return s\n", + "\n", + "train_batches = BatchGenerator(train_text, batch_size, num_unrollings)\n", + "valid_batches = BatchGenerator(valid_text, 1, 1)\n", + "\n", + "print batches2string(train_batches.next())\n", + "print batches2string(train_batches.next())\n", + "print batches2string(valid_batches.next())\n", + "print batches2string(valid_batches.next())" + ], + "outputs": [ { - "metadata": { - "id": "K8f67YXaDr4C", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "Simple LSTM Model." + "output_type": "stream", + "text": [ + "['ons anarchi', 'when milita', 'lleria arch', ' abbeys and', 'married urr', 'hel and ric', 'y and litur', 'ay opened f', 'tion from t', 'migration t', 'new york ot', 'he boeing s', 'e listed wi', 'eber has pr', 'o be made t', 'yer who rec', 'ore signifi', 'a fierce cr', ' two six ei', 'aristotle s', 'ity can be ', ' and intrac', 'tion of the', 'dy to pass ', 'f certain d', 'at it will ', 'e convince ', 'ent told hi', 'ampaign and', 'rver side s', 'ious texts ', 'o capitaliz', 'a duplicate', 'gh ann es d', 'ine january', 'ross zero t', 'cal theorie', 'ast instanc', ' dimensiona', 'most holy m', 't s support', 'u is still ', 'e oscillati', 'o eight sub', 'of italy la', 's the tower', 'klahoma pre', 'erprise lin', 'ws becomes ', 'et in a naz', 'the fabian ', 'etchy to re', ' sharman ne', 'ised empero', 'ting in pol', 'd neo latin', 'th risky ri', 'encyclopedi', 'fense the a', 'duating fro', 'treet grid ', 'ations more', 'appeal of d', 'si have mad']\n", + "['ists advoca', 'ary governm', 'hes nationa', 'd monasteri', 'raca prince', 'chard baer ', 'rgical lang', 'for passeng', 'the nationa', 'took place ', 'ther well k', 'seven six s', 'ith a gloss', 'robably bee', 'to recogniz', 'ceived the ', 'icant than ', 'ritic of th', 'ight in sig', 's uncaused ', ' lost as in', 'cellular ic', 'e size of t', ' him a stic', 'drugs confu', ' take to co', ' the priest', 'im to name ', 'd barred at', 'standard fo', ' such as es', 'ze on the g', 'e of the or', 'd hiver one', 'y eight mar', 'the lead ch', 'es classica', 'ce the non ', 'al analysis', 'mormons bel', 't or at lea', ' disagreed ', 'ing system ', 'btypes base', 'anguages th', 'r commissio', 'ess one nin', 'nux suse li', ' the first ', 'zi concentr', ' society ne', 'elatively s', 'etworks sha', 'or hirohito', 'litical ini', 'n most of t', 'iskerdoo ri', 'ic overview', 'air compone', 'om acnm acc', ' centerline', 'e than any ', 'devotional ', 'de such dev']\n", + "[' a']\n", + "['an']\n" + ], + "name": "stdout" + } + ], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "KyVd8FxT5QBc", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "Q5rxZK6RDuGe", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "cell_type": "code", - "input": "num_nodes = 64\n\ngraph = tf.Graph()\nwith graph.as_default():\n \n # Parameters:\n # Input gate: input, previous output, and bias.\n ix = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n im = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n ib = tf.Variable(tf.zeros([1, num_nodes]))\n # Forget gate: input, previous output, and bias.\n fx = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n fm = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n fb = tf.Variable(tf.zeros([1, num_nodes]))\n # Memory cell: input, state and bias. \n cx = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n cm = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n cb = tf.Variable(tf.zeros([1, num_nodes]))\n # Output gate: input, previous output, and bias.\n ox = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n om = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n ob = tf.Variable(tf.zeros([1, num_nodes]))\n # Variables saving state across unrollings.\n saved_output = tf.Variable(tf.zeros([batch_size, num_nodes]), trainable=False)\n saved_state = tf.Variable(tf.zeros([batch_size, num_nodes]), trainable=False)\n # Classifier weights and biases.\n w = tf.Variable(tf.truncated_normal([num_nodes, vocabulary_size], -0.1, 0.1))\n b = tf.Variable(tf.zeros([vocabulary_size]))\n \n # Definition of the cell computation.\n def lstm_cell(i, o, state):\n \"\"\"Create a LSTM cell. See e.g.: http://arxiv.org/pdf/1402.1128v1.pdf\n Note that in this formulation, we omit the various connections between the\n previous state and the gates.\"\"\"\n input_gate = tf.sigmoid(tf.matmul(i, ix) + tf.matmul(o, im) + ib)\n forget_gate = tf.sigmoid(tf.matmul(i, fx) + tf.matmul(o, fm) + fb)\n update = tf.matmul(i, cx) + tf.matmul(o, cm) + cb\n state = forget_gate * state + input_gate * tf.tanh(update)\n output_gate = tf.sigmoid(tf.matmul(i, ox) + tf.matmul(o, om) + ob)\n return output_gate * tf.tanh(state), state\n\n # Input data.\n train_data = list()\n for _ in xrange(num_unrollings + 1):\n train_data.append(\n tf.placeholder(tf.float32, shape=[batch_size,vocabulary_size]))\n train_inputs = train_data[:num_unrollings]\n train_labels = train_data[1:] # labels are inputs shifted by one time step.\n\n # Unrolled LSTM loop.\n outputs = list()\n output = saved_output\n state = saved_state\n for i in train_inputs:\n output, state = lstm_cell(i, output, state)\n outputs.append(output)\n\n # State saving across unrollings.\n with tf.control_dependencies([saved_output.assign(output),\n saved_state.assign(state)]):\n # Classifier.\n logits = tf.nn.xw_plus_b(tf.concat(0, outputs), w, b)\n loss = tf.reduce_mean(\n tf.nn.softmax_cross_entropy_with_logits(\n logits, tf.concat(0, train_labels)))\n\n # Optimizer.\n global_step = tf.Variable(0)\n learning_rate = tf.train.exponential_decay(\n 10.0, global_step, 5000, 0.1, staircase=True)\n optimizer = tf.train.GradientDescentOptimizer(learning_rate)\n gradients, v = zip(*optimizer.compute_gradients(loss))\n gradients, _ = tf.clip_by_global_norm(gradients, 1.25)\n optimizer = optimizer.apply_gradients(\n zip(gradients, v), global_step=global_step)\n\n # Predictions.\n train_prediction = tf.nn.softmax(logits)\n \n # Sampling and validation eval: batch 1, no unrolling.\n sample_input = tf.placeholder(tf.float32, shape=[1, vocabulary_size])\n saved_sample_output = tf.Variable(tf.zeros([1, num_nodes]))\n saved_sample_state = tf.Variable(tf.zeros([1, num_nodes]))\n reset_sample_state = tf.group(\n saved_sample_output.assign(tf.zeros([1, num_nodes])),\n saved_sample_state.assign(tf.zeros([1, num_nodes])))\n sample_output, sample_state = lstm_cell(\n sample_input, saved_sample_output, saved_sample_state)\n with tf.control_dependencies([saved_sample_output.assign(sample_output),\n saved_sample_state.assign(sample_state)]):\n sample_prediction = tf.nn.softmax(tf.nn.xw_plus_b(sample_output, w, b))", - "language": "python", - "outputs": [] + "cellView": "both" + }, + "source": [ + "def logprob(predictions, labels):\n", + " \"\"\"Log-probability of the true labels in a predicted batch.\"\"\"\n", + " predictions[predictions < 1e-10] = 1e-10\n", + " return np.sum(np.multiply(labels, -np.log(predictions))) / labels.shape[0]\n", + "\n", + "def sample_distribution(distribution):\n", + " \"\"\"Sample one element from a distribution assumed to be an array of normalized\n", + " probabilities.\n", + " \"\"\"\n", + " r = random.uniform(0, 1)\n", + " s = 0\n", + " for i in xrange(len(distribution)):\n", + " s += distribution[i]\n", + " if s >= r:\n", + " return i\n", + " return len(distribution) - 1\n", + "\n", + "def sample(prediction):\n", + " \"\"\"Turn a (column) prediction into 1-hot encoded samples.\"\"\"\n", + " p = np.zeros(shape=[1, vocabulary_size], dtype=np.float)\n", + " p[0, sample_distribution(prediction[0])] = 1.0\n", + " return p\n", + "\n", + "def random_distribution():\n", + " \"\"\"Generate a random column of probabilities.\"\"\"\n", + " b = np.random.uniform(0.0, 1.0, size=[1, vocabulary_size])\n", + " return b/np.sum(b, 1)[:,None]" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K8f67YXaDr4C", + "colab_type": "text" + }, + "source": [ + "Simple LSTM Model." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Q5rxZK6RDuGe", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } }, - { - "metadata": { - "id": "RD9zQCZTEaEm", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - }, - "output_extras": [ - { - "item_id": 41 - }, - { - "item_id": 80 - }, - { - "item_id": 126 - }, - { - "item_id": 144 - } - ] - }, - "cellView": "both", - "executionInfo": { - "elapsed": 199909, - "status": "ok", - "timestamp": 1445965877333, - "user": { - "color": "#1FA15D", - "displayName": "Vincent Vanhoucke", - "isAnonymous": false, - "isMe": true, - "permissionId": "05076109866853157986", - "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", - "sessionId": "6f6f07b359200c46", - "userId": "102167687554210253930" - }, - "user_tz": 420 - }, - "outputId": "5e868466-2532-4545-ce35-b403cf5d9de6" + "cellView": "both" + }, + "source": [ + "num_nodes = 64\n", + "\n", + "graph = tf.Graph()\n", + "with graph.as_default():\n", + " \n", + " # Parameters:\n", + " # Input gate: input, previous output, and bias.\n", + " ix = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n", + " im = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n", + " ib = tf.Variable(tf.zeros([1, num_nodes]))\n", + " # Forget gate: input, previous output, and bias.\n", + " fx = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n", + " fm = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n", + " fb = tf.Variable(tf.zeros([1, num_nodes]))\n", + " # Memory cell: input, state and bias. \n", + " cx = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n", + " cm = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n", + " cb = tf.Variable(tf.zeros([1, num_nodes]))\n", + " # Output gate: input, previous output, and bias.\n", + " ox = tf.Variable(tf.truncated_normal([vocabulary_size, num_nodes], -0.1, 0.1))\n", + " om = tf.Variable(tf.truncated_normal([num_nodes, num_nodes], -0.1, 0.1))\n", + " ob = tf.Variable(tf.zeros([1, num_nodes]))\n", + " # Variables saving state across unrollings.\n", + " saved_output = tf.Variable(tf.zeros([batch_size, num_nodes]), trainable=False)\n", + " saved_state = tf.Variable(tf.zeros([batch_size, num_nodes]), trainable=False)\n", + " # Classifier weights and biases.\n", + " w = tf.Variable(tf.truncated_normal([num_nodes, vocabulary_size], -0.1, 0.1))\n", + " b = tf.Variable(tf.zeros([vocabulary_size]))\n", + " \n", + " # Definition of the cell computation.\n", + " def lstm_cell(i, o, state):\n", + " \"\"\"Create a LSTM cell. See e.g.: http://arxiv.org/pdf/1402.1128v1.pdf\n", + " Note that in this formulation, we omit the various connections between the\n", + " previous state and the gates.\"\"\"\n", + " input_gate = tf.sigmoid(tf.matmul(i, ix) + tf.matmul(o, im) + ib)\n", + " forget_gate = tf.sigmoid(tf.matmul(i, fx) + tf.matmul(o, fm) + fb)\n", + " update = tf.matmul(i, cx) + tf.matmul(o, cm) + cb\n", + " state = forget_gate * state + input_gate * tf.tanh(update)\n", + " output_gate = tf.sigmoid(tf.matmul(i, ox) + tf.matmul(o, om) + ob)\n", + " return output_gate * tf.tanh(state), state\n", + "\n", + " # Input data.\n", + " train_data = list()\n", + " for _ in xrange(num_unrollings + 1):\n", + " train_data.append(\n", + " tf.placeholder(tf.float32, shape=[batch_size,vocabulary_size]))\n", + " train_inputs = train_data[:num_unrollings]\n", + " train_labels = train_data[1:] # labels are inputs shifted by one time step.\n", + "\n", + " # Unrolled LSTM loop.\n", + " outputs = list()\n", + " output = saved_output\n", + " state = saved_state\n", + " for i in train_inputs:\n", + " output, state = lstm_cell(i, output, state)\n", + " outputs.append(output)\n", + "\n", + " # State saving across unrollings.\n", + " with tf.control_dependencies([saved_output.assign(output),\n", + " saved_state.assign(state)]):\n", + " # Classifier.\n", + " logits = tf.nn.xw_plus_b(tf.concat(0, outputs), w, b)\n", + " loss = tf.reduce_mean(\n", + " tf.nn.softmax_cross_entropy_with_logits(\n", + " logits, tf.concat(0, train_labels)))\n", + "\n", + " # Optimizer.\n", + " global_step = tf.Variable(0)\n", + " learning_rate = tf.train.exponential_decay(\n", + " 10.0, global_step, 5000, 0.1, staircase=True)\n", + " optimizer = tf.train.GradientDescentOptimizer(learning_rate)\n", + " gradients, v = zip(*optimizer.compute_gradients(loss))\n", + " gradients, _ = tf.clip_by_global_norm(gradients, 1.25)\n", + " optimizer = optimizer.apply_gradients(\n", + " zip(gradients, v), global_step=global_step)\n", + "\n", + " # Predictions.\n", + " train_prediction = tf.nn.softmax(logits)\n", + " \n", + " # Sampling and validation eval: batch 1, no unrolling.\n", + " sample_input = tf.placeholder(tf.float32, shape=[1, vocabulary_size])\n", + " saved_sample_output = tf.Variable(tf.zeros([1, num_nodes]))\n", + " saved_sample_state = tf.Variable(tf.zeros([1, num_nodes]))\n", + " reset_sample_state = tf.group(\n", + " saved_sample_output.assign(tf.zeros([1, num_nodes])),\n", + " saved_sample_state.assign(tf.zeros([1, num_nodes])))\n", + " sample_output, sample_state = lstm_cell(\n", + " sample_input, saved_sample_output, saved_sample_state)\n", + " with tf.control_dependencies([saved_sample_output.assign(sample_output),\n", + " saved_sample_state.assign(sample_state)]):\n", + " sample_prediction = tf.nn.softmax(tf.nn.xw_plus_b(sample_output, w, b))" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "code", + "metadata": { + "id": "RD9zQCZTEaEm", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 }, - "cell_type": "code", - "input": "num_steps = 7001\nsummary_frequency = 100\n\nwith tf.Session(graph=graph) as session:\n tf.initialize_all_variables().run()\n print 'Initialized'\n mean_loss = 0\n for step in xrange(num_steps):\n batches = train_batches.next()\n feed_dict = dict()\n for i in xrange(num_unrollings + 1):\n feed_dict[train_data[i]] = batches[i]\n _, l, predictions, lr = session.run(\n [optimizer, loss, train_prediction, learning_rate], feed_dict=feed_dict)\n mean_loss += l\n if step % summary_frequency == 0:\n if step > 0:\n mean_loss = mean_loss / summary_frequency\n # The mean loss is an estimate of the loss over the last few batches.\n print 'Average loss at step', step, ':', mean_loss, 'learning rate:', lr\n mean_loss = 0\n labels = np.concatenate(list(batches)[1:])\n print 'Minibatch perplexity: %.2f' % float(\n np.exp(logprob(predictions, labels)))\n if step % (summary_frequency * 10) == 0:\n # Generate some samples.\n print '=' * 80\n for _ in xrange(5):\n feed = sample(random_distribution())\n sentence = characters(feed)[0]\n reset_sample_state.run()\n for _ in xrange(79):\n prediction = sample_prediction.eval({sample_input: feed})\n feed = sample(prediction)\n sentence += characters(feed)[0]\n print sentence\n print '=' * 80\n # Measure validation set perplexity.\n reset_sample_state.run()\n valid_logprob = 0\n for _ in xrange(valid_size):\n b = valid_batches.next()\n predictions = sample_prediction.eval({sample_input: b[0]})\n valid_logprob = valid_logprob + logprob(predictions, b[1])\n print 'Validation set perplexity: %.2f' % float(np.exp(\n valid_logprob / valid_size))", - "language": "python", - "outputs": [ + "output_extras": [ { - "output_type": "stream", - "stream": "stdout", - "text": "Initialized\nAverage loss at step 0 : 3.29904174805 learning rate: 10.0\nMinibatch perplexity: 27.09\n================================================================================\nsrk dwmrnuldtbbgg tapootidtu xsciu sgokeguw hi ieicjq lq piaxhazvc s fht wjcvdlh\nlhrvallvbeqqquc dxd y siqvnle bzlyw nr rwhkalezo siie o deb e lpdg storq u nx o\nmeieu nantiouie gdys qiuotblci loc hbiznauiccb cqzed acw l tsm adqxplku gn oaxet\nunvaouc oxchywdsjntdh zpklaejvxitsokeerloemee htphisb th eaeqseibumh aeeyj j orw\nogmnictpycb whtup otnilnesxaedtekiosqet liwqarysmt arj flioiibtqekycbrrgoysj\n================================================================================\nValidation set perplexity: 19.99\nAverage loss at step 100 : 2.59553678274 learning rate: 10.0\nMinibatch perplexity: 9.57\nValidation set perplexity: 10.60\nAverage loss at step 200 : 2.24747137785 learning rate: 10.0\nMinibatch perplexity: 7.68\nValidation set perplexity: 8.84\nAverage loss at step 300 : 2.09438110709 learning rate: 10.0\nMinibatch perplexity: 7.41\nValidation set perplexity: 8.13\nAverage loss at step 400 : 1.99440989017 learning rate: 10.0\nMinibatch perplexity: 6.46\nValidation set perplexity: 7.58\nAverage loss at step 500 : 1.9320810616 learning rate: 10.0\nMinibatch perplexity: 6.30\nValidation set perplexity: 6.88\nAverage loss at step 600 : 1.90935629249 learning rate: 10.0\nMinibatch perplexity: 7.21\nValidation set perplexity: 6.91\nAverage loss at step 700 : 1.85583009005 learning rate: 10.0\nMinibatch perplexity: 6.13\nValidation set perplexity: 6.60\nAverage loss at step 800 : 1.82152368546 learning rate: 10.0\nMinibatch perplexity: 6.01\nValidation set perplexity: 6.37\nAverage loss at step 900 : 1.83169809818 learning rate: 10.0\nMinibatch perplexity: 7.20\nValidation set perplexity: 6.23\nAverage loss at step 1000 : 1.82217029214 learning rate: 10.0\nMinibatch perplexity: 6.73\n================================================================================\nle action b of the tert sy ofter selvorang previgned stischdy yocal chary the co\nle relganis networks partucy cetinning wilnchan sics rumeding a fulch laks oftes\nhian andoris ret the ecause bistory l pidect one eight five lack du that the ses\naiv dromery buskocy becomer worils resism disele retery exterrationn of hide in \nmer miter y sught esfectur of the upission vain is werms is vul ugher compted by\n================================================================================\nValidation set perplexity: 6.07\nAverage loss at step 1100 : 1.77301145077 learning rate: 10.0\nMinibatch perplexity: 6.03\nValidation set perplexity: 5.89\nAverage loss at step 1200 : 1.75306463003 learning rate: 10.0\nMinibatch perplexity: 6.50\nValidation set perplexity: 5.61\nAverage loss at step 1300 : 1.72937195778 learning rate: 10.0\nMinibatch perplexity: 5.00\nValidation set perplexity: 5.60\nAverage loss at step 1400 : 1.74773373723 learning rate: 10.0\nMinibatch perplexity: 6.48\nValidation set perplexity: 5.66\nAverage loss at step 1500 : 1.7368799901 learning rate: 10.0\nMinibatch perplexity: 5.22\nValidation set perplexity: 5.44\nAverage loss at step 1600 : 1.74528762937 learning rate: 10.0\nMinibatch perplexity: 5.85\nValidation set perplexity: 5.33\nAverage loss at step 1700 : 1.70881183743 learning rate: 10.0\nMinibatch perplexity: 5.33\nValidation set perplexity: 5.56\nAverage loss at step 1800 : 1.67776108027 learning rate: 10.0\nMinibatch perplexity: 5.33\nValidation set perplexity: 5.29\nAverage loss at step 1900 : 1.64935536742 learning rate: 10.0\nMinibatch perplexity: 5.29\nValidation set perplexity: 5.15\nAverage loss at step" + "item_id": 41 }, { - "output_type": "stream", - "stream": "stdout", - "text": " 2000 : 1.69528644681 learning rate: 10.0\nMinibatch perplexity: 5.13\n================================================================================\nvers soqually have one five landwing to docial page kagan lower with ther batern\nctor son alfortmandd tethre k skin the known purated to prooust caraying the fit\nje in beverb is the sournction bainedy wesce tu sture artualle lines digra forme\nm rousively haldio ourso ond anvary was for the seven solies hild buil s to te\nzall for is it is one nine eight eight one neval to the kime typer oene where he\n================================================================================\nValidation set perplexity: 5.25\nAverage loss at step 2100 : 1.68808053017 learning rate: 10.0\nMinibatch perplexity: 5.17\nValidation set perplexity: 5.01\nAverage loss at step 2200 : 1.68322490931 learning rate: 10.0\nMinibatch perplexity: 5.09\nValidation set perplexity: 5.15\nAverage loss at step 2300 : 1.64465074301 learning rate: 10.0\nMinibatch perplexity: 5.51\nValidation set perplexity: 5.00\nAverage loss at step 2400 : 1.66408578038 learning rate: 10.0\nMinibatch perplexity: 5.86\nValidation set perplexity: 4.80\nAverage loss at step 2500 : 1.68515402555 learning rate: 10.0\nMinibatch perplexity: 5.75\nValidation set perplexity: 4.82\nAverage loss at step 2600 : 1.65405208349 learning rate: 10.0\nMinibatch perplexity: 5.38\nValidation set perplexity: 4.85\nAverage loss at step 2700 : 1.65706222177 learning rate: 10.0\nMinibatch perplexity: 5.46\nValidation set perplexity: 4.78\nAverage loss at step 2800 : 1.65204829812 learning rate: 10.0\nMinibatch perplexity: 5.06\nValidation set perplexity: 4.64\nAverage loss at step 2900 : 1.65107253551 learning rate: 10.0\nMinibatch perplexity: 5.00\nValidation set perplexity: 4.61\nAverage loss at step 3000 : 1.6495274055 learning rate: 10.0\nMinibatch perplexity: 4.53\n================================================================================\nject covered in belo one six six to finsh that all di rozial sime it a the lapse\nble which the pullic bocades record r to sile dric two one four nine seven six f\n originally ame the playa ishaps the stotchational in a p dstambly name which as\nore volum to bay riwer foreal in nuily operety can and auscham frooripm however \nkan traogey was lacous revision the mott coupofiteditey the trando insended frop\n================================================================================\nValidation set perplexity: 4.76\nAverage loss at step 3100 : 1.63705502152 learning rate: 10.0\nMinibatch perplexity: 5.50\nValidation set perplexity: 4.76\nAverage loss at step 3200 : 1.64740695596 learning rate: 10.0\nMinibatch perplexity: 4.84\nValidation set perplexity: 4.67\nAverage loss at step 3300 : 1.64711504817 learning rate: 10.0\nMinibatch perplexity: 5.39\nValidation set perplexity: 4.57\nAverage loss at step 3400 : 1.67113256454 learning rate: 10.0\nMinibatch perplexity: 5.56\nValidation set perplexity: 4.71\nAverage loss at step 3500 : 1.65637169957 learning rate: 10.0\nMinibatch perplexity: 5.03\nValidation set perplexity: 4.80\nAverage loss at step 3600 : 1.66601825476 learning rate: 10.0\nMinibatch perplexity: 4.63\nValidation set perplexity: 4.52\nAverage loss at step 3700 : 1.65021387935 learning rate: 10.0\nMinibatch perplexity: 5.50\nValidation set perplexity: 4.56\nAverage loss at step 3800 : 1.64481814981 learning rate: 10.0\nMinibatch perplexity: 4.60\nValidation set perplexity: 4.54\nAverage loss at step 3900 : 1.642069453 learning rate: 10.0\nMinibatch perplexity: 4.91\nValidation set perplexity: 4.54\nAverage loss at step 4000 : 1.65179730773 learning rate: 10.0\nMinibatch perplexity: 4.77\n================================================================================\nk s rasbonish roctes the nignese at heacle was sito of beho anarchys and with ro\njusar two sue wletaus of chistical in causations d ow trancic bruthing ha laters\nde and speacy pulted yoftret worksy zeatlating to eight d had to ie bue seven si" + "item_id": 80 }, { - "output_type": "stream", - "stream": "stdout", - "text": "\ns fiction of the feelly constive suq flanch earlied curauking bjoventation agent\nquen s playing it calana our seopity also atbellisionaly comexing the revideve i\n================================================================================\nValidation set perplexity: 4.58\nAverage loss at step 4100 : 1.63794238806 learning rate: 10.0\nMinibatch perplexity: 5.47\nValidation set perplexity: 4.79\nAverage loss at step 4200 : 1.63822438836 learning rate: 10.0\nMinibatch perplexity: 5.30\nValidation set perplexity: 4.54\nAverage loss at step 4300 : 1.61844664574 learning rate: 10.0\nMinibatch perplexity: 4.69\nValidation set perplexity: 4.54\nAverage loss at step 4400 : 1.61255454302 learning rate: 10.0\nMinibatch perplexity: 4.67\nValidation set perplexity: 4.54\nAverage loss at step 4500 : 1.61543365479 learning rate: 10.0\nMinibatch perplexity: 4.83\nValidation set perplexity: 4.69\nAverage loss at step 4600 : 1.61607327104 learning rate: 10.0\nMinibatch perplexity: 5.18\nValidation set perplexity: 4.64\nAverage loss at step 4700 : 1.62757282495 learning rate: 10.0\nMinibatch perplexity: 4.24\nValidation set perplexity: 4.66\nAverage loss at step 4800 : 1.63222063541 learning rate: 10.0\nMinibatch perplexity: 5.30\nValidation set perplexity: 4.53\nAverage loss at step 4900 : 1.63678096652 learning rate: 10.0\nMinibatch perplexity: 5.43\nValidation set perplexity: 4.64\nAverage loss at step 5000 : 1.610340662 learning rate: 1.0\nMinibatch perplexity: 5.10\n================================================================================\nin b one onarbs revieds the kimiluge that fondhtic fnoto cre one nine zero zero \n of is it of marking panzia t had wap ironicaghni relly deah the omber b h menba\nong messified it his the likdings ara subpore the a fames distaled self this int\ny advante authors the end languarle meit common tacing bevolitione and eight one\nzes that materly difild inllaring the fusts not panition assertian causecist bas\n================================================================================\nValidation set perplexity: 4.69\nAverage loss at step 5100 : 1.60593637228 learning rate: 1.0\nMinibatch perplexity: 4.69\nValidation set perplexity: 4.47\nAverage loss at step 5200 : 1.58993269444 learning rate: 1.0\nMinibatch perplexity: 4.65\nValidation set perplexity: 4.39\nAverage loss at step 5300 : 1.57930587292 learning rate: 1.0\nMinibatch perplexity: 5.11\nValidation set perplexity: 4.39\nAverage loss at step 5400 : 1.58022856832 learning rate: 1.0\nMinibatch perplexity: 5.19\nValidation set perplexity: 4.37\nAverage loss at step 5500 : 1.56654450059 learning rate: 1.0\nMinibatch perplexity: 4.69\nValidation set perplexity: 4.33\nAverage loss at step 5600 : 1.58013380885 learning rate: 1.0\nMinibatch perplexity: 5.13\nValidation set perplexity: 4.35\nAverage loss at step 5700 : 1.56974959254 learning rate: 1.0\nMinibatch perplexity: 5.00\nValidation set perplexity: 4.34\nAverage loss at step 5800 : 1.5839582932 learning rate: 1.0\nMinibatch perplexity: 4.88\nValidation set perplexity: 4.31\nAverage loss at step 5900 : 1.57129439116 learning rate: 1.0\nMinibatch perplexity: 4.66\nValidation set perplexity: 4.32\nAverage loss at step 6000 : 1.55144061089 learning rate: 1.0\nMinibatch perplexity: 4.55\n================================================================================\nutic clositical poopy stribe addi nixe one nine one zero zero eight zero b ha ex\nzerns b one internequiption of the secordy way anti proble akoping have fictiona\nphare united from has poporarly cities book ins sweden emperor a sass in origina\nquulk destrebinist and zeilazar and on low and by in science over country weilti\nx are holivia work missincis ons in the gages to starsle histon one icelanctrotu\n================================================================================\nValidation set perplexity: 4.30\nAverage loss at step 6100 : 1.56450940847 learning rate: 1.0\nMinibatch perplexity: 4.77\nValidation set perplexity: 4.27" + "item_id": 126 }, { - "output_type": "stream", - "stream": "stdout", - "text": "\nAverage loss at step 6200 : 1.53433164835 learning rate: 1.0\nMinibatch perplexity: 4.77\nValidation set perplexity: 4.27\nAverage loss at step 6300 : 1.54773445129 learning rate: 1.0\nMinibatch perplexity: 4.76\nValidation set perplexity: 4.25\nAverage loss at step 6400 : 1.54021131516 learning rate: 1.0\nMinibatch perplexity: 4.56\nValidation set perplexity: 4.24\nAverage loss at step 6500 : 1.56153374553 learning rate: 1.0\nMinibatch perplexity: 5.43\nValidation set perplexity: 4.27\nAverage loss at step 6600 : 1.59556478739 learning rate: 1.0\nMinibatch perplexity: 4.92\nValidation set perplexity: 4.28\nAverage loss at step 6700 : 1.58076951623 learning rate: 1.0\nMinibatch perplexity: 4.77\nValidation set perplexity: 4.30\nAverage loss at step 6800 : 1.6070714438 learning rate: 1.0\nMinibatch perplexity: 4.98\nValidation set perplexity: 4.28\nAverage loss at step 6900 : 1.58413293839 learning rate: 1.0\nMinibatch perplexity: 4.61\nValidation set perplexity: 4.29\nAverage loss at step 7000 : 1.57905534983 learning rate: 1.0\nMinibatch perplexity: 5.08\n================================================================================\njague are officiencinels ored by film voon higherise haik one nine on the iffirc\noshe provision that manned treatists on smalle bodariturmeristing the girto in s\nkis would softwenn mustapultmine truativersakys bersyim by s of confound esc bub\nry of the using one four six blain ira mannom marencies g with fextificallise re\n one son vit even an conderouss to person romer i a lebapter at obiding are iuse\n================================================================================\nValidation set perplexity: 4.25\n" + "item_id": 144 } ] }, - { - "metadata": { - "id": "pl4vtmFfa5nn", - "colab_type": "text" + "cellView": "both", + "executionInfo": { + "elapsed": 199909, + "status": "ok", + "timestamp": 1445965877333, + "user": { + "color": "#1FA15D", + "displayName": "Vincent Vanhoucke", + "isAnonymous": false, + "isMe": true, + "permissionId": "05076109866853157986", + "photoUrl": "//lh6.googleusercontent.com/-cCJa7dTDcgQ/AAAAAAAAAAI/AAAAAAAACgw/r2EZ_8oYer4/s50-c-k-no/photo.jpg", + "sessionId": "6f6f07b359200c46", + "userId": "102167687554210253930" }, - "cell_type": "markdown", - "source": "---\nProblem 1\n---------\n\nYou might have noticed that the definition of the LSTM cell involves 4 matrix multiplications with the input, and 4 matrix multiplications with the output. Simplify the expression by using a single matrix multiply for each, and variables that are 4 times larger.\n\n---" + "user_tz": 420 }, + "outputId": "5e868466-2532-4545-ce35-b403cf5d9de6" + }, + "source": [ + "num_steps = 7001\n", + "summary_frequency = 100\n", + "\n", + "with tf.Session(graph=graph) as session:\n", + " tf.initialize_all_variables().run()\n", + " print 'Initialized'\n", + " mean_loss = 0\n", + " for step in xrange(num_steps):\n", + " batches = train_batches.next()\n", + " feed_dict = dict()\n", + " for i in xrange(num_unrollings + 1):\n", + " feed_dict[train_data[i]] = batches[i]\n", + " _, l, predictions, lr = session.run(\n", + " [optimizer, loss, train_prediction, learning_rate], feed_dict=feed_dict)\n", + " mean_loss += l\n", + " if step % summary_frequency == 0:\n", + " if step > 0:\n", + " mean_loss = mean_loss / summary_frequency\n", + " # The mean loss is an estimate of the loss over the last few batches.\n", + " print 'Average loss at step', step, ':', mean_loss, 'learning rate:', lr\n", + " mean_loss = 0\n", + " labels = np.concatenate(list(batches)[1:])\n", + " print 'Minibatch perplexity: %.2f' % float(\n", + " np.exp(logprob(predictions, labels)))\n", + " if step % (summary_frequency * 10) == 0:\n", + " # Generate some samples.\n", + " print '=' * 80\n", + " for _ in xrange(5):\n", + " feed = sample(random_distribution())\n", + " sentence = characters(feed)[0]\n", + " reset_sample_state.run()\n", + " for _ in xrange(79):\n", + " prediction = sample_prediction.eval({sample_input: feed})\n", + " feed = sample(prediction)\n", + " sentence += characters(feed)[0]\n", + " print sentence\n", + " print '=' * 80\n", + " # Measure validation set perplexity.\n", + " reset_sample_state.run()\n", + " valid_logprob = 0\n", + " for _ in xrange(valid_size):\n", + " b = valid_batches.next()\n", + " predictions = sample_prediction.eval({sample_input: b[0]})\n", + " valid_logprob = valid_logprob + logprob(predictions, b[1])\n", + " print 'Validation set perplexity: %.2f' % float(np.exp(\n", + " valid_logprob / valid_size))" + ], + "outputs": [ { - "metadata": { - "id": "4eErTCTybtph", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 2\n---------\n\nWe want to train a LSTM over bigrams, that is pairs of consecutive characters like 'ab' instead of single characters like 'a'. Since the number of possible bigrams is large, feeding them directly to the LSTM using 1-hot encodings will lead to a very sparse representation that is very wasteful computationally.\n\na- Introduce an embedding lookup on the inputs, and feed the embeddings to the LSTM cell instead of the inputs themselves.\n\nb- Write a bigram-based LSTM, modeled on the character LSTM above.\n\nc- Introduce Dropout. For best practices on how to use Dropout in LSTMs, refer to this [article](http://arxiv.org/abs/1409.2329).\n\n---" + "output_type": "stream", + "text": [ + "Initialized\n", + "Average loss at step 0 : 3.29904174805 learning rate: 10.0\n", + "Minibatch perplexity: 27.09\n", + "================================================================================\n", + "srk dwmrnuldtbbgg tapootidtu xsciu sgokeguw hi ieicjq lq piaxhazvc s fht wjcvdlh\n", + "lhrvallvbeqqquc dxd y siqvnle bzlyw nr rwhkalezo siie o deb e lpdg storq u nx o\n", + "meieu nantiouie gdys qiuotblci loc hbiznauiccb cqzed acw l tsm adqxplku gn oaxet\n", + "unvaouc oxchywdsjntdh zpklaejvxitsokeerloemee htphisb th eaeqseibumh aeeyj j orw\n", + "ogmnictpycb whtup otnilnesxaedtekiosqet liwqarysmt arj flioiibtqekycbrrgoysj\n", + "================================================================================\n", + "Validation set perplexity: 19.99\n", + "Average loss at step 100 : 2.59553678274 learning rate: 10.0\n", + "Minibatch perplexity: 9.57\n", + "Validation set perplexity: 10.60\n", + "Average loss at step 200 : 2.24747137785 learning rate: 10.0\n", + "Minibatch perplexity: 7.68\n", + "Validation set perplexity: 8.84\n", + "Average loss at step 300 : 2.09438110709 learning rate: 10.0\n", + "Minibatch perplexity: 7.41\n", + "Validation set perplexity: 8.13\n", + "Average loss at step 400 : 1.99440989017 learning rate: 10.0\n", + "Minibatch perplexity: 6.46\n", + "Validation set perplexity: 7.58\n", + "Average loss at step 500 : 1.9320810616 learning rate: 10.0\n", + "Minibatch perplexity: 6.30\n", + "Validation set perplexity: 6.88\n", + "Average loss at step 600 : 1.90935629249 learning rate: 10.0\n", + "Minibatch perplexity: 7.21\n", + "Validation set perplexity: 6.91\n", + "Average loss at step 700 : 1.85583009005 learning rate: 10.0\n", + "Minibatch perplexity: 6.13\n", + "Validation set perplexity: 6.60\n", + "Average loss at step 800 : 1.82152368546 learning rate: 10.0\n", + "Minibatch perplexity: 6.01\n", + "Validation set perplexity: 6.37\n", + "Average loss at step 900 : 1.83169809818 learning rate: 10.0\n", + "Minibatch perplexity: 7.20\n", + "Validation set perplexity: 6.23\n", + "Average loss at step 1000 : 1.82217029214 learning rate: 10.0\n", + "Minibatch perplexity: 6.73\n", + "================================================================================\n", + "le action b of the tert sy ofter selvorang previgned stischdy yocal chary the co\n", + "le relganis networks partucy cetinning wilnchan sics rumeding a fulch laks oftes\n", + "hian andoris ret the ecause bistory l pidect one eight five lack du that the ses\n", + "aiv dromery buskocy becomer worils resism disele retery exterrationn of hide in \n", + "mer miter y sught esfectur of the upission vain is werms is vul ugher compted by\n", + "================================================================================\n", + "Validation set perplexity: 6.07\n", + "Average loss at step 1100 : 1.77301145077 learning rate: 10.0\n", + "Minibatch perplexity: 6.03\n", + "Validation set perplexity: 5.89\n", + "Average loss at step 1200 : 1.75306463003 learning rate: 10.0\n", + "Minibatch perplexity: 6.50\n", + "Validation set perplexity: 5.61\n", + "Average loss at step 1300 : 1.72937195778 learning rate: 10.0\n", + "Minibatch perplexity: 5.00\n", + "Validation set perplexity: 5.60\n", + "Average loss at step 1400 : 1.74773373723 learning rate: 10.0\n", + "Minibatch perplexity: 6.48\n", + "Validation set perplexity: 5.66\n", + "Average loss at step 1500 : 1.7368799901 learning rate: 10.0\n", + "Minibatch perplexity: 5.22\n", + "Validation set perplexity: 5.44\n", + "Average loss at step 1600 : 1.74528762937 learning rate: 10.0\n", + "Minibatch perplexity: 5.85\n", + "Validation set perplexity: 5.33\n", + "Average loss at step 1700 : 1.70881183743 learning rate: 10.0\n", + "Minibatch perplexity: 5.33\n", + "Validation set perplexity: 5.56\n", + "Average loss at step 1800 : 1.67776108027 learning rate: 10.0\n", + "Minibatch perplexity: 5.33\n", + "Validation set perplexity: 5.29\n", + "Average loss at step 1900 : 1.64935536742 learning rate: 10.0\n", + "Minibatch perplexity: 5.29\n", + "Validation set perplexity: 5.15\n", + "Average loss at step" + ], + "name": "stdout" }, { - "metadata": { - "id": "Y5tapX3kpcqZ", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": "---\nProblem 3\n---------\n\n(difficult!)\n\nWrite a sequence-to-sequence LSTM which mirrors all the words in a sentence. For example, if your input is:\n\n the quick brown fox\n \nthe model should attempt to output:\n\n eht kciuq nworb xof\n \nRefer to the lecture on how to put together a sequence-to-sequence model, as well as [this article](http://arxiv.org/abs/1409.3215) for best practices.\n\n---" + "output_type": "stream", + "text": [ + " 2000 : 1.69528644681 learning rate: 10.0\n", + "Minibatch perplexity: 5.13\n", + "================================================================================\n", + "vers soqually have one five landwing to docial page kagan lower with ther batern\n", + "ctor son alfortmandd tethre k skin the known purated to prooust caraying the fit\n", + "je in beverb is the sournction bainedy wesce tu sture artualle lines digra forme\n", + "m rousively haldio ourso ond anvary was for the seven solies hild buil s to te\n", + "zall for is it is one nine eight eight one neval to the kime typer oene where he\n", + "================================================================================\n", + "Validation set perplexity: 5.25\n", + "Average loss at step 2100 : 1.68808053017 learning rate: 10.0\n", + "Minibatch perplexity: 5.17\n", + "Validation set perplexity: 5.01\n", + "Average loss at step 2200 : 1.68322490931 learning rate: 10.0\n", + "Minibatch perplexity: 5.09\n", + "Validation set perplexity: 5.15\n", + "Average loss at step 2300 : 1.64465074301 learning rate: 10.0\n", + "Minibatch perplexity: 5.51\n", + "Validation set perplexity: 5.00\n", + "Average loss at step 2400 : 1.66408578038 learning rate: 10.0\n", + "Minibatch perplexity: 5.86\n", + "Validation set perplexity: 4.80\n", + "Average loss at step 2500 : 1.68515402555 learning rate: 10.0\n", + "Minibatch perplexity: 5.75\n", + "Validation set perplexity: 4.82\n", + "Average loss at step 2600 : 1.65405208349 learning rate: 10.0\n", + "Minibatch perplexity: 5.38\n", + "Validation set perplexity: 4.85\n", + "Average loss at step 2700 : 1.65706222177 learning rate: 10.0\n", + "Minibatch perplexity: 5.46\n", + "Validation set perplexity: 4.78\n", + "Average loss at step 2800 : 1.65204829812 learning rate: 10.0\n", + "Minibatch perplexity: 5.06\n", + "Validation set perplexity: 4.64\n", + "Average loss at step 2900 : 1.65107253551 learning rate: 10.0\n", + "Minibatch perplexity: 5.00\n", + "Validation set perplexity: 4.61\n", + "Average loss at step 3000 : 1.6495274055 learning rate: 10.0\n", + "Minibatch perplexity: 4.53\n", + "================================================================================\n", + "ject covered in belo one six six to finsh that all di rozial sime it a the lapse\n", + "ble which the pullic bocades record r to sile dric two one four nine seven six f\n", + " originally ame the playa ishaps the stotchational in a p dstambly name which as\n", + "ore volum to bay riwer foreal in nuily operety can and auscham frooripm however \n", + "kan traogey was lacous revision the mott coupofiteditey the trando insended frop\n", + "================================================================================\n", + "Validation set perplexity: 4.76\n", + "Average loss at step 3100 : 1.63705502152 learning rate: 10.0\n", + "Minibatch perplexity: 5.50\n", + "Validation set perplexity: 4.76\n", + "Average loss at step 3200 : 1.64740695596 learning rate: 10.0\n", + "Minibatch perplexity: 4.84\n", + "Validation set perplexity: 4.67\n", + "Average loss at step 3300 : 1.64711504817 learning rate: 10.0\n", + "Minibatch perplexity: 5.39\n", + "Validation set perplexity: 4.57\n", + "Average loss at step 3400 : 1.67113256454 learning rate: 10.0\n", + "Minibatch perplexity: 5.56\n", + "Validation set perplexity: 4.71\n", + "Average loss at step 3500 : 1.65637169957 learning rate: 10.0\n", + "Minibatch perplexity: 5.03\n", + "Validation set perplexity: 4.80\n", + "Average loss at step 3600 : 1.66601825476 learning rate: 10.0\n", + "Minibatch perplexity: 4.63\n", + "Validation set perplexity: 4.52\n", + "Average loss at step 3700 : 1.65021387935 learning rate: 10.0\n", + "Minibatch perplexity: 5.50\n", + "Validation set perplexity: 4.56\n", + "Average loss at step 3800 : 1.64481814981 learning rate: 10.0\n", + "Minibatch perplexity: 4.60\n", + "Validation set perplexity: 4.54\n", + "Average loss at step 3900 : 1.642069453 learning rate: 10.0\n", + "Minibatch perplexity: 4.91\n", + "Validation set perplexity: 4.54\n", + "Average loss at step 4000 : 1.65179730773 learning rate: 10.0\n", + "Minibatch perplexity: 4.77\n", + "================================================================================\n", + "k s rasbonish roctes the nignese at heacle was sito of beho anarchys and with ro\n", + "jusar two sue wletaus of chistical in causations d ow trancic bruthing ha laters\n", + "de and speacy pulted yoftret worksy zeatlating to eight d had to ie bue seven si" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "\n", + "s fiction of the feelly constive suq flanch earlied curauking bjoventation agent\n", + "quen s playing it calana our seopity also atbellisionaly comexing the revideve i\n", + "================================================================================\n", + "Validation set perplexity: 4.58\n", + "Average loss at step 4100 : 1.63794238806 learning rate: 10.0\n", + "Minibatch perplexity: 5.47\n", + "Validation set perplexity: 4.79\n", + "Average loss at step 4200 : 1.63822438836 learning rate: 10.0\n", + "Minibatch perplexity: 5.30\n", + "Validation set perplexity: 4.54\n", + "Average loss at step 4300 : 1.61844664574 learning rate: 10.0\n", + "Minibatch perplexity: 4.69\n", + "Validation set perplexity: 4.54\n", + "Average loss at step 4400 : 1.61255454302 learning rate: 10.0\n", + "Minibatch perplexity: 4.67\n", + "Validation set perplexity: 4.54\n", + "Average loss at step 4500 : 1.61543365479 learning rate: 10.0\n", + "Minibatch perplexity: 4.83\n", + "Validation set perplexity: 4.69\n", + "Average loss at step 4600 : 1.61607327104 learning rate: 10.0\n", + "Minibatch perplexity: 5.18\n", + "Validation set perplexity: 4.64\n", + "Average loss at step 4700 : 1.62757282495 learning rate: 10.0\n", + "Minibatch perplexity: 4.24\n", + "Validation set perplexity: 4.66\n", + "Average loss at step 4800 : 1.63222063541 learning rate: 10.0\n", + "Minibatch perplexity: 5.30\n", + "Validation set perplexity: 4.53\n", + "Average loss at step 4900 : 1.63678096652 learning rate: 10.0\n", + "Minibatch perplexity: 5.43\n", + "Validation set perplexity: 4.64\n", + "Average loss at step 5000 : 1.610340662 learning rate: 1.0\n", + "Minibatch perplexity: 5.10\n", + "================================================================================\n", + "in b one onarbs revieds the kimiluge that fondhtic fnoto cre one nine zero zero \n", + " of is it of marking panzia t had wap ironicaghni relly deah the omber b h menba\n", + "ong messified it his the likdings ara subpore the a fames distaled self this int\n", + "y advante authors the end languarle meit common tacing bevolitione and eight one\n", + "zes that materly difild inllaring the fusts not panition assertian causecist bas\n", + "================================================================================\n", + "Validation set perplexity: 4.69\n", + "Average loss at step 5100 : 1.60593637228 learning rate: 1.0\n", + "Minibatch perplexity: 4.69\n", + "Validation set perplexity: 4.47\n", + "Average loss at step 5200 : 1.58993269444 learning rate: 1.0\n", + "Minibatch perplexity: 4.65\n", + "Validation set perplexity: 4.39\n", + "Average loss at step 5300 : 1.57930587292 learning rate: 1.0\n", + "Minibatch perplexity: 5.11\n", + "Validation set perplexity: 4.39\n", + "Average loss at step 5400 : 1.58022856832 learning rate: 1.0\n", + "Minibatch perplexity: 5.19\n", + "Validation set perplexity: 4.37\n", + "Average loss at step 5500 : 1.56654450059 learning rate: 1.0\n", + "Minibatch perplexity: 4.69\n", + "Validation set perplexity: 4.33\n", + "Average loss at step 5600 : 1.58013380885 learning rate: 1.0\n", + "Minibatch perplexity: 5.13\n", + "Validation set perplexity: 4.35\n", + "Average loss at step 5700 : 1.56974959254 learning rate: 1.0\n", + "Minibatch perplexity: 5.00\n", + "Validation set perplexity: 4.34\n", + "Average loss at step 5800 : 1.5839582932 learning rate: 1.0\n", + "Minibatch perplexity: 4.88\n", + "Validation set perplexity: 4.31\n", + "Average loss at step 5900 : 1.57129439116 learning rate: 1.0\n", + "Minibatch perplexity: 4.66\n", + "Validation set perplexity: 4.32\n", + "Average loss at step 6000 : 1.55144061089 learning rate: 1.0\n", + "Minibatch perplexity: 4.55\n", + "================================================================================\n", + "utic clositical poopy stribe addi nixe one nine one zero zero eight zero b ha ex\n", + "zerns b one internequiption of the secordy way anti proble akoping have fictiona\n", + "phare united from has poporarly cities book ins sweden emperor a sass in origina\n", + "quulk destrebinist and zeilazar and on low and by in science over country weilti\n", + "x are holivia work missincis ons in the gages to starsle histon one icelanctrotu\n", + "================================================================================\n", + "Validation set perplexity: 4.30\n", + "Average loss at step 6100 : 1.56450940847 learning rate: 1.0\n", + "Minibatch perplexity: 4.77\n", + "Validation set perplexity: 4.27" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "\n", + "Average loss at step 6200 : 1.53433164835 learning rate: 1.0\n", + "Minibatch perplexity: 4.77\n", + "Validation set perplexity: 4.27\n", + "Average loss at step 6300 : 1.54773445129 learning rate: 1.0\n", + "Minibatch perplexity: 4.76\n", + "Validation set perplexity: 4.25\n", + "Average loss at step 6400 : 1.54021131516 learning rate: 1.0\n", + "Minibatch perplexity: 4.56\n", + "Validation set perplexity: 4.24\n", + "Average loss at step 6500 : 1.56153374553 learning rate: 1.0\n", + "Minibatch perplexity: 5.43\n", + "Validation set perplexity: 4.27\n", + "Average loss at step 6600 : 1.59556478739 learning rate: 1.0\n", + "Minibatch perplexity: 4.92\n", + "Validation set perplexity: 4.28\n", + "Average loss at step 6700 : 1.58076951623 learning rate: 1.0\n", + "Minibatch perplexity: 4.77\n", + "Validation set perplexity: 4.30\n", + "Average loss at step 6800 : 1.6070714438 learning rate: 1.0\n", + "Minibatch perplexity: 4.98\n", + "Validation set perplexity: 4.28\n", + "Average loss at step 6900 : 1.58413293839 learning rate: 1.0\n", + "Minibatch perplexity: 4.61\n", + "Validation set perplexity: 4.29\n", + "Average loss at step 7000 : 1.57905534983 learning rate: 1.0\n", + "Minibatch perplexity: 5.08\n", + "================================================================================\n", + "jague are officiencinels ored by film voon higherise haik one nine on the iffirc\n", + "oshe provision that manned treatists on smalle bodariturmeristing the girto in s\n", + "kis would softwenn mustapultmine truativersakys bersyim by s of confound esc bub\n", + "ry of the using one four six blain ira mannom marencies g with fextificallise re\n", + " one son vit even an conderouss to person romer i a lebapter at obiding are iuse\n", + "================================================================================\n", + "Validation set perplexity: 4.25\n" + ], + "name": "stdout" } + ], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pl4vtmFfa5nn", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 1\n", + "---------\n", + "\n", + "You might have noticed that the definition of the LSTM cell involves 4 matrix multiplications with the input, and 4 matrix multiplications with the output. Simplify the expression by using a single matrix multiply for each, and variables that are 4 times larger.\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4eErTCTybtph", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 2\n", + "---------\n", + "\n", + "We want to train a LSTM over bigrams, that is pairs of consecutive characters like 'ab' instead of single characters like 'a'. Since the number of possible bigrams is large, feeding them directly to the LSTM using 1-hot encodings will lead to a very sparse representation that is very wasteful computationally.\n", + "\n", + "a- Introduce an embedding lookup on the inputs, and feed the embeddings to the LSTM cell instead of the inputs themselves.\n", + "\n", + "b- Write a bigram-based LSTM, modeled on the character LSTM above.\n", + "\n", + "c- Introduce Dropout. For best practices on how to use Dropout in LSTMs, refer to this [article](http://arxiv.org/abs/1409.2329).\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Y5tapX3kpcqZ", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 3\n", + "---------\n", + "\n", + "(difficult!)\n", + "\n", + "Write a sequence-to-sequence LSTM which mirrors all the words in a sentence. For example, if your input is:\n", + "\n", + " the quick brown fox\n", + " \n", + "the model should attempt to output:\n", + "\n", + " eht kciuq nworb xof\n", + " \n", + "Refer to the lecture on how to put together a sequence-to-sequence model, as well as [this article](http://arxiv.org/abs/1409.3215) for best practices.\n", + "\n", + "---" ] } - ], - "metadata": { - "name": "6_lstm.ipynb", - "colabVersion": "0.3.2", - "colab_views": {}, - "colab_default_view": {} - }, - "nbformat": 3, - "nbformat_minor": 0 + ] } \ No newline at end of file From ed7587421309a552948ca006f4a11dd8e343eeca Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 25 Jan 2016 22:33:26 -0800 Subject: [PATCH 010/123] Keeps optional question format consisten Added a newline to keep separation of optional questions from required tasks consistent and easier to read. --- 1_notmnist.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index e32e4bf030c..4ef285d398b 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -622,6 +622,7 @@ "\n", "By construction, this dataset might contain a lot of overlapping samples, including training data that's also contained in the validation and test set! Overlap between training and test can skew the results if you expect to use your model in an environment where there is never an overlap, but are actually ok if you expect to see training samples recur when you use it.\n", "Measure how much overlap there is between training, validation and test samples.\n", + "\n", "Optional questions:\n", "- What about near duplicates between datasets? (images that are almost identical)\n", "- Create a sanitized validation and test set, and compare your accuracy on those in subsequent assignments.\n", @@ -649,4 +650,4 @@ ] } ] -} \ No newline at end of file +} From e1222ec9aa07cc2dbb2cf1e19b6a07c53f55c11d Mon Sep 17 00:00:00 2001 From: emmjaykay Date: Mon, 25 Jan 2016 23:25:34 -0800 Subject: [PATCH 011/123] Some error checking and user output notes Hi, While running this it seems like the notebook hung but what really is happening is that notMNIST_large.tar.gz is taking a long time to extract. Also, since I looked at the contents of the directory a .DS_Store file was created. Re-sending pull request because of a mistake on earlier pull request. --- 1_notmnist.ipynb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 4ef285d398b..86a6b217689 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -184,10 +184,13 @@ "\n", "def extract(filename):\n", " tar = tarfile.open(filename)\n", - " tar.extractall()\n", - " tar.close()\n", " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", - " data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n", + " if not os.path.isdir(root):\n", + " print 'Extracting data for %s. This may take a while. Please wait.' % root\n", + " sys.stdout.flush()\n", + " tar.extractall()\n", + " tar.close()\n", + " data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root)) if d != '.DS_Store']\n", " if len(data_folders) != num_classes:\n", " raise Exception(\n", " 'Expected %d folders, one per class. Found %d instead.' % (\n", From ccb6116966c30d6b544a5b67a996f774af9f6dc7 Mon Sep 17 00:00:00 2001 From: Andre Cruz Date: Tue, 26 Jan 2016 17:14:55 +0000 Subject: [PATCH 012/123] Corrected bug in Python code, wrong variable being used. --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 86a6b217689..6439c45314a 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -293,7 +293,7 @@ " for image in os.listdir(folder):\n", " if image_index >= max_num_images:\n", " raise Exception('More images than expected: %d >= %d' % (\n", - " num_images, max_num_images))\n", + " image_index, max_num_images))\n", " image_file = os.path.join(folder, image)\n", " try:\n", " image_data = (ndimage.imread(image_file).astype(float) -\n", From 8a3beecdfe479f45aa827ab97ecc0c867fbca5b7 Mon Sep 17 00:00:00 2001 From: Josh Levenberg Date: Tue, 26 Jan 2016 10:46:54 -0800 Subject: [PATCH 013/123] Global search & replace to move to the new location for tensorflow/core/ files and build targets. Change: 113073087 --- 1_notmnist.ipynb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index e32e4bf030c..6439c45314a 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -184,10 +184,13 @@ "\n", "def extract(filename):\n", " tar = tarfile.open(filename)\n", - " tar.extractall()\n", - " tar.close()\n", " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", - " data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))]\n", + " if not os.path.isdir(root):\n", + " print 'Extracting data for %s. This may take a while. Please wait.' % root\n", + " sys.stdout.flush()\n", + " tar.extractall()\n", + " tar.close()\n", + " data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root)) if d != '.DS_Store']\n", " if len(data_folders) != num_classes:\n", " raise Exception(\n", " 'Expected %d folders, one per class. Found %d instead.' % (\n", @@ -290,7 +293,7 @@ " for image in os.listdir(folder):\n", " if image_index >= max_num_images:\n", " raise Exception('More images than expected: %d >= %d' % (\n", - " num_images, max_num_images))\n", + " image_index, max_num_images))\n", " image_file = os.path.join(folder, image)\n", " try:\n", " image_data = (ndimage.imread(image_file).astype(float) -\n", @@ -622,6 +625,7 @@ "\n", "By construction, this dataset might contain a lot of overlapping samples, including training data that's also contained in the validation and test set! Overlap between training and test can skew the results if you expect to use your model in an environment where there is never an overlap, but are actually ok if you expect to see training samples recur when you use it.\n", "Measure how much overlap there is between training, validation and test samples.\n", + "\n", "Optional questions:\n", "- What about near duplicates between datasets? (images that are almost identical)\n", "- Create a sanitized validation and test set, and compare your accuracy on those in subsequent assignments.\n", @@ -649,4 +653,4 @@ ] } ] -} \ No newline at end of file +} From 402d9bb84c31764d21da534af9f50843ab077f92 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 26 Jan 2016 11:35:23 -0800 Subject: [PATCH 014/123] Updates to 1st Udacity colab: - re-make data extraction idempotent in case someone accidentally cancels the extraction. - Python 3 compatibility (h/t @lzlarryli) Change: 113079245 --- 1_notmnist.ipynb | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 6439c45314a..e44622b48a9 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -48,12 +48,13 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import os\n", + "import sys\n", "import tarfile\n", - "import urllib\n", "from IPython.display import display, Image\n", "from scipy import ndimage\n", "from sklearn.linear_model import LogisticRegression\n", - "import cPickle as pickle" + "from six.moves.urllib.request import urlretrieve\n", + "from six.moves import cPickle as pickle" ], "outputs": [], "execution_count": 0 @@ -185,17 +186,17 @@ "def extract(filename):\n", " tar = tarfile.open(filename)\n", " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", - " if not os.path.isdir(root):\n", - " print 'Extracting data for %s. This may take a while. Please wait.' % root\n", - " sys.stdout.flush()\n", - " tar.extractall()\n", - " tar.close()\n", - " data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root)) if d != '.DS_Store']\n", + " print('Extracting data for %s. This may take a while. Please wait.' % root)\n", + " sys.stdout.flush()\n", + " tar.extractall()\n", + " tar.close()\n", + " data_folders = [\n", + " os.path.join(root, d) for d in sorted(os.listdir(root)) if d != '.DS_Store']\n", " if len(data_folders) != num_classes:\n", " raise Exception(\n", " 'Expected %d folders, one per class. Found %d instead.' % (\n", " num_classes, len(data_folders)))\n", - " print data_folders\n", + " print(data_folders)\n", " return data_folders\n", " \n", "train_folders = extract(train_filename)\n", @@ -289,7 +290,7 @@ " label_index = 0\n", " image_index = 0\n", " for folder in data_folders:\n", - " print folder\n", + " print(folder)\n", " for image in os.listdir(folder):\n", " if image_index >= max_num_images:\n", " raise Exception('More images than expected: %d >= %d' % (\n", @@ -304,7 +305,7 @@ " labels[image_index] = label_index\n", " image_index += 1\n", " except IOError as e:\n", - " print 'Could not read:', image_file, ':', e, '- it\\'s ok, skipping.'\n", + " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", " label_index += 1\n", " num_images = image_index\n", " dataset = dataset[0:num_images, :, :]\n", @@ -312,10 +313,10 @@ " if num_images < min_num_images:\n", " raise Exception('Many fewer images than expected: %d < %d' % (\n", " num_images, min_num_images))\n", - " print 'Full dataset tensor:', dataset.shape\n", - " print 'Mean:', np.mean(dataset)\n", - " print 'Standard deviation:', np.std(dataset)\n", - " print 'Labels:', labels.shape\n", + " print('Full dataset tensor:', dataset.shape)\n", + " print('Mean:', np.mean(dataset))\n", + " print('Standard deviation:', np.std(dataset))\n", + " print('Labels:', labels.shape)\n", " return dataset, labels\n", "train_dataset, train_labels = load(train_folders, 450000, 550000)\n", "test_dataset, test_labels = load(test_folders, 18000, 20000)" @@ -502,8 +503,8 @@ "valid_labels = train_labels[:valid_size]\n", "train_dataset = train_dataset[valid_size:valid_size+train_size,:,:]\n", "train_labels = train_labels[valid_size:valid_size+train_size]\n", - "print 'Training', train_dataset.shape, train_labels.shape\n", - "print 'Validation', valid_dataset.shape, valid_labels.shape" + "print('Training', train_dataset.shape, train_labels.shape)\n", + "print('Validation', valid_dataset.shape, valid_labels.shape)" ], "outputs": [ { @@ -556,7 +557,7 @@ " pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n", " f.close()\n", "except Exception as e:\n", - " print 'Unable to save data to', pickle_file, ':', e\n", + " print('Unable to save data to', pickle_file, ':', e)\n", " raise" ], "outputs": [], @@ -599,7 +600,7 @@ }, "source": [ "statinfo = os.stat(pickle_file)\n", - "print 'Compressed pickle size:', statinfo.st_size" + "print('Compressed pickle size:', statinfo.st_size)" ], "outputs": [ { @@ -653,4 +654,4 @@ ] } ] -} +} \ No newline at end of file From 7dab95296751e90022c65d2428cf7e2a5a6abaaf Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 26 Jan 2016 12:05:24 -0800 Subject: [PATCH 015/123] Make 2nd and 3rd colab compatible with Python 3 Change: 113082597 --- 2_fullyconnected.ipynb | 47 +++++++++++++++++++++--------------------- 3_regularization.ipynb | 16 +++++++------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 5abcfd3be91..d7042e13139 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -45,9 +45,10 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", - "import cPickle as pickle\n", "import numpy as np\n", - "import tensorflow as tf" + "import tensorflow as tf\n", + "from six.moves import cPickle as pickle\n", + "from six.moves import range" ], "outputs": [], "execution_count": 0 @@ -109,9 +110,9 @@ " test_dataset = save['test_dataset']\n", " test_labels = save['test_labels']\n", " del save # hint to help gc free up memory\n", - " print 'Training set', train_dataset.shape, train_labels.shape\n", - " print 'Validation set', valid_dataset.shape, valid_labels.shape\n", - " print 'Test set', test_dataset.shape, test_labels.shape" + " print('Training set', train_dataset.shape, train_labels.shape)\n", + " print('Validation set', valid_dataset.shape, valid_labels.shape)\n", + " print('Test set', test_dataset.shape, test_labels.shape)" ], "outputs": [ { @@ -185,9 +186,9 @@ "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n", "test_dataset, test_labels = reformat(test_dataset, test_labels)\n", - "print 'Training set', train_dataset.shape, train_labels.shape\n", - "print 'Validation set', valid_dataset.shape, valid_labels.shape\n", - "print 'Test set', test_dataset.shape, test_labels.shape" + "print('Training set', train_dataset.shape, train_labels.shape)\n", + "print('Validation set', valid_dataset.shape, valid_labels.shape)\n", + "print('Test set', test_dataset.shape, test_labels.shape)" ], "outputs": [ { @@ -343,22 +344,22 @@ " # we described in the graph: random weights for the matrix, zeros for the\n", " # biases. \n", " tf.initialize_all_variables().run()\n", - " print 'Initialized'\n", - " for step in xrange(num_steps):\n", + " print('Initialized')\n", + " for step in range(num_steps):\n", " # Run the computations. We tell .run() that we want to run the optimizer,\n", " # and get the loss value and the training predictions returned as numpy\n", " # arrays.\n", " _, l, predictions = session.run([optimizer, loss, train_prediction])\n", " if (step % 100 == 0):\n", - " print 'Loss at step', step, ':', l\n", - " print 'Training accuracy: %.1f%%' % accuracy(\n", - " predictions, train_labels[:train_subset, :])\n", + " print('Loss at step %d: %f' % (step, l))\n", + " print('Training accuracy: %.1f%%' % accuracy(\n", + " predictions, train_labels[:train_subset, :]))\n", " # Calling .eval() on valid_prediction is basically like calling run(), but\n", " # just to get that one numpy array. Note that it recomputes all its graph\n", " # dependencies.\n", - " print 'Validation accuracy: %.1f%%' % accuracy(\n", - " valid_prediction.eval(), valid_labels)\n", - " print 'Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels)" + " print('Validation accuracy: %.1f%%' % accuracy(\n", + " valid_prediction.eval(), valid_labels))\n", + " print('Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels))" ], "outputs": [ { @@ -510,8 +511,8 @@ "\n", "with tf.Session(graph=graph) as session:\n", " tf.initialize_all_variables().run()\n", - " print \"Initialized\"\n", - " for step in xrange(num_steps):\n", + " print(\"Initialized\")\n", + " for step in range(num_steps):\n", " # Pick an offset within the training data, which has been randomized.\n", " # Note: we could use better randomization across epochs.\n", " offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n", @@ -525,11 +526,11 @@ " _, l, predictions = session.run(\n", " [optimizer, loss, train_prediction], feed_dict=feed_dict)\n", " if (step % 500 == 0):\n", - " print \"Minibatch loss at step\", step, \":\", l\n", - " print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n", - " print \"Validation accuracy: %.1f%%\" % accuracy(\n", - " valid_prediction.eval(), valid_labels)\n", - " print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)" + " print(\"Minibatch loss at step %d: %f\" % (step, l))\n", + " print(\"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels))\n", + " print(\"Validation accuracy: %.1f%%\" % accuracy(\n", + " valid_prediction.eval(), valid_labels))\n", + " print(\"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels))" ], "outputs": [ { diff --git a/3_regularization.ipynb b/3_regularization.ipynb index a61f7f4859a..c848c7c69b4 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -45,9 +45,9 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", - "import cPickle as pickle\n", "import numpy as np\n", - "import tensorflow as tf" + "import tensorflow as tf\n", + "from six.moves import cPickle as pickle" ], "outputs": [], "execution_count": 0 @@ -109,9 +109,9 @@ " test_dataset = save['test_dataset']\n", " test_labels = save['test_labels']\n", " del save # hint to help gc free up memory\n", - " print 'Training set', train_dataset.shape, train_labels.shape\n", - " print 'Validation set', valid_dataset.shape, valid_labels.shape\n", - " print 'Test set', test_dataset.shape, test_labels.shape" + " print('Training set', train_dataset.shape, train_labels.shape)\n", + " print('Validation set', valid_dataset.shape, valid_labels.shape)\n", + " print('Test set', test_dataset.shape, test_labels.shape)" ], "outputs": [ { @@ -185,9 +185,9 @@ "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n", "test_dataset, test_labels = reformat(test_dataset, test_labels)\n", - "print 'Training set', train_dataset.shape, train_labels.shape\n", - "print 'Validation set', valid_dataset.shape, valid_labels.shape\n", - "print 'Test set', test_dataset.shape, test_labels.shape" + "print('Training set', train_dataset.shape, train_labels.shape)\n", + "print('Validation set', valid_dataset.shape, valid_labels.shape)\n", + "print('Test set', test_dataset.shape, test_labels.shape)" ], "outputs": [ { From c62b5923524f19b16264bfafaaf7e65d82c310fb Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 26 Jan 2016 13:00:28 -0800 Subject: [PATCH 016/123] Fix bug with urlretrieve Change: 113087571 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index e44622b48a9..b2a06ba1152 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -110,7 +110,7 @@ "def maybe_download(filename, expected_bytes):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", " if not os.path.exists(filename):\n", - " filename, _ = urllib.urlretrieve(url + filename, filename)\n", + " filename, _ = urlretrieve(url + filename, filename)\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", " print 'Found and verified', filename\n", From 9bc9717f2f504877272ccde935a8d9f39923079f Mon Sep 17 00:00:00 2001 From: Timothy J Laurent Date: Sun, 24 Jan 2016 19:46:39 -0800 Subject: [PATCH 017/123] Mount notebooks into a volume to avoid data loss with --rm flag The current way this is done: ``` docker run -p 8888:8888 -it --rm $USER/assignments ``` creates an ephemeral container due to the `--rm` flag. In the first notebook you are doing very expensive operations (gunziping) several GBs. All of this data will be lost when the container shuts down. Using the filesystem as a mounted volume, allows subsequent sessions to have access to the files created (eg pickled data). This is especially important because this is course material so want to avoid time consuming gotchas. update readme Re ephemeral vs mounted notebooks dir --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index bab75c79735..fde591400a3 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,18 @@ Building a local Docker container Running the local container --------------------------- +To run a disposable container: + docker run -p 8888:8888 -it --rm $USER/assignments +Note the above command will create an ephemeral container and all data stored in the container will be lost when the container stops. + +To avoid losing work between sessions in the container, it is recommended that you mount the `tensorflow/examples/udacity` directory into the container: + + docker run -p 8888:8888 -v :/notebooks -it --rm $USER/assignments + +This will allow you to save work and have access to generated files on the host filesystem. + Pushing a Google Cloud release ------------------------------ From 771667984b4c90168e981c365477b790e081fc00 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 26 Jan 2016 18:47:47 -0800 Subject: [PATCH 018/123] Assignments 4, 5 and 6 compatible with python 3 Change: 113119710 --- 4_convolutions.ipynb | 31 ++++++++++--------- 5_word2vec.ipynb | 38 ++++++++++++----------- 6_lstm.ipynb | 74 +++++++++++++++++++++++--------------------- 3 files changed, 74 insertions(+), 69 deletions(-) diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 94266663b07..151aa25ce8b 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -45,9 +45,10 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", - "import cPickle as pickle\n", "import numpy as np\n", - "import tensorflow as tf" + "import tensorflow as tf\n", + "from six.moves import cPickle as pickle\n", + "from six.moves import range" ], "outputs": [], "execution_count": 0 @@ -99,9 +100,9 @@ " test_dataset = save['test_dataset']\n", " test_labels = save['test_labels']\n", " del save # hint to help gc free up memory\n", - " print 'Training set', train_dataset.shape, train_labels.shape\n", - " print 'Validation set', valid_dataset.shape, valid_labels.shape\n", - " print 'Test set', test_dataset.shape, test_labels.shape" + " print('Training set', train_dataset.shape, train_labels.shape)\n", + " print('Validation set', valid_dataset.shape, valid_labels.shape)\n", + " print('Test set', test_dataset.shape, test_labels.shape)" ], "outputs": [ { @@ -178,9 +179,9 @@ "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", "valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)\n", "test_dataset, test_labels = reformat(test_dataset, test_labels)\n", - "print 'Training set', train_dataset.shape, train_labels.shape\n", - "print 'Validation set', valid_dataset.shape, valid_labels.shape\n", - "print 'Test set', test_dataset.shape, test_labels.shape" + "print('Training set', train_dataset.shape, train_labels.shape)\n", + "print('Validation set', valid_dataset.shape, valid_labels.shape)\n", + "print('Test set', test_dataset.shape, test_labels.shape)" ], "outputs": [ { @@ -337,8 +338,8 @@ "\n", "with tf.Session(graph=graph) as session:\n", " tf.initialize_all_variables().run()\n", - " print \"Initialized\"\n", - " for step in xrange(num_steps):\n", + " print('Initialized')\n", + " for step in range(num_steps):\n", " offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n", " batch_data = train_dataset[offset:(offset + batch_size), :, :, :]\n", " batch_labels = train_labels[offset:(offset + batch_size), :]\n", @@ -346,11 +347,11 @@ " _, l, predictions = session.run(\n", " [optimizer, loss, train_prediction], feed_dict=feed_dict)\n", " if (step % 50 == 0):\n", - " print \"Minibatch loss at step\", step, \":\", l\n", - " print \"Minibatch accuracy: %.1f%%\" % accuracy(predictions, batch_labels)\n", - " print \"Validation accuracy: %.1f%%\" % accuracy(\n", - " valid_prediction.eval(), valid_labels)\n", - " print \"Test accuracy: %.1f%%\" % accuracy(test_prediction.eval(), test_labels)" + " print('Minibatch loss at step %d: %f' % (step, l))\n", + " print('Minibatch accuracy: %.1f%%' % accuracy(predictions, batch_labels))\n", + " print('Validation accuracy: %.1f%%' % accuracy(\n", + " valid_prediction.eval(), valid_labels))\n", + " print('Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels))" ], "outputs": [ { diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index cf704cecb45..1b7f5e20054 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -49,9 +49,10 @@ "import os\n", "import random\n", "import tensorflow as tf\n", - "import urllib\n", "import zipfile\n", "from matplotlib import pylab\n", + "from six.moves import range\n", + "from six.moves.urllib.request import urlretrieve\n", "from sklearn.manifold import TSNE" ], "outputs": [], @@ -108,10 +109,10 @@ "def maybe_download(filename, expected_bytes):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", " if not os.path.exists(filename):\n", - " filename, _ = urllib.urlretrieve(url + filename, filename)\n", + " filename, _ = urlretrieve(url + filename, filename)\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", - " print 'Found and verified', filename\n", + " print('Found and verified %s' % filename)\n", " else:\n", " print statinfo.st_size\n", " raise Exception(\n", @@ -180,11 +181,11 @@ "def read_data(filename):\n", " f = zipfile.ZipFile(filename)\n", " for name in f.namelist():\n", - " return f.read(name).split()\n", + " return tf.compat.as_str(f.read(name)).split()\n", " f.close()\n", " \n", "words = read_data(filename)\n", - "print 'Data size', len(words)" + "print('Data size %d' % len(words))" ], "outputs": [ { @@ -265,8 +266,8 @@ " return data, count, dictionary, reverse_dictionary\n", "\n", "data, count, dictionary, reverse_dictionary = build_dataset(words)\n", - "print 'Most common words (+UNK)', count[:5]\n", - "print 'Sample data', data[:10]\n", + "print('Most common words (+UNK)', count[:5])\n", + "print('Sample data', data[:10])\n", "del words # Hint to reduce memory." ], "outputs": [ @@ -340,7 +341,7 @@ " for _ in range(span):\n", " buffer.append(data[data_index])\n", " data_index = (data_index + 1) % len(data)\n", - " for i in range(batch_size / num_skips):\n", + " for i in range(batch_size // num_skips):\n", " target = skip_window # target label at the center of the buffer\n", " targets_to_avoid = [ skip_window ]\n", " for j in range(num_skips):\n", @@ -355,8 +356,9 @@ "\n", "batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)\n", "for i in range(8):\n", - " print batch[i], '->', labels[i, 0]\n", - " print reverse_dictionary[batch[i]], '->', reverse_dictionary[labels[i, 0]]" + " print('%d -> %d' % (batch[i], labels[i, 0]))\n", + " print('%s -> %s' % (reverse_dictionary[batch[i]],\n", + " reverse_dictionary[labels[i, 0]]))" ], "outputs": [ { @@ -417,7 +419,7 @@ "# construction are also the most frequent. \n", "valid_size = 16 # Random set of words to evaluate similarity on.\n", "valid_window = 100 # Only pick dev samples in the head of the distribution.\n", - "valid_examples = np.array(random.sample(xrange(valid_window), valid_size))\n", + "valid_examples = np.array(random.sample(range(valid_window), valid_size))\n", "num_sampled = 64 # Number of negative examples to sample.\n", "\n", "graph = tf.Graph()\n", @@ -505,9 +507,9 @@ "\n", "with tf.Session(graph=graph) as session:\n", " tf.initialize_all_variables().run()\n", - " print \"Initialized\"\n", + " print('Initialized')\n", " average_loss = 0\n", - " for step in xrange(num_steps):\n", + " for step in range(num_steps):\n", " batch_data, batch_labels = generate_batch(\n", " batch_size, num_skips, skip_window)\n", " feed_dict = {train_dataset : batch_data, train_labels : batch_labels}\n", @@ -517,7 +519,7 @@ " if step > 0:\n", " average_loss = average_loss / 2000\n", " # The average loss is an estimate of the loss over the last 2000 batches.\n", - " print \"Average loss at step\", step, \":\", average_loss\n", + " print('Average loss at step %d: %f' % (step, average_loss))\n", " average_loss = 0\n", " # note that this is expensive (~20% slowdown if computed every 500 steps)\n", " if step % 10000 == 0:\n", @@ -526,11 +528,11 @@ " valid_word = reverse_dictionary[valid_examples[i]]\n", " top_k = 8 # number of nearest neighbors\n", " nearest = (-sim[i, :]).argsort()[1:top_k+1]\n", - " log = \"Nearest to %s:\" % valid_word\n", + " log = 'Nearest to %s:' % valid_word\n", " for k in xrange(top_k):\n", " close_word = reverse_dictionary[nearest[k]]\n", - " log = \"%s %s,\" % (log, close_word)\n", - " print log\n", + " log = '%s %s,' % (log, close_word)\n", + " print(log)\n", " final_embeddings = normalized_embeddings.eval()" ], "outputs": [ @@ -853,7 +855,7 @@ " ha='right', va='bottom')\n", " pylab.show()\n", "\n", - "words = [reverse_dictionary[i] for i in xrange(1, num_points+1)]\n", + "words = [reverse_dictionary[i] for i in range(1, num_points+1)]\n", "plot(two_d_embeddings, words)" ], "outputs": [ diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 8e755dfc958..c41eef2a8f5 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -58,8 +58,9 @@ "import random\n", "import string\n", "import tensorflow as tf\n", - "import urllib\n", - "import zipfile" + "import zipfile\n", + "from six.moves import range\n", + "from six.moves.urllib.request import urlretrieve" ], "outputs": [], "execution_count": 0 @@ -105,12 +106,12 @@ "def maybe_download(filename, expected_bytes):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", " if not os.path.exists(filename):\n", - " filename, _ = urllib.urlretrieve(url + filename, filename)\n", + " filename, _ = urlretrieve(url + filename, filename)\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", - " print 'Found and verified', filename\n", + " print('Found and verified %s' % filename)\n", " else:\n", - " print statinfo.st_size\n", + " print(statinfo.st_size)\n", " raise Exception(\n", " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", " return filename\n", @@ -167,11 +168,11 @@ "def read_data(filename):\n", " f = zipfile.ZipFile(filename)\n", " for name in f.namelist():\n", - " return f.read(name)\n", + " return tf.compat.as_str(f.read(name))\n", " f.close()\n", " \n", "text = read_data(filename)\n", - "print \"Data size\", len(text)" + "print('Data size %d' % len(text))" ], "outputs": [ { @@ -234,8 +235,8 @@ "valid_text = text[:valid_size]\n", "train_text = text[valid_size:]\n", "train_size = len(train_text)\n", - "print train_size, train_text[:64]\n", - "print valid_size, valid_text[:64]" + "print(train_size, train_text[:64])\n", + "print(valid_size, valid_text[:64])" ], "outputs": [ { @@ -304,7 +305,7 @@ " elif char == ' ':\n", " return 0\n", " else:\n", - " print 'Unexpected character:', char\n", + " print('Unexpected character: %s' % char)\n", " return 0\n", " \n", "def id2char(dictid):\n", @@ -313,8 +314,8 @@ " else:\n", " return ' '\n", "\n", - "print char2id('a'), char2id('z'), char2id(' '), char2id('\u00ef')\n", - "print id2char(1), id2char(26), id2char(0)" + "print(char2id('a'), char2id('z'), char2id(' '), char2id('\u00ef'))\n", + "print(id2char(1), id2char(26), id2char(0))" ], "outputs": [ { @@ -384,14 +385,14 @@ " self._text_size = len(text)\n", " self._batch_size = batch_size\n", " self._num_unrollings = num_unrollings\n", - " segment = self._text_size / batch_size\n", - " self._cursor = [ offset * segment for offset in xrange(batch_size)]\n", + " segment = self._text_size // batch_size\n", + " self._cursor = [ offset * segment for offset in range(batch_size)]\n", " self._last_batch = self._next_batch()\n", " \n", " def _next_batch(self):\n", " \"\"\"Generate a single batch from the current cursor position in the data.\"\"\"\n", " batch = np.zeros(shape=(self._batch_size, vocabulary_size), dtype=np.float)\n", - " for b in xrange(self._batch_size):\n", + " for b in range(self._batch_size):\n", " batch[b, char2id(self._text[self._cursor[b]])] = 1.0\n", " self._cursor[b] = (self._cursor[b] + 1) % self._text_size\n", " return batch\n", @@ -401,7 +402,7 @@ " the last batch of the previous array, followed by num_unrollings new ones.\n", " \"\"\"\n", " batches = [self._last_batch]\n", - " for step in xrange(self._num_unrollings):\n", + " for step in range(self._num_unrollings):\n", " batches.append(self._next_batch())\n", " self._last_batch = batches[-1]\n", " return batches\n", @@ -422,10 +423,10 @@ "train_batches = BatchGenerator(train_text, batch_size, num_unrollings)\n", "valid_batches = BatchGenerator(valid_text, 1, 1)\n", "\n", - "print batches2string(train_batches.next())\n", - "print batches2string(train_batches.next())\n", - "print batches2string(valid_batches.next())\n", - "print batches2string(valid_batches.next())" + "print(batches2string(train_batches.next()))\n", + "print(batches2string(train_batches.next()))\n", + "print(batches2string(valid_batches.next()))\n", + "print(batches2string(valid_batches.next()))" ], "outputs": [ { @@ -466,7 +467,7 @@ " \"\"\"\n", " r = random.uniform(0, 1)\n", " s = 0\n", - " for i in xrange(len(distribution)):\n", + " for i in range(len(distribution)):\n", " s += distribution[i]\n", " if s >= r:\n", " return i\n", @@ -553,7 +554,7 @@ "\n", " # Input data.\n", " train_data = list()\n", - " for _ in xrange(num_unrollings + 1):\n", + " for _ in range(num_unrollings + 1):\n", " train_data.append(\n", " tf.placeholder(tf.float32, shape=[batch_size,vocabulary_size]))\n", " train_inputs = train_data[:num_unrollings]\n", @@ -655,12 +656,12 @@ "\n", "with tf.Session(graph=graph) as session:\n", " tf.initialize_all_variables().run()\n", - " print 'Initialized'\n", + " print('Initialized')\n", " mean_loss = 0\n", - " for step in xrange(num_steps):\n", + " for step in range(num_steps):\n", " batches = train_batches.next()\n", " feed_dict = dict()\n", - " for i in xrange(num_unrollings + 1):\n", + " for i in range(num_unrollings + 1):\n", " feed_dict[train_data[i]] = batches[i]\n", " _, l, predictions, lr = session.run(\n", " [optimizer, loss, train_prediction, learning_rate], feed_dict=feed_dict)\n", @@ -669,33 +670,34 @@ " if step > 0:\n", " mean_loss = mean_loss / summary_frequency\n", " # The mean loss is an estimate of the loss over the last few batches.\n", - " print 'Average loss at step', step, ':', mean_loss, 'learning rate:', lr\n", + " print(\n", + " 'Average loss at step %d: %f learning rate: %f' % (step, mean_loss, lr))\n", " mean_loss = 0\n", " labels = np.concatenate(list(batches)[1:])\n", - " print 'Minibatch perplexity: %.2f' % float(\n", - " np.exp(logprob(predictions, labels)))\n", + " print('Minibatch perplexity: %.2f' % float(\n", + " np.exp(logprob(predictions, labels))))\n", " if step % (summary_frequency * 10) == 0:\n", " # Generate some samples.\n", - " print '=' * 80\n", - " for _ in xrange(5):\n", + " print('=' * 80)\n", + " for _ in range(5):\n", " feed = sample(random_distribution())\n", " sentence = characters(feed)[0]\n", " reset_sample_state.run()\n", - " for _ in xrange(79):\n", + " for _ in range(79):\n", " prediction = sample_prediction.eval({sample_input: feed})\n", " feed = sample(prediction)\n", " sentence += characters(feed)[0]\n", - " print sentence\n", - " print '=' * 80\n", + " print(sentence)\n", + " print('=' * 80)\n", " # Measure validation set perplexity.\n", " reset_sample_state.run()\n", " valid_logprob = 0\n", - " for _ in xrange(valid_size):\n", + " for _ in range(valid_size):\n", " b = valid_batches.next()\n", " predictions = sample_prediction.eval({sample_input: b[0]})\n", " valid_logprob = valid_logprob + logprob(predictions, b[1])\n", - " print 'Validation set perplexity: %.2f' % float(np.exp(\n", - " valid_logprob / valid_size))" + " print('Validation set perplexity: %.2f' % float(np.exp(\n", + " valid_logprob / valid_size)))" ], "outputs": [ { From b6885afa3db592103a2b4d37133400fa41c41d60 Mon Sep 17 00:00:00 2001 From: Christian Jauvin Date: Thu, 28 Jan 2016 23:17:10 -0500 Subject: [PATCH 019/123] Use integer division in fourth notebook --- 4_convolutions.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 151aa25ce8b..9ad41acb0c4 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -265,7 +265,7 @@ " [patch_size, patch_size, depth, depth], stddev=0.1))\n", " layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))\n", " layer3_weights = tf.Variable(tf.truncated_normal(\n", - " [image_size / 4 * image_size / 4 * depth, num_hidden], stddev=0.1))\n", + " [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1))\n", " layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))\n", " layer4_weights = tf.Variable(tf.truncated_normal(\n", " [num_hidden, num_labels], stddev=0.1))\n", @@ -461,4 +461,4 @@ ] } ] -} \ No newline at end of file +} From 1edf516b1a9d55e348fe9c040fb3b1601d443a73 Mon Sep 17 00:00:00 2001 From: Christian Jauvin Date: Thu, 28 Jan 2016 23:17:57 -0500 Subject: [PATCH 020/123] Add missing parens for print stmt in 5th notebook --- 5_word2vec.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 1b7f5e20054..978e107bab0 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -114,7 +114,7 @@ " if statinfo.st_size == expected_bytes:\n", " print('Found and verified %s' % filename)\n", " else:\n", - " print statinfo.st_size\n", + " print(statinfo.st_size)\n", " raise Exception(\n", " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", " return filename\n", @@ -890,4 +890,4 @@ ] } ] -} \ No newline at end of file +} From e4f1ef84c9ad47d49bafc32287136ff4b41929fc Mon Sep 17 00:00:00 2001 From: Christian Jauvin Date: Thu, 28 Jan 2016 23:22:33 -0500 Subject: [PATCH 021/123] Add missing parens for print stmt in 1rst notebook --- 1_notmnist.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index b2a06ba1152..15b5b126aec 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -113,7 +113,7 @@ " filename, _ = urlretrieve(url + filename, filename)\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", - " print 'Found and verified', filename\n", + " print('Found and verified', filename)\n", " else:\n", " raise Exception(\n", " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", @@ -654,4 +654,4 @@ ] } ] -} \ No newline at end of file +} From 2fa89971448e0204e9adf1969fc3bdc40e4504de Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Fri, 29 Jan 2016 09:34:18 -0800 Subject: [PATCH 022/123] Use cc_binary rather than cc_library to reduce size of native library in APK from 5.5mb to 3.2mb (compressed). Change: 113369407 --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index bab75c79735..a3adc5f1557 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,24 @@ On mac, find the virtual machine's IP using: Then go to: http://IP:8888 (likely http://192.168.99.100:8888) +FAQ +--- + +* **I'm getting a MemoryError when loading data in the first notebook.** + +If you're using a Mac, Docker works by running a VM locally (which +is controlled by `docker-machine`). It's quite likely that you'll +need to bump up the amount of RAM allocated to the VM beyond the +default (which is 1G). +[This Stack Overflow question](http://stackoverflow.com/questions/32834082/how-to-increase-docker-machine-memory-mac) +has two good suggestions; we recommend using 8G. + +In addition, you may need to pass `--memory=8g` as an extra argument to +`docker run`. + +Notes for anyone needing to build their own containers (mostly instructors) +=========================================================================== + Building a local Docker container --------------------------------- From 477d5b2e66648c2339c6f64540714866482b1022 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Sat, 30 Jan 2016 13:43:26 -0800 Subject: [PATCH 023/123] Squashed commit of the following: commit 4e7b6e2799d6a2bf52027dadffb4ce3f14ed3f66 Merge: b0b231a 2b7d622 Author: Christian Jauvin Date: Sat Jan 30 13:11:00 2016 -0500 Merge branch 'master' into fix/udacity-notebooks-py3 commit b0b231a7202db3d4b4e31fa361cd1078719b9ba9 Author: Christian Jauvin Date: Sat Jan 30 12:57:32 2016 -0500 More explicit examples of batch generation algo --- 5_word2vec.ipynb | 50 ++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 978e107bab0..b3a7a71e2cb 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -354,35 +354,31 @@ " data_index = (data_index + 1) % len(data)\n", " return batch, labels\n", "\n", - "batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)\n", - "for i in range(8):\n", - " print('%d -> %d' % (batch[i], labels[i, 0]))\n", - " print('%s -> %s' % (reverse_dictionary[batch[i]],\n", - " reverse_dictionary[labels[i, 0]]))" + "print('data:', [reverse_dictionary[di] for di in data[:8]])\n", + "\n", + "for num_skips, skip_window in [(2, 1), (4, 2)]:\n", + " data_index = 0\n", + " batch, labels = generate_batch(batch_size=8, num_skips=num_skips, skip_window=skip_window)\n", + " print('\\nwith num_skips = %d and skip_window = %d:' % (num_skips, skip_window))\n", + " print(' batch:', [reverse_dictionary[bi] for bi in batch])\n", + " print(' labels:', [reverse_dictionary[li] for li in labels.reshape(8)])" ], "outputs": [ - { - "output_type": "stream", - "text": [ - " 3083 -> 5243\n", - "originated -> anarchism\n", - "3083 -> 12\n", - "originated -> as\n", - "12 -> 3083\n", - "as -> originated\n", - "12 -> 6\n", - "as -> a\n", - "6 -> 12\n", - "a -> as\n", - "6 -> 195\n", - "a -> term\n", - "195 -> 6\n", - "term -> a\n", - "195 -> 2\n", - "term -> of\n" - ], - "name": "stdout" - } + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first']\n", + "\n", + "with num_skips = 2 and skip_window = 1:\n", + " batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term']\n", + " labels: ['as', 'anarchism', 'a', 'originated', 'term', 'as', 'a', 'of']\n", + "\n", + "with num_skips = 4 and skip_window = 2:\n", + " batch: ['as', 'as', 'as', 'as', 'a', 'a', 'a', 'a']\n", + " labels: ['anarchism', 'originated', 'term', 'a', 'as', 'of', 'originated', 'term']\n" + ] + } ], "execution_count": 0 }, From 085e2729f7ca9acf8480cff5118ebe813ec93fb4 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Sun, 31 Jan 2016 08:10:36 -0800 Subject: [PATCH 024/123] Squashed commit of the following: commit abdb18cbecee59358db925043bc6203f06c11280 Merge: 6082549 a27d844 Author: Patrick Christ Date: Mon Jan 25 12:16:59 2016 +0100 Merge branch 'master' into master commit 60825498e6166e97ab6245773840401d146d7d74 Author: Patrick Christ Date: Sat Jan 23 16:44:37 2016 +0100 Add link to Tensorflow Udacity course Add link to Tensorflow Udacity course commit 958059040502849671fc0081fdff3d189ccfd676 Author: Patrick Christ Date: Sat Jan 23 16:39:52 2016 +0100 Add link to Tensorflow Udacity course Add link to the new tensorflow udacity course. https://www.udacity.com/course/deep-learning--ud730 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 25c7055a3af..e6a7241e8f2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ Assignments for Udacity Deep Learning class with TensorFlow =========================================================== +Course information can be found at https://www.udacity.com/course/deep-learning--ud730 + Running the Docker container from the Google Cloud repository ------------------------------------------------------------- From 7c9e7d84cd7a8c4aeed97c667a98564b61e8d464 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Sun, 31 Jan 2016 08:37:08 -0800 Subject: [PATCH 025/123] Squashed commit of the following: commit b52273baaa13ea000cf904b4ea4e215410bca908 Merge: 8149625 48c0e9e Author: Romain Thouvenin Date: Sun Jan 31 09:01:47 2016 +0100 Merge branch 'master' into notmnist-lowmem commit 81496253f4b2511cf2bbc72125a12bc8240f7565 Author: rthouvenin Date: Sat Jan 30 10:39:02 2016 +0100 Load dataset classes separately to require less memory --- 1_notmnist.ipynb | 301 +++++++++++++++++++++++++++++++---------------- 1 file changed, 202 insertions(+), 99 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 15b5b126aec..661ea4df92b 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -237,9 +237,9 @@ "colab_type": "text" }, "source": [ - "Now let's load the data in a more manageable format.\n", + "Now let's load the data in a more manageable format. Since, depending on your computer setup you might not be able to fit it all in memory, we'll load each class into a separate dataset, store them on disk and curate them independently. Later we'll merge them into a single dataset of manageable size.\n", "\n", - "We'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. The labels will be stored into a separate array of integers 0 through 9.\n", + "We'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. \n", "\n", "A few images might not be readable, we'll just skip them." ] @@ -283,83 +283,143 @@ "image_size = 28 # Pixel width and height.\n", "pixel_depth = 255.0 # Number of levels per pixel.\n", "\n", - "def load(data_folders, min_num_images, max_num_images):\n", - " dataset = np.ndarray(\n", - " shape=(max_num_images, image_size, image_size), dtype=np.float32)\n", - " labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n", - " label_index = 0\n", - " image_index = 0\n", - " for folder in data_folders:\n", - " print(folder)\n", + "def load_letter(folder, min_num_images):\n", + " image_files = os.listdir(folder)\n", + " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", + " dtype=np.float32)\n", + " image_index = 0\n", + " print folder\n", " for image in os.listdir(folder):\n", - " if image_index >= max_num_images:\n", - " raise Exception('More images than expected: %d >= %d' % (\n", - " image_index, max_num_images))\n", " image_file = os.path.join(folder, image)\n", " try:\n", - " image_data = (ndimage.imread(image_file).astype(float) -\n", + " image_data = (ndimage.imread(image_file).astype(float) - \n", " pixel_depth / 2) / pixel_depth\n", " if image_data.shape != (image_size, image_size):\n", " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", " dataset[image_index, :, :] = image_data\n", - " labels[image_index] = label_index\n", " image_index += 1\n", " except IOError as e:\n", " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", - " label_index += 1\n", - " num_images = image_index\n", - " dataset = dataset[0:num_images, :, :]\n", - " labels = labels[0:num_images]\n", - " if num_images < min_num_images:\n", - " raise Exception('Many fewer images than expected: %d < %d' % (\n", - " num_images, min_num_images))\n", - " print('Full dataset tensor:', dataset.shape)\n", - " print('Mean:', np.mean(dataset))\n", - " print('Standard deviation:', np.std(dataset))\n", - " print('Labels:', labels.shape)\n", - " return dataset, labels\n", - "train_dataset, train_labels = load(train_folders, 450000, 550000)\n", - "test_dataset, test_labels = load(test_folders, 18000, 20000)" + " \n", + " num_images = image_index\n", + " dataset = dataset[0:num_images, :, :]\n", + " if num_images < min_num_images:\n", + " raise Exception('Many fewer images than expected: %d < %d' % \n", + " (num_images, min_num_images))\n", + " \n", + " print('Full dataset tensor:', dataset.shape)\n", + " print('Mean:', np.mean(dataset))\n", + " print('Standard deviation:', np.std(dataset))\n", + " return dataset\n", + " \n", + "def load(data_folders, min_num_images_per_class):\n", + " dataset_names = []\n", + " for folder in data_folders:\n", + " dataset = load_letter(folder, min_num_images_per_class)\n", + " set_filename = folder + '.pickle'\n", + " try:\n", + " with open(set_filename, 'wb') as f:\n", + " pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n", + " dataset_names.append(set_filename)\n", + " except Exception as e:\n", + " print('Unable to save data to', pickle_file, ':', e)\n", + " \n", + " return dataset_names\n", + "\n", + "train_datasets = load(train_folders, 45000)\n", + "test_datasets = load(test_folders, 1800)" ], "outputs": [ { "output_type": "stream", "text": [ "notMNIST_large/A\n", - "Could not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\n", - "Could not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", "Could not read: notMNIST_large/A/Um9tYW5hIEJvbGQucGZi.png : cannot identify image file - it's ok, skipping.\n", + "Could not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Could not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (52909, 28, 28)\n", + "Mean: -0.12848\n", + "Standard deviation: 0.425576\n", "notMNIST_large/B\n", "Could not read: notMNIST_large/B/TmlraXNFRi1TZW1pQm9sZEl0YWxpYy5vdGY=.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (52911, 28, 28)\n", + "Mean: -0.00755947\n", + "Standard deviation: 0.417272\n", "notMNIST_large/C\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.142321\n", + "Standard deviation: 0.421305\n", "notMNIST_large/D\n", "Could not read: notMNIST_large/D/VHJhbnNpdCBCb2xkLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (52911, 28, 28)\n", + "Mean: -0.0574553\n", + "Standard deviation: 0.434072\n", "notMNIST_large/E\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.0701406\n", + "Standard deviation: 0.42882\n", "notMNIST_large/F\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.125914\n", + "Standard deviation: 0.429645\n", "notMNIST_large/G\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.0947771\n", + "Standard deviation: 0.421674\n", "notMNIST_large/H\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.0687667\n", + "Standard deviation: 0.430344\n", "notMNIST_large/I\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: 0.0307405\n", + "Standard deviation: 0.449686\n", "notMNIST_large/J\n", - "Full dataset tensor: (529114, 28, 28)\n", - "Mean: -0.0816593\n", - "Standard deviation: 0.454232\n", - "Labels: (529114,)\n", + "Full dataset tensor: (52911, 28, 28)\n", + "Mean: -0.153479\n", + "Standard deviation: 0.397169\n", "notMNIST_small/A\n", "Could not read: notMNIST_small/A/RGVtb2NyYXRpY2FCb2xkT2xkc3R5bGUgQm9sZC50dGY=.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.132588\n", + "Standard deviation: 0.445923\n", "notMNIST_small/B\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: 0.00535619\n", + "Standard deviation: 0.457054\n", "notMNIST_small/C\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: -0.141489\n", + "Standard deviation: 0.441056\n", "notMNIST_small/D\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: -0.0492094\n", + "Standard deviation: 0.460477\n", "notMNIST_small/E\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: -0.0598952\n", + "Standard deviation: 0.456146\n", "notMNIST_small/F\n", "Could not read: notMNIST_small/F/Q3Jvc3NvdmVyIEJvbGRPYmxpcXVlLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.118148\n", + "Standard deviation: 0.451134\n", "notMNIST_small/G\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.092519\n", + "Standard deviation: 0.448468\n", "notMNIST_small/H\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.0586729\n", + "Standard deviation: 0.457387\n", "notMNIST_small/I\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: 0.0526481\n", + "Standard deviation: 0.472657\n", "notMNIST_small/J\n", - "Full dataset tensor: (18724, 28, 28)\n", - "Mean: -0.0746364\n", - "Standard deviation: 0.458622\n", - "Labels: (18724,)\n" + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.15167\n", + "Standard deviation: 0.449521\n" ], "name": "stdout" } @@ -382,57 +442,6 @@ "---" ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "GPTCnjIcyuKN", - "colab_type": "text" - }, - "source": [ - "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "6WZ2l2tN2zOL", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "source": [ - "np.random.seed(133)\n", - "def randomize(dataset, labels):\n", - " permutation = np.random.permutation(labels.shape[0])\n", - " shuffled_dataset = dataset[permutation,:,:]\n", - " shuffled_labels = labels[permutation]\n", - " return shuffled_dataset, shuffled_labels\n", - "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", - "test_dataset, test_labels = randomize(test_dataset, test_labels)" - ], - "outputs": [], - "execution_count": 0 - }, - { - "cell_type": "markdown", - "metadata": { - "id": "puDUTe6t6USl", - "colab_type": "text" - }, - "source": [ - "---\n", - "Problem 3\n", - "---------\n", - "Convince yourself that the data is still good after shuffling!\n", - "\n", - "---" - ] - }, { "cell_type": "markdown", "metadata": { @@ -441,7 +450,7 @@ }, "source": [ "---\n", - "Problem 4\n", + "Problem 3\n", "---------\n", "Another check: we expect the data to be balanced across classes. Verify that.\n", "\n", @@ -455,7 +464,7 @@ "colab_type": "text" }, "source": [ - "Prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune train_size as needed.\n", + "Merge and prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune `train_size` as needed. The labels will be stored into a separate array of integers 0 through 9.\n", "\n", "Also create a validation dataset for hyperparameter tuning." ] @@ -496,28 +505,122 @@ "outputId": "8af66da6-902d-4719-bedc-7c9fb7ae7948" }, "source": [ + "def make_arrays(nb_rows, img_size):\n", + " if nb_rows:\n", + " dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n", + " labels = np.ndarray(nb_rows, dtype=np.int32)\n", + " else:\n", + " dataset, labels = None, None\n", + " return dataset, labels\n", + "\n", + "def merge_datasets(pickle_files, train_size, valid_size=0):\n", + " num_classes = len(pickle_files)\n", + " valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n", + " train_dataset, train_labels = make_arrays(train_size, image_size)\n", + " vsize_per_class = valid_size // num_classes\n", + " tsize_per_class = train_size // num_classes\n", + " \n", + " start_v, start_t = 0, 0\n", + " end_v, end_t = vsize_per_class, tsize_per_class\n", + " end_l = vsize_per_class+tsize_per_class\n", + " for label, pickle_file in enumerate(pickle_files): \n", + " try:\n", + " with open(pickle_file, 'rb') as f:\n", + " letter_set = pickle.load(f)\n", + " if valid_dataset is not None:\n", + " valid_letter = letter_set[:vsize_per_class, :, :]\n", + " valid_dataset[start_v:end_v, :, :] = valid_letter\n", + " valid_labels[start_v:end_v] = label\n", + " start_v += vsize_per_class\n", + " end_v += vsize_per_class\n", + " \n", + " train_letter = letter_set[vsize_per_class:end_l, :, :]\n", + " train_dataset[start_t:end_t, :, :] = train_letter\n", + " train_labels[start_t:end_t] = label\n", + " start_t += tsize_per_class\n", + " end_t += tsize_per_class\n", + " except Exception as e:\n", + " print('Unable to process data from', pickle_file, ':', e)\n", + " raise\n", + " \n", + " return valid_dataset, valid_labels, train_dataset, train_labels\n", + " \n", + " \n", "train_size = 200000\n", "valid_size = 10000\n", + "test_size = 10000\n", + "\n", + "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(train_datasets, train_size, valid_size)\n", + "__, __, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n", "\n", - "valid_dataset = train_dataset[:valid_size,:,:]\n", - "valid_labels = train_labels[:valid_size]\n", - "train_dataset = train_dataset[valid_size:valid_size+train_size,:,:]\n", - "train_labels = train_labels[valid_size:valid_size+train_size]\n", - "print('Training', train_dataset.shape, train_labels.shape)\n", - "print('Validation', valid_dataset.shape, valid_labels.shape)" + "print('Training:', train_dataset.shape, train_labels.shape)\n", + "print('Validation:', valid_dataset.shape, valid_labels.shape)\n", + "print('Testing:', test_dataset.shape, test_labels.shape)" ], "outputs": [ { "output_type": "stream", "text": [ "Training (200000, 28, 28) (200000,)\n", - "Validation (10000, 28, 28) (10000,)\n" + "Validation (10000, 28, 28) (10000,)\n", + "Testing (10000, 28, 28) (10000,)\n" ], "name": "stdout" } ], "execution_count": 0 }, + { + "cell_type": "markdown", + "metadata": { + "id": "GPTCnjIcyuKN", + "colab_type": "text" + }, + "source": [ + "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6WZ2l2tN2zOL", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "source": [ + "np.random.seed(133)\n", + "def randomize(dataset, labels):\n", + " permutation = np.random.permutation(labels.shape[0])\n", + " shuffled_dataset = dataset[permutation,:,:]\n", + " shuffled_labels = labels[permutation]\n", + " return shuffled_dataset, shuffled_labels\n", + "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", + "test_dataset, test_labels = randomize(test_dataset, test_labels)" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "puDUTe6t6USl", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 4\n", + "---------\n", + "Convince yourself that the data is still good after shuffling!\n", + "\n", + "---" + ] + }, { "cell_type": "markdown", "metadata": { From 6f899dcbce9660dc6ddcd1ed87c9e084dffc8e5c Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Mon, 1 Feb 2016 16:39:16 -0800 Subject: [PATCH 026/123] Minor formatting fixes. Change: 113582098 --- 1_notmnist.ipynb | 305 +++++++++++++++++++++++++++++-------------- 4_convolutions.ipynb | 4 +- 5_word2vec.ipynb | 54 ++++---- README.md | 12 ++ 4 files changed, 243 insertions(+), 132 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index b2a06ba1152..661ea4df92b 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -113,7 +113,7 @@ " filename, _ = urlretrieve(url + filename, filename)\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", - " print 'Found and verified', filename\n", + " print('Found and verified', filename)\n", " else:\n", " raise Exception(\n", " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", @@ -237,9 +237,9 @@ "colab_type": "text" }, "source": [ - "Now let's load the data in a more manageable format.\n", + "Now let's load the data in a more manageable format. Since, depending on your computer setup you might not be able to fit it all in memory, we'll load each class into a separate dataset, store them on disk and curate them independently. Later we'll merge them into a single dataset of manageable size.\n", "\n", - "We'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. The labels will be stored into a separate array of integers 0 through 9.\n", + "We'll convert the entire dataset into a 3D array (image index, x, y) of floating point values, normalized to have approximately zero mean and standard deviation ~0.5 to make training easier down the road. \n", "\n", "A few images might not be readable, we'll just skip them." ] @@ -283,83 +283,143 @@ "image_size = 28 # Pixel width and height.\n", "pixel_depth = 255.0 # Number of levels per pixel.\n", "\n", - "def load(data_folders, min_num_images, max_num_images):\n", - " dataset = np.ndarray(\n", - " shape=(max_num_images, image_size, image_size), dtype=np.float32)\n", - " labels = np.ndarray(shape=(max_num_images), dtype=np.int32)\n", - " label_index = 0\n", - " image_index = 0\n", - " for folder in data_folders:\n", - " print(folder)\n", + "def load_letter(folder, min_num_images):\n", + " image_files = os.listdir(folder)\n", + " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", + " dtype=np.float32)\n", + " image_index = 0\n", + " print folder\n", " for image in os.listdir(folder):\n", - " if image_index >= max_num_images:\n", - " raise Exception('More images than expected: %d >= %d' % (\n", - " image_index, max_num_images))\n", " image_file = os.path.join(folder, image)\n", " try:\n", - " image_data = (ndimage.imread(image_file).astype(float) -\n", + " image_data = (ndimage.imread(image_file).astype(float) - \n", " pixel_depth / 2) / pixel_depth\n", " if image_data.shape != (image_size, image_size):\n", " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", " dataset[image_index, :, :] = image_data\n", - " labels[image_index] = label_index\n", " image_index += 1\n", " except IOError as e:\n", " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", - " label_index += 1\n", - " num_images = image_index\n", - " dataset = dataset[0:num_images, :, :]\n", - " labels = labels[0:num_images]\n", - " if num_images < min_num_images:\n", - " raise Exception('Many fewer images than expected: %d < %d' % (\n", - " num_images, min_num_images))\n", - " print('Full dataset tensor:', dataset.shape)\n", - " print('Mean:', np.mean(dataset))\n", - " print('Standard deviation:', np.std(dataset))\n", - " print('Labels:', labels.shape)\n", - " return dataset, labels\n", - "train_dataset, train_labels = load(train_folders, 450000, 550000)\n", - "test_dataset, test_labels = load(test_folders, 18000, 20000)" + " \n", + " num_images = image_index\n", + " dataset = dataset[0:num_images, :, :]\n", + " if num_images < min_num_images:\n", + " raise Exception('Many fewer images than expected: %d < %d' % \n", + " (num_images, min_num_images))\n", + " \n", + " print('Full dataset tensor:', dataset.shape)\n", + " print('Mean:', np.mean(dataset))\n", + " print('Standard deviation:', np.std(dataset))\n", + " return dataset\n", + " \n", + "def load(data_folders, min_num_images_per_class):\n", + " dataset_names = []\n", + " for folder in data_folders:\n", + " dataset = load_letter(folder, min_num_images_per_class)\n", + " set_filename = folder + '.pickle'\n", + " try:\n", + " with open(set_filename, 'wb') as f:\n", + " pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n", + " dataset_names.append(set_filename)\n", + " except Exception as e:\n", + " print('Unable to save data to', pickle_file, ':', e)\n", + " \n", + " return dataset_names\n", + "\n", + "train_datasets = load(train_folders, 45000)\n", + "test_datasets = load(test_folders, 1800)" ], "outputs": [ { "output_type": "stream", "text": [ "notMNIST_large/A\n", - "Could not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\n", - "Could not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", "Could not read: notMNIST_large/A/Um9tYW5hIEJvbGQucGZi.png : cannot identify image file - it's ok, skipping.\n", + "Could not read: notMNIST_large/A/RnJlaWdodERpc3BCb29rSXRhbGljLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Could not read: notMNIST_large/A/SG90IE11c3RhcmQgQlROIFBvc3Rlci50dGY=.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (52909, 28, 28)\n", + "Mean: -0.12848\n", + "Standard deviation: 0.425576\n", "notMNIST_large/B\n", "Could not read: notMNIST_large/B/TmlraXNFRi1TZW1pQm9sZEl0YWxpYy5vdGY=.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (52911, 28, 28)\n", + "Mean: -0.00755947\n", + "Standard deviation: 0.417272\n", "notMNIST_large/C\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.142321\n", + "Standard deviation: 0.421305\n", "notMNIST_large/D\n", "Could not read: notMNIST_large/D/VHJhbnNpdCBCb2xkLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (52911, 28, 28)\n", + "Mean: -0.0574553\n", + "Standard deviation: 0.434072\n", "notMNIST_large/E\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.0701406\n", + "Standard deviation: 0.42882\n", "notMNIST_large/F\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.125914\n", + "Standard deviation: 0.429645\n", "notMNIST_large/G\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.0947771\n", + "Standard deviation: 0.421674\n", "notMNIST_large/H\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: -0.0687667\n", + "Standard deviation: 0.430344\n", "notMNIST_large/I\n", + "Full dataset tensor: (52912, 28, 28)\n", + "Mean: 0.0307405\n", + "Standard deviation: 0.449686\n", "notMNIST_large/J\n", - "Full dataset tensor: (529114, 28, 28)\n", - "Mean: -0.0816593\n", - "Standard deviation: 0.454232\n", - "Labels: (529114,)\n", + "Full dataset tensor: (52911, 28, 28)\n", + "Mean: -0.153479\n", + "Standard deviation: 0.397169\n", "notMNIST_small/A\n", "Could not read: notMNIST_small/A/RGVtb2NyYXRpY2FCb2xkT2xkc3R5bGUgQm9sZC50dGY=.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.132588\n", + "Standard deviation: 0.445923\n", "notMNIST_small/B\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: 0.00535619\n", + "Standard deviation: 0.457054\n", "notMNIST_small/C\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: -0.141489\n", + "Standard deviation: 0.441056\n", "notMNIST_small/D\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: -0.0492094\n", + "Standard deviation: 0.460477\n", "notMNIST_small/E\n", + "Full dataset tensor: (1873, 28, 28)\n", + "Mean: -0.0598952\n", + "Standard deviation: 0.456146\n", "notMNIST_small/F\n", "Could not read: notMNIST_small/F/Q3Jvc3NvdmVyIEJvbGRPYmxpcXVlLnR0Zg==.png : cannot identify image file - it's ok, skipping.\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.118148\n", + "Standard deviation: 0.451134\n", "notMNIST_small/G\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.092519\n", + "Standard deviation: 0.448468\n", "notMNIST_small/H\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.0586729\n", + "Standard deviation: 0.457387\n", "notMNIST_small/I\n", + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: 0.0526481\n", + "Standard deviation: 0.472657\n", "notMNIST_small/J\n", - "Full dataset tensor: (18724, 28, 28)\n", - "Mean: -0.0746364\n", - "Standard deviation: 0.458622\n", - "Labels: (18724,)\n" + "Full dataset tensor: (1872, 28, 28)\n", + "Mean: -0.15167\n", + "Standard deviation: 0.449521\n" ], "name": "stdout" } @@ -382,57 +442,6 @@ "---" ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "GPTCnjIcyuKN", - "colab_type": "text" - }, - "source": [ - "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "6WZ2l2tN2zOL", - "colab_type": "code", - "colab": { - "autoexec": { - "startup": false, - "wait_interval": 0 - } - }, - "cellView": "both" - }, - "source": [ - "np.random.seed(133)\n", - "def randomize(dataset, labels):\n", - " permutation = np.random.permutation(labels.shape[0])\n", - " shuffled_dataset = dataset[permutation,:,:]\n", - " shuffled_labels = labels[permutation]\n", - " return shuffled_dataset, shuffled_labels\n", - "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", - "test_dataset, test_labels = randomize(test_dataset, test_labels)" - ], - "outputs": [], - "execution_count": 0 - }, - { - "cell_type": "markdown", - "metadata": { - "id": "puDUTe6t6USl", - "colab_type": "text" - }, - "source": [ - "---\n", - "Problem 3\n", - "---------\n", - "Convince yourself that the data is still good after shuffling!\n", - "\n", - "---" - ] - }, { "cell_type": "markdown", "metadata": { @@ -441,7 +450,7 @@ }, "source": [ "---\n", - "Problem 4\n", + "Problem 3\n", "---------\n", "Another check: we expect the data to be balanced across classes. Verify that.\n", "\n", @@ -455,7 +464,7 @@ "colab_type": "text" }, "source": [ - "Prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune train_size as needed.\n", + "Merge and prune the training data as needed. Depending on your computer setup, you might not be able to fit it all in memory, and you can tune `train_size` as needed. The labels will be stored into a separate array of integers 0 through 9.\n", "\n", "Also create a validation dataset for hyperparameter tuning." ] @@ -496,28 +505,122 @@ "outputId": "8af66da6-902d-4719-bedc-7c9fb7ae7948" }, "source": [ + "def make_arrays(nb_rows, img_size):\n", + " if nb_rows:\n", + " dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n", + " labels = np.ndarray(nb_rows, dtype=np.int32)\n", + " else:\n", + " dataset, labels = None, None\n", + " return dataset, labels\n", + "\n", + "def merge_datasets(pickle_files, train_size, valid_size=0):\n", + " num_classes = len(pickle_files)\n", + " valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n", + " train_dataset, train_labels = make_arrays(train_size, image_size)\n", + " vsize_per_class = valid_size // num_classes\n", + " tsize_per_class = train_size // num_classes\n", + " \n", + " start_v, start_t = 0, 0\n", + " end_v, end_t = vsize_per_class, tsize_per_class\n", + " end_l = vsize_per_class+tsize_per_class\n", + " for label, pickle_file in enumerate(pickle_files): \n", + " try:\n", + " with open(pickle_file, 'rb') as f:\n", + " letter_set = pickle.load(f)\n", + " if valid_dataset is not None:\n", + " valid_letter = letter_set[:vsize_per_class, :, :]\n", + " valid_dataset[start_v:end_v, :, :] = valid_letter\n", + " valid_labels[start_v:end_v] = label\n", + " start_v += vsize_per_class\n", + " end_v += vsize_per_class\n", + " \n", + " train_letter = letter_set[vsize_per_class:end_l, :, :]\n", + " train_dataset[start_t:end_t, :, :] = train_letter\n", + " train_labels[start_t:end_t] = label\n", + " start_t += tsize_per_class\n", + " end_t += tsize_per_class\n", + " except Exception as e:\n", + " print('Unable to process data from', pickle_file, ':', e)\n", + " raise\n", + " \n", + " return valid_dataset, valid_labels, train_dataset, train_labels\n", + " \n", + " \n", "train_size = 200000\n", "valid_size = 10000\n", + "test_size = 10000\n", + "\n", + "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(train_datasets, train_size, valid_size)\n", + "__, __, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n", "\n", - "valid_dataset = train_dataset[:valid_size,:,:]\n", - "valid_labels = train_labels[:valid_size]\n", - "train_dataset = train_dataset[valid_size:valid_size+train_size,:,:]\n", - "train_labels = train_labels[valid_size:valid_size+train_size]\n", - "print('Training', train_dataset.shape, train_labels.shape)\n", - "print('Validation', valid_dataset.shape, valid_labels.shape)" + "print('Training:', train_dataset.shape, train_labels.shape)\n", + "print('Validation:', valid_dataset.shape, valid_labels.shape)\n", + "print('Testing:', test_dataset.shape, test_labels.shape)" ], "outputs": [ { "output_type": "stream", "text": [ "Training (200000, 28, 28) (200000,)\n", - "Validation (10000, 28, 28) (10000,)\n" + "Validation (10000, 28, 28) (10000,)\n", + "Testing (10000, 28, 28) (10000,)\n" ], "name": "stdout" } ], "execution_count": 0 }, + { + "cell_type": "markdown", + "metadata": { + "id": "GPTCnjIcyuKN", + "colab_type": "text" + }, + "source": [ + "Next, we'll randomize the data. It's important to have the labels well shuffled for the training and test distributions to match." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6WZ2l2tN2zOL", + "colab_type": "code", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "cellView": "both" + }, + "source": [ + "np.random.seed(133)\n", + "def randomize(dataset, labels):\n", + " permutation = np.random.permutation(labels.shape[0])\n", + " shuffled_dataset = dataset[permutation,:,:]\n", + " shuffled_labels = labels[permutation]\n", + " return shuffled_dataset, shuffled_labels\n", + "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", + "test_dataset, test_labels = randomize(test_dataset, test_labels)" + ], + "outputs": [], + "execution_count": 0 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "puDUTe6t6USl", + "colab_type": "text" + }, + "source": [ + "---\n", + "Problem 4\n", + "---------\n", + "Convince yourself that the data is still good after shuffling!\n", + "\n", + "---" + ] + }, { "cell_type": "markdown", "metadata": { @@ -654,4 +757,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 151aa25ce8b..9ad41acb0c4 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -265,7 +265,7 @@ " [patch_size, patch_size, depth, depth], stddev=0.1))\n", " layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))\n", " layer3_weights = tf.Variable(tf.truncated_normal(\n", - " [image_size / 4 * image_size / 4 * depth, num_hidden], stddev=0.1))\n", + " [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1))\n", " layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))\n", " layer4_weights = tf.Variable(tf.truncated_normal(\n", " [num_hidden, num_labels], stddev=0.1))\n", @@ -461,4 +461,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 1b7f5e20054..b3a7a71e2cb 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -114,7 +114,7 @@ " if statinfo.st_size == expected_bytes:\n", " print('Found and verified %s' % filename)\n", " else:\n", - " print statinfo.st_size\n", + " print(statinfo.st_size)\n", " raise Exception(\n", " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", " return filename\n", @@ -354,35 +354,31 @@ " data_index = (data_index + 1) % len(data)\n", " return batch, labels\n", "\n", - "batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)\n", - "for i in range(8):\n", - " print('%d -> %d' % (batch[i], labels[i, 0]))\n", - " print('%s -> %s' % (reverse_dictionary[batch[i]],\n", - " reverse_dictionary[labels[i, 0]]))" + "print('data:', [reverse_dictionary[di] for di in data[:8]])\n", + "\n", + "for num_skips, skip_window in [(2, 1), (4, 2)]:\n", + " data_index = 0\n", + " batch, labels = generate_batch(batch_size=8, num_skips=num_skips, skip_window=skip_window)\n", + " print('\\nwith num_skips = %d and skip_window = %d:' % (num_skips, skip_window))\n", + " print(' batch:', [reverse_dictionary[bi] for bi in batch])\n", + " print(' labels:', [reverse_dictionary[li] for li in labels.reshape(8)])" ], "outputs": [ - { - "output_type": "stream", - "text": [ - " 3083 -> 5243\n", - "originated -> anarchism\n", - "3083 -> 12\n", - "originated -> as\n", - "12 -> 3083\n", - "as -> originated\n", - "12 -> 6\n", - "as -> a\n", - "6 -> 12\n", - "a -> as\n", - "6 -> 195\n", - "a -> term\n", - "195 -> 6\n", - "term -> a\n", - "195 -> 2\n", - "term -> of\n" - ], - "name": "stdout" - } + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first']\n", + "\n", + "with num_skips = 2 and skip_window = 1:\n", + " batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term']\n", + " labels: ['as', 'anarchism', 'a', 'originated', 'term', 'as', 'a', 'of']\n", + "\n", + "with num_skips = 4 and skip_window = 2:\n", + " batch: ['as', 'as', 'as', 'as', 'a', 'a', 'a', 'a']\n", + " labels: ['anarchism', 'originated', 'term', 'a', 'as', 'of', 'originated', 'term']\n" + ] + } ], "execution_count": 0 }, @@ -890,4 +886,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index a3adc5f1557..65b16648826 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ Assignments for Udacity Deep Learning class with TensorFlow =========================================================== +Course information can be found at https://www.udacity.com/course/deep-learning--ud730 + Running the Docker container from the Google Cloud repository ------------------------------------------------------------- @@ -44,8 +46,18 @@ Building a local Docker container Running the local container --------------------------- +To run a disposable container: + docker run -p 8888:8888 -it --rm $USER/assignments +Note the above command will create an ephemeral container and all data stored in the container will be lost when the container stops. + +To avoid losing work between sessions in the container, it is recommended that you mount the `tensorflow/examples/udacity` directory into the container: + + docker run -p 8888:8888 -v :/notebooks -it --rm $USER/assignments + +This will allow you to save work and have access to generated files on the host filesystem. + Pushing a Google Cloud release ------------------------------ From e8b013a923c46da42b0b84a52b0a22c600155576 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Mon, 1 Feb 2016 20:40:54 -0800 Subject: [PATCH 027/123] Fix print formatting. More general exclusion of files (h/t @shreyasva) Typo (h/t @seanpavlov) Change: 113597422 --- 1_notmnist.ipynb | 121 +++++++++++++++++++++-------------------- 2_fullyconnected.ipynb | 1 + 3_regularization.ipynb | 3 +- 4_convolutions.ipynb | 3 +- 5_word2vec.ipynb | 33 +++++------ 6_lstm.ipynb | 1 + 6 files changed, 85 insertions(+), 77 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 661ea4df92b..d3f72c4fe8e 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -45,6 +45,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "from __future__ import print_function\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import os\n", @@ -191,7 +192,8 @@ " tar.extractall()\n", " tar.close()\n", " data_folders = [\n", - " os.path.join(root, d) for d in sorted(os.listdir(root)) if d != '.DS_Store']\n", + " os.path.join(root, d) for d in sorted(os.listdir(root))\n", + " if os.path.isdir(os.path.join(root, d))]\n", " if len(data_folders) != num_classes:\n", " raise Exception(\n", " 'Expected %d folders, one per class. Found %d instead.' % (\n", @@ -284,33 +286,34 @@ "pixel_depth = 255.0 # Number of levels per pixel.\n", "\n", "def load_letter(folder, min_num_images):\n", - " image_files = os.listdir(folder)\n", - " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", + " \"\"\"Load the data for a single letter label.\"\"\"\n", + " image_files = os.listdir(folder)\n", + " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", " dtype=np.float32)\n", - " image_index = 0\n", - " print folder\n", - " for image in os.listdir(folder):\n", - " image_file = os.path.join(folder, image)\n", - " try:\n", - " image_data = (ndimage.imread(image_file).astype(float) - \n", - " pixel_depth / 2) / pixel_depth\n", - " if image_data.shape != (image_size, image_size):\n", - " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", - " dataset[image_index, :, :] = image_data\n", - " image_index += 1\n", - " except IOError as e:\n", - " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", + " image_index = 0\n", + " print(folder)\n", + " for image in os.listdir(folder):\n", + " image_file = os.path.join(folder, image)\n", + " try:\n", + " image_data = (ndimage.imread(image_file).astype(float) - \n", + " pixel_depth / 2) / pixel_depth\n", + " if image_data.shape != (image_size, image_size):\n", + " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", + " dataset[image_index, :, :] = image_data\n", + " image_index += 1\n", + " except IOError as e:\n", + " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", " \n", - " num_images = image_index\n", - " dataset = dataset[0:num_images, :, :]\n", - " if num_images < min_num_images:\n", - " raise Exception('Many fewer images than expected: %d < %d' % \n", - " (num_images, min_num_images))\n", + " num_images = image_index\n", + " dataset = dataset[0:num_images, :, :]\n", + " if num_images < min_num_images:\n", + " raise Exception('Many fewer images than expected: %d < %d' %\n", + " (num_images, min_num_images))\n", " \n", - " print('Full dataset tensor:', dataset.shape)\n", - " print('Mean:', np.mean(dataset))\n", - " print('Standard deviation:', np.std(dataset))\n", - " return dataset\n", + " print('Full dataset tensor:', dataset.shape)\n", + " print('Mean:', np.mean(dataset))\n", + " print('Standard deviation:', np.std(dataset))\n", + " return dataset\n", " \n", "def load(data_folders, min_num_images_per_class):\n", " dataset_names = []\n", @@ -506,44 +509,44 @@ }, "source": [ "def make_arrays(nb_rows, img_size):\n", - " if nb_rows:\n", - " dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n", - " labels = np.ndarray(nb_rows, dtype=np.int32)\n", - " else:\n", - " dataset, labels = None, None\n", - " return dataset, labels\n", + " if nb_rows:\n", + " dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n", + " labels = np.ndarray(nb_rows, dtype=np.int32)\n", + " else:\n", + " dataset, labels = None, None\n", + " return dataset, labels\n", "\n", "def merge_datasets(pickle_files, train_size, valid_size=0):\n", - " num_classes = len(pickle_files)\n", - " valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n", - " train_dataset, train_labels = make_arrays(train_size, image_size)\n", - " vsize_per_class = valid_size // num_classes\n", - " tsize_per_class = train_size // num_classes\n", + " num_classes = len(pickle_files)\n", + " valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n", + " train_dataset, train_labels = make_arrays(train_size, image_size)\n", + " vsize_per_class = valid_size // num_classes\n", + " tsize_per_class = train_size // num_classes\n", " \n", - " start_v, start_t = 0, 0\n", - " end_v, end_t = vsize_per_class, tsize_per_class\n", - " end_l = vsize_per_class+tsize_per_class\n", - " for label, pickle_file in enumerate(pickle_files): \n", - " try:\n", - " with open(pickle_file, 'rb') as f:\n", - " letter_set = pickle.load(f)\n", - " if valid_dataset is not None:\n", - " valid_letter = letter_set[:vsize_per_class, :, :]\n", - " valid_dataset[start_v:end_v, :, :] = valid_letter\n", - " valid_labels[start_v:end_v] = label\n", - " start_v += vsize_per_class\n", - " end_v += vsize_per_class\n", + " start_v, start_t = 0, 0\n", + " end_v, end_t = vsize_per_class, tsize_per_class\n", + " end_l = vsize_per_class+tsize_per_class\n", + " for label, pickle_file in enumerate(pickle_files): \n", + " try:\n", + " with open(pickle_file, 'rb') as f:\n", + " letter_set = pickle.load(f)\n", + " if valid_dataset is not None:\n", + " valid_letter = letter_set[:vsize_per_class, :, :]\n", + " valid_dataset[start_v:end_v, :, :] = valid_letter\n", + " valid_labels[start_v:end_v] = label\n", + " start_v += vsize_per_class\n", + " end_v += vsize_per_class\n", " \n", - " train_letter = letter_set[vsize_per_class:end_l, :, :]\n", - " train_dataset[start_t:end_t, :, :] = train_letter\n", - " train_labels[start_t:end_t] = label\n", - " start_t += tsize_per_class\n", - " end_t += tsize_per_class\n", - " except Exception as e:\n", - " print('Unable to process data from', pickle_file, ':', e)\n", - " raise\n", + " train_letter = letter_set[vsize_per_class:end_l, :, :]\n", + " train_dataset[start_t:end_t, :, :] = train_letter\n", + " train_labels[start_t:end_t] = label\n", + " start_t += tsize_per_class\n", + " end_t += tsize_per_class\n", + " except Exception as e:\n", + " print('Unable to process data from', pickle_file, ':', e)\n", + " raise\n", " \n", - " return valid_dataset, valid_labels, train_dataset, train_labels\n", + " return valid_dataset, valid_labels, train_dataset, train_labels\n", " \n", " \n", "train_size = 200000\n", @@ -757,4 +760,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index d7042e13139..2bf5a7f937c 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -45,6 +45,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "from __future__ import print_function\n", "import numpy as np\n", "import tensorflow as tf\n", "from six.moves import cPickle as pickle\n", diff --git a/3_regularization.ipynb b/3_regularization.ipynb index c848c7c69b4..7c587a65123 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -45,6 +45,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "from __future__ import print_function\n", "import numpy as np\n", "import tensorflow as tf\n", "from six.moves import cPickle as pickle" @@ -234,7 +235,7 @@ "Problem 1\n", "---------\n", "\n", - "Introduce and tune L2 regularization for both logistic and neural network models. Remember that L2 amounts to adding a penalty on the norm of the weights to the loss. In TensorFlow, you can compue the L2 loss for a tensor `t` using `nn.l2_loss(t)`. The right amount of regularization should improve your validation / test accuracy.\n", + "Introduce and tune L2 regularization for both logistic and neural network models. Remember that L2 amounts to adding a penalty on the norm of the weights to the loss. In TensorFlow, you can compute the L2 loss for a tensor `t` using `nn.l2_loss(t)`. The right amount of regularization should improve your validation / test accuracy.\n", "\n", "---" ] diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 9ad41acb0c4..680f72bff5f 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -45,6 +45,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "from __future__ import print_function\n", "import numpy as np\n", "import tensorflow as tf\n", "from six.moves import cPickle as pickle\n", @@ -461,4 +462,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index b3a7a71e2cb..ed8049388f1 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -43,6 +43,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "from __future__ import print_function\n", "import collections\n", "import math\n", "import numpy as np\n", @@ -364,21 +365,21 @@ " print(' labels:', [reverse_dictionary[li] for li in labels.reshape(8)])" ], "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first']\n", - "\n", - "with num_skips = 2 and skip_window = 1:\n", - " batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term']\n", - " labels: ['as', 'anarchism', 'a', 'originated', 'term', 'as', 'a', 'of']\n", - "\n", - "with num_skips = 4 and skip_window = 2:\n", - " batch: ['as', 'as', 'as', 'as', 'a', 'a', 'a', 'a']\n", - " labels: ['anarchism', 'originated', 'term', 'a', 'as', 'of', 'originated', 'term']\n" - ] - } + { + "output_type": "stream", + "text": [ + "data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first']\n", + "\n", + "with num_skips = 2 and skip_window = 1:\n", + " batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term']\n", + " labels: ['as', 'anarchism', 'a', 'originated', 'term', 'as', 'a', 'of']\n", + "\n", + "with num_skips = 4 and skip_window = 2:\n", + " batch: ['as', 'as', 'as', 'as', 'a', 'a', 'a', 'a']\n", + " labels: ['anarchism', 'originated', 'term', 'a', 'as', 'of', 'originated', 'term']\n" + ], + "name": "stdout" + } ], "execution_count": 0 }, @@ -886,4 +887,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/6_lstm.ipynb b/6_lstm.ipynb index c41eef2a8f5..a1ef14b7879 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -53,6 +53,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "from __future__ import print_function\n", "import os\n", "import numpy as np\n", "import random\n", From 49a3543189d128b7098b55bb10521ce245dde97e Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 2 Feb 2016 16:56:56 -0800 Subject: [PATCH 028/123] Make all the expensive steps in 1_notmnist lazy, and provide an explicit path to forcing them. This should alleviate some of the issues with having to always rerun the beginning of the Notebook, while still providing a simple way out of accidental aborts in the middle of unzipping or pickling. h/t @mtamburrano and @shreyasva Change: 113693113 --- 1_notmnist.ipynb | 50 +++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index d3f72c4fe8e..ba2700b4473 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -108,9 +108,9 @@ "source": [ "url = 'http://yaroslavvb.com/upload/notMNIST/'\n", "\n", - "def maybe_download(filename, expected_bytes):\n", + "def maybe_download(filename, expected_bytes, force=False):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", - " if not os.path.exists(filename):\n", + " if force or not os.path.exists(filename):\n", " filename, _ = urlretrieve(url + filename, filename)\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", @@ -184,13 +184,17 @@ "source": [ "num_classes = 10\n", "\n", - "def extract(filename):\n", - " tar = tarfile.open(filename)\n", + "def maybe_extract(filename, force=False):\n", " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", - " print('Extracting data for %s. This may take a while. Please wait.' % root)\n", - " sys.stdout.flush()\n", - " tar.extractall()\n", - " tar.close()\n", + " if os.path.isdir(root) and not force:\n", + " # You may override by setting force=True.\n", + " print('%s already present - Skipping extraction of %s.' % (root, filename))\n", + " else:\n", + " print('Extracting data for %s. This may take a while. Please wait.' % root)\n", + " tar = tarfile.open(filename)\n", + " sys.stdout.flush()\n", + " tar.extractall()\n", + " tar.close()\n", " data_folders = [\n", " os.path.join(root, d) for d in sorted(os.listdir(root))\n", " if os.path.isdir(os.path.join(root, d))]\n", @@ -201,8 +205,8 @@ " print(data_folders)\n", " return data_folders\n", " \n", - "train_folders = extract(train_filename)\n", - "test_folders = extract(test_filename)" + "train_folders = maybe_extract(train_filename)\n", + "test_folders = maybe_extract(test_filename)" ], "outputs": [ { @@ -315,22 +319,27 @@ " print('Standard deviation:', np.std(dataset))\n", " return dataset\n", " \n", - "def load(data_folders, min_num_images_per_class):\n", + "def maybe_pickle(data_folders, min_num_images_per_class, force=False):\n", " dataset_names = []\n", " for folder in data_folders:\n", - " dataset = load_letter(folder, min_num_images_per_class)\n", " set_filename = folder + '.pickle'\n", - " try:\n", + " dataset_names.append(set_filename)\n", + " if os.path.exists(set_filename) and not force:\n", + " # You may override by setting force=True.\n", + " print('%s already present - Skipping pickling.' % set_filename)\n", + " else:\n", + " print('Pickling %s.' % set_filename)\n", + " dataset = load_letter(folder, min_num_images_per_class)\n", + " try:\n", " with open(set_filename, 'wb') as f:\n", - " pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n", - " dataset_names.append(set_filename)\n", - " except Exception as e:\n", + " pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n", + " except Exception as e:\n", " print('Unable to save data to', pickle_file, ':', e)\n", " \n", " return dataset_names\n", "\n", - "train_datasets = load(train_folders, 45000)\n", - "test_datasets = load(test_folders, 1800)" + "train_datasets = maybe_pickle(train_folders, 45000)\n", + "test_datasets = maybe_pickle(test_folders, 1800)" ], "outputs": [ { @@ -553,8 +562,9 @@ "valid_size = 10000\n", "test_size = 10000\n", "\n", - "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(train_datasets, train_size, valid_size)\n", - "__, __, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n", + "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(\n", + " train_datasets, train_size, valid_size)\n", + "_, _, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n", "\n", "print('Training:', train_dataset.shape, train_labels.shape)\n", "print('Validation:', valid_dataset.shape, valid_labels.shape)\n", From b09f1bea0a7e5eb55df81516171fe377b701cd6a Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Wed, 3 Feb 2016 09:16:16 -0800 Subject: [PATCH 029/123] Fix typo (h/t Yao-Nan Chen) Change: 113748862 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index ba2700b4473..ffe64d5ac0d 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -334,7 +334,7 @@ " with open(set_filename, 'wb') as f:\n", " pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n", " except Exception as e:\n", - " print('Unable to save data to', pickle_file, ':', e)\n", + " print('Unable to save data to', set_filename, ':', e)\n", " \n", " return dataset_names\n", "\n", From 043a29692868d2318727a54d616fdab767fbbe61 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Wed, 3 Feb 2016 09:59:54 -0800 Subject: [PATCH 030/123] Updated Docker container. Change: 113752933 --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 65b16648826..8308a567660 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,13 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.1.0 + V=0.2.0 docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:$V docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest gcloud docker push b.gcr.io/tensorflow-udacity/assignments + +History +------- + +* 0.1.0: Initial release. +* 0.2.0: Many fixes, including lower memory footprint and support for Python 3. From 2e2a376e41bd5c066ce190af0110a6b0b01329ca Mon Sep 17 00:00:00 2001 From: Lukas Krecan Date: Thu, 4 Feb 2016 09:02:10 +0100 Subject: [PATCH 031/123] Shuffling letters before assigning them to training and validation datasets Without this change we are getting poor results since training and validation sets are not well chosen. --- 1_notmnist.ipynb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 61b0ec05fc5..fd74ea83e03 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -183,6 +183,7 @@ }, "source": [ "num_classes = 10\n", + "np.random.seed(133)\n", "\n", "def maybe_extract(filename, force=False):\n", " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", @@ -539,6 +540,8 @@ " try:\n", " with open(pickle_file, 'rb') as f:\n", " letter_set = pickle.load(f)\n", + " # let's shuffle the letters to have random validation and training set\n", + " np.random.shuffle(letter_set)\n", " if valid_dataset is not None:\n", " valid_letter = letter_set[:vsize_per_class, :, :]\n", " valid_dataset[start_v:end_v, :, :] = valid_letter\n", @@ -607,14 +610,14 @@ "cellView": "both" }, "source": [ - "np.random.seed(133)\n", "def randomize(dataset, labels):\n", " permutation = np.random.permutation(labels.shape[0])\n", " shuffled_dataset = dataset[permutation,:,:]\n", " shuffled_labels = labels[permutation]\n", " return shuffled_dataset, shuffled_labels\n", "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", - "test_dataset, test_labels = randomize(test_dataset, test_labels)" + "test_dataset, test_labels = randomize(test_dataset, test_labels)\n", + "valid_dataset, valid_labels = randomize(valid_dataset, valid_labels)" ], "outputs": [], "execution_count": 0 From 9b0e3d5f507016b479124acad499e4a005911001 Mon Sep 17 00:00:00 2001 From: Moussa Taifi Date: Sat, 6 Feb 2016 19:00:57 -0500 Subject: [PATCH 032/123] fix minor filename typo fix minor filename typo --- 2_fullyconnected.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 2bf5a7f937c..c8815f631b5 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -61,7 +61,7 @@ "colab_type": "text" }, "source": [ - "First reload the data we generated in `1_notmist.ipynb`." + "First reload the data we generated in `1_notmnist.ipynb`." ] }, { @@ -583,4 +583,4 @@ ] } ] -} \ No newline at end of file +} From 0c8d5e053caac7ae69857aae3a75d29572bb855e Mon Sep 17 00:00:00 2001 From: Martin Wicke Date: Sun, 7 Feb 2016 12:34:25 -0800 Subject: [PATCH 033/123] Merge changes from GitHub, clean up linter errors, fix dependencies test. Change: 114064632 --- 1_notmnist.ipynb | 9 ++++++--- 4_convolutions.ipynb | 2 +- 5_word2vec.ipynb | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index ffe64d5ac0d..fd74ea83e03 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -183,6 +183,7 @@ }, "source": [ "num_classes = 10\n", + "np.random.seed(133)\n", "\n", "def maybe_extract(filename, force=False):\n", " root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz\n", @@ -539,6 +540,8 @@ " try:\n", " with open(pickle_file, 'rb') as f:\n", " letter_set = pickle.load(f)\n", + " # let's shuffle the letters to have random validation and training set\n", + " np.random.shuffle(letter_set)\n", " if valid_dataset is not None:\n", " valid_letter = letter_set[:vsize_per_class, :, :]\n", " valid_dataset[start_v:end_v, :, :] = valid_letter\n", @@ -607,14 +610,14 @@ "cellView": "both" }, "source": [ - "np.random.seed(133)\n", "def randomize(dataset, labels):\n", " permutation = np.random.permutation(labels.shape[0])\n", " shuffled_dataset = dataset[permutation,:,:]\n", " shuffled_labels = labels[permutation]\n", " return shuffled_dataset, shuffled_labels\n", "train_dataset, train_labels = randomize(train_dataset, train_labels)\n", - "test_dataset, test_labels = randomize(test_dataset, test_labels)" + "test_dataset, test_labels = randomize(test_dataset, test_labels)\n", + "valid_dataset, valid_labels = randomize(valid_dataset, valid_labels)" ], "outputs": [], "execution_count": 0 @@ -770,4 +773,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 680f72bff5f..ecddcf43691 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -462,4 +462,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index ed8049388f1..5bc8152b1cc 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -887,4 +887,4 @@ ] } ] -} \ No newline at end of file +} From c9e1aa2d23136d6eacc20b4674cdd77199285152 Mon Sep 17 00:00:00 2001 From: ninotoshi Date: Wed, 10 Feb 2016 20:15:27 +0900 Subject: [PATCH 034/123] fixed a typo --- 6_lstm.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6_lstm.ipynb b/6_lstm.ipynb index a1ef14b7879..75a7027784b 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -410,7 +410,7 @@ "\n", "def characters(probabilities):\n", " \"\"\"Turn a 1-hot encoding or a probability distribution over the possible\n", - " characters back into its (mostl likely) character representation.\"\"\"\n", + " characters back into its (most likely) character representation.\"\"\"\n", " return [id2char(c) for c in np.argmax(probabilities, 1)]\n", "\n", "def batches2string(batches):\n", From 4e1602a7dd1a34b5c5c8b324e091f93abbff2802 Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Wed, 17 Feb 2016 11:42:30 -0800 Subject: [PATCH 035/123] Merge changes from github. Change: 114882676 --- 2_fullyconnected.ipynb | 4 ++-- 6_lstm.ipynb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 2bf5a7f937c..c8815f631b5 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -61,7 +61,7 @@ "colab_type": "text" }, "source": [ - "First reload the data we generated in `1_notmist.ipynb`." + "First reload the data we generated in `1_notmnist.ipynb`." ] }, { @@ -583,4 +583,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/6_lstm.ipynb b/6_lstm.ipynb index a1ef14b7879..75a7027784b 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -410,7 +410,7 @@ "\n", "def characters(probabilities):\n", " \"\"\"Turn a 1-hot encoding or a probability distribution over the possible\n", - " characters back into its (mostl likely) character representation.\"\"\"\n", + " characters back into its (most likely) character representation.\"\"\"\n", " return [id2char(c) for c in np.argmax(probabilities, 1)]\n", "\n", "def batches2string(batches):\n", From 15cfdab3ad46275fae2c8c43ba7b37db0bbab4d7 Mon Sep 17 00:00:00 2001 From: Jan Prach Date: Fri, 19 Feb 2016 00:26:17 -0800 Subject: [PATCH 036/123] add samples to docker and start jupyter by default --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 59ae4abca82..9545c376b75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM b.gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke RUN pip install scikit-learn +RUN rm -rf /notebooks/* ADD *.ipynb /notebooks/ WORKDIR /notebooks CMD ["/run_jupyter.sh"] From 8a2877c63d174faee56c763674adca57b3bdcb58 Mon Sep 17 00:00:00 2001 From: urimend Date: Wed, 24 Feb 2016 13:09:19 +0200 Subject: [PATCH 037/123] Update 3_regularization.ipynb Fixed a mistake in a variable name. --- 3_regularization.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3_regularization.ipynb b/3_regularization.ipynb index 7c587a65123..5e1d30f54fc 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -290,11 +290,11 @@ "Another one is to use learning rate decay:\n", "\n", " global_step = tf.Variable(0) # count the number of steps taken.\n", - " learning_rate = tf.train.exponential_decay(0.5, step, ...)\n", + " learning_rate = tf.train.exponential_decay(0.5, global_step, ...)\n", " optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)\n", " \n", " ---\n" ] } ] -} \ No newline at end of file +} From 1215f98879085e1b4fb72b9c8b2f981048e4393e Mon Sep 17 00:00:00 2001 From: J Yegerlehner Date: Sun, 28 Feb 2016 02:44:39 -0600 Subject: [PATCH 038/123] Assign graph to cpu in example/udacity/assignment5. This was required so the code will execute on tensorflow installations with gpu support. SparseApplyAdagrad op has no gpu implementation at this time and causes exception to be thrown. --- 5_word2vec.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 5bc8152b1cc..c266488bde6 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -421,7 +421,7 @@ "\n", "graph = tf.Graph()\n", "\n", - "with graph.as_default():\n", + "with graph.as_default(), tf.device('/cpu:0'):\n", "\n", " # Input data.\n", " train_dataset = tf.placeholder(tf.int32, shape=[batch_size])\n", From 3f5b0e52d7a27290a4df28563ee3bf75e4935ca7 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 8 Mar 2016 15:22:00 -0800 Subject: [PATCH 039/123] Update Udacity assignments past v0.7.1. Change: 116703851 --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8308a567660..a6d6f8742a5 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments + docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.3.0 Accessing the Notebooks ----------------------- @@ -61,9 +61,9 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.2.0 + V=0.3.0 docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:$V - docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest + docker tag -f $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest gcloud docker push b.gcr.io/tensorflow-udacity/assignments History @@ -71,3 +71,4 @@ History * 0.1.0: Initial release. * 0.2.0: Many fixes, including lower memory footprint and support for Python 3. +* 0.3.0: Use 0.7.1 release. From 25583993ea208da9ce9d4b0f5530c35a58a4d85b Mon Sep 17 00:00:00 2001 From: Eugene Brevdo Date: Thu, 10 Mar 2016 17:18:30 -0800 Subject: [PATCH 040/123] Fix dependencies bugs Change: 116925769 --- 3_regularization.ipynb | 4 ++-- 5_word2vec.ipynb | 2 +- Dockerfile | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/3_regularization.ipynb b/3_regularization.ipynb index 7c587a65123..5e1d30f54fc 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -290,11 +290,11 @@ "Another one is to use learning rate decay:\n", "\n", " global_step = tf.Variable(0) # count the number of steps taken.\n", - " learning_rate = tf.train.exponential_decay(0.5, step, ...)\n", + " learning_rate = tf.train.exponential_decay(0.5, global_step, ...)\n", " optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)\n", " \n", " ---\n" ] } ] -} \ No newline at end of file +} diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 5bc8152b1cc..c266488bde6 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -421,7 +421,7 @@ "\n", "graph = tf.Graph()\n", "\n", - "with graph.as_default():\n", + "with graph.as_default(), tf.device('/cpu:0'):\n", "\n", " # Input data.\n", " train_dataset = tf.placeholder(tf.int32, shape=[batch_size])\n", diff --git a/Dockerfile b/Dockerfile index 59ae4abca82..9545c376b75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM b.gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke RUN pip install scikit-learn +RUN rm -rf /notebooks/* ADD *.ipynb /notebooks/ WORKDIR /notebooks CMD ["/run_jupyter.sh"] From 47a0fef1f08689037d0c79992006377af55fb62a Mon Sep 17 00:00:00 2001 From: Abhinav Upadhyay Date: Sun, 13 Mar 2016 22:46:21 +0530 Subject: [PATCH 041/123] Add space before filename in the error message of maybe_download(). --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index fd74ea83e03..23351d9bd94 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -117,7 +117,7 @@ " print('Found and verified', filename)\n", " else:\n", " raise Exception(\n", - " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", + " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", " return filename\n", "\n", "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", From b8dbec0569de5e5e45d7a45e9d3a27006b49d699 Mon Sep 17 00:00:00 2001 From: Yaroslav Bulatov Date: Sun, 13 Mar 2016 11:17:14 -0800 Subject: [PATCH 042/123] Move notMNIST to Google Cloud Storage, update notebook. Fixes #1475. Change: 117088197 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index fd74ea83e03..b4704a3985d 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -106,7 +106,7 @@ "outputId": "0d0f85df-155f-4a89-8e7e-ee32df36ec8d" }, "source": [ - "url = 'http://yaroslavvb.com/upload/notMNIST/'\n", + "url = 'http://commondatastorage.googleapis.com/books1000/'\n", "\n", "def maybe_download(filename, expected_bytes, force=False):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", From 4758ac6e106233f4e841731687ed96791fcc2b16 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Mon, 14 Mar 2016 08:29:07 -0800 Subject: [PATCH 043/123] Update Docker image to point to new data source. Change: 117140354 --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a6d6f8742a5..af26e2ee387 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.3.0 + docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.4.0 Accessing the Notebooks ----------------------- @@ -61,8 +61,9 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.3.0 + V=0.4.0 docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:$V + gcloud docker push b.gcr.io/tensorflow-udacity/assignments docker tag -f $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest gcloud docker push b.gcr.io/tensorflow-udacity/assignments @@ -72,3 +73,4 @@ History * 0.1.0: Initial release. * 0.2.0: Many fixes, including lower memory footprint and support for Python 3. * 0.3.0: Use 0.7.1 release. +* 0.4.0: Move notMMNIST data for Google Cloud. From 46954dcc4d2d5c4767c5cc557715f33ca94b9306 Mon Sep 17 00:00:00 2001 From: ronrest Date: Wed, 16 Mar 2016 17:34:18 +1100 Subject: [PATCH 044/123] fixes #1522 close file object properly for read_data() --- 5_word2vec.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index c266488bde6..333a87fec75 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -180,10 +180,10 @@ }, "source": [ "def read_data(filename):\n", - " f = zipfile.ZipFile(filename)\n", - " for name in f.namelist():\n", - " return tf.compat.as_str(f.read(name)).split()\n", - " f.close()\n", + " \"\"\"Extract the first file enclosed in a zip file as a list of words\"\"\"\n", + " with zipfile.ZipFile(filename) as f:\n", + " data = tf.compat.as_str(f.read(f.namelist()[0])).split()\n", + " return data\n", " \n", "words = read_data(filename)\n", "print('Data size %d' % len(words))" From c8a09186fa8f0a11240f9988b9067455633acb49 Mon Sep 17 00:00:00 2001 From: Martin Wicke Date: Tue, 15 Mar 2016 17:53:33 -0800 Subject: [PATCH 045/123] Merge changes from github. Change: 117301677 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index b4704a3985d..9d864ccd374 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -117,7 +117,7 @@ " print('Found and verified', filename)\n", " else:\n", " raise Exception(\n", - " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", + " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", " return filename\n", "\n", "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", From cef342e0527f380a3eba45b94bc973f4b2b1c3d1 Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Tue, 15 Mar 2016 18:45:27 -0800 Subject: [PATCH 046/123] Rollback of: "Merge changes from github." Change: 117304114 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 9d864ccd374..b4704a3985d 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -117,7 +117,7 @@ " print('Found and verified', filename)\n", " else:\n", " raise Exception(\n", - " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", + " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", " return filename\n", "\n", "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", From 1b81fd9172f774bd581fed9df6078a455b8aefb5 Mon Sep 17 00:00:00 2001 From: Geoffrey Irving Date: Wed, 16 Mar 2016 12:20:34 -0800 Subject: [PATCH 047/123] Rollforward of "Merge changes from github." Change: 117375570 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index b4704a3985d..9d864ccd374 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -117,7 +117,7 @@ " print('Found and verified', filename)\n", " else:\n", " raise Exception(\n", - " 'Failed to verify' + filename + '. Can you get to it with a browser?')\n", + " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", " return filename\n", "\n", "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", From b77b61afe6a0549243089fdbe7aa0c2d86d3b43e Mon Sep 17 00:00:00 2001 From: Abhinav Upadhyay Date: Sun, 20 Mar 2016 02:30:22 +0530 Subject: [PATCH 048/123] Minor refactorings: Reuse variable and use enumerate() to manage image_index variable. --- 1_notmnist.ipynb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 9d864ccd374..17af3363639 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -295,9 +295,8 @@ " image_files = os.listdir(folder)\n", " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", " dtype=np.float32)\n", - " image_index = 0\n", " print(folder)\n", - " for image in os.listdir(folder):\n", + " for image_index, image in enumerate(image_files):\n", " image_file = os.path.join(folder, image)\n", " try:\n", " image_data = (ndimage.imread(image_file).astype(float) - \n", @@ -305,11 +304,10 @@ " if image_data.shape != (image_size, image_size):\n", " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", " dataset[image_index, :, :] = image_data\n", - " image_index += 1\n", " except IOError as e:\n", " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", " \n", - " num_images = image_index\n", + " num_images = image_index + 1\n", " dataset = dataset[0:num_images, :, :]\n", " if num_images < min_num_images:\n", " raise Exception('Many fewer images than expected: %d < %d' %\n", From 1a3831131f4085ca6fdbb1a00509127ec696ca3c Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Sat, 19 Mar 2016 19:45:37 +0000 Subject: [PATCH 049/123] Clarify that skip-gram and CBOW are both Word2Vec models --- 5_word2vec.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 333a87fec75..766a6ea0562 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -24,7 +24,7 @@ "Assignment 5\n", "------------\n", "\n", - "The goal of this assignment is to train a skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." + "The goal of this assignment is to train a Word2Vec skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." ] }, { @@ -283,7 +283,7 @@ ], "execution_count": 0 }, - { + { skip-gram mod "cell_type": "markdown", "metadata": { "id": "lFwoyygOmWsL", @@ -881,7 +881,7 @@ "Problem\n", "-------\n", "\n", - "An alternative to Word2Vec is called [CBOW](http://arxiv.org/abs/1301.3781) (Continuous Bag of Words). In the CBOW model, instead of predicting a context word from a word vector, you predict a word from the sum of all the word vectors in its context. Implement and evaluate a CBOW model trained on the text8 dataset.\n", + "An alternative to skip-gram is another Word2Vec model called [CBOW](http://arxiv.org/abs/1301.3781) (Continuous Bag of Words). In the CBOW model, instead of predicting a context word from a word vector, you predict a word from the sum of all the word vectors in its context. Implement and evaluate a CBOW model trained on the text8 dataset.\n", "\n", "---" ] From c15c58749c0ff92eb150179ee038ba61389d1a0e Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Sun, 20 Mar 2016 23:01:57 +0000 Subject: [PATCH 050/123] Remove stray text --- 5_word2vec.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 766a6ea0562..94ba37ee13e 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -283,7 +283,7 @@ ], "execution_count": 0 }, - { skip-gram mod + { "cell_type": "markdown", "metadata": { "id": "lFwoyygOmWsL", From 758d1f3983fcd7fcbfedea143b3ef93aac02490b Mon Sep 17 00:00:00 2001 From: Wei-Ting Kuo Date: Mon, 21 Mar 2016 16:14:48 +0800 Subject: [PATCH 051/123] Update README.md Add a FAQ for adding a new virtual machine instead of the default one. The default one is only 1G. Here we create a new vm with 8G which is recommended --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index af26e2ee387..9200bcc79bb 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,23 @@ has two good suggestions; we recommend using 8G. In addition, you may need to pass `--memory=8g` as an extra argument to `docker run`. +* **I want to create a new virtual machine instead of the default one.** + +`docker-machine` is a tool to provision and manage docker hosts, it supports multiple platform (ex. aws, gce, azure, virtualbox, ...). To create a new virtual machine locally with built-in docker engine, you can use + + docker-machine create -d virtualbox --virtualbox-memory 8196 tensorflow + +`-d` means the driver for the cloud platform, supported drivers listed [here](https://docs.docker.com/machine/drivers/). Here we use virtualbox to create a new virtual machine locally. `tensorflow` means the name of the virtual machine, feel free to use whatever you like. You can use + + docker-machine ip tensorflow + +to get the ip of the new virtual machine. To switch from default virtual machine to a new one (here we use tensorflow), type + + eval $(docker-machine env tensorflow) + +Note that `docker-machine env tensorflow` outputs some environment variables such like `DOCKER_HOST`. Then your docker client is now connected to the docker host in virtual machine `tensorflow` + + Notes for anyone needing to build their own containers (mostly instructors) =========================================================================== From 9da10ae8314727197023ba9765785ef631c5a8df Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Tue, 22 Mar 2016 22:01:30 -0800 Subject: [PATCH 052/123] Merge changes from github, some fixes to adhere somewhat to our requirements for skflow. Change: 117901053 --- 5_word2vec.ipynb | 12 ++++++------ README.md | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index c266488bde6..94ba37ee13e 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -24,7 +24,7 @@ "Assignment 5\n", "------------\n", "\n", - "The goal of this assignment is to train a skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." + "The goal of this assignment is to train a Word2Vec skip-gram model over [Text8](http://mattmahoney.net/dc/textdata) data." ] }, { @@ -180,10 +180,10 @@ }, "source": [ "def read_data(filename):\n", - " f = zipfile.ZipFile(filename)\n", - " for name in f.namelist():\n", - " return tf.compat.as_str(f.read(name)).split()\n", - " f.close()\n", + " \"\"\"Extract the first file enclosed in a zip file as a list of words\"\"\"\n", + " with zipfile.ZipFile(filename) as f:\n", + " data = tf.compat.as_str(f.read(f.namelist()[0])).split()\n", + " return data\n", " \n", "words = read_data(filename)\n", "print('Data size %d' % len(words))" @@ -881,7 +881,7 @@ "Problem\n", "-------\n", "\n", - "An alternative to Word2Vec is called [CBOW](http://arxiv.org/abs/1301.3781) (Continuous Bag of Words). In the CBOW model, instead of predicting a context word from a word vector, you predict a word from the sum of all the word vectors in its context. Implement and evaluate a CBOW model trained on the text8 dataset.\n", + "An alternative to skip-gram is another Word2Vec model called [CBOW](http://arxiv.org/abs/1301.3781) (Continuous Bag of Words). In the CBOW model, instead of predicting a context word from a word vector, you predict a word from the sum of all the word vectors in its context. Implement and evaluate a CBOW model trained on the text8 dataset.\n", "\n", "---" ] diff --git a/README.md b/README.md index af26e2ee387..9200bcc79bb 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,23 @@ has two good suggestions; we recommend using 8G. In addition, you may need to pass `--memory=8g` as an extra argument to `docker run`. +* **I want to create a new virtual machine instead of the default one.** + +`docker-machine` is a tool to provision and manage docker hosts, it supports multiple platform (ex. aws, gce, azure, virtualbox, ...). To create a new virtual machine locally with built-in docker engine, you can use + + docker-machine create -d virtualbox --virtualbox-memory 8196 tensorflow + +`-d` means the driver for the cloud platform, supported drivers listed [here](https://docs.docker.com/machine/drivers/). Here we use virtualbox to create a new virtual machine locally. `tensorflow` means the name of the virtual machine, feel free to use whatever you like. You can use + + docker-machine ip tensorflow + +to get the ip of the new virtual machine. To switch from default virtual machine to a new one (here we use tensorflow), type + + eval $(docker-machine env tensorflow) + +Note that `docker-machine env tensorflow` outputs some environment variables such like `DOCKER_HOST`. Then your docker client is now connected to the docker host in virtual machine `tensorflow` + + Notes for anyone needing to build their own containers (mostly instructors) =========================================================================== From 4ced304f55c411edafadd10de23deffe86e46588 Mon Sep 17 00:00:00 2001 From: lekaha Date: Thu, 24 Mar 2016 02:07:17 +0900 Subject: [PATCH 053/123] Add %matplotlib inline on the first cell Config the matlotlib backend as plotting inline in IPython --- 1_notmnist.ipynb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 9d864ccd374..402cee44ea2 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -55,7 +55,10 @@ "from scipy import ndimage\n", "from sklearn.linear_model import LogisticRegression\n", "from six.moves.urllib.request import urlretrieve\n", - "from six.moves import cPickle as pickle" + "from six.moves import cPickle as pickle\n" + "\n", + "# Config the matlotlib backend as plotting inline in IPython\n", + "%matplotlib inline" ], "outputs": [], "execution_count": 0 From 19a9198b8b733f636a4c311ae3a34fefefacb81c Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Wed, 23 Mar 2016 16:44:49 -0700 Subject: [PATCH 054/123] Update 1_notmnist.ipynb --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 402cee44ea2..5ba54980d48 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -55,7 +55,7 @@ "from scipy import ndimage\n", "from sklearn.linear_model import LogisticRegression\n", "from six.moves.urllib.request import urlretrieve\n", - "from six.moves import cPickle as pickle\n" + "from six.moves import cPickle as pickle\n", "\n", "# Config the matlotlib backend as plotting inline in IPython\n", "%matplotlib inline" From d6b25d0428b14b4adb44c8bdd181bba58d7f0620 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Wed, 23 Mar 2016 18:43:58 -0700 Subject: [PATCH 055/123] Update 2_fullyconnected.ipynb --- 2_fullyconnected.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index c8815f631b5..e60c885e4c2 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -410,7 +410,7 @@ "source": [ "Let's now switch to stochastic gradient descent training instead, which is much faster.\n", "\n", - "The graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `sesion.run()`." + "The graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `session.run()`." ] }, { From f76fd756ca2da2745621c417daa90871d4d69c8b Mon Sep 17 00:00:00 2001 From: Jay Young Date: Thu, 24 Mar 2016 21:31:27 +0800 Subject: [PATCH 056/123] add matplotlib inline to redirect the image of matplotlib to notebook --- 5_word2vec.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 94ba37ee13e..80ac9ca902f 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -43,6 +43,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "%matplotlib inline\n", "from __future__ import print_function\n", "import collections\n", "import math\n", From dbf35636b425da9dd3a6f807add4576892624eee Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Thu, 24 Mar 2016 07:31:56 -0700 Subject: [PATCH 057/123] Update 2_fullyconnected.ipynb --- 2_fullyconnected.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index e60c885e4c2..588b581a69b 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -577,7 +577,7 @@ "Problem\n", "-------\n", "\n", - "Turn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units (nn.relu()) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n", + "Turn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units [nn.relu()](https://www.tensorflow.org/versions/r0.7/api_docs/python/nn.html#relu) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n", "\n", "---" ] From 4e262402090e141828c745a0dc70574ae7275893 Mon Sep 17 00:00:00 2001 From: Jay Young Date: Fri, 25 Mar 2016 13:28:23 +0800 Subject: [PATCH 058/123] replace xrange with range for python3 compatibility --- 5_word2vec.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 80ac9ca902f..62dbec4e114 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -522,12 +522,12 @@ " # note that this is expensive (~20% slowdown if computed every 500 steps)\n", " if step % 10000 == 0:\n", " sim = similarity.eval()\n", - " for i in xrange(valid_size):\n", + " for i in range(valid_size):\n", " valid_word = reverse_dictionary[valid_examples[i]]\n", " top_k = 8 # number of nearest neighbors\n", " nearest = (-sim[i, :]).argsort()[1:top_k+1]\n", " log = 'Nearest to %s:' % valid_word\n", - " for k in xrange(top_k):\n", + " for k in range(top_k):\n", " close_word = reverse_dictionary[nearest[k]]\n", " log = '%s %s,' % (log, close_word)\n", " print(log)\n", From f7d444b783e6cc32d9a13061ad740eaf3fb37964 Mon Sep 17 00:00:00 2001 From: Craig Citro Date: Thu, 24 Mar 2016 14:07:45 -0800 Subject: [PATCH 059/123] Switch Docker instructions to always `--pull` on build. This fixes situations like Vincent hit, where a stale base image would lead to new packages based on old base packages. Change: 118071412 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9200bcc79bb..8c8d10c8b2e 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Building a local Docker container --------------------------------- cd tensorflow/examples/udacity - docker build -t $USER/assignments . + docker build --pull -t $USER/assignments . Running the local container --------------------------- From 5914e2d7848f09cec089387c3f68ecb47a744cc4 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Thu, 24 Mar 2016 15:41:34 -0800 Subject: [PATCH 060/123] Fix tensorflow version (was missing a --pull) Change: 118080472 --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c8d10c8b2e..98edc71e594 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.4.0 + docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.5.0 Accessing the Notebooks ----------------------- @@ -78,7 +78,7 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.4.0 + V=0.5.0 docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:$V gcloud docker push b.gcr.io/tensorflow-udacity/assignments docker tag -f $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest @@ -91,3 +91,4 @@ History * 0.2.0: Many fixes, including lower memory footprint and support for Python 3. * 0.3.0: Use 0.7.1 release. * 0.4.0: Move notMMNIST data for Google Cloud. +* 0.5.0: Actually use 0.7.1 release. From 604b24e918169fd4c5fabed97e0d51fd4f54dae6 Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Tue, 29 Mar 2016 18:23:11 -0800 Subject: [PATCH 061/123] Merge changes from github. Change: 118532471 --- 1_notmnist.ipynb | 11 ++++++----- 2_fullyconnected.ipynb | 4 ++-- 5_word2vec.ipynb | 5 +++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 9d864ccd374..22654458154 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -55,7 +55,10 @@ "from scipy import ndimage\n", "from sklearn.linear_model import LogisticRegression\n", "from six.moves.urllib.request import urlretrieve\n", - "from six.moves import cPickle as pickle" + "from six.moves import cPickle as pickle\n", + "\n", + "# Config the matlotlib backend as plotting inline in IPython\n", + "%matplotlib inline" ], "outputs": [], "execution_count": 0 @@ -295,9 +298,8 @@ " image_files = os.listdir(folder)\n", " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", " dtype=np.float32)\n", - " image_index = 0\n", " print(folder)\n", - " for image in os.listdir(folder):\n", + " for image_index, image in enumerate(image_files):\n", " image_file = os.path.join(folder, image)\n", " try:\n", " image_data = (ndimage.imread(image_file).astype(float) - \n", @@ -305,11 +307,10 @@ " if image_data.shape != (image_size, image_size):\n", " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", " dataset[image_index, :, :] = image_data\n", - " image_index += 1\n", " except IOError as e:\n", " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", " \n", - " num_images = image_index\n", + " num_images = image_index + 1\n", " dataset = dataset[0:num_images, :, :]\n", " if num_images < min_num_images:\n", " raise Exception('Many fewer images than expected: %d < %d' %\n", diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index c8815f631b5..588b581a69b 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -410,7 +410,7 @@ "source": [ "Let's now switch to stochastic gradient descent training instead, which is much faster.\n", "\n", - "The graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `sesion.run()`." + "The graph will be similar, except that instead of holding all the training data into a constant node, we create a `Placeholder` node which will be fed actual data at every call of `session.run()`." ] }, { @@ -577,7 +577,7 @@ "Problem\n", "-------\n", "\n", - "Turn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units (nn.relu()) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n", + "Turn the logistic regression example with SGD into a 1-hidden layer neural network with rectified linear units [nn.relu()](https://www.tensorflow.org/versions/r0.7/api_docs/python/nn.html#relu) and 1024 hidden nodes. This model should improve your validation / test accuracy.\n", "\n", "---" ] diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 94ba37ee13e..62dbec4e114 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -43,6 +43,7 @@ "source": [ "# These are all the modules we'll be using later. Make sure you can import them\n", "# before proceeding further.\n", + "%matplotlib inline\n", "from __future__ import print_function\n", "import collections\n", "import math\n", @@ -521,12 +522,12 @@ " # note that this is expensive (~20% slowdown if computed every 500 steps)\n", " if step % 10000 == 0:\n", " sim = similarity.eval()\n", - " for i in xrange(valid_size):\n", + " for i in range(valid_size):\n", " valid_word = reverse_dictionary[valid_examples[i]]\n", " top_k = 8 # number of nearest neighbors\n", " nearest = (-sim[i, :]).argsort()[1:top_k+1]\n", " log = 'Nearest to %s:' % valid_word\n", - " for k in xrange(top_k):\n", + " for k in range(top_k):\n", " close_word = reverse_dictionary[nearest[k]]\n", " log = '%s %s,' % (log, close_word)\n", " print(log)\n", From 80e87cf844688bf5b55653900cea2964acd748a7 Mon Sep 17 00:00:00 2001 From: Jan Prach Date: Wed, 13 Apr 2016 08:26:19 -0700 Subject: [PATCH 062/123] switch docker links from b.gcr.io to gcr.io (#1911) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9545c376b75..4af441018bf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM b.gcr.io/tensorflow/tensorflow:latest +FROM gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke RUN pip install scikit-learn RUN rm -rf /notebooks/* From 0487961224a6c98e8c9fcfff569d918a0c4dc410 Mon Sep 17 00:00:00 2001 From: Illia Polosukhin Date: Mon, 18 Apr 2016 17:56:51 -0800 Subject: [PATCH 063/123] Merge changes from github. Change: 120185825 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9545c376b75..4af441018bf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM b.gcr.io/tensorflow/tensorflow:latest +FROM gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke RUN pip install scikit-learn RUN rm -rf /notebooks/* From 0ef7b817a19674c60a815ae51ce874972a80ac00 Mon Sep 17 00:00:00 2001 From: Zohar Jackson Date: Tue, 3 May 2016 18:59:06 +0300 Subject: [PATCH 064/123] Added a function to report download progress of the MNIST data on the first Udacity example. This commit is primarily intended for users with slow internet connections. --- 1_notmnist.ipynb | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 22654458154..32ece419b02 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -110,11 +110,31 @@ }, "source": [ "url = 'http://commondatastorage.googleapis.com/books1000/'\n", + "last_percent_reported = None\n", "\n", + "def download_progress_hook(count, blockSize, totalSize):\n", + " \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n", + " slow internet connections. Reports every 1% change in download progress.\n", + " \"\"\"\n", + " global last_percent_reported\n", + " percent = int(count * blockSize * 100 / totalSize)\n", + "\n", + " if last_percent_reported != percent:\n", + " if percent % 5 == 0:\n", + " sys.stdout.write(\"%s%%\" % percent)\n", + " sys.stdout.flush()\n", + " else:\n", + " sys.stdout.write(\".\")\n", + " sys.stdout.flush()\n", + " \n", + " last_percent_reported = percent\n", + " \n", "def maybe_download(filename, expected_bytes, force=False):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", " if force or not os.path.exists(filename):\n", - " filename, _ = urlretrieve(url + filename, filename)\n", + " print('Attempting to download:', filename) \n", + " filename, _ = urlretrieve(url + filename, filename, reporthook=download_progress_hook)\n", + " print('\\nDownload Complete!')\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", " print('Found and verified', filename)\n", From 4cd7d2555c172cf498fdb1be1c490c4fbab99196 Mon Sep 17 00:00:00 2001 From: Zohar Jackson Date: Sun, 8 May 2016 21:32:07 +0300 Subject: [PATCH 065/123] Added comments to clarify how/why the embeddings are being minimized. Reason for commit: For a student who has been going through the udacity examples, this particular use of the minimize function is a bit confusing as its difference between the previous examples is subtle. To the student it appears that only the softmax weights are being modified. --- 5_word2vec.ipynb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 62dbec4e114..f932f62e280 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -446,6 +446,11 @@ " train_labels, num_sampled, vocabulary_size))\n", "\n", " # Optimizer.\n", + " # Note: The optimizer will optimize the softmax_weights AND the embeddings.\n", + " # This is because the embeddings are defined as a variable quantity and the\n", + " # optimizer's `minimize` method will by default modify all variable quantities \n", + " # that contribute to the tensor it is passed.\n", + " # See docs on `tf.train.Optimizer.minimize()` for more details.\n", " optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)\n", " \n", " # Compute the similarity between minibatch examples and all embeddings.\n", From a03d93103c9ccfd0e217bca5b833dc1a14cc070f Mon Sep 17 00:00:00 2001 From: Derek Murray Date: Mon, 23 May 2016 11:39:39 -0800 Subject: [PATCH 066/123] Merge changes from github. Change: 123026122 --- 1_notmnist.ipynb | 22 +++++++++++++++++++++- 5_word2vec.ipynb | 5 +++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 22654458154..32ece419b02 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -110,11 +110,31 @@ }, "source": [ "url = 'http://commondatastorage.googleapis.com/books1000/'\n", + "last_percent_reported = None\n", "\n", + "def download_progress_hook(count, blockSize, totalSize):\n", + " \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n", + " slow internet connections. Reports every 1% change in download progress.\n", + " \"\"\"\n", + " global last_percent_reported\n", + " percent = int(count * blockSize * 100 / totalSize)\n", + "\n", + " if last_percent_reported != percent:\n", + " if percent % 5 == 0:\n", + " sys.stdout.write(\"%s%%\" % percent)\n", + " sys.stdout.flush()\n", + " else:\n", + " sys.stdout.write(\".\")\n", + " sys.stdout.flush()\n", + " \n", + " last_percent_reported = percent\n", + " \n", "def maybe_download(filename, expected_bytes, force=False):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", " if force or not os.path.exists(filename):\n", - " filename, _ = urlretrieve(url + filename, filename)\n", + " print('Attempting to download:', filename) \n", + " filename, _ = urlretrieve(url + filename, filename, reporthook=download_progress_hook)\n", + " print('\\nDownload Complete!')\n", " statinfo = os.stat(filename)\n", " if statinfo.st_size == expected_bytes:\n", " print('Found and verified', filename)\n", diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index 62dbec4e114..f932f62e280 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -446,6 +446,11 @@ " train_labels, num_sampled, vocabulary_size))\n", "\n", " # Optimizer.\n", + " # Note: The optimizer will optimize the softmax_weights AND the embeddings.\n", + " # This is because the embeddings are defined as a variable quantity and the\n", + " # optimizer's `minimize` method will by default modify all variable quantities \n", + " # that contribute to the tensor it is passed.\n", + " # See docs on `tf.train.Optimizer.minimize()` for more details.\n", " optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)\n", " \n", " # Compute the similarity between minibatch examples and all embeddings.\n", From 446839c1ca9dc9eb798d20be7510bd10dca64ae2 Mon Sep 17 00:00:00 2001 From: Justin Harris Date: Wed, 25 May 2016 20:23:04 -0400 Subject: [PATCH 067/123] examples/udacity: Ignore data --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..30f9b9616f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +notMNIST_large* +notMNIST_small* From 6cbc9d6c01911c1c7a5c41edf8ff98470d14bf08 Mon Sep 17 00:00:00 2001 From: raoqiyu Date: Fri, 27 May 2016 18:13:07 +0800 Subject: [PATCH 068/123] load the readable data ```py dataset = np.ndarray(shape=(len(image_files), image_size, image_size), dtype=np.float32) for image_index, image in enumerate(image_files): ... num_images = image_index + 1 dataset = dataset[0:num_images, :, :] ``` By doing so, `num_images` will always equal to `len(image_files)`. So the code here, `dataset = dataset[0:num_images, :, :]` cannot select the valid (readable) images. But from the output, it works just fine. Why it work fine?? I think the job can be done by the following code. ```py dataset = np.ndarray(shape=(len(image_files), image_size, image_size), dtype=np.float32) num_images = 0 for image in image_files: ... num_images = num_images + 1 dataset = dataset[0:num_images, :, :] ```" --- 1_notmnist.ipynb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 32ece419b02..01c6231ab4d 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -319,18 +319,19 @@ " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", " dtype=np.float32)\n", " print(folder)\n", - " for image_index, image in enumerate(image_files):\n", + " num_images = 0\n", + " for image in image_files:\n", " image_file = os.path.join(folder, image)\n", " try:\n", " image_data = (ndimage.imread(image_file).astype(float) - \n", " pixel_depth / 2) / pixel_depth\n", " if image_data.shape != (image_size, image_size):\n", " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", - " dataset[image_index, :, :] = image_data\n", + " dataset[num_images, :, :] = image_data\n", + " num_images = num_images + 1\n", " except IOError as e:\n", " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", " \n", - " num_images = image_index + 1\n", " dataset = dataset[0:num_images, :, :]\n", " if num_images < min_num_images:\n", " raise Exception('Many fewer images than expected: %d < %d' %\n", From 7d00fdc2ee3d8a77d359ce280226e06058fbf978 Mon Sep 17 00:00:00 2001 From: Martin Wicke Date: Fri, 3 Jun 2016 14:23:52 -0800 Subject: [PATCH 069/123] Merge changes from github. Change: 124012080 --- 1_notmnist.ipynb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 32ece419b02..01c6231ab4d 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -319,18 +319,19 @@ " dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n", " dtype=np.float32)\n", " print(folder)\n", - " for image_index, image in enumerate(image_files):\n", + " num_images = 0\n", + " for image in image_files:\n", " image_file = os.path.join(folder, image)\n", " try:\n", " image_data = (ndimage.imread(image_file).astype(float) - \n", " pixel_depth / 2) / pixel_depth\n", " if image_data.shape != (image_size, image_size):\n", " raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n", - " dataset[image_index, :, :] = image_data\n", + " dataset[num_images, :, :] = image_data\n", + " num_images = num_images + 1\n", " except IOError as e:\n", " print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n", " \n", - " num_images = image_index + 1\n", " dataset = dataset[0:num_images, :, :]\n", " if num_images < min_num_images:\n", " raise Exception('Many fewer images than expected: %d < %d' %\n", From f2a1337138e8f7e830c473d0ff21e867cd63ff79 Mon Sep 17 00:00:00 2001 From: Nishant Agrawal Date: Sat, 25 Jun 2016 21:58:50 +0530 Subject: [PATCH 070/123] docs: Change "valued" to "values" (#3041) --- 2_fullyconnected.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 588b581a69b..2d1dfa2fba6 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -258,7 +258,7 @@ " \n", " # Variables.\n", " # These are the parameters that we are going to be training. The weight\n", - " # matrix will be initialized using random valued following a (truncated)\n", + " # matrix will be initialized using random values following a (truncated)\n", " # normal distribution. The biases get initialized to zero.\n", " weights = tf.Variable(\n", " tf.truncated_normal([image_size * image_size, num_labels]))\n", From f96dbbb41e44a0763acc59108742f7ab293d68e0 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Thu, 30 Jun 2016 12:10:50 -0800 Subject: [PATCH 071/123] Merge changes from github. Change: 126335170 --- 2_fullyconnected.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 588b581a69b..2d1dfa2fba6 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -258,7 +258,7 @@ " \n", " # Variables.\n", " # These are the parameters that we are going to be training. The weight\n", - " # matrix will be initialized using random valued following a (truncated)\n", + " # matrix will be initialized using random values following a (truncated)\n", " # normal distribution. The biases get initialized to zero.\n", " weights = tf.Variable(\n", " tf.truncated_normal([image_size * image_size, num_labels]))\n", From b2c47edf4410a20255dda2a8b9fb0362748fa059 Mon Sep 17 00:00:00 2001 From: harold cooper Date: Thu, 7 Jul 2016 12:05:58 -0400 Subject: [PATCH 072/123] instructions for saving progress using the udacity docker image People not used to Docker might be surprised if all of their "saved" progress disappears. --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 98edc71e594..58db9d71c92 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,21 @@ On mac, find the virtual machine's IP using: Then go to: http://IP:8888 (likely http://192.168.99.100:8888) +Saving Your Progress +-------------------- + +Because of the `--rm` flag above, stopping the docker container removes it, so any changes you've made will disappear. One way around this is to remove the `--rm` flag, and name the container for easy restarting: +```sh +# you only need to "run" the container the first time: +docker run -p 8888:8888 -it --name tensorflow-udacity b.gcr.io/tensorflow-udacity/assignments:0.5.0 +# …do various things… +# when you're done, control-C to kill jupyter and stop the container +# when you're ready to do more things, you can now just "start" the container: +docker start -ai tensorflow-udacity +# …do more things… +# …repeat… +``` + FAQ --- From 2ee74178f58df66847552b67e12da753ac0bdd80 Mon Sep 17 00:00:00 2001 From: Darcy Liu Date: Fri, 8 Jul 2016 03:25:49 +0100 Subject: [PATCH 073/123] Reserve Udacity docker container after the session finished --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 98edc71e594..07d2617bdde 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.5.0 + docker run -p 8888:8888 -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 Accessing the Notebooks ----------------------- From 77b060fc992491d40e63d88b92663535e9995b97 Mon Sep 17 00:00:00 2001 From: Andrew Harp Date: Mon, 11 Jul 2016 09:39:41 -0800 Subject: [PATCH 074/123] Merge changes from github. Change: 127101926 --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 98edc71e594..4743ab557bb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it --rm b.gcr.io/tensorflow-udacity/assignments:0.5.0 + docker run -p 8888:8888 -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 Accessing the Notebooks ----------------------- @@ -19,6 +19,21 @@ On mac, find the virtual machine's IP using: Then go to: http://IP:8888 (likely http://192.168.99.100:8888) +Saving Your Progress +-------------------- + +Because of the `--rm` flag above, stopping the docker container removes it, so any changes you've made will disappear. One way around this is to remove the `--rm` flag, and name the container for easy restarting: +```sh +# you only need to "run" the container the first time: +docker run -p 8888:8888 -it --name tensorflow-udacity b.gcr.io/tensorflow-udacity/assignments:0.5.0 +# …do various things… +# when you're done, control-C to kill jupyter and stop the container +# when you're ready to do more things, you can now just "start" the container: +docker start -ai tensorflow-udacity +# …do more things… +# …repeat… +``` + FAQ --- From d3f7348395b8fb72478386a1147e4543398b9293 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Wed, 13 Jul 2016 17:03:20 -0700 Subject: [PATCH 075/123] Remove confusing section (#3303) Removing the --rm is simpler. If users want to use a named container, they can, but it's not essential. --- README.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/README.md b/README.md index 4743ab557bb..07d2617bdde 100644 --- a/README.md +++ b/README.md @@ -19,21 +19,6 @@ On mac, find the virtual machine's IP using: Then go to: http://IP:8888 (likely http://192.168.99.100:8888) -Saving Your Progress --------------------- - -Because of the `--rm` flag above, stopping the docker container removes it, so any changes you've made will disappear. One way around this is to remove the `--rm` flag, and name the container for easy restarting: -```sh -# you only need to "run" the container the first time: -docker run -p 8888:8888 -it --name tensorflow-udacity b.gcr.io/tensorflow-udacity/assignments:0.5.0 -# …do various things… -# when you're done, control-C to kill jupyter and stop the container -# when you're ready to do more things, you can now just "start" the container: -docker start -ai tensorflow-udacity -# …do more things… -# …repeat… -``` - FAQ --- From 604e420bff2fc62d617ca46f7391e74e2e054631 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Thu, 14 Jul 2016 13:27:38 -0700 Subject: [PATCH 076/123] Make the default command use a named container (#3318) It seems that it's a more common workflow than I assumed, and should be relatively foolproof. --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 07d2617bdde..1b0e5df5ee4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,11 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 + docker run -p 8888:8888 --name tensorflow-udacity -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 + +Note that if you ever exit the container, you can return to it using: + + docker start -ai tensorflow-udacity Accessing the Notebooks ----------------------- From bb7e6462be26b27c6cf09c05e9cdf20cac28101a Mon Sep 17 00:00:00 2001 From: Martin Wicke Date: Mon, 25 Jul 2016 13:48:16 -0800 Subject: [PATCH 077/123] Merge changes from github. Change: 128401884 --- README.md | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 4743ab557bb..1b0e5df5ee4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,11 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 + docker run -p 8888:8888 --name tensorflow-udacity -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 + +Note that if you ever exit the container, you can return to it using: + + docker start -ai tensorflow-udacity Accessing the Notebooks ----------------------- @@ -19,21 +23,6 @@ On mac, find the virtual machine's IP using: Then go to: http://IP:8888 (likely http://192.168.99.100:8888) -Saving Your Progress --------------------- - -Because of the `--rm` flag above, stopping the docker container removes it, so any changes you've made will disappear. One way around this is to remove the `--rm` flag, and name the container for easy restarting: -```sh -# you only need to "run" the container the first time: -docker run -p 8888:8888 -it --name tensorflow-udacity b.gcr.io/tensorflow-udacity/assignments:0.5.0 -# …do various things… -# when you're done, control-C to kill jupyter and stop the container -# when you're ready to do more things, you can now just "start" the container: -docker start -ai tensorflow-udacity -# …do more things… -# …repeat… -``` - FAQ --- From 11ed8fea62a6a52776dde0c572996f469a8dd5d9 Mon Sep 17 00:00:00 2001 From: Neil Han Date: Fri, 30 Sep 2016 07:57:43 -0700 Subject: [PATCH 078/123] Fix image loading error, autocomplete with ipython in udacity Dockerfile (#4671) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 4af441018bf..b7b094621a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke -RUN pip install scikit-learn +RUN pip install scikit-learn pyreadline Pillow RUN rm -rf /notebooks/* ADD *.ipynb /notebooks/ WORKDIR /notebooks From 461440934c9986ebb8b077a396d551df63152ff4 Mon Sep 17 00:00:00 2001 From: Pablo Moyano Date: Sat, 1 Oct 2016 22:15:39 -0700 Subject: [PATCH 079/123] small typo fix "matlotlib" should be "matplotlib" --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 01c6231ab4d..b60d4a9034f 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -57,7 +57,7 @@ "from six.moves.urllib.request import urlretrieve\n", "from six.moves import cPickle as pickle\n", "\n", - "# Config the matlotlib backend as plotting inline in IPython\n", + "# Config the matplotlib backend as plotting inline in IPython\n", "%matplotlib inline" ], "outputs": [], From 054657d008cfd57961b9f718462120af4a52db1b Mon Sep 17 00:00:00 2001 From: David Brailovsky Date: Wed, 5 Oct 2016 08:01:51 +0300 Subject: [PATCH 080/123] fix comment in notebook (#4751) --- 3_regularization.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3_regularization.ipynb b/3_regularization.ipynb index 5e1d30f54fc..2658c00b6c7 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -180,7 +180,7 @@ "\n", "def reformat(dataset, labels):\n", " dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n", - " # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]\n", + " # Map 1 to [0.0, 1.0, 0.0 ...], 2 to [0.0, 0.0, 1.0 ...]\n", " labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n", " return dataset, labels\n", "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", From 6b76f3d26042e6e2d2959eb9815bb3990ba9f83c Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 10 Oct 2016 10:26:22 -0800 Subject: [PATCH 081/123] Merge changes from github. Change: 135698415 --- 1_notmnist.ipynb | 2 +- 3_regularization.ipynb | 2 +- Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 01c6231ab4d..b60d4a9034f 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -57,7 +57,7 @@ "from six.moves.urllib.request import urlretrieve\n", "from six.moves import cPickle as pickle\n", "\n", - "# Config the matlotlib backend as plotting inline in IPython\n", + "# Config the matplotlib backend as plotting inline in IPython\n", "%matplotlib inline" ], "outputs": [], diff --git a/3_regularization.ipynb b/3_regularization.ipynb index 5e1d30f54fc..2658c00b6c7 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -180,7 +180,7 @@ "\n", "def reformat(dataset, labels):\n", " dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)\n", - " # Map 2 to [0.0, 1.0, 0.0 ...], 3 to [0.0, 0.0, 1.0 ...]\n", + " # Map 1 to [0.0, 1.0, 0.0 ...], 2 to [0.0, 0.0, 1.0 ...]\n", " labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)\n", " return dataset, labels\n", "train_dataset, train_labels = reformat(train_dataset, train_labels)\n", diff --git a/Dockerfile b/Dockerfile index 4af441018bf..b7b094621a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke -RUN pip install scikit-learn +RUN pip install scikit-learn pyreadline Pillow RUN rm -rf /notebooks/* ADD *.ipynb /notebooks/ WORKDIR /notebooks From 9970ff13a91c402f29b0a8dfc1ca5310c74189f3 Mon Sep 17 00:00:00 2001 From: Craig Citro Date: Fri, 21 Oct 2016 19:30:06 -0800 Subject: [PATCH 082/123] Update the Udacity Docker containers: 1/ Switch to using gcr.io instead of b.gcr.io 2/ Add libjpeg so that Pillow >=3.0 can be installed. Change: 136901293 --- Dockerfile | 8 ++++++++ README.md | 11 ++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index b7b094621a8..9f5ef1aca3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,13 @@ FROM gcr.io/tensorflow/tensorflow:latest MAINTAINER Vincent Vanhoucke + +# Pillow needs libjpeg by default as of 3.0. +RUN apt-get update && apt-get install -y --no-install-recommends \ + libjpeg8-dev \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + RUN pip install scikit-learn pyreadline Pillow RUN rm -rf /notebooks/* ADD *.ipynb /notebooks/ diff --git a/README.md b/README.md index 1b0e5df5ee4..b8bf3dd3b06 100644 --- a/README.md +++ b/README.md @@ -82,11 +82,11 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.5.0 - docker tag $USER/assignments b.gcr.io/tensorflow-udacity/assignments:$V - gcloud docker push b.gcr.io/tensorflow-udacity/assignments - docker tag -f $USER/assignments b.gcr.io/tensorflow-udacity/assignments:latest - gcloud docker push b.gcr.io/tensorflow-udacity/assignments + V=0.6.0 + docker tag $USER/assignments gcr.io/tensorflow/udacity-assignments:$V + gcloud docker push gcr.io/tensorflow/udacity-assignments + docker tag -f $USER/assignments gcr.io/tensorflow/udacity-assignments:latest + gcloud docker push gcr.io/tensorflow/udacity-assignments History ------- @@ -96,3 +96,4 @@ History * 0.3.0: Use 0.7.1 release. * 0.4.0: Move notMMNIST data for Google Cloud. * 0.5.0: Actually use 0.7.1 release. +* 0.6.0: Update to TF 0.10.0, add libjpeg (for Pillow). From 8b024d683b2bad1550dd55d8f045c2d103ed4918 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 24 Oct 2016 13:05:42 -0800 Subject: [PATCH 083/123] Sync hidden files. Change: 137077262 --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..30f9b9616f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +notMNIST_large* +notMNIST_small* From 69fdc2ada36cf5fb9ec39c3d8720f04fe70d97e9 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Mon, 24 Oct 2016 15:08:48 -0800 Subject: [PATCH 084/123] Update instructions to point to Docker image 0.6.0. Fixes #5070 Change: 137092810 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8bf3dd3b06..2814e5c62a8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 --name tensorflow-udacity -it b.gcr.io/tensorflow-udacity/assignments:0.5.0 + docker run -p 8888:8888 --name tensorflow-udacity -it gcr.io/tensorflow/udacity-assignments:0.6.0 Note that if you ever exit the container, you can return to it using: From 96da798a0b87fec258ca4f557bf3e6960774e71b Mon Sep 17 00:00:00 2001 From: Illia Polosukhin Date: Thu, 3 Nov 2016 14:46:06 -0800 Subject: [PATCH 085/123] Replace usages initialize_all_variables -> global_variables_initializer Change: 138128703 --- 2_fullyconnected.ipynb | 4 ++-- 4_convolutions.ipynb | 2 +- 5_word2vec.ipynb | 2 +- 6_lstm.ipynb | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 2d1dfa2fba6..8a845171a42 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -344,7 +344,7 @@ " # This is a one-time operation which ensures the parameters get initialized as\n", " # we described in the graph: random weights for the matrix, zeros for the\n", " # biases. \n", - " tf.initialize_all_variables().run()\n", + " tf.global_variables_initializer().run()\n", " print('Initialized')\n", " for step in range(num_steps):\n", " # Run the computations. We tell .run() that we want to run the optimizer,\n", @@ -511,7 +511,7 @@ "num_steps = 3001\n", "\n", "with tf.Session(graph=graph) as session:\n", - " tf.initialize_all_variables().run()\n", + " tf.global_variables_initializer().run()\n", " print(\"Initialized\")\n", " for step in range(num_steps):\n", " # Pick an offset within the training data, which has been randomized.\n", diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index ecddcf43691..464d2c836ed 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -338,7 +338,7 @@ "num_steps = 1001\n", "\n", "with tf.Session(graph=graph) as session:\n", - " tf.initialize_all_variables().run()\n", + " tf.global_variables_initializer().run()\n", " print('Initialized')\n", " for step in range(num_steps):\n", " offset = (step * batch_size) % (train_labels.shape[0] - batch_size)\n", diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index f932f62e280..ec6413a0a37 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -509,7 +509,7 @@ "num_steps = 100001\n", "\n", "with tf.Session(graph=graph) as session:\n", - " tf.initialize_all_variables().run()\n", + " tf.global_variables_initializer().run()\n", " print('Initialized')\n", " average_loss = 0\n", " for step in range(num_steps):\n", diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 75a7027784b..6a9a5be9647 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -656,7 +656,7 @@ "summary_frequency = 100\n", "\n", "with tf.Session(graph=graph) as session:\n", - " tf.initialize_all_variables().run()\n", + " tf.global_variables_initializer().run()\n", " print('Initialized')\n", " mean_loss = 0\n", " for step in range(num_steps):\n", From 89f9877521866058e6284a749bb8d02c61ebb7e8 Mon Sep 17 00:00:00 2001 From: Ronny Date: Sat, 3 Dec 2016 09:18:08 +1100 Subject: [PATCH 086/123] Fix issue #6036 (#6038) --- 6_lstm.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 6a9a5be9647..a2550f07b65 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -167,10 +167,10 @@ }, "source": [ "def read_data(filename):\n", - " f = zipfile.ZipFile(filename)\n", - " for name in f.namelist():\n", - " return tf.compat.as_str(f.read(name))\n", - " f.close()\n", + " with zipfile.ZipFile(filename) as f:\n", + " name = f.namelist()[0]\n", + " data = tf.compat.as_str(f.read(name))\n", + " return data\n", " \n", "text = read_data(filename)\n", "print('Data size %d' % len(text))" From 28a86677bdcefbdc375afba63d470dd5d764a9aa Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 6 Dec 2016 18:25:37 -0800 Subject: [PATCH 087/123] Switch all tf.concat(concat_dim, value, name) calls in third_party/tensorflow to tf.concat_v2(value, axis, name). Change: 141255675 --- 6_lstm.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 6a9a5be9647..159182c3fa6 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -573,10 +573,10 @@ " with tf.control_dependencies([saved_output.assign(output),\n", " saved_state.assign(state)]):\n", " # Classifier.\n", - " logits = tf.nn.xw_plus_b(tf.concat(0, outputs), w, b)\n", + " logits = tf.nn.xw_plus_b(tf.concat_v2(outputs, 0), w, b)\n", " loss = tf.reduce_mean(\n", " tf.nn.softmax_cross_entropy_with_logits(\n", - " logits, tf.concat(0, train_labels)))\n", + " logits, tf.concat_v2(train_labels, 0)))\n", "\n", " # Optimizer.\n", " global_step = tf.Variable(0)\n", @@ -1066,4 +1066,4 @@ ] } ] -} \ No newline at end of file +} From 29cb9b06e9920a56d6c8573766cee0d1e681ff4d Mon Sep 17 00:00:00 2001 From: Andrew Harp Date: Thu, 8 Dec 2016 20:05:49 -0800 Subject: [PATCH 088/123] Merge changes from github. Additionally: - change single quotes to double quotes to make path rewriting easier - guard windows lib reference with PLATFORM_WINDOWS - fixed failing kmeans test Change: 141515942 --- 6_lstm.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 159182c3fa6..64e913acf8c 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -167,10 +167,10 @@ }, "source": [ "def read_data(filename):\n", - " f = zipfile.ZipFile(filename)\n", - " for name in f.namelist():\n", - " return tf.compat.as_str(f.read(name))\n", - " f.close()\n", + " with zipfile.ZipFile(filename) as f:\n", + " name = f.namelist()[0]\n", + " data = tf.compat.as_str(f.read(name))\n", + " return data\n", " \n", "text = read_data(filename)\n", "print('Data size %d' % len(text))" From f6352ab43eaf6f84d58a355528033c09e551be5c Mon Sep 17 00:00:00 2001 From: Sam Putnam Date: Tue, 20 Dec 2016 19:22:34 -0500 Subject: [PATCH 089/123] Added FAQ entry for cannot connect to Docker daemon (#6406) * Added FAQ for cannot connect to Docker daemon Linked to popular SO answer. * Removed sentence lacking useful information --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2814e5c62a8..6e40c3bae69 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,9 @@ to get the ip of the new virtual machine. To switch from default virtual machine Note that `docker-machine env tensorflow` outputs some environment variables such like `DOCKER_HOST`. Then your docker client is now connected to the docker host in virtual machine `tensorflow` +* **I'm getting the error - docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host? - when I run 'docker run'.** + +This is a permissions issue, and a popular answer is provided for Linux and Max OSX [here](http://stackoverflow.com/questions/21871479/docker-cant-connect-to-docker-daemon) on StackOverflow. Notes for anyone needing to build their own containers (mostly instructors) =========================================================================== From 5ab0d0a16767fec64acf2e9f848e44555e4940a0 Mon Sep 17 00:00:00 2001 From: Jonathan Hseu Date: Thu, 22 Dec 2016 15:38:30 -0800 Subject: [PATCH 090/123] Merge changes from github. Change: 142805270 --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2814e5c62a8..6e40c3bae69 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,9 @@ to get the ip of the new virtual machine. To switch from default virtual machine Note that `docker-machine env tensorflow` outputs some environment variables such like `DOCKER_HOST`. Then your docker client is now connected to the docker host in virtual machine `tensorflow` +* **I'm getting the error - docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host? - when I run 'docker run'.** + +This is a permissions issue, and a popular answer is provided for Linux and Max OSX [here](http://stackoverflow.com/questions/21871479/docker-cant-connect-to-docker-daemon) on StackOverflow. Notes for anyone needing to build their own containers (mostly instructors) =========================================================================== From 749eb17c4e08ba18fdbc7c688aaeb8aa867e1844 Mon Sep 17 00:00:00 2001 From: rasbt Date: Tue, 27 Dec 2016 01:41:49 -0500 Subject: [PATCH 091/123] fix spelling/insert correct reference to udacity notebook --- 3_regularization.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3_regularization.ipynb b/3_regularization.ipynb index 2658c00b6c7..5dc6f148611 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -60,7 +60,7 @@ "colab_type": "text" }, "source": [ - "First reload the data we generated in _notmist.ipynb_." + "First reload the data we generated in `1_notmnist.ipynb`." ] }, { From edaee312f452ab05690a23f5c55456b20c35cd7c Mon Sep 17 00:00:00 2001 From: Michael Basilyan Date: Sat, 31 Dec 2016 20:15:25 -0800 Subject: [PATCH 092/123] 1% -> 5% in comment The download reports every 5% not every 1%. --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index b60d4a9034f..c9ec86f71a2 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -114,7 +114,7 @@ "\n", "def download_progress_hook(count, blockSize, totalSize):\n", " \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n", - " slow internet connections. Reports every 1% change in download progress.\n", + " slow internet connections. Reports every 5% change in download progress.\n", " \"\"\"\n", " global last_percent_reported\n", " percent = int(count * blockSize * 100 / totalSize)\n", From 2efe11678fe4ba088452f250f9c1859522ac6379 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 2 Jan 2017 22:19:48 -0800 Subject: [PATCH 093/123] Merge changes from github. Change: 143412147 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index b60d4a9034f..c9ec86f71a2 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -114,7 +114,7 @@ "\n", "def download_progress_hook(count, blockSize, totalSize):\n", " \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n", - " slow internet connections. Reports every 1% change in download progress.\n", + " slow internet connections. Reports every 5% change in download progress.\n", " \"\"\"\n", " global last_percent_reported\n", " percent = int(count * blockSize * 100 / totalSize)\n", From 189f752be708a60bff0c7640a4500ca33736d629 Mon Sep 17 00:00:00 2001 From: Martin Wicke Date: Wed, 4 Jan 2017 21:25:34 -0800 Subject: [PATCH 094/123] Change arg order for {softmax,sparse_softmax,sigmoid}_cross_entropy_with_logits to be (labels, predictions), and force use of named args to avoid accidents. Change: 143629623 --- 2_fullyconnected.ipynb | 4 ++-- 4_convolutions.ipynb | 2 +- 6_lstm.ipynb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/2_fullyconnected.ipynb b/2_fullyconnected.ipynb index 8a845171a42..a6a206307aa 100644 --- a/2_fullyconnected.ipynb +++ b/2_fullyconnected.ipynb @@ -271,7 +271,7 @@ " # cross-entropy across all training examples: that's our loss.\n", " logits = tf.matmul(tf_train_dataset, weights) + biases\n", " loss = tf.reduce_mean(\n", - " tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n", + " tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels, logits=logits))\n", " \n", " # Optimizer.\n", " # We are going to find the minimum of this loss using gradient descent.\n", @@ -448,7 +448,7 @@ " # Training computation.\n", " logits = tf.matmul(tf_train_dataset, weights) + biases\n", " loss = tf.reduce_mean(\n", - " tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n", + " tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels, logits=logits))\n", " \n", " # Optimizer.\n", " optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)\n", diff --git a/4_convolutions.ipynb b/4_convolutions.ipynb index 464d2c836ed..d607dddbb2d 100644 --- a/4_convolutions.ipynb +++ b/4_convolutions.ipynb @@ -286,7 +286,7 @@ " # Training computation.\n", " logits = model(tf_train_dataset)\n", " loss = tf.reduce_mean(\n", - " tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))\n", + " tf.nn.softmax_cross_entropy_with_logits(labels=tf_train_labels, logits=logits))\n", " \n", " # Optimizer.\n", " optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)\n", diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 64e913acf8c..7e78c5328fb 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -576,7 +576,7 @@ " logits = tf.nn.xw_plus_b(tf.concat_v2(outputs, 0), w, b)\n", " loss = tf.reduce_mean(\n", " tf.nn.softmax_cross_entropy_with_logits(\n", - " logits, tf.concat_v2(train_labels, 0)))\n", + " labels=tf.concat_v2(train_labels, 0), logits=logits))\n", "\n", " # Optimizer.\n", " global_step = tf.Variable(0)\n", From dd55fe360e75b0209b9c6bb61731e4cde60d0912 Mon Sep 17 00:00:00 2001 From: Rohan Jain Date: Thu, 5 Jan 2017 14:39:17 -0800 Subject: [PATCH 095/123] Merge changes from github. Change: 143710639 --- 3_regularization.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3_regularization.ipynb b/3_regularization.ipynb index 2658c00b6c7..5dc6f148611 100644 --- a/3_regularization.ipynb +++ b/3_regularization.ipynb @@ -60,7 +60,7 @@ "colab_type": "text" }, "source": [ - "First reload the data we generated in _notmist.ipynb_." + "First reload the data we generated in `1_notmnist.ipynb`." ] }, { From 014638f8b1be94d858cc8e587f77a552f877dc27 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 10 Jan 2017 18:21:29 -0800 Subject: [PATCH 096/123] Switch tf.concat_v2 references in third_party/tensorflow to tf.concat. Change: 144153795 --- 6_lstm.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/6_lstm.ipynb b/6_lstm.ipynb index 7e78c5328fb..b17e70be95d 100644 --- a/6_lstm.ipynb +++ b/6_lstm.ipynb @@ -573,10 +573,10 @@ " with tf.control_dependencies([saved_output.assign(output),\n", " saved_state.assign(state)]):\n", " # Classifier.\n", - " logits = tf.nn.xw_plus_b(tf.concat_v2(outputs, 0), w, b)\n", + " logits = tf.nn.xw_plus_b(tf.concat(outputs, 0), w, b)\n", " loss = tf.reduce_mean(\n", " tf.nn.softmax_cross_entropy_with_logits(\n", - " labels=tf.concat_v2(train_labels, 0), logits=logits))\n", + " labels=tf.concat(train_labels, 0), logits=logits))\n", "\n", " # Optimizer.\n", " global_step = tf.Variable(0)\n", From 251e77aa0e73201c4da7f03b626a8c21a97c0bab Mon Sep 17 00:00:00 2001 From: KOUASSI Konan Jean-Claude Date: Mon, 16 Jan 2017 18:16:17 +0000 Subject: [PATCH 097/123] docs: add a troubleshooting section to the faq (#6368) docs: add a troubleshooting section to the faq Sometimes we could have an issue with a running docker, specifically with the TLS certificate. It is important for a beginner to be aware of that. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 6e40c3bae69..143a75a3e9f 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,15 @@ to get the ip of the new virtual machine. To switch from default virtual machine Note that `docker-machine env tensorflow` outputs some environment variables such like `DOCKER_HOST`. Then your docker client is now connected to the docker host in virtual machine `tensorflow` +* **I'm getting a TLS connection error.** + +If you get an error about the TLS connection of your docker, run the command below to confirm the problem. + + docker-machine ip tensorflow + +Then if it is the case use the instructions on [this page](https://docs.docker.com/toolbox/faqs/troubleshoot/) to solve the issue. + + * **I'm getting the error - docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host? - when I run 'docker run'.** This is a permissions issue, and a popular answer is provided for Linux and Max OSX [here](http://stackoverflow.com/questions/21871479/docker-cant-connect-to-docker-daemon) on StackOverflow. From 655c01e86c38f5368ac1079f145384e6369fd5f6 Mon Sep 17 00:00:00 2001 From: Patrick Nguyen Date: Tue, 17 Jan 2017 10:57:25 -0800 Subject: [PATCH 098/123] Merge changes from github. Change: 144729490 --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 6e40c3bae69..143a75a3e9f 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,15 @@ to get the ip of the new virtual machine. To switch from default virtual machine Note that `docker-machine env tensorflow` outputs some environment variables such like `DOCKER_HOST`. Then your docker client is now connected to the docker host in virtual machine `tensorflow` +* **I'm getting a TLS connection error.** + +If you get an error about the TLS connection of your docker, run the command below to confirm the problem. + + docker-machine ip tensorflow + +Then if it is the case use the instructions on [this page](https://docs.docker.com/toolbox/faqs/troubleshoot/) to solve the issue. + + * **I'm getting the error - docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host? - when I run 'docker run'.** This is a permissions issue, and a popular answer is provided for Linux and Max OSX [here](http://stackoverflow.com/questions/21871479/docker-cant-connect-to-docker-daemon) on StackOverflow. From b1c2e4d5564678e22084dee23754d01edd31d7e8 Mon Sep 17 00:00:00 2001 From: Ashutosh Das Date: Mon, 30 Jan 2017 13:38:44 +0530 Subject: [PATCH 099/123] Fixed error due to api changes (#7099) --- 5_word2vec.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index ec6413a0a37..9d4243d7aea 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -442,8 +442,8 @@ " embed = tf.nn.embedding_lookup(embeddings, train_dataset)\n", " # Compute the softmax loss, using a sample of the negative labels each time.\n", " loss = tf.reduce_mean(\n", - " tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,\n", - " train_labels, num_sampled, vocabulary_size))\n", + " tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=embed,\n", + " labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size))\n", "\n", " # Optimizer.\n", " # Note: The optimizer will optimize the softmax_weights AND the embeddings.\n", From 0859e14c0b4ce46f053a4a141d0e57af0e9f04f7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 1 Feb 2017 18:13:33 -0800 Subject: [PATCH 100/123] Merge changes from github. Change: 146316196 --- 5_word2vec.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5_word2vec.ipynb b/5_word2vec.ipynb index ec6413a0a37..9d4243d7aea 100644 --- a/5_word2vec.ipynb +++ b/5_word2vec.ipynb @@ -442,8 +442,8 @@ " embed = tf.nn.embedding_lookup(embeddings, train_dataset)\n", " # Compute the softmax loss, using a sample of the negative labels each time.\n", " loss = tf.reduce_mean(\n", - " tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,\n", - " train_labels, num_sampled, vocabulary_size))\n", + " tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=embed,\n", + " labels=train_labels, num_sampled=num_sampled, num_classes=vocabulary_size))\n", "\n", " # Optimizer.\n", " # Note: The optimizer will optimize the softmax_weights AND the embeddings.\n", From b9b5b633c5bbb8a3b61f77d50656ed306cf3ce7c Mon Sep 17 00:00:00 2001 From: mlucool Date: Thu, 2 Feb 2017 00:56:57 -0500 Subject: [PATCH 101/123] Allow for data stored in an arbitrary location (#7200) If you want to store data somewhere you have more space or be able to ignore a folder in sync, change the data_root. --- 1_notmnist.ipynb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index c9ec86f71a2..4b0a20b1dd2 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -111,6 +111,7 @@ "source": [ "url = 'http://commondatastorage.googleapis.com/books1000/'\n", "last_percent_reported = None\n", + "data_root = '.' # Change me to store data elsewhere\n", "\n", "def download_progress_hook(count, blockSize, totalSize):\n", " \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n", @@ -131,17 +132,18 @@ " \n", "def maybe_download(filename, expected_bytes, force=False):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", - " if force or not os.path.exists(filename):\n", + " dest_filename = os.path.join(data_root, filename)\n", + " if force or not os.path.exists(dest_filename):\n", " print('Attempting to download:', filename) \n", - " filename, _ = urlretrieve(url + filename, filename, reporthook=download_progress_hook)\n", + " filename, _ = urlretrieve(url + filename, dest_filename, reporthook=download_progress_hook)\n", " print('\\nDownload Complete!')\n", - " statinfo = os.stat(filename)\n", + " statinfo = os.stat(dest_filename)\n", " if statinfo.st_size == expected_bytes:\n", - " print('Found and verified', filename)\n", + " print('Found and verified', dest_filename)\n", " else:\n", " raise Exception(\n", - " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", - " return filename\n", + " 'Failed to verify ' + dest_filename + '. Can you get to it with a browser?')\n", + " return dest_filename\n", "\n", "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", "test_filename = maybe_download('notMNIST_small.tar.gz', 8458043)" @@ -683,7 +685,7 @@ "cellView": "both" }, "source": [ - "pickle_file = 'notMNIST.pickle'\n", + "pickle_file = os.path.join(data_root, 'notMNIST.pickle')\n", "\n", "try:\n", " f = open(pickle_file, 'wb')\n", From 26693802912e5e9245084a30b205531a1804744d Mon Sep 17 00:00:00 2001 From: Benoit Steiner Date: Wed, 8 Feb 2017 09:25:09 -0800 Subject: [PATCH 102/123] Merge changes from github. Change: 146918929 --- 1_notmnist.ipynb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index c9ec86f71a2..4b0a20b1dd2 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -111,6 +111,7 @@ "source": [ "url = 'http://commondatastorage.googleapis.com/books1000/'\n", "last_percent_reported = None\n", + "data_root = '.' # Change me to store data elsewhere\n", "\n", "def download_progress_hook(count, blockSize, totalSize):\n", " \"\"\"A hook to report the progress of a download. This is mostly intended for users with\n", @@ -131,17 +132,18 @@ " \n", "def maybe_download(filename, expected_bytes, force=False):\n", " \"\"\"Download a file if not present, and make sure it's the right size.\"\"\"\n", - " if force or not os.path.exists(filename):\n", + " dest_filename = os.path.join(data_root, filename)\n", + " if force or not os.path.exists(dest_filename):\n", " print('Attempting to download:', filename) \n", - " filename, _ = urlretrieve(url + filename, filename, reporthook=download_progress_hook)\n", + " filename, _ = urlretrieve(url + filename, dest_filename, reporthook=download_progress_hook)\n", " print('\\nDownload Complete!')\n", - " statinfo = os.stat(filename)\n", + " statinfo = os.stat(dest_filename)\n", " if statinfo.st_size == expected_bytes:\n", - " print('Found and verified', filename)\n", + " print('Found and verified', dest_filename)\n", " else:\n", " raise Exception(\n", - " 'Failed to verify ' + filename + '. Can you get to it with a browser?')\n", - " return filename\n", + " 'Failed to verify ' + dest_filename + '. Can you get to it with a browser?')\n", + " return dest_filename\n", "\n", "train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)\n", "test_filename = maybe_download('notMNIST_small.tar.gz', 8458043)" @@ -683,7 +685,7 @@ "cellView": "both" }, "source": [ - "pickle_file = 'notMNIST.pickle'\n", + "pickle_file = os.path.join(data_root, 'notMNIST.pickle')\n", "\n", "try:\n", " f = open(pickle_file, 'wb')\n", From d0ce5c8e8db9aa1eb4e1ea073ac2e529501b593f Mon Sep 17 00:00:00 2001 From: Evgeny Mazovetskiy Date: Wed, 8 Feb 2017 20:11:04 +0100 Subject: [PATCH 103/123] set correct target directory for tar extractall() fixes a wrong path when data_root is other than '.' --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 4b0a20b1dd2..521cbf30006 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -219,7 +219,7 @@ " print('Extracting data for %s. This may take a while. Please wait.' % root)\n", " tar = tarfile.open(filename)\n", " sys.stdout.flush()\n", - " tar.extractall()\n", + " tar.extractall(data_root)\n", " tar.close()\n", " data_folders = [\n", " os.path.join(root, d) for d in sorted(os.listdir(root))\n", From 6df57415304e3b84b23ae80dd1ebb503310c8a2e Mon Sep 17 00:00:00 2001 From: Vijay Vasudevan Date: Fri, 17 Feb 2017 17:05:49 -0800 Subject: [PATCH 104/123] Merge changes from github. Change: 147897309 --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 4b0a20b1dd2..521cbf30006 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -219,7 +219,7 @@ " print('Extracting data for %s. This may take a while. Please wait.' % root)\n", " tar = tarfile.open(filename)\n", " sys.stdout.flush()\n", - " tar.extractall()\n", + " tar.extractall(data_root)\n", " tar.close()\n", " data_folders = [\n", " os.path.join(root, d) for d in sorted(os.listdir(root))\n", From fa894f854fb11b3b04c6018f6cd09b38f546cd97 Mon Sep 17 00:00:00 2001 From: Vincent Vanhoucke Date: Tue, 21 Feb 2017 15:01:51 -0800 Subject: [PATCH 105/123] Add latest Docker image based on TF 1.0.0 --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 143a75a3e9f..6faad294c2d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 --name tensorflow-udacity -it gcr.io/tensorflow/udacity-assignments:0.6.0 + docker run -p 8888:8888 --name tensorflow-udacity -it gcr.io/tensorflow/udacity-assignments:1.0.0 Note that if you ever exit the container, you can return to it using: @@ -94,10 +94,10 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.6.0 + V=1.0.0 docker tag $USER/assignments gcr.io/tensorflow/udacity-assignments:$V gcloud docker push gcr.io/tensorflow/udacity-assignments - docker tag -f $USER/assignments gcr.io/tensorflow/udacity-assignments:latest + docker tag $USER/assignments gcr.io/tensorflow/udacity-assignments:latest gcloud docker push gcr.io/tensorflow/udacity-assignments History @@ -109,3 +109,4 @@ History * 0.4.0: Move notMMNIST data for Google Cloud. * 0.5.0: Actually use 0.7.1 release. * 0.6.0: Update to TF 0.10.0, add libjpeg (for Pillow). +* 1.0.0: Update to TF 1.0.0 release. From a4837bc635d842d832c43916830f958ba91ae1a9 Mon Sep 17 00:00:00 2001 From: Andrew Harp Date: Wed, 1 Mar 2017 17:59:22 -0800 Subject: [PATCH 106/123] Merge changes from github. Change: 148954491 --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 143a75a3e9f..6faad294c2d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Course information can be found at https://www.udacity.com/course/deep-learning- Running the Docker container from the Google Cloud repository ------------------------------------------------------------- - docker run -p 8888:8888 --name tensorflow-udacity -it gcr.io/tensorflow/udacity-assignments:0.6.0 + docker run -p 8888:8888 --name tensorflow-udacity -it gcr.io/tensorflow/udacity-assignments:1.0.0 Note that if you ever exit the container, you can return to it using: @@ -94,10 +94,10 @@ This will allow you to save work and have access to generated files on the host Pushing a Google Cloud release ------------------------------ - V=0.6.0 + V=1.0.0 docker tag $USER/assignments gcr.io/tensorflow/udacity-assignments:$V gcloud docker push gcr.io/tensorflow/udacity-assignments - docker tag -f $USER/assignments gcr.io/tensorflow/udacity-assignments:latest + docker tag $USER/assignments gcr.io/tensorflow/udacity-assignments:latest gcloud docker push gcr.io/tensorflow/udacity-assignments History @@ -109,3 +109,4 @@ History * 0.4.0: Move notMMNIST data for Google Cloud. * 0.5.0: Actually use 0.7.1 release. * 0.6.0: Update to TF 0.10.0, add libjpeg (for Pillow). +* 1.0.0: Update to TF 1.0.0 release. From 15ad1fecf5a91c5982003598b7a450771b8e8c8c Mon Sep 17 00:00:00 2001 From: peeyush18 Date: Sat, 20 May 2017 02:25:16 +0530 Subject: [PATCH 107/123] Update 1_notmnist.ipynb (#10022) --- 1_notmnist.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 521cbf30006..5b2966c0062 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -109,7 +109,7 @@ "outputId": "0d0f85df-155f-4a89-8e7e-ee32df36ec8d" }, "source": [ - "url = 'http://commondatastorage.googleapis.com/books1000/'\n", + "url = 'https://commondatastorage.googleapis.com/books1000/'\n", "last_percent_reported = None\n", "data_root = '.' # Change me to store data elsewhere\n", "\n", From 081b04b4cbb678bf033f0af527196afb3a7eed2b Mon Sep 17 00:00:00 2001 From: Andreas Solleder Date: Sat, 20 May 2017 06:26:40 +0200 Subject: [PATCH 108/123] fix: typos using misspell fix: typos This PR is part of a campaign to fix a lot of typos on github! You can see the progress on https://github.com/fixTypos/fix_typos/ https://github.com/client9/misspell --- 1_notmnist.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1_notmnist.ipynb b/1_notmnist.ipynb index 5b2966c0062..39674e1aa49 100644 --- a/1_notmnist.ipynb +++ b/1_notmnist.ipynb @@ -70,7 +70,7 @@ "colab_type": "text" }, "source": [ - "First, we'll download the dataset to our local machine. The data consists of characters rendered in a variety of fonts on a 28x28 image. The labels are limited to 'A' through 'J' (10 classes). The training set has about 500k and the testset 19000 labelled examples. Given these sizes, it should be possible to train models quickly on any machine." + "First, we'll download the dataset to our local machine. The data consists of characters rendered in a variety of fonts on a 28x28 image. The labels are limited to 'A' through 'J' (10 classes). The training set has about 500k and the testset 19000 labeled examples. Given these sizes, it should be possible to train models quickly on any machine." ] }, { @@ -168,7 +168,7 @@ }, "source": [ "Extract the dataset from the compressed .tar.gz file.\n", - "This should give you a set of directories, labelled A through J." + "This should give you a set of directories, labeled A through J." ] }, { From 4e8a85e4a277f8b2d69a871f8519c35c4dfc6167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Jastrz=C4=99bski?= Date: Tue, 6 Jun 2017 19:57:08 -0700 Subject: [PATCH 109/123] Fix CMD in Dockerfile (#10444) Currently Notebook fails execution because default user for this container is root, and unless explicitly allowed, jupyter notebook will not start. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9f5ef1aca3e..3d48ced41b2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ RUN pip install scikit-learn pyreadline Pillow RUN rm -rf /notebooks/* ADD *.ipynb /notebooks/ WORKDIR /notebooks -CMD ["/run_jupyter.sh"] +CMD ["/run_jupyter.sh", "--allow-root"] From 35e58e553b5fcdde9d59760eecc2fdf6f410591a Mon Sep 17 00:00:00 2001 From: Jonathan Hseu Date: Fri, 9 Jun 2017 10:37:18 -0700 Subject: [PATCH 110/123] Merge changes from github. END_PUBLIC --- Commit f0e185d1f authored by Benoit Steiner Committed by TensorFlower Gardener: Better handle nodes with a variable number of outputs PiperOrigin-RevId: 158435028 --- Commit bc3e20807 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove unused BUILD dependencies PiperOrigin-RevId: 158431059 --- Commit a0c80e4d5 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Delete unnecessary (mistakenly duplicated) logging message. PiperOrigin-RevId: 158428506 --- Commit b6ad1d747 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Adds DNN-only tests for DNNLinearCombinedClassifier. PiperOrigin-RevId: 158423119 --- Commit ddbb58034 authored by Shanqing Cai Committed by TensorFlower Gardener: Remove unnecessary pylint disable PiperOrigin-RevId: 158416140 --- Commit fcaa724e2 authored by Luke Iwanski Committed by gunan: [OpenCL] Cleans pack and unpack ops (#10336) * [OpenCL] Cleans pack op * [OpenCL] Cleans unpack op --- Commit 2f53cacb2 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Fix a test failure of quantization_utils_test on ASAN PiperOrigin-RevId: 158414538 --- Commit 50b2f951c authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Update ops-related pbtxt files. PiperOrigin-RevId: 158413455 --- Commit 1e90b78e9 authored by Brennan Saeta Committed by TensorFlower Gardener: Add CacheDataset ops. Some input pipelines may pull down data from remote webservers or perform expensive processing. In order to avoid extraneous work, we now support caching the dataset (e.g. on disk). PiperOrigin-RevId: 158411901 --- Commit e16cd2ede authored by Taehoon Lee Committed by gunan: Fix typos (#10533) --- Commit 50d80ddf9 authored by Jonathan Hseu Committed by Jonathan Hseu: Fix fft_ops_test.py for CPU --- Commit d35cbbb44 authored by Mustafa Ispir Committed by TensorFlower Gardener: Add weight-column support to the heads. PiperOrigin-RevId: 158409180 --- Commit 7fb52cd54 authored by Justin Lebar Committed by TensorFlower Gardener: Don't crash when displaying XLA metrics if they happen to be negative. PiperOrigin-RevId: 158407664 --- Commit 12a7a752a authored by Jianfei Wang Committed by Jonathan Hseu: Add a tip for tf.train.LoggingTensorHook (#10237) `INFO` logs are not printed by default unless in IPython. Add a friendly tip for newcomers. --- Commit 216dcbf1e authored by Luke Iwanski Committed by Jonathan Hseu: [OpenCL] Cleans reduction ops (#10340) * [OpenCL] Cleans reduction_ops_max.cc * [OpenCL] Cleans reduction_ops_mean.cc * [OpenCL] Cleans reduction_ops_min.cc * [OpenCL] Cleans reduction_ops_prod.cc * [OpenCL] Cleans reduction_ops_sum.cc --- Commit 2b351062a authored by Androbin Committed by Jonathan Hseu: Improve docs for selective registration headers (#10351) * Improve docs for selective registration headers progressing #10299 * Update print_selective_registration_header.py * Mention both flags -DSELECTIVE_REGISTRATION and -DSUPPORT_SELECTIVE_REGISTRATION --- Commit ee919510f authored by Yun Peng Committed by gunan: Re-enable some python tests in Windows Bazel build (#10526) --- Commit b0e881457 authored by Androbin Committed by gunan: [Bash] Declare and assign separately (#10509) As proposed by static analysis tool: https://github.com/koalaman/shellcheck/wiki/SC2155 --- Commit 284901b08 authored by Androbin Committed by gunan: [Bash] Remove unquoting quotes (#10506) As proposed by static analysis tool: https://github.com/koalaman/shellcheck/wiki/SC2027 --- Commit 2a1f11556 authored by ksellesk Committed by ksellesk: Fix AttributeError in resnet.py There is no function tf.softmax() in Tensorflow 1.x. When running the old code, Python interpreter complains: File "resnet.py", line 152, in res_net_model prediction, loss = res_net(x, y) File "resnet.py", line 148, in res_net return tf.softmax(logits), loss AttributeError: 'module' object has no attribute 'softmax' --- Commit 1d68f729b authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove unneeded BUILD dependency PiperOrigin-RevId: 158391996 --- Commit 08ed32dbb authored by Yun Peng Committed by gunan: Windows: Make TensorFlow build without --cpu=x64_windows_msvc (#10466) * Windows: Make TensorFlow build without --cpu=x64_windows_msvc Since from Bazel 0.5.0, MSVC toolchain became the default toolchain on Windows. So --cpu=x64_windows_msvc is not required as long as we adjust the BUILD files in TensorFlow. --cpu=x64_windows_msvc is also supported for now, but is depracated. The configuration for cpu value x64_windows_msvc is a duplicate of x64_windows, which should be removed in the future. * Fix breakage on macOS --- Commit 02dbe153a authored by Androbin Committed by gunan: [Bash] Simplify Conditional (#10503) --- Commit c07bc581f authored by Androbin Committed by gunan: [Bash] Prefer read -a to split path (#10508) As proposed by static analysis tool: https://github.com/koalaman/shellcheck/wiki/SC2207 --- Commit 0a389674d authored by Androbin Committed by gunan: [Bash] Prefer [ p ] && [ q ] over [ p -a q ] (#10507) As proposed by static analysis tool: https://github.com/koalaman/shellcheck/wiki/SC2166 --- Commit 87a008ec3 authored by Jonathan Hseu Committed by gunan: Delete non-deterministic testEmpty() test (#10512) --- Commit 3a2971bd8 authored by Frank Chen Committed by TensorFlower Gardener: Adds the base for ClusterResolvers, a new way of communicating with and retrieving cluster information for running distributed TensorFlow. Implementations of this class would eventually allow users to simply point TensorFlow at a cluster management endpoint, and TensorFlow will automatically retrieve the host names/IPs and port numbers of TensorFlow workers from the cluster management service. PiperOrigin-RevId: 158358761 --- Commit 28b4e7f04 authored by Jonathan Hseu Committed by gunan: Disable stage_op_test and map_stage_op_test (#10516) --- Commit 390e57a75 authored by Yan (Asta) Li Committed by Benoit Steiner: Check EIGEN_MAX_ALIGN_BYTES to prevent mod-by-0 (#10380) * Check EIGEN_MAX_ALIGN_BYTES to prevent mod-by-0 If EIGEN_MAX_ALIGN_BYTES is set to 0, alignment checks that mod by EIGEN_MAX_ALIGN_BYTES fail at runtime. * Returns true, as in tensorflow/core/framework/tensor.h * Update unit tests * Enable tests only if EIGEN_MAX_ALIGN_BYTES > 0 --- Commit cd5ac40b3 authored by Peter Hawkins Committed by TensorFlower Gardener: [XLA] Update LLVM to upstream revision r304927. Add LLVM build rules for the LLVM AMDGPU backend, commented out by default. Fixes issue #10437. PiperOrigin-RevId: 158351480 --- Commit 91cb809bd authored by David Norman Committed by Jonathan Hseu: [XLA] Add ability to run the XLA unit tests against a different device (#9759) * Add ability to run the XLA unit tests against a different device * Allow for multiple extra backend devices * Correct merge error * Include options for additional tags --- Commit aff4d124b authored by Yuxin Wu Committed by Jonathan Hseu: Compare base_dtype instead of dtype in piecewise_constant (#10280) * Compare base_dtype instead of dtype in piecewise_constant Compare base_dtype instead of dtype in piecewise_constant. Fix #10086 * add unit test * Small lint fix and comment --- Commit 845539f98 authored by Jianwei Xie Committed by TensorFlower Gardener: Add evaluation test for linear classifier (n==2 or n >2). PiperOrigin-RevId: 158340296 --- Commit 7c46214ab authored by Jonathan Hseu Committed by GitHub: Fix numpy 1.13 incompatibilities (#10501) * Fix numpy 1.13 incompatibilities * Skip tests with numpy 1.13.0 --- Commit 4572c41df authored by gunan Committed by Jonathan Hseu: A few changes to kernel_tests. (#10502) * Disable reader_ops_test on windows. * Run buildifier on kernel_tests/BUILD * Mark map_stage_op_test as large. * Set the size of stage_op_test to large --- Commit 892293d98 authored by Brennan Saeta Committed by TensorFlower Gardener: Set a default for datasets end_of_sequence. While all datasets carefully set the end_of_sequence to true at the appropriate time, some datasets might forget to set it to false in the normal case. In order to avoid potential undefined behavior, we set the end_of_sequence variable to be false by default. PiperOrigin-RevId: 158337799 --- Commit 187404eac authored by Benoit Steiner Committed by TensorFlower Gardener: Setup the env to since ops such as MatchFileOp rely on it. PiperOrigin-RevId: 158336344 --- Commit 2741561c8 authored by Justine Tunney Committed by TensorFlower Gardener: Fix up vz_projector script structure We now make sure scripts and HTML imports are declared in the correct places. In the future, pedantically listing script tags should not be necessary. PiperOrigin-RevId: 158334306 --- Commit beeaade46 authored by Kay Zhu Committed by TensorFlower Gardener: Resubmit a reverted change. Original description: [XLA] Enable HloEvaluator for constant folding, also merged a few operations from hlo_constant_folding to hlo_evaluator. Additionally: - In ShapeUtil::ForEachIndex: * fix a bug where visitor is called when the shape has zero elements (e.g., F32{1,0}) * added test case for ForEachIndex. - In HloEvaluator: * Instead of copying and caching a Constant instruction, return the literal directly if the instruction is constant. * Fix an issue where TUPLE and OPAQUE primitives are not keyed in the templated typed_visitor. * Use (fixed) LiteralUtil::Populate to populate resulting literal, fixes the preexisting bug in the evaluator where R0 and shape with zero size dimensions are not handled. * Refactor ElementWiseUnaryOp and HandleCompare to be templatized on the operand's type. * Refactor IsFinite to be top level since it is only applicable to floats and the return type is always boolean. * Change from std::remainder to std::fmod for kRemainder to be compliant with existing XLA behavior. * Change from std::max and std::min to std::fmax and std::fmin to handle NaNs. * Minor comments fix. PiperOrigin-RevId: 158330052 --- Commit b94540e6f authored by Toby Boyd Committed by TensorFlower Gardener: tf.layers.conv2d use_bias=True to use nn.bias_add PiperOrigin-RevId: 158326493 --- Commit 379aa9911 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Go: Update generated wrapper functions for TensorFlow ops. PiperOrigin-RevId: 158325855 --- Commit 4e529f0f1 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Update ops-related pbtxt files. PiperOrigin-RevId: 158325293 --- Commit 0a9d2dac0 authored by Yuefeng Zhou Committed by TensorFlower Gardener: Add a util function in virtual placer to return canonicalized device string, which can be used to fix the node's device field before passing them to the maxcut algorithm. PiperOrigin-RevId: 158322753 --- Commit 2d8da1d9b authored by Daniel Ylitalo Committed by gunan: Recognize CPU core count in FreeBSD (#10490) --- Commit c19e6cac0 authored by Peter Hawkins Committed by TensorFlower Gardener: [TF:XLA] Initial implementation of TensorArray ops. The XLA implementation of TensorArrays is more restrictive than regular TensorArrays: * XLA TensorArrays must have dynamic_size=False. * all elements in an XLA TensorArray must have the same shape. * writes always add their values to any existing values; neither reads nor writes ever issue errors. Out-of-bounds writes currently wrap. Refactor Variable handling in the TF/XLA bridge. Use a XlaVariable* to refer to variables inside compilation rather than a numerical ID. Allow for variables that don't correspond to variables known to the user. Also use XlaVariable to handle TensorArrays. PiperOrigin-RevId: 158322041 --- Commit b5e8d3086 authored by Peter Hawkins Committed by TensorFlower Gardener: [TF:XLA] Refactor randomized tests to allow testing of larger inputs without running out of memory. PiperOrigin-RevId: 158321431 --- Commit 5d90bbaac authored by Kay Zhu Committed by TensorFlower Gardener: [XLA] Disable constant_folding in test base, so that intended test code paths would not be elided by constant_folding pass. PiperOrigin-RevId: 158317641 --- Commit 036ce8ba6 authored by Luke Iwanski Committed by gunan: [OpenCL] Cleans dense_update_ops (#10335) * [OpenCL] Cleans dense_update_ops * Acts on feedback from: #10335#discussion_r120536460 --- Commit 85f968125 authored by Luke Iwanski Committed by gunan: [OpenCL] Cleans cast operation (#10330) * [OpenCL] Removes not needed typedef for SYCLDevice * [OpenCL] Fixes formatting * [OpenCL] use SYCLDevice for int32 cast case --- Commit bff5e72da authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Fix typo. PiperOrigin-RevId: 158310742 --- Commit 38249d6be authored by Shanqing Cai Committed by TensorFlower Gardener: Swap the order of NanTensorHook and custom hooks to ensure that when the training encounteres NaN's in the loss function, user-supplied hooks such as tf_debug.LocalCLIDebugHook can still be used to debug the root cause of the numeric issues. PiperOrigin-RevId: 158310249 --- Commit 599727c65 authored by Eli Bendersky Committed by TensorFlower Gardener: [XLA] Propagate debug option flags to hlo_test_base. Specific HLO tests have to replace the generic test_main target with a manual main() that invokes RUN_ALL_TESTS. To get access to a module with debug options set up, a new convenience method is created on HloTestBase. Initially algebraic_simplifier_test is modified as a canary; in a followup we'll convert all HLO tests to this approach. PiperOrigin-RevId: 158309488 --- Commit 0770393e9 authored by Eric Liu Committed by TensorFlower Gardener: [Tensorboard] Add a trace viewer component to TensorBoard. We make the trace viewer a separate app; otherwise, there would be dependency conflicts (e.g. Polymer) between the trace viewer app and the tensorboard app. The trace viewer app would be served by a plugin, and Tensorboard dashboard will integrate trace viewer app using iframe in the future. This CL also added "mominify" support for link import HTML tags in the tensorboard home-grown java vulnizer; otherwise, the vulcanized trace viewer code would crash the java vulcanizer. For open-source build, we add a denpendency on the Catapult github repository (https://github.com/catapult-project/catapult/tree/master/tracing). We use a bazel genrule to vulcanize a trace viewer binary which is then used in the tf-trace-viewer component. PiperOrigin-RevId: 158309408 --- Commit 85e832201 authored by RJ Ryan Committed by TensorFlower Gardener: Support unknown emit shapes in tf.nn.raw_rnn. PiperOrigin-RevId: 158308002 --- Commit edb5fed7f authored by Mustafa Ispir Committed by TensorFlower Gardener: Add label-vocab support to binary logistic head. Add assertion that binary classifier label is in range [0., 1.] Fixed Classifier Integration tests. PiperOrigin-RevId: 158307521 --- Commit f8e1cf8fa authored by Justine Tunney Committed by Jonathan Hseu: Open up visibility of tf_imports (#10500) This also fixes the definition of Clutz. --- Commit 9fd7cf054 authored by Luke Iwanski Committed by Jonathan Hseu: [OpenCL] Cleans relu ops (#10343) * [OpenCL] register relu ops to gpu types (no half) * [OpenCL] Removes #undef EIGEN_USE_SYCL --- Commit 09c1455e3 authored by Luke Iwanski Committed by Jonathan Hseu: [OpenCL] Cleans reverse_op.cc (#10346) --- Commit b7892a30f authored by orome Committed by Jonathan Hseu: Clarify tf.matmul documentation (#10381) * Update math_ops.py * Fix non-ascii character --- Commit 9786b7062 authored by Luke Iwanski Committed by Benoit Steiner: [OpenCL] Cleans StridedSlice Op (#10314) * [OpenCL] Cleans StridedSlice Op * [OpenCL] Removes half from registred types --- Commit f105df047 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: In the CUDA path of depthwise_conv2d, optimize backward filter convolution for images 2 or 4 times smaller than 16x16. Also initialize in_cols from blockDim, to fix the regression caused in CL 157906773. PiperOrigin-RevId: 158296136 --- Commit 492afc2e3 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Go: Update generated wrapper functions for TensorFlow ops. PiperOrigin-RevId: 158295169 --- Commit abe0877ef authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add bazel version check to .configure PiperOrigin-RevId: 158294569 --- Commit b702e7e79 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Update ops-related pbtxt files. PiperOrigin-RevId: 158294289 --- Commit 94085bee7 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Replace std::function object with regular function. The function is called recursively, and the std::function object had only existed to allow recursion from within a lambda expression. A regular function should be cheaper than a polymorphic function wrapper. PiperOrigin-RevId: 158292415 --- Commit ba656b261 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Use template specialization instead of overloaded methods. This is a more appropriate tool here. NFC PiperOrigin-RevId: 158292035 --- Commit 55f987692 authored by Yutaka Leon Committed by TensorFlower Gardener: Make tf.contrib.lookup python functions use the kernels v2 that uses the resource tensor as handler. PiperOrigin-RevId: 158291836 --- Commit ebae3deba authored by Wei Ho Committed by TensorFlower Gardener: Switch back to max_num_rows_to_load instead of reading slice by slice due to performance regression from network overhead. Add check when using initializing values to avoid seg fault PiperOrigin-RevId: 158291218 --- Commit 7b4c01794 authored by RJ Ryan Committed by TensorFlower Gardener: Support numpy-style padding and slicing of tf.spectral.rfft/irfft to match the desired FFT length. Fixes incorrect RFFT/IRFFT results when fft_length does not match the input dimension. PiperOrigin-RevId: 158289991 --- Commit fdb8e2935 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Update iOS examples to use CocoaPods, and moved to tensorflow/examples/ios PiperOrigin-RevId: 158289285 --- Commit d86167b5f authored by Amit Patankar Committed by Amit Patankar: Merging rc2 back into master. --- Commit dffea202a authored by Eli Bendersky Committed by TensorFlower Gardener: Clean up some code after previous CL PiperOrigin-RevId: 158282834 --- Commit 7b5302af0 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Adds ability to set a "family" attribute in Tensorflow summaries, which controls the "tab name" of the summary that is displayed. This solution keeps using name_scope to keep names unique, but then prefixes the tag with the family name if provided. PiperOrigin-RevId: 158278922 --- Commit 611c82b5b authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Adds integration test for DNNLinearCombined((Classifier)|(Regressor)). PiperOrigin-RevId: 158278512 --- Commit cc6c91a9a authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove a further unused proto header inclusion PiperOrigin-RevId: 158278026 --- Commit 9f17c26ca authored by Mark Heffernan Committed by TensorFlower Gardener: [XLA] Add HloLocation to dataflow analysis. Add an HloLocation abstraction to dataflow analysis which indicates where (in the output of what instruction and at which index) an HloValue may appear. Previously only uses were stored with an HLO value where a use is an edge in the HLO graph (instruction, operand number and ShapeIndex). Also, change the handling of tuple-shaped kSelect instructions when ssa_form is true. Previously a phi value would be created. With this change the the value set instead contains the union of it's inputs identical to the ssa_form=false case. PiperOrigin-RevId: 158276598 --- Commit b9d5e1441 authored by Eli Bendersky Committed by TensorFlower Gardener: [XLA] Start collecting flags for debug options in a single place. ClientLibraryTestBase will now parse command-line flags for debug options automatically, permitting subclasses to override certain options by using mutable_debug_options. main() still has to call AppendDebugOptionsFlags() explicitly before running the TF flag parser. In the mean-time, this CL leaves flag handling to the current "legacy" approach. However, this is part of a larger plan to move *all* debugging flags for XLA into the DebugOptions message and expose them as flags from a single place. The other flags (which are not controlling debugging options) will have to be propagated more explicitly. PiperOrigin-RevId: 158276294 --- Commit 3b6fe94bb authored by Benoit Steiner Committed by TensorFlower Gardener: Properly handle shape nodes that have a preexisting control dependency PiperOrigin-RevId: 158274845 --- Commit 1d67379d5 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Minor cleanup PiperOrigin-RevId: 158268933 --- Commit 41997756c authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Sort header inclusions; define EIGEN_USE_THREADS where headers depend on it. PiperOrigin-RevId: 158267803 --- Commit 85355f015 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add missing header inclusion PiperOrigin-RevId: 158265934 --- Commit 3cf88d390 authored by Gunhan Gulsoy Committed by TensorFlower Gardener: When GPU is configured, do not require --config=cuda. Also fix indentation in configure. PiperOrigin-RevId: 158232959 --- Commit f48673b50 authored by Luke Iwanski Committed by gunan: [OpenCL] Removes ReductionFunctor for SYCLDevice (#10326) We are using Eigen implementation --- Commit 1b6453bec authored by Joan Puigcerver Committed by gunan: Fixes issue #10258 (#10366) On CUDA versions previous to 8.0, only __shared__ variables could be declared as static in the device code. --- Commit cd56a638d authored by Beomsu Kim<123bskim@naver.com> Committed by Jonathan Hseu: Fixed wrong range in docstring (#10272) --- Commit d13ae380c authored by Micha? Jastrz?bski Committed by Jonathan Hseu: Fix CMD in Dockerfile (#10444) Currently Notebook fails execution because default user for this container is root, and unless explicitly allowed, jupyter notebook will not start. --- Commit 8118ab4ec authored by Simon Perkins Committed by Jonathan Hseu: Support partial gets in MapStagingArea (#10276) * Modify map staging area tests - size from `small` to `medium` - introduce 2 shards * Add partial get support in MapStagingArea A partial list of tensors in a (key, value) map entry can now be requested. Once all tensors associated with the entry are removed, it is removed from the map. * Correct output/indices mismatch errors * Rename IncompleteTuple to OptionalTuple * Add partial get test with indices * Add some more index checks * Improve stage test case graph creation Test sessions (and default graphs) are reused by default. Create explicit, finalized graphs in each test to prevent possible interactions between stateful Staging Areas and others ops created in separate tests. * Make staging area tests small and remove shards They were originally made 'medium' to ameliorate timeouts in the test case, but they usually run in ~1s so they should be small. * Improve imports Avoid importing base tensorflow package * Support both python 2 and python 3 range. * Set map_stage_op_test to size=large * Convert the tests to size=medium --- Commit 0df102b0a authored by Androbin Committed by Jonathan Hseu: Update `configure` script sample (#10455) The `configure` script was changed regularly since the generation of the sample. This PR updates the sample to reflect those changes. --- Commit f6dc1ac61 authored by Earthson Lu Committed by Jonathan Hseu: MKL_INSTALL_PATH should not be ignore when given (#10180) * MKL_INSTALL_PATH should not be clear when given * fix overwrite by default --- Commit 8ad6a036e authored by Asim Shankar Committed by TensorFlower Gardener: Java: Update Maven release to 1.2.0-rc2 PiperOrigin-RevId: 158212897 --- Commit 15eddf035 authored by Fritz Obermeyer Committed by Jonathan Hseu: Export C API symbols in _pywrap_tensorflow_internal.so (#10469) * Export C API symbols * Export C API symbols under config:default --- Commit 754e12668 authored by Luke Iwanski Committed by Jonathan Hseu: [OpenCL] Removes half concat op registration (#10331) --- Commit cfdc22dee authored by Peng Yu Committed by Jonathan Hseu: fix the error (#10293) --- Commit 58747e357 authored by Joel Hestness Committed by Jonathan Hseu: PhiloxRandom: Fix race in GPU fill function (#10298) * PhiloxRandom: Fix race in GPU fill function The PhiloxRandom fill kernel for the GPU had race conditions that caused the outputs to be non-deterministic. In particular, the code previously executed with N GPU threads (# thread contexts per GPU), but it would only advance the fill addresses by N-1 stride in each step. This incorrect stride caused the 0th and N-1st threads to write to the same memory locations, racing for which was last to write their common locations. Make the stride equal to the number of threads to eliminate the race. BONUS: By fixing this race, PhiloxRandom constant-sized GPU initializers now match CPU initializers. * Update random_ops_test.py to find race conditions Increasing the size of arrays in the random_ops_test.py test to manifest the race conditions to be resolved. --- Commit 2cbcda08f authored by Androbin Committed by Jonathan Hseu: Fixed formatting in Linux install guide (#10353) Formatting issues were introduced in PR #8825, commit f30918b3694afe844990cbddc82e27e023d88856 --- Commit ab5f38560 authored by Lakshay Garg Committed by Jonathan Hseu: Fixed typos in documentation & READMEs (#10365) --- Commit 94dc1dbfa authored by Christos Nikolaou Committed by Jonathan Hseu: Enable figures in the tfprof README.md (#10372) --- Commit 3018d4678 authored by Taehoon Lee Committed by Jonathan Hseu: Fix typos (#10386) --- Commit c5f3c6171 authored by Daniel Rasmussen Committed by Jonathan Hseu: Fix unbatch for Datasets with multiple elements (#10401) * Fix unbatch for datasets with multiple elements * fixup! pylint (indent two spaces instead of four) --- Commit 8b065bc10 authored by Yong Tang Committed by Jonathan Hseu: Fix unaligned args in api_docs/python/tf/contrib/learn/Evaluable (#10423) This commit fixes unaligned args in api_docs/python/tf/contrib/learn/Evaluable Signed-off-by: Yong Tang --- Commit 8f89b654f authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Profile memory usage in VirtualScheduler and report peak memory usage. To do so, NodeState now handles different output ports of a node (in case a node has multiple outputs). Also, VirtualScheduler code is cleaned up with more comments. PiperOrigin-RevId: 158209068 --- Commit 0ea0bf5aa authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add a frontend for viewing the first ops that exhibit bad values (NaN, +/- Inf). This helps the user identify problematic ops. Also moved the debugger data logic within tf-graph-info into a new tf-graph-debugger-data-card component. PiperOrigin-RevId: 158208679 --- Commit ed47ecf2d authored by Luke Iwanski Committed by Benoit Steiner: [OpenCL] Cleans variable op (#10333) * [OpenCL] Cleans variable op * Fixes formatting and float / double -> GPU_NUMBER_TYPES_NO_HALF --- Commit 9b2c1af63 authored by Luke Iwanski Committed by Benoit Steiner: [OpenCL] Improves device reporting (#10462) Prints: id, type, name, vendor and profile of the device --- Commit 7f5384dcc authored by Alexandre Passos Committed by TensorFlower Gardener: Making load() work for resource variables. PiperOrigin-RevId: 158205361 --- Commit 05412bd36 authored by Mark Heffernan Committed by TensorFlower Gardener: [XLA] Simplify Shape traversal visitors. Simplify shape traversal visitors in ShapeUtil and ShapeTree. Add a non-Status form because most uses of the traversal methods do not use it, and remove is_leaf parameter from ShapeTree.ForEach* as it is not frequently used. PiperOrigin-RevId: 158201574 --- Commit 69c9365b4 authored by Mustafa Ispir Committed by TensorFlower Gardener: Extracted linear estimator testing utils to be reused by dnn-linear-combined. Added tests for linear part of dnn-linear-combined estimator. PiperOrigin-RevId: 158200827 --- Commit 65ce8c723 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add arrowheads to dataflow edges. Make reference edges orange. Remove animations from tooltips in the graph documentation. Previously, arrowheads were only added to reference edges (because we assumed users knew about the convention that arrowless edges flow upwards). That decision nicely reduces clutter. However, recently, some internal and external folks have expressed confusion, and so I want to try adding arrowheads to all data flow edges. And make the reference edges starkly different. See #10428 PiperOrigin-RevId: 158195388 --- Commit bf4c3dd6b authored by gunan Committed by GitHub: Revert "Fix patching issue on Windows" (#10472) This reverts commit 47e6785646a1266f01a1a570bd799f8518ee2997. --- Commit b49515539 authored by David Soergel Committed by TensorFlower Gardener: Add only string constants to ASSET_FILEPATHS collection. PiperOrigin-RevId: 158192152 --- Commit 51acad09c authored by Sergio Guadarrama Committed by TensorFlower Gardener: Add tests with different delta to huber_loss. PiperOrigin-RevId: 158191361 --- Commit a4e7b7add authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Fixes a bug in setting default optimizers for DNNLinearCombinedClassifier. PiperOrigin-RevId: 158190192 --- Commit ddd67e333 authored by Luke Iwanski Committed by Jonathan Hseu: [OpenCL] Cleans reshape.cc (#10347) * [OpenCL] Cleans reshape.cc * Removes half and complex numbers. Half is extension and complex numbers needs implementation in Eigen first --- Commit 3ca653304 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Update ops-related pbtxt files. PiperOrigin-RevId: 158186454 --- Commit 8cda8660e authored by Luke Iwanski Committed by gunan: [OpenCL] Cleans sendrecv_ops.cc (#10345) --- Commit 6915bb919 authored by Luke Iwanski Committed by gunan: [OpenCL] Cleans Slice op (#10341) --- Commit 54998b45d authored by Michele Colombo Committed by Jonathan Hseu: BasicRNNCell comment fix (#10467) --- Commit df5906fb7 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Mark saver/restore ops that depend on filesystem as stateful to disable them from being folded into a constant by graph optimizer. PiperOrigin-RevId: 158182282 --- Commit 96cb4d182 authored by Sergio Guadarrama Committed by TensorFlower Gardener: Add support of scale_l1 == 0. or scale_l2 == 0 to l1_l2_regularizer. Added tests. PiperOrigin-RevId: 158179790 --- Commit b65eb3f9b authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Speed up atrous_convolution_test by combining evaluations. To make this test run faster (and prevent it from timing out under certain circumstances), this change combines all evaluations for each test method into a single call to Session.run, to eliminate overhead. This reduces the test time from about 40 seconds to 10 seconds. RELNOTES: n/a PiperOrigin-RevId: 158175227 --- Commit b440abce7 authored by Gao, Xiang Committed by Rasmus Munk Larsen: add Cuda{2D,3D}LaunchConfig that maximizes occupancy (#10032) * add Cuda{2D,3D}LaunchConfig that max occupancy * remove default val, check input<=0 * add max size check * fix typo * tests, docs, and related changes * build the test * buildify * cudaOccupancy... call check success, and style fix --- Commit 81cf61fdb authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Initialize tensor in graph_properties_test, to avoid msan complaint. PiperOrigin-RevId: 158169374 --- Commit cabc5c35c authored by Eli Bendersky Committed by TensorFlower Gardener: [XLA] Add xla_disable_hlo_passes to DebugOptions Also add a SetDebugOptions method to ClientLibraryTestBas; this lets us set debug options in tests by calling it. As an example, this CL removes the current way of passing xla_disable_hlo_passes programmatically in tests - it used to employ a special constructor parameter which is no longer required. PiperOrigin-RevId: 158169006 --- Commit 187d23337 authored by Luke Iwanski Committed by gunan: [OpenCL] Cleans Pad op (#10339) --- Commit e8bc38ef6 authored by gunan Committed by GitHub: Fix test failures on windows. (#10470) --- Commit 2b3535c64 authored by David Soergel Committed by TensorFlower Gardener: Minor docstring fix for build_parsing_serving_input_receiver_fn PiperOrigin-RevId: 158163615 --- Commit e55f2e036 authored by Benoit Steiner Committed by TensorFlower Gardener: Propagates constants through switch nodes. PiperOrigin-RevId: 158163537 --- Commit b01d4b905 authored by Jacques Pienaar Committed by TensorFlower Gardener: [XLA] Remove outdated todo. PiperOrigin-RevId: 158161411 --- Commit 7125733d7 authored by William Chargin Committed by TensorFlower Gardener: Create a set of sample data for the audio plugin This implements a simple tone generator, with sine waves, square waves, and triangle waves, plus two simple combinations of sine waves. The step value is used to control the frequency. PiperOrigin-RevId: 158160889 --- Commit dc81a2420 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Updates to the WALSMatrixFactorization estimator: - Add a completed_sweeps variable to keep track of sweeps that have been completed during training. - Add a StopAtSweepHook, which can request a stop after completing a specified number of sweeps. PiperOrigin-RevId: 158156347 --- Commit 74220616c authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Set device cores and frequency in op_level_cost_estimator_test, to avoid asan error about assigning inf to int64 (this comes in from a divide-by-0). PiperOrigin-RevId: 158155488 --- Commit 47e678564 authored by Yun Peng Committed by gunan: Fix patching issue on Windows (#10452) --- Commit 6d54f09d9 authored by Yun Peng Committed by gunan: Fix linking errors of lmdb on Windows (#10457) --- Commit 61c8a745b authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Minor cleanup: Add braces around if statement arms; remove redundant "return" and "static". PiperOrigin-RevId: 158143418 --- Commit e9a889c5e authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Pass int parameter by value, not by const reference PiperOrigin-RevId: 158142102 --- Commit 9184726ed authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Avoid unnecessary copying of map data during visitation PiperOrigin-RevId: 158141962 --- Commit 2e7e1d57b authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Small fix for how std::move is used in constructors PiperOrigin-RevId: 158141564 --- Commit 2a61c1652 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: In cpu compiler's CompileAheadOfTime, pass ordering when compiling entry computation. PiperOrigin-RevId: 158140349 --- Commit f3f53e8b3 authored by Derek Murray Committed by TensorFlower Gardener: [tf.contrib.data] Add support for dicts and remove lists from nested structures. This changes the behavior of constructors like `tf.contrib.data.Dataset.from_tensors()` when passed a list. Previously, the `nest` utility would recurse into each element of such a list and create a separate Dataset component. Now the list will be converted to a tensor, allowing code like: ```python dataset = tf.contrib.data.Dataset.from_tensor_slices(([1, 2, 3], [4, 5, 6])) ``` ...to define a dataset with two components (each of shape `()`). This change also adds support for dictionaries as nested structures, which simplifies integration with dictionary-returning ops like `tf.parse_example()`. Fixes #10151. RELNOTES: Breaking change to `tf.contrib.data.Dataset` APIs that expect a nested structure. Lists are now converted to tf.Tensor implicitly. You may need to change uses of lists to tuples in existing code. In addition, dicts are now supported as a nested structure. PiperOrigin-RevId: 158139467 --- Commit b6a8848c1 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Enabling python configuration to use a remotely generated configuration that is located inside of the org_tensorflow repo (previously it *had* to be a remote repo declared in workspace file). PiperOrigin-RevId: 158138601 --- Commit 0fe0bfcc3 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove unused protobuf header inclusions PiperOrigin-RevId: 158120864 --- Commit f0c4c6c3f authored by A. Unique TensorFlower Committed by TensorFlower Gardener: In the CUDA path of depthwise_conv2d, add a fast NCHW backward filter convolution for images smaller than 16x16. PiperOrigin-RevId: 158111294 --- Commit 8dcf37b47 authored by Jon Malmaud Committed by gunan: Fix typo (#10379) --- Commit 3039d7da2 authored by Androbin Committed by gunan: Remove "bazel clean" (#10318) Reverting #8880 (see #10236) unnecessary since bazelbuild/bazel#2759 was merged --- Commit ae1c16ae8 authored by Yifei Feng Committed by gunan: Update docker to cudnn6. (#10307) * Update docker to cudnn6. * Update Dockerfile.gpu * Add --expunge to bazel clean to make cuda_configure run again and update TF_CUDNN_VERSION. * Remove expunge and set CUDA and CUDNN version default in configure. * Update configure * Only set --action_env once * Update prints for default version. --- Commit 232e9d86d authored by A. Unique TensorFlower Committed by TensorFlower Gardener: tf_workspace() claims that the tf_repo_name argument is unused. temp_workaround_http_archive still requires it. This change silences the spurious message. PiperOrigin-RevId: 158089834 --- Commit cc1a02d37 authored by Francois Chollet Committed by TensorFlower Gardener: Add fp16 support to convolutional layers that support it. PiperOrigin-RevId: 158086284 --- Commit 7d3fbba48 authored by Mustafa Ispir Committed by TensorFlower Gardener: Extracted dnn estimator testing utils to be reused by dnn-linear-combined. Added tests for dnn part of dnn-linear-combined estimator. PiperOrigin-RevId: 158084898 --- Commit 9d12c629c authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Refactor the document and some polishment PiperOrigin-RevId: 158083952 --- Commit 134138299 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Corrected comment: import_scoped_metagraph does not return a Saver. PiperOrigin-RevId: 158082288 --- Commit a58553e4d authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add function in shape inference to try to infer output tensor content based on the input shapes of the op. In some cases (E.g: shape), knowing the shapes of the input is all that is necessary to infer the content of the output tensor. This improves shape inference. PiperOrigin-RevId: 158079306 --- Commit 0cc851c08 authored by Yuefeng Zhou Committed by TensorFlower Gardener: Call maxcut algorithm in the model_based_cost_estimator. PiperOrigin-RevId: 158078511 --- Commit 7d76a90be authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add question marks next to items in the graph legend. PiperOrigin-RevId: 158076005 --- Commit 68fdb7628 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add DNNLinearCombinedClassifier. PiperOrigin-RevId: 158075939 --- Commit 3d52e4cb9 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Fix create_meta_graph to respect an empty collection_list. PiperOrigin-RevId: 158073112 --- Commit 54ccc3e5a authored by Mark Heffernan Committed by TensorFlower Gardener: [XLA] Add module-scoped HLO dataflow analysis. This is the first step to replacing TuplePointsToAnalysis with a global, module-scoped analysis. This dataflow analysis identifies all values and their defs and uses in the XLA graph. The analysis is currently unused. Follow up CLs will add buffer alias analysis using this dataflow analysis, and incrementally switch the transformation passes (for example, CopyInsertion) to use these new module-scoped analyses. PiperOrigin-RevId: 158067910 --- Commit 93c57c6e4 authored by Benoit Steiner Committed by TensorFlower Gardener: Handle control flow logic properly: * Don't fold enter/exit nodes since that can interact badly with frames * Create proper control dependencies on switch nodes PiperOrigin-RevId: 158066691 --- Commit 9e6899720 authored by Jingyue Wu Committed by TensorFlower Gardener: [SE] Add cudnnTransformTensor to StreamExecutor. PiperOrigin-RevId: 158062553 --- Commit 827874c30 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: In the CUDA path of depthwise_conv2d, add a fast NCHW backward input convolution for images smaller than 16x16. PiperOrigin-RevId: 158061669 --- Commit bee26215c authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Speed up multinomial_op on CPU by using a vectorized Eigen expression and avoiding unnecessary casts. Benchmark with AVX+FMA enabled: Run on (12 X 3492 MHz CPUs); 2017-06-05T12:54:07.881672447-07:00 CPU: Intel Haswell with HyperThreading (6 cores) dL1:32KB dL2:256KB dL3:15MB Benchmark Base (ns) New (ns) Improvement ------------------------------------------------------------------ BM_Multinomial_cpu_1_10000_4 250817 172953 +31.0% BM_Multinomial_cpu_1_10000_128 273834 187552 +31.5% BM_Multinomial_cpu_1_10000_10000 1174175 1130778 +3.7% BM_Multinomial_cpu_1_100000_4 2040741 1276761 +37.4% BM_Multinomial_cpu_32_10000_4 10221765 4498666 +56.0% BM_Multinomial_cpu_32_10000_128 10638159 4994754 +53.0% BM_Multinomial_cpu_32_100000_4 100790019 44193314 +56.2% BM_Multinomial_cpu_128_100000_1 431269640 182506078 +57.7% PiperOrigin-RevId: 158061480 --- Commit 515b3ac67 authored by Justine Tunney Committed by TensorFlower Gardener: Add Clutz to TensorBoard build This is so we can get JavaScript protobufs. This CL also improves the web_aspect and makes some peculiar Closure Compiler errors go away relating to externs. PiperOrigin-RevId: 158061198 --- Commit 0df6760fe authored by Benoit Steiner Committed by TensorFlower Gardener: Added a test to make sure that graph properties for variables are properly reported PiperOrigin-RevId: 158053084 --- Commit 2ccfe8e76 authored by Benoit Steiner Committed by TensorFlower Gardener: Added a new method to extract the graph properties from a cost graph without having to run the model. This will simplify the process of creating regression tests PiperOrigin-RevId: 158050327 --- Commit 27f1b80c2 authored by Alexandre Passos Committed by TensorFlower Gardener: Fixes memory leak in py_func when functions return unwrapped strings. PiperOrigin-RevId: 158046530 --- Commit cf238e1f2 authored by Eugene Brevdo Committed by TensorFlower Gardener: Fix memory leak in python caused by @tf_should_use. The issue is that python's GC has trouble collecting objects with __del__ methods. The solution is two pronged: * Keep track of usage state outside of the class, via a dict mapping id(object) => state * Remove __del__ (this was the source: python's GC couldn't collect wrapped objects), and instead use weakref.finalize to emit warnings just as the object is being garbage collected. * Added tests for garbage collection [they were failing before i fixed the issue] PiperOrigin-RevId: 158042388 --- Commit e6f581863 authored by Bo Wang Committed by Rasmus Munk Larsen: New reader for LMDB databases (#9950) * Add LMDBReader op and test case * Add testcase to load LMDB from a folder * Add tensorflow/core/lib/lmdb/testdata/data.mdb * Add EOF test * Add license export * Blacklist the test data in pip_smoke_test.py * Address issues with respect to review * Add LICENSE to BUILD rules * Remove the prefx of LICENSE * Wrap key with compat.as_bytes() * Fixed a compilation flag * Improve BUILD rules * Support LMDB build in cmake * Fix BUILD file format with buildifier * Add fake unistd.h for lmdb to build on Windows * Avoid building lmdb tools which depends on unistd.h * Fix the string encoding issue in Python3 * Update lmdb library name in CMakeList.txt --- Commit cc411f938 authored by Yao Zhang Committed by TensorFlower Gardener: When converting the layout of Conv2DBackpropInput, we need to permute one of its inputs, which is a constant node. We permute a copy of this node, instead of the original node, because the original node may be used as input to other nodes. This kind of sharing of const node could arise if the graph is pre-optimized by common subexpression elimination, which is part of the L1 optimizations in TensorFlow. PiperOrigin-RevId: 158037552 --- Commit 88bdb6fca authored by Dandelion Man? Committed by TensorFlower Gardener: Remove all remaining references to non-public TF modules from TensorBoard. I deleted the PluginAssetUtil tests because that code is deprecated. I'll later add manual testing for backcompat in the text plugin. PiperOrigin-RevId: 158037466 --- Commit 6c531eb2f authored by Francois Chollet Committed by TensorFlower Gardener: Add file hash to Keras Boston Housing dataset to force cache update. PiperOrigin-RevId: 158036587 --- Commit afdc38cd3 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove deprecated resource handle functions in InferenceContext. PiperOrigin-RevId: 158034419 --- Commit 9f932e6ce authored by Derek Murray Committed by TensorFlower Gardener: Avoid parsing a rendezvous key for Send/Recv ops outside a loop. For such ops, the rendezvous key will be constant, because `ctx->frame_iter()` will always evaluate to `{0, 0}`. Benchmarking reveals that this can save between 1 and 2 microseconds per Send or Recv op execution. The optimization applies to all cross-process, inter-device, and intra-device (host-to/from-device memory) Send/Recv ops. PiperOrigin-RevId: 158032522 --- Commit cc2dd4ac8 authored by Shanqing Cai Committed by TensorFlower Gardener: tfdbg: dump debug data from different devices in separate directories Fixes: #7051 wherein TFDBG failed to load the data dump from a Session.run() involving multiple GPUs. The root cause of the bug was that TFDBG previously assumed that node names are unique across all partition graphs. This is however not the case when multiple GPUs exist. The Send/Recv nodes in the partition graphs of the GPUs can have duplicate names. There will potentially be other cases like this in the future due to other reasons (e.g., distributed sessions and/or graph optimization). This CL relaxes this assumption, by dumping the GraphDef and tensor data from different devices into different sub-directories under the dump root directory. PiperOrigin-RevId: 158029814 --- Commit a5909d643 authored by Toby Boyd Committed by TensorFlower Gardener: Fixed triggering create device multiple times PiperOrigin-RevId: 158025196 --- Commit 504a307b7 authored by Martin Wicke Committed by TensorFlower Gardener: Make sure that Adam colocates ops with a consistent variable across workers. PiperOrigin-RevId: 158022292 --- Commit 69ba4d3d4 authored by Asim Shankar Committed by TensorFlower Gardener: Fix #10371 cpuinfo.get_cpu_info() doesn't seem to include the l2_cache_size key on some architectures. PiperOrigin-RevId: 158021008 --- Commit a51a9846c authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Performance-related tweaks: Don't copy loop variables; remove ineffective std::move casts. PiperOrigin-RevId: 158017670 --- Commit 009789f74 authored by Peter Hawkins Committed by TensorFlower Gardener: [XLA] Allow 0-sized slices in DynamicSlice and DynamicUpdateSlice; add tests. PiperOrigin-RevId: 158015870 --- Commit 48a4853eb authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Miscellaneous cleanups PiperOrigin-RevId: 158012131 --- Commit 379ddde24 authored by Chris Song Committed by Chris Song: Fix misspells. --- Commit a0a76da97 authored by Lakshay Garg Committed by Lakshay Garg: Fixed typo in code --- Commit 7ffc35732 authored by Eugene Brevdo Committed by TensorFlower Gardener: Add support for bools in matrix_diag, matrix_diag_part, matrix_set_diag, matrix_band_part. PiperOrigin-RevId: 157939272 --- Commit edf3d5dbe authored by Darren Garvey Committed by Darren Garvey: configure: Fix default path when enabling MPI. Correct showing what the default path is when mpi is installed. --- Commit aad2e3daf authored by A. Unique TensorFlower Committed by TensorFlower Gardener: In the CUDA path of depthwise_conv2d, add a fast NCHW forward convolution for images smaller than 16x16. PiperOrigin-RevId: 157915637 --- Commit 5cf08d9cb authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Drop blockDim.y for the equivalent in_cols, and slightly improve naming (use 'pixels' instead of 'size' for height*width numbers). PiperOrigin-RevId: 157906773 --- Commit 563f05ff6 authored by Eugene Brevdo Committed by TensorFlower Gardener: [tf contrib seq2seq] Expand tile_batch to handle nested structures. This allows it to properly tile the initial wrapper state when using BeamSearchDecoder with AttentionWrapper. Unit tests updated to show this use. PiperOrigin-RevId: 157903115 --- Commit 1234e2dda authored by Justine Tunney Committed by TensorFlower Gardener: Fix Plottable definition On Mac OS the build directory in the Node package conflicts with BUILD. PiperOrigin-RevId: 157899970 --- Commit bb7a8d8e7 authored by Benoit Steiner Committed by TensorFlower Gardener: Don't use the _output_shape attribute in the op_level_cost_estimator since there is no guaranty that it will be present or accurate. PiperOrigin-RevId: 157898989 --- Commit 6f4204c3d authored by Justine Tunney Committed by TensorFlower Gardener: Fix TensorBoard SHA256 in cmake PiperOrigin-RevId: 157897958 --- Commit c9d2f432b authored by Justine Tunney Committed by Justine Tunney: Fix TensorBoard SHA256 in cmake --- Commit 1c70fb686 authored by Jianwei Xie Committed by TensorFlower Gardener: Add training test for multi classes (n>2) linear classifier. PiperOrigin-RevId: 157896002 --- Commit 675d36be0 authored by Yao Zhang Committed by TensorFlower Gardener: Add fused batch norm to tf.layers. PiperOrigin-RevId: 157893874 --- Commit f37d0ea47 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Internal change -- first draft docs PiperOrigin-RevId: 157891937 --- Commit 9b8f6113b authored by Zongheng Yang Committed by TensorFlower Gardener: tensor_bundle: fix that the read path forgets to cache file handles. In a case where a reader is geographically far from the file, this change achieves a speedup of end-to-end checkpoint restore by 5.8x. PiperOrigin-RevId: 157889659 --- Commit 0c92dada6 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Use inplace Cholesky factorization and solves to speed up and reduce memory usage in matrix_solve_ls. Check succes before copying outputs in cholesky_op. PiperOrigin-RevId: 157887564 --- Commit a4caeb2ea authored by William Chargin Committed by TensorFlower Gardener: Extract the graphs dashboard to a plugin This completes the great plugin migration! The graphs plugin is somewhat different from the plugins considered so far. First, it exposes two kinds of data: graph data and run metadata. We elect to put both sources of data under the domain of the graphs plugin for now, because it's not clear that the run metadata would be useful for anything else. Second, the graph data really has no use for "tags": a run either has an associated graph or it does not. Thus, we expose an endpoint /data/plugin/graphs/runs that is different in format from the /tags routes exposed by other plugins (it returns just a list instead of a run-to-tag mapping). This change removes a bunch of tests from application_test.py. The tests cover the compresion behavior of the graph endpoint, but the graph endpoint doesn't have any special logic in the way of compression. Thus, the tests are, apparently, testing that werkzeug (or whatever is relevant here) provides good compression defaults. This isn't necessarily a bad idea, but it shouldn't be coupled to the graph tests. To get test data that includes run metadata, you can run this script: https://raw.githubusercontent.com/tensorflow/tensorflow/326942394e69074d50d5889218a24c9371eff259/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py PiperOrigin-RevId: 157884714 --- Commit 05a6a13f7 authored by Gunhan Gulsoy Committed by gunan: Make sure all writer caches are closed before deleting directories in dnn_test. --- Commit d0e761f8d authored by Gunhan Gulsoy Committed by gunan: Disable another test that uses matrix_set_diag on windows. --- Commit 8939b8562 authored by Derek Murray Committed by TensorFlower Gardener: [tf.contrib.data] Re-implement IteratorGetNext as an AsyncOpKernel. This prevents the op from consuming an inter-op thread pool thread when blocked, and fixes a potential deadlock when many IteratorGetNext ops are blocked. Fixes #10369. PiperOrigin-RevId: 157878885 --- Commit 9e25c68ad authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add loss_only_head to hold additional loss terms for multi_head setup PiperOrigin-RevId: 157875934 --- Commit 7cdcd0cca authored by Benoit Steiner Committed by TensorFlower Gardener: Filter more op types that don't benefit from constant folding. PiperOrigin-RevId: 157875168 --- Commit 366990d92 authored by Kay Zhu Committed by TensorFlower Gardener: [XLA] Fix a subtle issue in copy_insertion due the interaction between copy overriding logic and RecordIndicesToColocatingBuffers: - When building instructions ShapeTree to be copy overriden, it is possible that we create a single kCopy for two identical instructions. An example can be: %tuple.19 = tuple(%constant.4, %constant.1793, %constant.1793) where it is used in a while.init operand, and constant.1793 is read-only within the loop and also used by another while loop. The copy overriding pass will then create the following (logical, not finalized) tuple: %tuple.19 = tuple(%constant.4, %copy.5, %copy.5) - In the subsequent pass RecordAmbiguousOrNonDistinctIndices, to add copies to ensure point_to set is distinct, the duplicate %copy.5 are ignored because they are not yet finalized, and these indices (1 and 2 in the example) are still marked as to-be copied. Therefore distinctiveness is lost. This fix applies to the override building stage, to explicitly avoid creating shared copies for non-distinct buffers. PiperOrigin-RevId: 157872231 --- Commit f4b8d21b8 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Change function parameters to references to avoid copying, or otherwise move from function parameters when moving reduces the amount of copying. PiperOrigin-RevId: 157867333 --- Commit 3eee61caa authored by Drew Hintz Committed by GitHub: fix quotes in example code from ? to " --- Commit 4905c0eae authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove TODO - the new tolerance is okay to keep. PiperOrigin-RevId: 157861020 --- Commit 55f6b6ff1 authored by David Soergel Committed by TensorFlower Gardener: Add explicit SparseTensor support to SignatureDef. PiperOrigin-RevId: 157860466 --- Commit 79099d677 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Removes default thresholds from BinaryLogisticHead and adds predict and evaluate tests for DNNClassifier. PiperOrigin-RevId: 157856471 --- Commit 54595f0f3 authored by Jianwei Xie Committed by TensorFlower Gardener: Adds the training test for LinearClassifier with n_classes=2. PiperOrigin-RevId: 157855473 --- Commit cd6c02985 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Add 'streaming_curve_points' metric which returns curve [ROC, PR] approximation at specified number of points. PiperOrigin-RevId: 157851535 --- Commit 0f2db7391 authored by Peter Hawkins Committed by TensorFlower Gardener: [TF:XLA] Split union-find implementation in mark_for_compilation_pass.cc into a separate library, make it more generic. PiperOrigin-RevId: 157850985 --- Commit d5421cf58 authored by Justin Lebar Committed by TensorFlower Gardener: Add additional concat test. PiperOrigin-RevId: 157844113 --- Commit f661128db authored by Geoffrey Irving Committed by TensorFlower Gardener: Remove unused overloads of SummarizeGraphDef and EqualGraphDef PiperOrigin-RevId: 157843404 --- Commit a56d59a84 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Set flow to a value during TensorArray creation, Re-enable tensor_array_ops_test in msan. PiperOrigin-RevId: 157841785 --- Commit edcc5cc13 authored by Justine Tunney Committed by TensorFlower Gardener: Add manual test runner for vz_sorting PiperOrigin-RevId: 157841098 --- Commit 3f6404f20 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Assign a max height of 800px to images in the image dashboard. The user could always expand to actual dimensions if need be. PiperOrigin-RevId: 157838046 --- Commit c6ea6972a authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Remove debugging LOG(INFO) from previous change. PiperOrigin-RevId: 157837305 --- Commit 07d39f28e authored by freedom" Koan-Sin Tan Committed by Benoit Steiner: make gcc-5 on Ubuntu 16.04 happy (#10385) gcc-5 complains of ambiguity and refuses to go when doing something like 'bazel build -c opt tensorflow/...' --- Commit ac66be783 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Minor cleanup: Remove unused BUILD dependencies and unnecessary code. PiperOrigin-RevId: 157837211 --- Commit 4161ccc8e authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Adjust tolerance on dirichlet_multinomial test. PiperOrigin-RevId: 157834660 --- Commit 43c0f52f1 authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Fix off-by-one error in BoolVector(begin, end) constructor. PiperOrigin-RevId: 157833086 --- Commit 419d437ba authored by Lakshay Garg Committed by Lakshay Garg: Fixed typo in code comment --- Commit 07710014d authored by A. Unique TensorFlower Committed by TensorFlower Gardener: Fix device colocation for KMeans in case of multiple parameter servers. PiperOrigin-RevId: 157795360 --- Commit b659bc39f authored by Justine Tunney Committed by TensorFlower Gardener: Simplify TensorBoard build - Remove tensorboard_typescript_genrule - Remove tensorboard_typescript_bundle - Introduce ts_web_library Skylark rule which supports seamless TypeScript compilation. - Use Closure Compiler in semi-advanced mode to compile JavaScript. This is done in a way that preserves