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": {