From 0cec9920f3f6d2e569470ecb4e242e86b47f2473 Mon Sep 17 00:00:00 2001 From: Matt Graham Date: Fri, 14 Oct 2016 03:56:06 +0100 Subject: [PATCH] Adding coursework files to master branch. --- courseworks/coursework_1.md | 247 ++++++++++++++ courseworks/coursework_1.pdf | Bin 0 -> 127040 bytes courseworks/coursework_1.tex | 607 +++++++++++++++++++++++++++++++++++ courseworks/cw1_hdr.tex | 12 + notebooks/Coursework_1.ipynb | 254 +++++++++++++++ 5 files changed, 1120 insertions(+) create mode 100644 courseworks/coursework_1.md create mode 100644 courseworks/coursework_1.pdf create mode 100644 courseworks/coursework_1.tex create mode 100644 courseworks/cw1_hdr.tex create mode 100644 notebooks/Coursework_1.ipynb diff --git a/courseworks/coursework_1.md b/courseworks/coursework_1.md new file mode 100644 index 0000000..2e51716 --- /dev/null +++ b/courseworks/coursework_1.md @@ -0,0 +1,247 @@ +# Machine Learning Practical: Coursework 1 + +**Release date: Monday 10th October 2016** +**Due date: 16:00 Thursday 27th October 2016** + +## Introduction + +This coursework is concerned with training multi-layer networks to address the MNIST digit classification problem. It builds on the material covered in the first three lab notebooks and the first four lectures. It is highly recommended that you complete the first three lab notebooks before starting the coursework. The aim of the coursework is to investigate the effect of learning rate schedules and adaptive learning rates on the progression of training and the final performance achieved by the trained models. + +## Mechanics + +**Marks:** This assignment will be assessed out of 100 marks and forms 10% of your final grade for the course. + +**Academic conduct:** Assessed work is subject to University regulations on academic conduct: + + +**Late submissions:** The School of Informatics policy is that late coursework normally gets a mark of zero. See for exceptions to this rule. Any requests for extensions should go to the Informatics Teaching Office (ITO), either directly or via your Personal Tutor. + +## Report + +The main component of your coursework submission, on which you will be assessed, will be a short report. This should follow a typical experimental report structure, in particular covering the following + + * a clear description of the methods used and algorithms implemented, + * quantitative results for the experiments you carried out including relevant graphs, + * discussion of the results of your experiments and any conclusions you have drawn. + +The report should be submitted in PDF. You are welcome to use what ever document preparation tool you prefer working with to write the report providing it can produce a PDF output and can meet the required presentation standards for the report. + +Of the total 100 marks for the coursework, 25 marks have been allocated for the quality of presentation and clarity of the report. A good report, will clear, precise, and concise. It will contain enough information for someone else to reproduce your work (with the exception that you do not have to include the values to which the parameters were randomly initialised). + +You will need to include experimental results plotted as graphs in the report. You are advised (but not required) to use `matplotlib` to produce these plots, and you may reuse code plotting (and other) code given in the lab notebooks as a starting point. + +Each plot should have all axes labelled and if multiple plots are included on the same set of axes a legend should be included to make clear what each line represents. Within the report all figures should be numbered (and you should use these numbers to refer to the figures in the main text) and have a descriptive caption stating what they show. + +Ideally all figures should be included in your report file as [vector graphics](https://en.wikipedia.org/wiki/Vector_graphics) rather than [raster files](https://en.wikipedia.org/wiki/Raster_graphics) as this will make sure all detail in the plot is visible. Matplotlib supports saving high quality figures in a wide range of common image formats using the [`savefig`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig) function. **You should use `savefig` rather than copying the screen-resolution raster images outputted in the notebook.** An example of using `savefig` to save a figure as a PDF file (which can be included as graphics in [LaTeX](https://en.wikibooks.org/wiki/LaTeX/Importing_Graphics) compiled with `pdflatex` and in Apple Pages and [Microsoft Word](https://support.office.com/en-us/article/Add-a-PDF-to-your-Office-file-74819342-8f00-4ab4-bcbe-0f3df15ab0dc) documents) is given below. + + + +```python +import matplotlib.pyplot as plt +import numpy as np +# Generate some example data to plot +x = np.linspace(0., 1., 100) +y1 = np.sin(2. * np.pi * x) +y2 = np.cos(2. * np.pi * x) +fig_size = (6, 3) # Set figure size in inches (width, height) +fig = plt.figure(figsize=fig_size) # Create a new figure object +ax = fig.add_subplot(1, 1, 1) # Add a single axes to the figure +# Plot lines giving each a label for the legend and setting line width to 2 +ax.plot(x, y1, linewidth=2, label='$y = \sin(2\pi x)$') +ax.plot(x, y2, linewidth=2, label='$y = \cos(2\pi x)$') +# Set the axes labels. Can use LaTeX in labels within $...$ delimiters. +ax.set_xlabel('$x$', fontsize=12) +ax.set_ylabel('$y$', fontsize=12) +ax.grid('on') # Turn axes grid on +ax.legend(loc='best', fontsize=11) # Add a legend +fig.tight_layout() # This minimises whitespace around the axes. +fig.savefig('file-name.pdf') # Save figure to current directory in PDF format +``` + +If you are using Libre/OpenOffice you should use Scalable Vector Format plots instead using `fig.savefig('file-name.svg')`. If the document editor you are using for the report does not support including either PDF or SVG graphics you can instead output high-resolution raster images using `fig.savefig('file-name.png', dpi=200)` however note these files will generally be larger than either SVG or PDF formatted graphics. + +If you make use of any any books, articles, web pages or other resources you should appropriately cite these in your report. You do not need to cite material from the course lecture slides or lab notebooks. + +## Code + +You should run all of the experiments for the coursework inside the Conda environment [you set up in the first lab](https://github.com/CSTR-Edinburgh/mlpractical/blob/mlp2016-7/master/environment-set-up.md). + +The code for the coursework is available on the course [Github repository](https://github.com/CSTR-Edinburgh/mlpractical/) on a branch `mlp2016-7/coursework1`. To create a local working copy of this branch in your local repository you need to do the following. + + 1. Make sure all modified files on the branch you are currently on have been committed ([see details here](https://github.com/CSTR-Edinburgh/mlpractical/blob/mlp2016-7/master/getting-started-in-a-lab.md) if you are unsure how to do this). + 2. Fetch changes to the upstream `origin` repository by running + ``` + git fetch origin + ``` + 3. Checkout a new local branch from the fetched branch using + ``` + git checkout -b coursework1 origin/mlp2016-7/coursework1 + ``` + +You will now have a new branch in your local repository with all the code necessary for the coursework in it. In the `notebooks` directory there is a notebook `Coursework_1.ipynb` which is intended as a starting point for structuring the code for your experiments. You will probably want to add additional code cells to this as you go along and run new experiments (e.g. doing each new training run in a new cell). You may also wish to use Markdown cells to keep notes on the results of experiments. + +## Submission + +Your coursework submission should be done electronically using the [`submit`](http://computing.help.inf.ed.ac.uk/submit) command available on DICE machines. + +Your submission should include + + * your completed course report as a PDF file, + * the notebook (`.ipynb`) file you use to run the experiments in + * and your local version of the `mlp` code including any changes you make to the modules (`.py` files). + +You should EITHER (1) package all of these files into a single archive file using [`tar`](http://linuxcommand.org/man_pages/tar1.html) or [`zip`](http://linuxcommand.org/man_pages/zip1.html), e.g. + +``` +tar -zcf coursework1.tar.gz notebooks/Coursework_1.ipynb mlp/*.py reports/coursework1.pdf +``` + +and then submit this archive using + +``` +submit mlp 1 coursework1.tar.gz +``` + +OR (2) copy all of the files to a single directory `coursework1` directory, e.g. + +``` +mkdir coursework1 +cp notebooks/Coursework_1.ipynb mlp/*.py reports/coursework1.pdf coursework1 +``` + +and then submit this directory using + +``` +submit mlp 1 coursework1 +``` + +The `submit` command will prompt you with the details of the submission including the name of the files / directories you are submitting and the name of the course and exercise you are submitting for and ask you to check if these details are correct. You should check these carefully and reply `y` to submit if you are sure the files are correct and `n` otherwise. + +You can amend an existing submission by rerunning the `submit` command any time up to the deadline. It is therefore a good idea (particularly if this is your first time using the DICE submit mechanism) to do an initial run of the `submit` command early on and then rerun the command if you make any further updates to your submisison rather than leaving submission to the last minute. + +## Backing up your work + +It is **strongly recommended** you use some method for backing up your work. Those working in their AFS homespace on DICE will have their work automatically backed up as part of the [routine backup](http://computing.help.inf.ed.ac.uk/backups-and-mirrors) of all user homespaces. If you are working on a personal computer you should have your own backup method in place (e.g. saving additional copies to an external drive, syncing to a cloud service or pushing commits to your local Git repository to a private repository on Github). **Loss of work through failure to back up [does not consitute a good reason for late submission](http://tinyurl.com/edinflate)**. + +You may *additionally* wish to keep your coursework under version control in your local Git repository on the `coursework1` branch. This does not need to be limited to the coursework notebook and `mlp` Python modules - you can also add your report document to the repository. + +If you make regular commits of your work on the coursework this will allow you to better keep track of the changes you have made and if necessary revert to previous versions of files and/or restore accidentally deleted work. This is not however required and you should note that keeping your work under version control is a distinct issue from backing up to guard against hard drive failure. If you are working on a personal computer you should still keep an additional back up of your work as described above. + +## Standard network architecture + +To make the results of your experiments more easily comparable, you should try to keep as many of the free choices in the specification of the model and learning problem the same across different experiments. If you vary only a small number of aspects of the problem at a time this will make it easier to interpret the effect those changes have. + +In all experiments you should therefore use the same model architecture and parameter initialisation method. In particular you should use a model composed of three affine transformations interleaved with logistic sigmoid nonlinearities, and a softmax output layer. The intermediate layers between the input and output should have a dimension of 100 (i.e. two hidden layers with 100 units in each hidden layer). This can be defined with the following code: + +```python +import numpy as np +from mlp.layers import AffineLayer, SoftmaxLayer, SigmoidLayer +from mlp.errors import CrossEntropySoftmaxError +from mlp.models import MultipleLayerModel +from mlp.initialisers import ConstantInit, GlorotUniformInit + +seed = 10102016 +rng = np.random.RandomState(seed) + +input_dim, output_dim, hidden_dim = 784, 10, 100 + +weights_init = GlorotUniformInit(rng=rng) +biases_init = ConstantInit(0.) + +model = MultipleLayerModel([ + AffineLayer(input_dim, hidden_dim, weights_init, biases_init), + SigmoidLayer(), + AffineLayer(hidden_dim, hidden_dim, weights_init, biases_init), + SigmoidLayer(), + AffineLayer(hidden_dim, output_dim, weights_init, biases_init) +]) + +error = CrossEntropySoftmaxError() +``` + +Here we are using a special parameter initialisation scheme for the weights which makes the scale of the random initialisation dependent on the input and output dimensions of the layer, with the aim of trying to keep the scale of activations at different layers of the network the same at initialisation. The scheme is described in [*Understanding the difficulty of training deep feedforward neural networks*, Glorot and Bengio (2011)](http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf). As also recommended there we initialise the biases to zero. You do not need to read or understand this paper for the assignment, it only being mentioned to explain the use of `GlorotUniformInit` in the above code. You should use this parameter initialisation for all of your experiments. + +As well as standardising the network architecture, you should also fix the hyperparameters of the training procedure not being investigated to be the same across different runs. In particular for all experiments you should use a **batch size of 50 and train for a total of 100 epochs** for all reported runs. You may of course use a smaller number of epochs for initial pilot runs. + +## Part 1: Learning rate schedules (10 marks) + +In the first part of the assignment you will investigate how using a time-dependent learning rate schedule influences training. + +Implement one of the two following time-dependent learning rate schedules: + + * exponential $\eta(t) = \eta_0 \exp\left(-t / r\right)$ + * reciprocal $\eta(t) = \eta_0 \left(1 + t / r\right)^{-1}$ + +where $\eta_0$ is the initial learning rate, $t$ the epoch number, $\eta(t)$ the learning rate at epoch $t$ and $r$ a free parameter governing how quickly the learning rate decays. + +You should implement the schedule by creating a new scheduler class in the `mlp.schedulers.py` module which follows the interface of the example `ConstantLearningRateScheduler` given in the module. In particular as well as an `__init__` method initialising the object with any free parameters for the schedule, the class should define a `update_learning_rule` method which sets the `learning_rate` attribute of a learning rule object based on the current epoch number. + +A (potentially empty) list of scheduler objects are passed to the `__init__` method of the `Optimiser` object used to train the model, for example + +```python +schedulers = [ConstantLearningRateScheduler(learning_rate)] +optimiser = Optimiser( + model, error, learning_rule, train_data, + valid_data, data_monitors, schedulers) +``` + +You should: + + * Compare the performance of your time-dependent learning rate schedule when training the standard model on the MNIST digit classification task, to training with a constant learning rate baseline. + * Indicate how the free schedule parameters $\eta_0$ and $r$ affect the evolution of the training. + * State the final error function and classification accuracy values and include plots of the evolution of the error and accuracy across the training epochs for both the training and validation sets. These should be reported for both the constant learning rate baseline and *at least* one run with your learning rate scheduler implementation. + +## Part 2: Momentum learning rule (15 marks) + +In this part of the assignment you will investigate using a gradient descent learning rule with momentum. This extends the basic gradient learning rule by introducing extra momentum state variables for the parameters. These can help the learning dynamic help overcome shallow local minima and speed convergence when making multiple successive steps in a similar direction in parameter space. + +An implementation of the momentum learning rule is given in the `mlp.learning_rules` module in the `MomentumLearningRule` class. Read through the code and documentation for this class and make sure you understand how it relates to the equations given in the lecture slides. + +In addition to the `learning_rate` parameter, the `MomentumLearningRule` also accepts a `mom_coeff` argument. This *momentum coefficient* $\alpha \in [0,\,1]$ determines the contribution of the previous momentum value to the new momentum after an update. + +As a first task you should: + + * Compare the performance of a basic gradient descent learning rule to the momentum learning rule for several values of the momentum coefficient $\alpha$. + * Interpret how the momentum coefficient $\alpha$ influences training. + * Include plots of the error and accuracy training curves across the training epochs, for the different momentum coefficients you test. + +Analogous to scheduling of the learning rate, it is also possible to vary the momentum coefficient over a training run. In particular it is common to increase the coefficient from an initially lower value at the start of training (when the direction of the gradient of the error function in parameter space are likely to vary a lot) to a larger value closer to 1 later in training. One possible schedule is + +\begin{equation} + \alpha(t) = \alpha_{\infty} \left( 1 - \frac{\gamma}{t + \tau} \right) +\end{equation} + +where $\alpha_{\infty} \in [0,\,1]$ determines the asymptotic momentum coefficient and $\tau \geq 1$ and $0 \leq \gamma \leq \tau$ determine the initial momentum coefficient and how quickly the coefficient tends to $\alpha_{\infty}$. + +You should create a scheduler class which implements the above momentum coefficient schedule by adding a further definition to the `mlp.schedulers` module. This should have the same interface as the learning rate scheduler implemented in the previous part. + +Using your implementation you should: + + * Try out several different momentum rate schedules by using different values for $\alpha_{\infty}$, $\gamma$ and $\tau$ and investigate whether using a variable momentum coefficient gives improved performance over a constant momentum coefficient baseline. + +## Part 3: Adaptive learning rules (40 marks) + +In the final part of the assignment you will investigate adaptive learning rules which attempt to automatically tune the scale of updates in a parameter-dependent fashion. + +You should implement **two** of the three adaptive learning rules mentioned in the [fourth lecture slides](http://www.inf.ed.ac.uk/teaching/courses/mlp/2016/mlp04-learn.pdf): [AdaGrad](http://jmlr.org/papers/v12/duchi11a.html), [RMSProp](http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf) and [Adam](https://arxiv.org/abs/1412.6980). + +You should implement the learning rules by defining new classes inheriting from `GradientDescendLearningRule` in the `mlp/learning_rules.py` module. The `MomentumLearningRule` class should show you how to define learning rules which use additional state variables to calculate the updates to the parameters. + +You should: + + * Compare the performance of your two implemented adaptive training rules to your previous results using the basic gradient descent and momentum learning rules. Ideally you should compare both in terms of speed of convergence (including potentially accounting for greater computional cost of the adaptive updates) and the final error / classification accuracy on both training and validation data sets. + * Briefly discuss any free parameters in the adaptive learning rules you implement and how sensitive training performance seems to the values used for them. + * Include example plots of the evolution of the error and accuracy across the training epochs for the training and validation sets for both of your implemented adaptive learning rules. + + +## Marking Scheme + +* Part 1, Learning Rate Schedules (10 marks). Marks awarded for completeness of implementation, experimental methodology, experimental results. + +* Part 2, Momentum Learning Rule (15 marks). Marks awarded for completeness of implementation, experimental methodology, experimental results. + +* Part 3, Adaptive Learning Rules (40 marks). Marks awarded for completeness of implementation, experimental methodology, experimental results. + +* Presentation and clarity of report (25 marks). Marks awarded for overall structure, clear and concise presentation, providing enough information to enable work to be reproduced, clear and concise presentation of results, informative discussion and conclusions. + +* Additional Excellence (10 marks). Marks awarded for significant personal insight, creativity, originality, and/or extra depth and academic maturity. diff --git a/courseworks/coursework_1.pdf b/courseworks/coursework_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7d1c61f393beb6f6ff84d1c7392ca8daaad4cbb8 GIT binary patch literal 127040 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

