{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Credits: Forked from [deep-learning-keras-tensorflow](https://github.com/leriomaggio/deep-learning-keras-tensorflow) by Valerio Maggio" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "
\n", "

Deep Learning with Keras

\n", " \n", "
\n", "\n", "
\n", "

Tutorial @ EuroScipy 2016

\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Yam Peleg, Valerio Maggio" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "# Goal of this Tutorial\n", "\n", "- **Introduce** main features of Keras\n", "- **Learn** how simple and Pythonic is doing Deep Learning with Keras\n", "- **Understand** how easy is to do basic and *advanced* DL models in Keras;\n", " - **Examples and Hand-on Excerises** along the way." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Source\n", "\n", "https://github.com/leriomaggio/deep-learning-keras-euroscipy2016/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# (Tentative) Schedule \n", "\n", "## Attention: Spoilers Warning!\n", "\n", "\n", "- **Setup** (`10 mins`)\n", "\n", "- **Part I**: **Introduction** (`~65 mins`)\n", "\n", " - Intro to ANN (`~20 mins`)\n", " - naive pure-Python implementation\n", " - fast forward, sgd, backprop\n", " \n", " - Intro to Theano (`15 mins`)\n", " - Model + SGD with Theano\n", " \n", " - Introduction to Keras (`30 mins`)\n", " - Overview and main features\n", " - Theano backend\n", " - Tensorflow backend\n", " - Multi-Layer Perceptron and Fully Connected\n", " - Examples with `keras.models.Sequential` and `Dense`\n", " - HandsOn: MLP with keras\n", " \n", "- **Coffe Break** (`30 mins`)\n", "\n", "- **Part II**: **Supervised Learning and Convolutional Neural Nets** (`~45 mins`)\n", " \n", " - Intro: Focus on Image Classification (`5 mins`)\n", "\n", " - Intro to CNN (`25 mins`)\n", " - meaning of convolutional filters\n", " - examples from ImageNet \n", " - Meaning of dimensions of Conv filters (through an exmple of ConvNet) \n", " - Visualising ConvNets\n", " - HandsOn: ConvNet with keras \n", "\n", " - Advanced CNN (`10 mins`)\n", " - Dropout\n", " - MaxPooling\n", " - Batch Normalisation\n", " \n", " - Famous Models in Keras (likely moved somewhere else) (`10 mins`)\n", " (ref: https://github.com/fchollet/deep-learning-models)\n", " - VGG16\n", " - VGG19\n", " - ResNet50\n", " - Inception v3\n", " - HandsOn: Fine tuning a network on new dataset \n", " \n", "- **Part III**: **Unsupervised Learning** (`10 mins`)\n", "\n", " - AutoEncoders (`5 mins`)\n", " - word2vec & doc2vec (gensim) & `keras.datasets` (`5 mins`)\n", " - `Embedding`\n", " - word2vec and CNN\n", " - Exercises\n", "\n", "- **Part IV**: **Advanced Materials** (`20 mins`)\n", " - RNN and LSTM (`10 mins`)\n", " - RNN, LSTM, GRU \n", " - Example of RNN and LSTM with Text (`~10 mins`) -- *Tentative*\n", " - HandsOn: IMDB\n", "\n", "- **Wrap up and Conclusions** (`5 mins`)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Requirements" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial requires the following packages:\n", "\n", "- Python version 3.4+ \n", " - likely Python 2.7 would be fine, but *who knows*? :P\n", "- `numpy` version 1.10 or later: http://www.numpy.org/\n", "- `scipy` version 0.16 or later: http://www.scipy.org/\n", "- `matplotlib` version 1.4 or later: http://matplotlib.org/\n", "- `pandas` version 0.16 or later: http://pandas.pydata.org\n", "- `scikit-learn` version 0.15 or later: http://scikit-learn.org\n", "- `keras` version 1.0 or later: http://keras.io\n", "- `theano` version 0.8 or later: http://deeplearning.net/software/theano/\n", "- `ipython`/`jupyter` version 4.0 or later, with notebook support\n", "\n", "(Optional but recommended):\n", "\n", "- `pyyaml`\n", "- `hdf5` and `h5py` (required if you use model saving/loading functions in keras)\n", "- **NVIDIA cuDNN** if you have NVIDIA GPUs on your machines.\n", " [https://developer.nvidia.com/rdp/cudnn-download]()\n", "\n", "The easiest way to get (most) these is to use an all-in-one installer such as [Anaconda](http://www.continuum.io/downloads) from Continuum. These are available for multiple architectures." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Python Version" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I'm currently running this tutorial with **Python 3** on **Anaconda**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python 3.5.2\r\n" ] } ], "source": [ "!python --version" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# How to set up your environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The quickest and simplest way to setup the environment is to use [conda](https://store.continuum.io) environment manager. \n", "\n", "We provide in the materials a `deep-learning.yml` that is complete and **ready to use** to set up your virtual environment with conda." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "name: deep-learning\r\n", "channels:\r\n", "- conda-forge\r\n", "- defaults\r\n", "dependencies:\r\n", "- accelerate=2.3.0=np111py35_3\r\n", "- accelerate_cudalib=2.0=0\r\n", "- bokeh=0.12.1=py35_0\r\n", "- cffi=1.6.0=py35_0\r\n", "- backports.shutil_get_terminal_size=1.0.0=py35_0\r\n", "- blas=1.1=openblas\r\n", "- ca-certificates=2016.8.2=3\r\n", "- cairo=1.12.18=8\r\n", "- certifi=2016.8.2=py35_0\r\n", "- cycler=0.10.0=py35_0\r\n", "- cython=0.24.1=py35_0\r\n", "- decorator=4.0.10=py35_0\r\n", "- entrypoints=0.2.2=py35_0\r\n", "- fontconfig=2.11.1=3\r\n", "- freetype=2.6.3=1\r\n", "- gettext=0.19.7=1\r\n", "- glib=2.48.0=4\r\n", "- h5py=2.6.0=np111py35_6\r\n", "- harfbuzz=1.0.6=0\r\n", "- hdf5=1.8.17=2\r\n", "- icu=56.1=4\r\n", "- ipykernel=4.3.1=py35_1\r\n", "- ipython=5.1.0=py35_0\r\n", "- ipywidgets=5.2.2=py35_0\r\n", "- jinja2=2.8=py35_1\r\n", "- jpeg=9b=0\r\n", "- jsonschema=2.5.1=py35_0\r\n", "- jupyter_client=4.3.0=py35_0\r\n", "- jupyter_console=5.0.0=py35_0\r\n", "- jupyter_core=4.1.1=py35_1\r\n", "- libffi=3.2.1=2\r\n", "- libiconv=1.14=3\r\n", "- libpng=1.6.24=0\r\n", "- libsodium=1.0.10=0\r\n", "- libtiff=4.0.6=6\r\n", "- libxml2=2.9.4=0\r\n", "- markupsafe=0.23=py35_0\r\n", "- matplotlib=1.5.2=np111py35_6\r\n", "- mistune=0.7.3=py35_0\r\n", "- nbconvert=4.2.0=py35_0\r\n", "- nbformat=4.0.1=py35_0\r\n", "- ncurses=5.9=8\r\n", "- nose=1.3.7=py35_1\r\n", "- notebook=4.2.2=py35_0\r\n", "- numpy=1.11.1=py35_blas_openblas_201\r\n", "- openblas=0.2.18=4\r\n", "- openssl=1.0.2h=2\r\n", "- pandas=0.18.1=np111py35_1\r\n", "- pango=1.40.1=0\r\n", "- path.py=8.2.1=py35_0\r\n", "- pcre=8.38=1\r\n", "- pexpect=4.2.0=py35_1\r\n", "- pickleshare=0.7.3=py35_0\r\n", "- pip=8.1.2=py35_0\r\n", "- pixman=0.32.6=0\r\n", "- prompt_toolkit=1.0.6=py35_0\r\n", "- protobuf=3.0.0b3=py35_1\r\n", "- ptyprocess=0.5.1=py35_0\r\n", "- pygments=2.1.3=py35_1\r\n", "- pyparsing=2.1.7=py35_0\r\n", "- python=3.5.2=2\r\n", "- python-dateutil=2.5.3=py35_0\r\n", "- pytz=2016.6.1=py35_0\r\n", "- pyyaml=3.11=py35_0\r\n", "- pyzmq=15.4.0=py35_0\r\n", "- qt=4.8.7=0\r\n", "- qtconsole=4.2.1=py35_0\r\n", "- readline=6.2=0\r\n", "- requests=2.11.0=py35_0\r\n", "- scikit-learn=0.17.1=np111py35_blas_openblas_201\r\n", "- scipy=0.18.0=np111py35_blas_openblas_201\r\n", "- setuptools=25.1.6=py35_0\r\n", "- simplegeneric=0.8.1=py35_0\r\n", "- sip=4.18=py35_0\r\n", "- six=1.10.0=py35_0\r\n", "- sqlite=3.13.0=1\r\n", "- terminado=0.6=py35_0\r\n", "- tk=8.5.19=0\r\n", "- tornado=4.4.1=py35_1\r\n", "- traitlets=4.2.2=py35_0\r\n", "- wcwidth=0.1.7=py35_0\r\n", "- wheel=0.29.0=py35_0\r\n", "- widgetsnbextension=1.2.6=py35_3\r\n", "- xz=5.2.2=0\r\n", "- yaml=0.1.6=0\r\n", "- zeromq=4.1.5=0\r\n", "- zlib=1.2.8=3\r\n", "- cudatoolkit=7.5=0\r\n", "- ipython_genutils=0.1.0=py35_0\r\n", "- jupyter=1.0.0=py35_3\r\n", "- libgfortran=3.0.0=1\r\n", "- llvmlite=0.11.0=py35_0\r\n", "- mkl=11.3.3=0\r\n", "- mkl-service=1.1.2=py35_2\r\n", "- numba=0.26.0=np111py35_0\r\n", "- pycparser=2.14=py35_1\r\n", "- pyqt=4.11.4=py35_4\r\n", "- snakeviz=0.4.1=py35_0\r\n", "- pip:\r\n", " - backports.shutil-get-terminal-size==1.0.0\r\n", " - certifi==2016.8.2\r\n", " - cycler==0.10.0\r\n", " - cython==0.24.1\r\n", " - decorator==4.0.10\r\n", " - h5py==2.6.0\r\n", " - ipykernel==4.3.1\r\n", " - ipython==5.1.0\r\n", " - ipython-genutils==0.1.0\r\n", " - ipywidgets==5.2.2\r\n", " - jinja2==2.8\r\n", " - jsonschema==2.5.1\r\n", " - jupyter-client==4.3.0\r\n", " - jupyter-console==5.0.0\r\n", " - jupyter-core==4.1.1\r\n", " - keras==1.0.7\r\n", " - mako==1.0.4\r\n", " - markupsafe==0.23\r\n", " - matplotlib==1.5.2\r\n", " - mistune==0.7.3\r\n", " - nbconvert==4.2.0\r\n", " - nbformat==4.0.1\r\n", " - nose==1.3.7\r\n", " - notebook==4.2.2\r\n", " - numpy==1.11.1\r\n", " - pandas==0.18.1\r\n", " - path.py==8.2.1\r\n", " - pexpect==4.2.0\r\n", " - pickleshare==0.7.3\r\n", " - pip==8.1.2\r\n", " - prompt-toolkit==1.0.6\r\n", " - protobuf==3.0.0b2\r\n", " - ptyprocess==0.5.1\r\n", " - pygments==2.1.3\r\n", " - pygpu==0.2.1\r\n", " - pyparsing==2.1.7\r\n", " - python-dateutil==2.5.3\r\n", " - pytz==2016.6.1\r\n", " - pyyaml==3.11\r\n", " - pyzmq==15.4.0\r\n", " - qtconsole==4.2.1\r\n", " - requests==2.11.0\r\n", " - scikit-learn==0.17.1\r\n", " - scipy==0.18.0\r\n", " - setuptools==25.1.4\r\n", " - simplegeneric==0.8.1\r\n", " - six==1.10.0\r\n", " - tensorflow==0.10.0rc0\r\n", " - terminado==0.6\r\n", " - theano==0.8.2\r\n", " - tornado==4.4.1\r\n", " - traitlets==4.2.2\r\n", " - wcwidth==0.1.7\r\n", " - wheel==0.29.0\r\n", " - widgetsnbextension==1.2.6\r\n", "prefix: /home/valerio/anaconda3/envs/deep-learning\r\n", "\r\n" ] } ], "source": [ "!cat deep-learning.yml" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Recreate the Conda Environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### A. Create the Environment\n", "\n", "```\n", "conda env create -f deep-learning.yml # this file is for Linux channels.\n", "```\n", "\n", "If you're using a **Mac OSX**, we also provided in the repo the conda file \n", "that is compatible with `osx-channels`:\n", "\n", "```\n", "conda env create -f deep-learning-osx.yml # this file is for OSX channels.\n", "```\n", "\n", "#### B. Activate the new `deep-learning` Environment\n", "\n", "```\n", "source activate deep-learning\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optionals" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Enabling Conda-Forge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is strongly suggested to enable [**conda forge**](https://conda-forge.github.io/) in your Anaconda installation.\n", "\n", "**Conda-Forge** is a github organisation containing repositories of conda recipies.\n", "\n", "To add `conda-forge` as an additional anaconda channel it is just required to type:\n", "\n", "```shell\n", "conda config --add channels conda-forge\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Configure Theano\n", "\n", "1) Create the `theanorc` file:\n", "\n", "```shell\n", "touch $HOME/.theanorc\n", "```\n", "\n", "2) Copy the following content into the file:\n", "\n", "```\n", "[global]\n", "floatX = float32\n", "device = gpu # switch to cpu if no GPU is available on your machine\n", "\n", "[nvcc]\n", "fastmath = True\n", "\n", "[lib]\n", "cnmem=.90\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**More on [theano documentation](http://theano.readthedocs.io/en/latest/library/config.html)**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Installing Tensorflow as backend " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```shell\n", "# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5\n", "# Requires CUDA toolkit 7.5 and CuDNN v4. For other versions, see \"Install from sources\" below.\n", "export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0rc0-cp35-cp35m-linux_x86_64.whl\n", "\n", "pip install --ignore-installed --upgrade $TF_BINARY_URL\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**More on [tensorflow documentation](https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html)**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Test if everything is up&running" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Check import" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "import scipy as sp\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import sklearn" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using Theano backend.\n", "Using gpu device 0: GeForce GTX 760 (CNMeM is enabled with initial size: 90.0% of memory, cuDNN 4007)\n" ] } ], "source": [ "import keras" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Check installeded Versions" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "numpy: 1.11.1\n", "scipy: 0.18.0\n", "matplotlib: 1.5.2\n", "iPython: 5.1.0\n", "scikit-learn: 0.17.1\n" ] } ], "source": [ "import numpy\n", "print('numpy:', numpy.__version__)\n", "\n", "import scipy\n", "print('scipy:', scipy.__version__)\n", "\n", "import matplotlib\n", "print('matplotlib:', matplotlib.__version__)\n", "\n", "import IPython\n", "print('iPython:', IPython.__version__)\n", "\n", "import sklearn\n", "print('scikit-learn:', sklearn.__version__)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "keras: 1.0.7\n", "Theano: 0.8.2\n", "Tensorflow: 0.10.0rc0\n" ] } ], "source": [ "import keras\n", "print('keras: ', keras.__version__)\n", "\n", "import theano\n", "print('Theano: ', theano.__version__)\n", "\n", "# optional\n", "import tensorflow as tf\n", "print('Tensorflow: ', tf.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

If everything worked till down here, you're ready to start!

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Consulting Material" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You have two options to go through the material presented in this tutorial:\n", "\n", "* Read (and execute) the material as **iPython/Jupyter** notebooks\n", "* (just) read the material as (HTML) slides" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the first case, all you need to do is just execute `ipython notebook` (or `jupyter notebook`) depending on the version of `iPython` you have installed on your machine\n", "\n", "(`jupyter` command works in case you have `iPython 4.0.x` installed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the second case, you may simply convert the provided notebooks in `HTML` slides and see them into your browser\n", "thanks to `nbconvert`.\n", "\n", "Thus, move to the folder where notebooks are stored and execute the following command:\n", "\n", " jupyter nbconvert --to slides ./*.ipynb --post serve\n", " \n", " \n", "(Please substitute `jupyter` with `ipython` in the previous command if you have `iPython 3.x` installed on your machine)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## In case..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "..you wanna do **both** (interactive and executable slides), I highly suggest to install the terrific `RISE` ipython notebook extension: [https://github.com/damianavila/RISE](https://github.com/damianavila/RISE)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }