From 13de626279636bde8aa69d67c345ee1a4816c3f8 Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Wed, 21 Sep 2016 02:30:21 +0100 Subject: [PATCH] Editing first lab notebook exercises and adding to Jupyter basics guide. --- notebooks/00_Introduction.ipynb | 272 +++++++++++++++++++------------- 1 file changed, 159 insertions(+), 113 deletions(-) diff --git a/notebooks/00_Introduction.ipynb b/notebooks/00_Introduction.ipynb index f545f95..e6bb392 100644 --- a/notebooks/00_Introduction.ipynb +++ b/notebooks/00_Introduction.ipynb @@ -14,6 +14,8 @@ "\n", "The majority of your work in this course will be done using Jupyter notebooks so we will here introduce some of the basics of the notebook system. If you are already comfortable using notebooks or just would rather get on with some coding feel free to [skip straight to the exercises below](#Exercises).\n", "\n", + "*Note: Jupyter notebooks are also known as IPython notebooks. The Jupyter system now supports languages other than Python [hence the name was changed to make it more language agnostic](https://ipython.org/#jupyter-and-the-future-of-ipython) however IPython notebook is still commonly used.*\n", + "\n", "### Jupyter basics: the server, dashboard and kernels\n", "\n", "In launching this notebook you will have already come across two of the other key components of the Jupyter system - the notebook *server* and *dashboard* interface.\n", @@ -136,38 +138,12 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello world!\n", - "Hello again!\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Alarming hello!\n" - ] - }, - { - "data": { - "text/plain": [ - "'And again!'" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from __future__ import print_function\n", "import sys\n", @@ -207,37 +183,37 @@ "\n", "A useful command mode shortcut to know about is the ability to toggle line numbers on and off for a cell by pressing `L` which can be useful when trying to diagnose stack traces printed when an exception is raised or when referring someone else to a section of code.\n", " \n", - "### Extensions and magics\n", + "### Magics\n", "\n", - " * Extensions and magics\n", - " * %%timeit, time, debug, pdb, precision\n", + "There are a range of *magic* commands in IPython notebooks, than provide helpful tools outside of the usual Python syntax. A full list of the inbuilt magic commands is given [here](http://ipython.readthedocs.io/en/stable/interactive/magics.html), however three that are particularly useful for this course:\n", + "\n", + " * [`%%timeit`](http://ipython.readthedocs.io/en/stable/interactive/magics.html?highlight=matplotlib#magic-timeit) Put at the beginning of a cell to time its execution and print the resulting timing statistics.\n", + " * [`%precision`](http://ipython.readthedocs.io/en/stable/interactive/magics.html?highlight=matplotlib#magic-precision) Set the precision for pretty printing of floating point values and NumPy arrays.\n", + " * [`%debug`](http://ipython.readthedocs.io/en/stable/interactive/magics.html?highlight=matplotlib#magic-debug) Activates the interactive debugger in a cell. Run after an exception has been occured to help diagnose the issue.\n", " \n", "### Plotting with `matplotlib`\n", "\n", - "When setting up your environment one of the dependencies we asked you to install was `matplotlib`. This is an extensive plotting and data visualisation library which is tightly integrated with NumPy and Jupyter notebooks." + "When setting up your environment one of the dependencies we asked you to install was `matplotlib`. This is an extensive plotting and data visualisation library which is tightly integrated with NumPy and Jupyter notebooks.\n", + "\n", + "When using `matplotlib` in a notebook you should first run the [magic command](http://ipython.readthedocs.io/en/stable/interactive/magics.html?highlight=matplotlib)\n", + "\n", + "```\n", + "%matplotlib inline\n", + "```\n", + "\n", + "This will cause all plots to be automatically displayed as images in the output area of the cell they are created in. Below we give a toy example of plotting two sinusoids using `matplotlib` to show case some of the basic plot options. To see the output produced select the cell and then run it." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "collapsed": false, "nbpresent": { "id": "2bced39d-ae3a-4603-ac94-fbb6a6283a96" } }, - "outputs": [ - { - "data": { - "image/png": "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\nCCGEEMKV/g/9AdlDBfWSkwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# use the matplotlib magic to specify to display plots inline in the notebook\n", "%matplotlib inline\n", @@ -286,61 +262,104 @@ "\n", "### Exercise 1 \n", "\n", - " * Using MNISTDataProvider, write code that iterates over the first 5 minibatches of size 100 data-points. \n", - " * Display each batch of MNIST digits in a 10x10 grid of images. \n", - " \n", - "**Notes**:\n", - "\n", - " * Images are returned from the provider as tuples of numpy arrays `(inputs, targets)`. The `inputs` matrix has shape `(batch_size, input_dim)` while the `targets` array is of shape `(batch_size,)`, where `batch_size` is the number of data points in a single batch and `input_dim` is dimensionality of the input features. \n", - " * Each input data-point (image) is stored as a 784 dimensional vector of pixel intensities normalised to $[0, 1]$ from inital integer values in $[0, 255]$. However, the original spatial domain is two dimensional, so before plotting you will need to reshape the one dimensional input arrays in to two dimensional arrays 2D (MNIST images have the same height and width dimensions).\n", - "\n", - "*Tip:* Some potentially useful functions for this exercise are: `np.reshape`, `plt.imshow`, `subplot`, `gridspec`" + "The `MNISTDataProvider` iterates over input images and target classes (digit IDs) from the [MNIST database of handwritten digit images](http://yann.lecun.com/exdb/mnist/), a common supervised learning benchmark task. Using the data provider and `matplotlib` we can for example iterate over the first couple of images in the dataset and display them using the following code:" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "nbpresent": { - "id": "113d1e72-6a3a-424b-bafb-9148a1ee21ca" - } - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import matplotlib.gridspec as gridspec\n", - "import matplotlib.cm as cm\n", - "from mlp.data_providers import MNISTDataProvider\n", - "\n", - "def show_mnist_image(img):\n", - " fig = plt.figure()\n", - " gs = gridspec.GridSpec(1, 1)\n", - " ax1 = fig.add_subplot(gs[0,0])\n", - " ax1.imshow(img, cmap=cm.Greys_r)\n", - " plt.show()\n", - "\n", - "def show_mnist_images(batch):\n", - " raise NotImplementedError('Write me!')" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false, "nbpresent": { "id": "978c1095-a9ce-4626-a113-e0be5fe51ecb" } }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Image target: [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]\n" + ] + }, + { + "data": { + "image/png": "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\nrkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Image target: [[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]]\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.gridspec as gridspec\n", + "import matplotlib.cm as cm\n", + "import mlp.data_providers as data_providers\n", + "\n", + "def show_single_image(img, fig_size=(2, 2)):\n", + " fig = plt.figure(figsize=fig_size)\n", + " ax = fig.add_subplot(111)\n", + " ax.imshow(img, cmap=cm.Greys_r)\n", + " ax.axis('off')\n", + " plt.show()\n", + " return fig, ax\n", + "\n", + "# An example for a single MNIST image\n", + "mnist_dp = data_providers.MNISTDataProvider(\n", + " which_set='valid', batch_size=1, max_num_batches=2, shuffle_order=True)\n", + "\n", + "for inputs, target in mnist_dp:\n", + " show_single_image(inputs.reshape(28, 28))\n", + " print('Image target: {0}'.format(target))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generally we will want to deal with batches of multiple images i.e. `batch_size > 1`. As a first task:\n", + "\n", + " * Using MNISTDataProvider, write code that iterates over the first 5 minibatches of size 100 data-points. \n", + " * Display each batch of MNIST digits in a $10\\times10$ grid of images. \n", + " \n", + "**Notes**:\n", + "\n", + " * Images are returned from the provider as tuples of numpy arrays `(inputs, targets)`. The `inputs` matrix has shape `(batch_size, input_dim)` while the `targets` array is of shape `(batch_size,)`, where `batch_size` is the number of data points in a single batch and `input_dim` is dimensionality of the input features. \n", + " * Each input data-point (image) is stored as a 784 dimensional vector of pixel intensities normalised to $[0, 1]$ from inital integer values in $[0, 255]$. However, the original spatial domain is two dimensional, so before plotting you will need to reshape the one dimensional input arrays in to two dimensional arrays 2D (MNIST images have the same height and width dimensions)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ - "# An example for a single MNIST image\n", - "mnist_dp = MNISTDataProvider(dset='valid', batch_size=1, max_num_examples=2, randomize=False)\n", + "# write your code here for iterating over five batches of 100 data points each and displaying as 10x10 grids\n", "\n", - "for batch in mnist_dp:\n", - " features, targets = batch\n", - " show_mnist_image(features.reshape(28, 28))" + "def show_batch_of_images(img_batch):\n", + " raise NotImplementedError('Write me!')" ] }, { @@ -353,40 +372,43 @@ "source": [ "### Exercise 2\n", "\n", - "`MNISTDataProvider` as `targets` currently returns a vector of integers, each element in this vector represents an id of the category `features` data-point represent. Later in the course we are going to need 1-of-K representation of targets, for instance, given the minibatch of size 3 and the corresponding targets vector $[2, 2, 0]$ (and assuming there are only 3 different classes to discriminate between), one needs to convert it into matrix $\\left[ \\begin{array}{ccc}\n", - "0 & 0 & 1 \\\\\n", - "0 & 0 & 1 \\\\\n", - "1 & 0 & 0 \\end{array} \\right]$. \n", + "`MNISTDataProvider` as `targets` currently returns a vector of integers, each element in this vector represents an the integer ID of the class the corresponding data-point represents. \n", "\n", - "Implement `__to_one_of_k` method of `MNISTDataProvider` class. Then modify (uncomment) an appropriate line in its `next` method, so the raw targets get converted to `1 of K` coding. Test the code in the cell below." + "For training of neural networks a 1-of-K representation of multi-class targets is more useful. Instead of representing class identity by an integer ID, for each data point a vector of length equal to the number of classes is created, will all elements zero except for the element corresponding to the class ID. \n", + "\n", + "For instance, given a batch of 5 integer targets `[2, 2, 0, 1, 0]` and assuming there are 3 different classes \n", + "the corresponding 1-of_K encoded targets would be\n", + "```\n", + "[[0, 0, 1],\n", + " [0, 0, 1],\n", + " [1, 0, 0],\n", + " [0, 1, 0],\n", + " [1, 0, 0]]\n", + "```\n", + "\n", + " * Implement the `to_one_of_k` method of `MNISTDataProvider` class. \n", + " * Uncomment and modify an appropriate line in the `next` method, so the raw targets are converted to 1-of-K coding. \n", + " * Test your code by running the the cell below." ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, - "nbpresent": { - "id": "5e437105-a6d4-4187-9557-26e7296e9909" - } + "collapsed": false }, "outputs": [], "source": [ - "#implement here Exercise 1" + "mnist_dp = data_providers.MNISTDataProvider(\n", + " which_set='valid', batch_size=5, max_num_batches=5, shuffle_order=False)\n", + "\n", + "for inputs, targets in mnist_dp:\n", + " assert np.all(targets.sum(-1) == 1.)\n", + " assert np.all(targets >= 0.)\n", + " assert np.all(targets <= 1.)\n", + " print(targets)" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true, - "nbpresent": { - "id": "0e6d7154-d799-428a-bf1f-f574351ed649" - } - }, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": { @@ -398,22 +420,46 @@ "source": [ "### Exercise 3\n", "\n", - "Write your own data provider `MetOfficeDataProvider` that wraps the weather data for south Scotland (could be obtained from: http://www.metoffice.gov.uk/hadobs/hadukp/data/daily/HadSSP_daily_qc.txt). The file was also downloaded and stored in `data` directory for your convenience. The provider should return a tuple `(x,t)` of the estimates over an arbitrary time windows (i.e. last N-1 days) for `x` and the N-th day as the one which model should be able to predict, `t`. For now, skip missing data-points (denoted by -99.9) and simply use the next correct value. Make sure the provider works for arbitrary `batch_size` settings, including the case where single mini-batch is equal to all datapoints in the dataset. Test the dataset in the cell below.\n", + "Write your own data provider `MetOfficeDataProvider` that wraps [weather data for south Scotland](http://www.metoffice.gov.uk/hadobs/hadukp/data/daily/HadSSP_daily_qc.txt). A previous version of this data has been stored in `data` directory for your convenience.\n", "\n", - "Tip: To follow with this exercise, copy MNISTDataProvider in dataset.py, rename it to `MetOfficeDataProvider` and reimplement necesarry parts (including the arguments you pass to the constructor)." + "The data is organised in the text file as a table, with the first two columns indexing the year and month of the readings and the following 31 columns giving daily precipitation values for the corresponding month. As not all months have 31 days some of entries correspond to non-existing days. These values are indicated by a non-physical value of `-99.9`.\n", + "\n", + " * You should read all of the data from the file (`np.loadtxt` may be useful for this) and then filter out the `-99.9` values and collapse the table to one-dimensional array corresponding to a sequence of daily measurements for the whole period data is available for.\n", + " * A common initial preprocessing step in machine learning tasks is to normalise data so that it has zero mean and a standard deviation of one. Normalise the data sequence so that its overall mean is zero and standard deviation one.\n", + " * Each data point in the data provider should correspond to a window of length specified in the `__init__` method as `window_size` of this contiguous data sequence, with the model inputs being the first `window_size - 1` elements of the window and the target output being the last element of the window. For example if the original data sequence was `[1, 2, 3, 4, 5, 6]` and `window_size=3` then `input, target` pairs iterated over by the data provider should be\n", + " ```\n", + " [1, 2], 3\n", + " [4, 5], 6\n", + " ```\n", + " * **Extension**: Have the data provider instead overlapping windows of the sequence so that more training data instances are produced. For example for the sequence `[1, 2, 3, 4, 5, 6]` the corresponding `input, target` pairs would be\n", + "\n", + "```\n", + "[1, 2], 3\n", + "[2, 3], 4\n", + "[3, 4], 5\n", + "[4, 5], 6\n", + "```\n", + " * Test your code by running the cell below." ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true, + "collapsed": false, "nbpresent": { "id": "c8553a56-9f25-4198-8a1a-d7e9572b4382" } }, "outputs": [], - "source": [] + "source": [ + "for window_size in [2, 5, 10]:\n", + " met_dp = data_providers.MetOfficeDataProvider(\n", + " window_size=window_size, batch_size=5, max_num_batches=5, shuffle_order=False)\n", + " for inputs, targets in met_dp:\n", + " assert inputs.shape == (5, window_size - 1)\n", + " assert targets.shape == (5, )" + ] } ], "metadata": {