XU|xG7|}!-KT*~2g{FCRi2YPHzk?Rd>6$><{Cor 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 j1LRR)t!7FulDguyqYiTfnBQ2nA=hDHI+Y~ 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 literal 0 HcmV?d00001 diff --git a/courseworks/coursework_1.tex b/courseworks/coursework_1.tex new file mode 100644 index 0000000..fccf07b --- /dev/null +++ b/courseworks/coursework_1.tex @@ -0,0 +1,607 @@ +\documentclass[11pt,]{article} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{amssymb,amsmath} +\usepackage{ifxetex,ifluatex} +\usepackage{fixltx2e} % provides \textsubscript +% use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex + \usepackage[utf8]{inputenc} +\else % if luatex or xelatex + \ifxetex + \usepackage{mathspec} + \usepackage{xltxtra,xunicode} + \else + \usepackage{fontspec} + \fi + \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase} + \newcommand{\euro}{€} +\fi +% use microtype if available +\IfFileExists{microtype.sty}{\usepackage{microtype}}{} +\usepackage{color} +\usepackage{fancyvrb} +\newcommand{\VerbBar}{|} +\newcommand{\VERB}{\Verb[commandchars=\\\{\}]} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} +% Add ',fontsize=\small' for more characters per line +\newenvironment{Shaded}{}{} +\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} +\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} +\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} +\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} +\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} +\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} +\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} +\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} +\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} +\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} +\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} +\newcommand{\RegionMarkerTok}[1]{{#1}} +\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} +\newcommand{\NormalTok}[1]{{#1}} +\ifxetex + \usepackage[setpagesize=false, % page size defined by xetex + unicode=false, % unicode breaks when used with xetex + xetex]{hyperref} +\else + \usepackage[unicode=true]{hyperref} +\fi +\hypersetup{breaklinks=true, + bookmarks=true, + pdfauthor={}, + pdftitle={}, + colorlinks=true, + citecolor=blue, + urlcolor=blue, + linkcolor=magenta, + pdfborder={0 0 0}} +\urlstyle{same} % don't use monospace font for urls +\setlength{\parindent}{0pt} +\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines +\setcounter{secnumdepth}{0} +\usepackage{txfonts} +\usepackage{microtype} + +\usepackage[a4paper,body={170mm,250mm},top=25mm,left=25mm]{geometry} +\usepackage[sf,bf,small]{titlesec} +\usepackage{fancyhdr} + +\pagestyle{fancy} +\lhead{\sffamily MLP Coursework 1} +\rhead{\sffamily Due: 27 October 2016} +\cfoot{\sffamily \thepage} + +\author{} +\date{} + +\begin{document} + +\section{Machine Learning Practical: Coursework +1}\label{machine-learning-practical-coursework-1} + +\textbf{Release date: Monday 10th October 2016}\\\textbf{Due date: 16:00 +Thursday 27th October 2016} + +\subsection{Introduction}\label{introduction} + +This coursework is concerned with training multi-layer networks to +address the MNIST digit classification problem. It builds on the +material covered in the first three lab notebooks and the first four +lectures. It is highly recommended that you complete the first three lab +notebooks before starting the coursework. The aim of the coursework is +to investigate the effect of learning rate schedules and adaptive +learning rates on the progression of training and the final performance +achieved by the trained models. + +\subsection{Mechanics}\label{mechanics} + +\textbf{Marks:} This assignment will be assessed out of 100 marks and +forms 10\% of your final grade for the course. + +\textbf{Academic conduct:} Assessed work is subject to University +regulations on academic +conduct:\\\url{http://web.inf.ed.ac.uk/infweb/admin/policies/academic-misconduct} + +\textbf{Late submissions:} The School of Informatics policy is that late +coursework normally gets a mark of zero. See +{\small\url{http://web.inf.ed.ac.uk/infweb/student-services/ito/admin/coursework-projects/late-coursework-extension-requests}} +for exceptions to this rule. Any requests for extensions should go to +the Informatics Teaching Office (ITO), either directly or via your +Personal Tutor. + +\subsection{Report}\label{report} + +The main component of your coursework submission, on which you will be +assessed, will be a short report. This should follow a typical +experimental report structure, in particular covering the following + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + a clear description of the methods used and algorithms implemented, +\item + quantitative results for the experiments you carried out including + relevant graphs, +\item + discussion of the results of your experiments and any conclusions you + have drawn. +\end{itemize} + +The report should be submitted in PDF. You are welcome to use what ever +document preparation tool you prefer working with to write the report +providing it can produce a PDF output and can meet the required +presentation standards for the report. + +Of the total 100 marks for the coursework, 25 marks have been allocated +for the quality of presentation and clarity of the report. A good +report, will clear, precise, and concise. It will contain enough +information for someone else to reproduce your work (with the exception +that you do not have to include the values to which the parameters were +randomly initialised). + +You will need to include experimental results plotted as graphs in the +report. You are advised (but not required) to use \texttt{matplotlib} to +produce these plots, and you may reuse code plotting (and other) code +given in the lab notebooks as a starting point. + +Each plot should have all axes labelled and if multiple plots are +included on the same set of axes a legend should be included to make +clear what each line represents. Within the report all figures should be +numbered (and you should use these numbers to refer to the figures in +the main text) and have a descriptive caption stating what they show. + +Ideally all figures should be included in your report file as +\href{https://en.wikipedia.org/wiki/Vector_graphics}{vector graphics} +rather than \href{https://en.wikipedia.org/wiki/Raster_graphics}{raster +files} as this will make sure all detail in the plot is visible. +Matplotlib supports saving high quality figures in a wide range of +common image formats using the +\href{http://matplotlib.org/api/pyplot_api.html\#matplotlib.pyplot.savefig}{\texttt{savefig}} +function. \textbf{You should use \texttt{savefig} rather than copying +the screen-resolution raster images outputted in the notebook.} An +example of using \texttt{savefig} to save a figure as a PDF file (which +can be included as graphics in +\href{https://en.wikibooks.org/wiki/LaTeX/Importing_Graphics}{LaTeX} +compiled with \texttt{pdflatex} and in Apple Pages and +\href{https://support.office.com/en-us/article/Add-a-PDF-to-your-Office-file-74819342-8f00-4ab4-bcbe-0f3df15ab0dc}{Microsoft +Word} documents) is given below. + +\begin{Shaded} +\begin{Highlighting}[] +\CharTok{import} \NormalTok{matplotlib.pyplot }\CharTok{as} \NormalTok{plt} +\CharTok{import} \NormalTok{numpy }\CharTok{as} \NormalTok{np} +\CommentTok{# Generate some example data to plot} +\NormalTok{x = np.linspace(}\DecValTok{0}\NormalTok{., }\DecValTok{1}\NormalTok{., }\DecValTok{100}\NormalTok{)} +\NormalTok{y1 = np.sin(}\DecValTok{2}\NormalTok{. * np.pi * x)} +\NormalTok{y2 = np.cos(}\DecValTok{2}\NormalTok{. * np.pi * x)} +\NormalTok{fig_size = (}\DecValTok{6}\NormalTok{, }\DecValTok{3}\NormalTok{) }\CommentTok{# Set figure size in inches (width, height)} +\NormalTok{fig = plt.figure(figsize=fig_size) }\CommentTok{# Create a new figure object} +\NormalTok{ax = fig.add_subplot(}\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{, }\DecValTok{1}\NormalTok{) }\CommentTok{# Add a single axes to the figure} +\CommentTok{# Plot lines giving each a label for the legend and setting line width to 2} +\NormalTok{ax.plot(x, y1, linewidth=}\DecValTok{2}\NormalTok{, label=}\StringTok{'$y = \textbackslash{}sin(2\textbackslash{}pi x)$'}\NormalTok{)} +\NormalTok{ax.plot(x, y2, linewidth=}\DecValTok{2}\NormalTok{, label=}\StringTok{'$y = \textbackslash{}cos(2\textbackslash{}pi x)$'}\NormalTok{)} +\CommentTok{# Set the axes labels. Can use LaTeX in labels within $...$ delimiters.} +\NormalTok{ax.set_xlabel(}\StringTok{'$x$'}\NormalTok{, fontsize=}\DecValTok{12}\NormalTok{)} +\NormalTok{ax.set_ylabel(}\StringTok{'$y$'}\NormalTok{, fontsize=}\DecValTok{12}\NormalTok{)} +\NormalTok{ax.grid(}\StringTok{'on'}\NormalTok{) }\CommentTok{# Turn axes grid on} +\NormalTok{ax.legend(loc=}\StringTok{'best'}\NormalTok{, fontsize=}\DecValTok{11}\NormalTok{) }\CommentTok{# Add a legend} +\NormalTok{fig.tight_layout() }\CommentTok{# This minimises whitespace around the axes.} +\NormalTok{fig.savefig(}\StringTok{'file-name.pdf'}\NormalTok{) }\CommentTok{# Save figure to current directory in PDF format} +\end{Highlighting} +\end{Shaded} + +If you are using Libre/OpenOffice you should use Scalable Vector Format +plots instead using \\ +\texttt{fig.savefig('file-name.svg')}. If the +document editor you are using for the report does not support including +either PDF or SVG graphics you can instead output high-resolution raster +images using \texttt{fig.savefig('file-name.png', dpi=200)} however note +these files will generally be larger than either SVG or PDF formatted +graphics. + +If you make use of any any books, articles, web pages or other resources +you should appropriately cite these in your report. You do not need to +cite material from the course lecture slides or lab notebooks. + +\subsection{Code}\label{code} + +You should run all of the experiments for the coursework inside the +Conda environment +\href{https://github.com/CSTR-Edinburgh/mlpractical/blob/mlp2016-7/master/environment-set-up.md}{you +set up in the first lab}. + +The code for the coursework is available on the course +\href{https://github.com/CSTR-Edinburgh/mlpractical/}{Github repository} +on a branch \texttt{mlp2016-7/coursework1}. To create a local working +copy of this branch in your local repository you need to do the +following. + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\itemsep1pt\parskip0pt\parsep0pt +\item + Make sure all modified files on the branch you are currently on have + been committed + (\href{https://github.com/CSTR-Edinburgh/mlpractical/blob/mlp2016-7/master/getting-started-in-a-lab.md}{see + details here} if you are unsure how to do this). +\item + Fetch changes to the upstream \texttt{origin} repository by running\\ + \texttt{git fetch origin} +\item + Checkout a new local branch from the fetched branch using\\ + \texttt{git checkout -b coursework1 origin/mlp2016-7/coursework1} +\end{enumerate} + +You will now have a new branch in your local repository with all the +code necessary for the coursework in it. In the \texttt{notebooks} +directory there is a notebook \texttt{Coursework\_1.ipynb} which is +intended as a starting point for structuring the code for your +experiments. You will probably want to add additional code cells to this +as you go along and run new experiments (e.g.~doing each new training +run in a new cell). You may also wish to use Markdown cells to keep +notes on the results of experiments. + +\subsection{Submission}\label{submission} + +Your coursework submission should be done electronically using the +\href{http://computing.help.inf.ed.ac.uk/submit}{\texttt{submit}} +command available on DICE machines. + +Your submission should include + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + your completed course report as a PDF file, +\item + the notebook (\texttt{.ipynb}) file you use to run the experiments in +\item + and your local version of the \texttt{mlp} code including any changes + you make to the modules (\texttt{.py} files). +\end{itemize} + +You should EITHER (1) package all of these files into a single archive +file using +\href{http://linuxcommand.org/man_pages/tar1.html}{\texttt{tar}} or +\href{http://linuxcommand.org/man_pages/zip1.html}{\texttt{zip}}, e.g. + +{\small +\begin{verbatim} +tar -zcf coursework1.tar.gz notebooks/Coursework_1.ipynb mlp/*.py reports/coursework1.pdf +\end{verbatim} +} + +and then submit this archive using + +\begin{verbatim} +submit mlp 1 coursework1.tar.gz +\end{verbatim} + +OR (2) copy all of the files to a single directory \texttt{coursework1} +directory, e.g. + +\begin{verbatim} +mkdir coursework1 +cp notebooks/Coursework_1.ipynb mlp/*.py reports/coursework1.pdf coursework1 +\end{verbatim} + +and then submit this directory using + +\begin{verbatim} +submit mlp 1 coursework1 +\end{verbatim} + +The \texttt{submit} command will prompt you with the details of the +submission including the name of the files / directories you are +submitting and the name of the course and exercise you are submitting +for and ask you to check if these details are correct. You should check +these carefully and reply \texttt{y} to submit if you are sure the files +are correct and \texttt{n} otherwise. + +You can amend an existing submission by rerunning the \texttt{submit} +command any time up to the deadline. It is therefore a good idea +(particularly if this is your first time using the DICE submit +mechanism) to do an initial run of the \texttt{submit} command early on +and then rerun the command if you make any further updates to your +submisison rather than leaving submission to the last minute. + +\subsection{Backing up your work}\label{backing-up-your-work} + +It is \textbf{strongly recommended} you use some method for backing up +your work. Those working in their AFS homespace on DICE will have their +work automatically backed up as part of the +\href{http://computing.help.inf.ed.ac.uk/backups-and-mirrors}{routine +backup} of all user homespaces. If you are working on a personal +computer you should have your own backup method in place (e.g.~saving +additional copies to an external drive, syncing to a cloud service or +pushing commits to your local Git repository to a private repository on +Github). \textbf{Loss of work through failure to back up +\href{http://tinyurl.com/edinflate}{does not consitute a good reason for +late submission}}. + +You may \emph{additionally} wish to keep your coursework under version +control in your local Git repository on the \texttt{coursework1} branch. +This does not need to be limited to the coursework notebook and +\texttt{mlp} Python modules - you can also add your report document to +the repository. + +If you make regular commits of your work on the coursework this will +allow you to better keep track of the changes you have made and if +necessary revert to previous versions of files and/or restore +accidentally deleted work. This is not however required and you should +note that keeping your work under version control is a distinct issue +from backing up to guard against hard drive failure. If you are working +on a personal computer you should still keep an additional back up of +your work as described above. + +\subsection{Standard network +architecture}\label{standard-network-architecture} + +To make the results of your experiments more easily comparable, you +should try to keep as many of the free choices in the specification of +the model and learning problem the same across different experiments. If +you vary only a small number of aspects of the problem at a time this +will make it easier to interpret the effect those changes have. + +In all experiments you should therefore use the same model architecture +and parameter initialisation method. In particular you should use a +model composed of three affine transformations interleaved with logistic +sigmoid nonlinearities, and a softmax output layer. The intermediate +layers between the input and output should have a dimension of 100 +(i.e.~two hidden layers with 100 units in each hidden layer). This can +be defined with the following code: + +\begin{Shaded} +\begin{Highlighting}[] +\CharTok{import} \NormalTok{numpy }\CharTok{as} \NormalTok{np} +\CharTok{from} \NormalTok{mlp.layers }\CharTok{import} \NormalTok{AffineLayer, SoftmaxLayer, SigmoidLayer} +\CharTok{from} \NormalTok{mlp.errors }\CharTok{import} \NormalTok{CrossEntropySoftmaxError} +\CharTok{from} \NormalTok{mlp.models }\CharTok{import} \NormalTok{MultipleLayerModel} +\CharTok{from} \NormalTok{mlp.initialisers }\CharTok{import} \NormalTok{ConstantInit, GlorotUniformInit} + +\NormalTok{seed = }\DecValTok{10102016} +\NormalTok{rng = np.random.RandomState(seed)} + +\NormalTok{input_dim, output_dim, hidden_dim = }\DecValTok{784}\NormalTok{, }\DecValTok{10}\NormalTok{, }\DecValTok{100} + +\NormalTok{weights_init = GlorotUniformInit(rng=rng)} +\NormalTok{biases_init = ConstantInit(}\DecValTok{0}\NormalTok{.)} + +\NormalTok{model = MultipleLayerModel([} + \NormalTok{AffineLayer(input_dim, hidden_dim, weights_init, biases_init),} + \NormalTok{SigmoidLayer(),} + \NormalTok{AffineLayer(hidden_dim, hidden_dim, weights_init, biases_init),} + \NormalTok{SigmoidLayer(),} + \NormalTok{AffineLayer(hidden_dim, output_dim, weights_init, biases_init)} +\NormalTok{])} + +\NormalTok{error = CrossEntropySoftmaxError()} +\end{Highlighting} +\end{Shaded} + +Here we are using a special parameter initialisation scheme for the +weights which makes the scale of the random initialisation dependent on +the input and output dimensions of the layer, with the aim of trying to +keep the scale of activations at different layers of the network the +same at initialisation. The scheme is described in +\href{http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf}{\emph{Understanding +the difficulty of training deep feedforward neural networks}, Glorot and +Bengio (2011)}. As also recommended there we initialise the biases to +zero. You do not need to read or understand this paper for the +assignment, it only being mentioned to explain the use of +\texttt{GlorotUniformInit} in the above code. You should use this +parameter initialisation for all of your experiments. + +As well as standardising the network architecture, you should also fix +the hyperparameters of the training procedure not being investigated to +be the same across different runs. In particular for all experiments you +should use a \textbf{batch size of 50 and train for a total of 100 +epochs} for all reported runs. You may of course use a smaller number of +epochs for initial pilot runs. + +\subsection{Part 1: Learning rate schedules (10 +marks)}\label{part-1-learning-rate-schedules-10-marks} + +In the first part of the assignment you will investigate how using a +time-dependent learning rate schedule influences training. + +Implement one of the two following time-dependent learning rate +schedules: + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + exponential $\eta(t) = \eta_0 \exp\left(-t / r\right)$ +\item + reciprocal $\eta(t) = \eta_0 \left(1 + t / r\right)^{-1}$ +\end{itemize} + +where $\eta_0$ is the initial learning rate, $t$ the epoch number, +$\eta(t)$ the learning rate at epoch $t$ and $r$ a free parameter +governing how quickly the learning rate decays. + +You should implement the schedule by creating a new scheduler class in +the \texttt{mlp.schedulers.py} module which follows the interface of the +example \texttt{ConstantLearningRateScheduler} given in the module. In +particular as well as an \texttt{\_\_init\_\_} method initialising the +object with any free parameters for the schedule, the class should +define a \texttt{update\_learning\_rule} method which sets the +\texttt{learning\_rate} attribute of a learning rule object based on the +current epoch number. + +A (potentially empty) list of scheduler objects are passed to the +\texttt{\_\_init\_\_} method of the \texttt{Optimiser} object used to +train the model, for example + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{schedulers = [ConstantLearningRateScheduler(learning_rate)]} +\NormalTok{optimiser = Optimiser(} + \NormalTok{model, error, learning_rule, train_data,} + \NormalTok{valid_data, data_monitors, schedulers)} +\end{Highlighting} +\end{Shaded} + +You should: + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + Compare the performance of your time-dependent learning rate schedule + when training the standard model on the MNIST digit classification + task, to training with a constant learning rate baseline. +\item + Indicate how the free schedule parameters $\eta_0$ and $r$ affect the + evolution of the training. +\item + State the final error function and classification accuracy values and + include plots of the evolution of the error and accuracy across the + training epochs for both the training and validation sets. These + should be reported for both the constant learning rate baseline and + \emph{at least} one run with your learning rate scheduler + implementation. +\end{itemize} + +\subsection{Part 2: Momentum learning rule (15 +marks)}\label{part-2-momentum-learning-rule-15-marks} + +In this part of the assignment you will investigate using a gradient +descent learning rule with momentum. This extends the basic gradient +learning rule by introducing extra momentum state variables for the +parameters. These can help the learning dynamic help overcome shallow +local minima and speed convergence when making multiple successive steps +in a similar direction in parameter space. + +An implementation of the momentum learning rule is given in the +\texttt{mlp.learning\_rules} module in the \texttt{MomentumLearningRule} +class. Read through the code and documentation for this class and make +sure you understand how it relates to the equations given in the lecture +slides. + +In addition to the \texttt{learning\_rate} parameter, the +\texttt{MomentumLearningRule} also accepts a \texttt{mom\_coeff} +argument. This \emph{momentum coefficient} $\alpha \in [0,\,1]$ +determines the contribution of the previous momentum value to the new +momentum after an update. + +\newpage +As a first task you should: + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + Compare the performance of a basic gradient descent learning rule to + the momentum learning rule for several values of the momentum + coefficient $\alpha$. +\item + Interpret how the momentum coefficient $\alpha$ influences training. +\item + Include plots of the error and accuracy training curves across the + training epochs, for the different momentum coefficients you test. +\end{itemize} + +Analogous to scheduling of the learning rate, it is also possible to +vary the momentum coefficient over a training run. In particular it is +common to increase the coefficient from an initially lower value at the +start of training (when the direction of the gradient of the error +function in parameter space are likely to vary a lot) to a larger value +closer to 1 later in training. One possible schedule is + +\begin{equation} + \alpha(t) = \alpha_{\infty} \left( 1 - \frac{\gamma}{t + \tau} \right) +\end{equation} + +where $\alpha_{\infty} \in [0,\,1]$ determines the asymptotic momentum +coefficient and $\tau \geq 1$ and $0 \leq \gamma \leq \tau$ determine +the initial momentum coefficient and how quickly the coefficient tends to +$\alpha_{\infty}$. + +You should create a scheduler class which implements the above momentum +coefficient schedule by adding a further definition to the +\texttt{mlp.schedulers} module. This should have the same interface as +the learning rate scheduler implemented in the previous part. + +Using your implementation you should: + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + Try out several different momentum rate schedules by using different + values for $\alpha_{\infty}$, $\gamma$ and $\tau$ and investigate whether + using a variable momentum coefficient gives improved performance over + a constant momentum coefficient baseline. +\end{itemize} + +\subsection{Part 3: Adaptive learning rules (40 +marks)}\label{part-3-adaptive-learning-rules-40-marks} + +In the final part of the assignment you will investigate adaptive +learning rules which attempt to automatically tune the scale of updates +in a parameter-dependent fashion. + +You should implement \textbf{two} of the three adaptive learning rules +mentioned in the +\href{http://www.inf.ed.ac.uk/teaching/courses/mlp/2016/mlp04-learn.pdf}{fourth +lecture slides}: +\href{http://jmlr.org/papers/v12/duchi11a.html}{AdaGrad}, +\href{http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf}{RMSProp} +and \href{https://arxiv.org/abs/1412.6980}{Adam}. + +You should implement the learning rules by defining new classes +inheriting from \texttt{GradientDescendLearningRule} in the +\texttt{mlp/learning\_rules.py} module. The +\texttt{MomentumLearningRule} class should show you how to define +learning rules which use additional state variables to calculate the +updates to the parameters. + +You should: + +\begin{itemize} +\itemsep1pt\parskip0pt\parsep0pt +\item + Compare the performance of your two implemented adaptive training + rules to your previous results using the basic gradient descent and + momentum learning rules. Ideally you should compare both in terms of + speed of convergence (including potentially accounting for greater + computional cost of the adaptive updates) and the final error / + classification accuracy on both training and validation data sets. +\item + Briefly discuss any free parameters in the adaptive learning rules you + implement and how sensitive training performance seems to the values + used for them. +\item + Include example plots of the evolution of the error and accuracy + across the training epochs for the training and validation sets for + both of your implemented adaptive learning rules. +\end{itemize} + +\subsection{Marking Scheme}\label{marking-scheme} + +\begin{itemize} +\item + Part 1, Learning Rate Schedules (10 marks). Marks awarded for + completeness of implementation, experimental methodology, experimental + results. +\item + Part 2, Momentum Learning Rule (15 marks). Marks awarded for + completeness of implementation, experimental methodology, experimental + results. +\item + Part 3, Adaptive Learning Rules (40 marks). Marks awarded for + completeness of implementation, experimental methodology, experimental + results. +\item + Presentation and clarity of report (25 marks). Marks awarded for + overall structure, clear and concise presentation, providing enough + information to enable work to be reproduced, clear and concise + presentation of results, informative discussion and conclusions. +\item + Additional Excellence (10 marks). Marks awarded for significant + personal insight, creativity, originality, and/or extra depth and + academic maturity. +\end{itemize} + +\end{document} diff --git a/courseworks/cw1_hdr.tex b/courseworks/cw1_hdr.tex new file mode 100644 index 0000000..0cdfd12 --- /dev/null +++ b/courseworks/cw1_hdr.tex @@ -0,0 +1,12 @@ +\usepackage{txfonts} +\usepackage{microtype} + +\usepackage[a4paper,body={170mm,250mm},top=25mm,left=25mm]{geometry} +\usepackage[sf,bf,small]{titlesec} +\usepackage{fancyhdr} + +\pagestyle{fancy} +\lhead{\sffamily MLP Coursework 1} +\rhead{\sffamily Due: 27 October 2016} +\cfoot{\sffamily \thepage} + diff --git a/notebooks/Coursework_1.ipynb b/notebooks/Coursework_1.ipynb new file mode 100644 index 0000000..e394f1e --- /dev/null +++ b/notebooks/Coursework_1.ipynb @@ -0,0 +1,254 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Machine Learning Practical: Coursework 1\n", + "\n", + "**Release date: Monday 10th October 2016** \n", + "**Due date: 16:00 Thursday 27th October 2016**\n", + "\n", + "Instructions for the coursework are [available as a PDF here](http://www.inf.ed.ac.uk/teaching/courses/mlp/2016/coursework_1.pdf)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 1: Learning rate schedules" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# The below code will set up the data providers, random number\n", + "# generator and logger objects needed for training runs. As\n", + "# loading the data from file take a little while you generally\n", + "# will probably not want to reload the data providers on\n", + "# every training run. If you wish to reset their state you\n", + "# should instead use the .reset() method of the data providers.\n", + "import numpy as np\n", + "import logging\n", + "from mlp.data_providers import MNISTDataProvider\n", + "\n", + "# Seed a random number generator\n", + "seed = 10102016 \n", + "rng = np.random.RandomState(seed)\n", + "\n", + "# Set up a logger object to print info about the training run to stdout\n", + "logger = logging.getLogger()\n", + "logger.setLevel(logging.INFO)\n", + "logger.handlers = [logging.StreamHandler()]\n", + "\n", + "# Create data provider objects for the MNIST data set\n", + "train_data = MNISTDataProvider('train', batch_size=50, rng=rng)\n", + "valid_data = MNISTDataProvider('valid', batch_size=50, rng=rng)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# The model set up code below is provided as a starting point.\n", + "# You will probably want to add further code cells for the\n", + "# different experiments you run.\n", + "\n", + "from mlp.layers import AffineLayer, SoftmaxLayer, SigmoidLayer\n", + "from mlp.errors import CrossEntropySoftmaxError\n", + "from mlp.models import MultipleLayerModel\n", + "from mlp.initialisers import ConstantInit, GlorotUniformInit\n", + "\n", + "input_dim, output_dim, hidden_dim = 784, 10, 100\n", + "\n", + "weights_init = GlorotUniformInit(rng=rng)\n", + "biases_init = ConstantInit(0.)\n", + "\n", + "model = MultipleLayerModel([\n", + " AffineLayer(input_dim, hidden_dim, weights_init, biases_init), \n", + " SigmoidLayer(),\n", + " AffineLayer(hidden_dim, hidden_dim, weights_init, biases_init), \n", + " SigmoidLayer(),\n", + " AffineLayer(hidden_dim, output_dim, weights_init, biases_init)\n", + "])\n", + "\n", + "error = CrossEntropySoftmaxError()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 2: Momentum learning rule" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# The below code will set up the data providers, random number\n", + "# generator and logger objects needed for training runs. As\n", + "# loading the data from file take a little while you generally\n", + "# will probably not want to reload the data providers on\n", + "# every training run. If you wish to reset their state you\n", + "# should instead use the .reset() method of the data providers.\n", + "import numpy as np\n", + "import logging\n", + "from mlp.data_providers import MNISTDataProvider\n", + "\n", + "# Seed a random number generator\n", + "seed = 10102016 \n", + "rng = np.random.RandomState(seed)\n", + "\n", + "# Set up a logger object to print info about the training run to stdout\n", + "logger = logging.getLogger()\n", + "logger.setLevel(logging.INFO)\n", + "logger.handlers = [logging.StreamHandler()]\n", + "\n", + "# Create data provider objects for the MNIST data set\n", + "train_data = MNISTDataProvider('train', batch_size=50, rng=rng)\n", + "valid_data = MNISTDataProvider('valid', batch_size=50, rng=rng)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# The model set up code below is provided as a starting point.\n", + "# You will probably want to add further code cells for the\n", + "# different experiments you run.\n", + "\n", + "from mlp.layers import AffineLayer, SoftmaxLayer, SigmoidLayer\n", + "from mlp.errors import CrossEntropySoftmaxError\n", + "from mlp.models import MultipleLayerModel\n", + "from mlp.initialisers import ConstantInit, GlorotUniformInit\n", + "\n", + "input_dim, output_dim, hidden_dim = 784, 10, 100\n", + "\n", + "weights_init = GlorotUniformInit(rng=rng)\n", + "biases_init = ConstantInit(0.)\n", + "\n", + "model = MultipleLayerModel([\n", + " AffineLayer(input_dim, hidden_dim, weights_init, biases_init), \n", + " SigmoidLayer(),\n", + " AffineLayer(hidden_dim, hidden_dim, weights_init, biases_init), \n", + " SigmoidLayer(),\n", + " AffineLayer(hidden_dim, output_dim, weights_init, biases_init)\n", + "])\n", + "\n", + "error = CrossEntropySoftmaxError()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 3: Adaptive learning rules" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# The below code will set up the data providers, random number\n", + "# generator and logger objects needed for training runs. As\n", + "# loading the data from file take a little while you generally\n", + "# will probably not want to reload the data providers on\n", + "# every training run. If you wish to reset their state you\n", + "# should instead use the .reset() method of the data providers.\n", + "import numpy as np\n", + "import logging\n", + "from mlp.data_providers import MNISTDataProvider\n", + "\n", + "# Seed a random number generator\n", + "seed = 10102016 \n", + "rng = np.random.RandomState(seed)\n", + "\n", + "# Set up a logger object to print info about the training run to stdout\n", + "logger = logging.getLogger()\n", + "logger.setLevel(logging.INFO)\n", + "logger.handlers = [logging.StreamHandler()]\n", + "\n", + "# Create data provider objects for the MNIST data set\n", + "train_data = MNISTDataProvider('train', batch_size=50, rng=rng)\n", + "valid_data = MNISTDataProvider('valid', batch_size=50, rng=rng)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# The model set up code below is provided as a starting point.\n", + "# You will probably want to add further code cells for the\n", + "# different experiments you run.\n", + "\n", + "from mlp.layers import AffineLayer, SoftmaxLayer, SigmoidLayer\n", + "from mlp.errors import CrossEntropySoftmaxError\n", + "from mlp.models import MultipleLayerModel\n", + "from mlp.initialisers import ConstantInit, GlorotUniformInit\n", + "\n", + "input_dim, output_dim, hidden_dim = 784, 10, 100\n", + "\n", + "weights_init = GlorotUniformInit(rng=rng)\n", + "biases_init = ConstantInit(0.)\n", + "\n", + "model = MultipleLayerModel([\n", + " AffineLayer(input_dim, hidden_dim, weights_init, biases_init), \n", + " SigmoidLayer(),\n", + " AffineLayer(hidden_dim, hidden_dim, weights_init, biases_init), \n", + " SigmoidLayer(),\n", + " AffineLayer(hidden_dim, output_dim, weights_init, biases_init)\n", + "])\n", + "\n", + "error = CrossEntropySoftmaxError()" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [conda env:mlp]", + "language": "python", + "name": "conda-env-mlp-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}