From fa4c4c57f0b3d44227bf6a6022a23c46a4cfc829 Mon Sep 17 00:00:00 2001 From: Herbert Kruitbosch Date: Thu, 18 Jan 2018 09:41:18 +0100 Subject: [PATCH] added benchmark notebooks --- 01. Matrix multiplication.ipynb | 286 ++++++++++++++++++ ...Neural Network training + evaluation.ipynb | 188 ++++++++++++ 03. Popular image classification models.ipynb | 256 ++++++++++++++++ 3 files changed, 730 insertions(+) create mode 100644 01. Matrix multiplication.ipynb create mode 100644 02. Simple Neural Network training + evaluation.ipynb create mode 100644 03. Popular image classification models.ipynb diff --git a/01. Matrix multiplication.ipynb b/01. Matrix multiplication.ipynb new file mode 100644 index 0000000..d3dd375 --- /dev/null +++ b/01. Matrix multiplication.ipynb @@ -0,0 +1,286 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "import matplotlib\n", + "%matplotlib inline\n", + "matplotlib.rcParams['figure.figsize'] = (20, 10)\n", + "matplotlib.rcParams['font.size'] = 24\n", + "matplotlib.rcParams['lines.linewidth'] = 5\n", + "matplotlib.rcParams['lines.markersize'] = 20\n", + "\n", + "import tensorflow as tf\n", + "from tensorflow.python.client import device_lib\n", + "\n", + "import time\n", + "import numpy as np\n", + "from matplotlib import pyplot\n", + "from collections import defaultdict\n", + "from ipy_table import make_table, set_row_style, set_column_style\n", + "from jupyter_progressbar import ProgressBar" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Devices\n", + "\n", + "lists the devices found by tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
nametype
/device:CPU:0CPU
/device:GPU:0GPU
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "devices = device_lib.list_local_devices()\n", + "\n", + "make_table([[\"name\", \"type\"]] + [\n", + " [device.name, device.device_type]\n", + " for device in devices\n", + "])\n", + "set_row_style(0, bold=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Use all devices once such that they are initialized" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "for device in devices:\n", + " with tf.device(device.name):\n", + " c = tf.constant(5.0)\n", + " x = tf.placeholder(tf.float32)\n", + " product = c * x\n", + "\n", + " with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:\n", + " result = session.run(product, feed_dict={x: 5.0})\n", + " assert result == 25.0, \"c * x for x == 5.0 should result in 25.0, but resulted in {} on device {} ({})\".format(\n", + " result, device.name, device.device_type)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start /device:CPU:0 10\n", + "start /device:GPU:0 10\n", + "start /device:CPU:0 20\n", + "start /device:GPU:0 20\n", + "start /device:CPU:0 50\n", + "start /device:GPU:0 50\n", + "start /device:CPU:0 100\n", + "start /device:GPU:0 100\n", + "start /device:CPU:0 1000\n", + "start /device:GPU:0 1000\n", + "start /device:CPU:0 5000\n", + "start /device:GPU:0 5000\n", + "start /device:CPU:0 10000\n", + "start /device:GPU:0 10000\n" + ] + } + ], + "source": [ + "results = defaultdict(list)\n", + "\n", + "matrix_sizes = list(map(int, [10, 20, 50, 100, 1000, 5000, 1e4]))\n", + "\n", + "for size in ProgressBar(matrix_sizes):\n", + " for device in devices:\n", + " print('start', device.name, size)\n", + " with tf.device(device.name):\n", + " A = tf.random_uniform(shape=(size, size), minval=0, maxval=1, dtype=tf.float32)\n", + " B = tf.random_uniform(shape=(size, size), minval=0, maxval=1, dtype=tf.float32)\n", + " product = tf.matmul(A, B)\n", + " \n", + " with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:\n", + " t0 = time.time()\n", + " result = session.run(product)\n", + " t1 = time.time()\n", + " results[device.name].append(t1 - t0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Results" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEPCAYAAABRHfM8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XeYVOX5//H3Ta+7LAiIdMQSCyLWXGhcRFQ0sYIFK5ZYozExavRrIJoGJrHFkhDUWLCgoCgQVGRtPzGKEBCxQAAREYSlC7Ll/v1xZpfZndllWOacmd39vK5rLmbOM3POPWeHuecp53nM3REREdmRBpkOQEREagclDBERSYkShoiIpEQJQ0REUqKEISIiKVHCEBGRlISaMMysi5m9YWbzzWyemf0stn2EmX1lZh/FbieGGYeIiOw6C/M6DDPbHdjd3eeYWStgFnAqcDaw0d3/GtrBRUQkrRqFuXN3/wb4JnZ/k5ktADrHii3MY4uISHpF1odhZj2AvsD7sU3XmNkcM/unmeVGFYeIiNRMJAkj1hz1PHC9u28CHgT2dPe+BDUQNU2JiGS5UPswAMysEfAKMNXd701S3h142d37JCnTRFciIjXg7mlv9o+ihvEI8El8soh1hpc5A/i4qhe7u27ujBgxIuMxZMtN50LnQuei+ltYQu30NrP+wHnAPDObDThwKzDMzPoCpcAS4Iow4xARkV0X9iipd4GGSYr+HeZxRUQk/XSldy2Rn5+f6RCyhs7FdjoX2+lchC/0Tu9dYWaezfGJiGQjM8ND6PQOtUlKRMLXo0cPli5dmukwJAO6d+/OkiVLIjueahgitVzs12Smw5AMqOpvH1YNQ30YIiKSEiUMERFJiRKGiIikRAlDRDJm+PDh/OY3v9nl/Zx00kk88cQTaYhIqqOEISKhWrFiBV27dg31GFOmTOGCCy5I+34///xzzjrrLNq3b09eXh59+/bl7rvvxt1ZunQpDRo0ICcnh5ycHHr16sWoUaMAystKS0sr7G9HCXLcuHH06NGD1q1bc8YZZ7Bu3bq0v6ddoYQhIqGaMmUKgwcPznQYO23RokUceeSRdO/enY8//pi1a9cyfvx4Zs2axcaNG4FgNNL69evZsGED48aN44477uDVV18tL9sZ8+fP58orr+Spp55i5cqVNG/enKuuuirt72tXKGGI1FVm4dx20pQpUzjppJMAmD17Nocccgi5ubmcc845bN26tcJzX3nlFQ4++GDy8vI46qijmDdvHgCjR49m6NChFZ57/fXX8/Of/xyAAQMG8Mgjj5SXjRkzhv3224+cnBwOOOAA5syZAwS1nSFDhtChQwf23HNP7r///irjHjlyJP379+euu+6iY8eOAOy11148+eST5OTklD+vbFjrkUceyf7778/HH1c5l2q1xo0bxymnnEL//v1p0aIFd955JxMmTGDz5s012l8YlDBEJDTFxcW89dZbDBo0iKKiIk4//XQuuugiCgsLGTp0KC+88EL5c2fPns2ll17KmDFjKCws5IorruCUU06hqKiIc845h6lTp5Z/eZaWljJ+/HjOO++8hGOOHz+eO+64gyeffJINGzYwadIk2rVrh7vzk5/8hIMPPpgVK1Ywffp07r33Xl577TUA3n33Xdq2bVu+n9dff50hQ4bs8D2WJYx3332XTz75hH79+qV0bpYtW0bbtm356quvgKCGcdBBB5WX9+rViyZNmvD555+ntL8oKGGISGjeeust+vbtS8uWLXnvvfcoLi7muuuuo2HDhpx55pkcdthh5c8dM2YMV155JYceeihmxgUXXEDTpk2ZOXMm3bp1o1+/fkycOBGA6dOn07JlywqvLzN27Fhuuumm8i/uXr160bVrVz744ANWr17NbbfdRsOGDenRoweXXXYZzzzzDAD9+/ensLCwfD9r1qyhU6dO1b4/d6d9+/a0a9eOn/70p4waNSrlOa26du1KYWEhXbp0AWDTpk3k5lZcfDQ3N7e8+SsbaGoQEQlNfHPUihUr6Ny5c4Xy7t27l99funQpjz/+eHkzkbtTVFTE119/DcC5557L008/zfnnn8/TTz/NsGHDkh5z2bJl7Lnnngnbly5dyvLly8trEe5OaWkpP/rRj5Lup127dqxYsaLa92dmrFmzJqG/olGj4Ku1qKiIpk2blm8vKiqicePGSffVqlUrNmzYUGHbhg0baN26dbUxREk1DBEJTXzC6NSpE8uXL69Q/uWXX5bf79q1K7fddhuFhYUUFhaydu1aNm3axNlnnw3A0KFDKSgoYPny5UycOLHKhNG1a1cWLVqUdHuvXr0q7H/9+vW8/PLLSfdz3HHHVWgyq0qyqTk6depE48aNE+Z5Wrx4cYUkGW///ffnv//9b/nj//3vf2zbto299957hzFUEOa8YpleGWoHq0a5iFQvW/+fLF682Pfcc8/yx9u2bfPu3bv7fffd50VFRf7CCy9448aN/fbbb3d39w8//NC7devm77//vru7b9q0ySdPnuybNm0q38fgwYN90KBB3q9fvwrHys/P97Fjx7q7+/jx471bt24+a9Ysd3dfuHChf/nll15SUuKHHHKIjxo1yrds2eLFxcX+8ccf+wcffJA0/kWLFnm7du38pptu8m+++cbd3b/44gs///zzff369b5kyRI3My8pKUn6+mHDhvmZZ57pa9as8aKiIh83bpzn5eX5qlWrkj5//vz5npub6++8845v2rTJzz//fB82bFi15zjhb//BB+6tW5dtT/t3smoYIhKKyZMnl9cuABo3bsyECRN49NFHadeuHePHj+fMM88sLz/kkEMYM2YM1157LW3btmXvvffmX//6V4V9Dhs2jOnTpyd0dsc3CQ0ZMoTbbruNYcOGkZOTw+mnn05hYSENGjTglVdeYc6cOfTs2ZMOHTpw+eWXlzcDvfPOOxVGP/Xq1Yv33nuPxYsXs//++5OXl8fQoUM57LDDypuJqhs6++CDD9K2bVv69OlDx44defDBB5kyZQrt27cHgqaznJyc8k7v/fbbj4cffphhw4ax++67s3nzZh544IHUT/i8eXDCCRBin4dmqxWp5bJ1ttqTTz6Zn/3sZ5x44omZDqXOKv/bf/YZ/OhHsGpVsB00W62I1B4DBgxgwIABmQ6j7lu8GAYOLE8WYVINQ6SWy9YahoTPzPCePYOkEb+dcGoYShgitZwSRv1lZiT7y6tJSkREdmz33UPbtRKGiEhd0a4dvP56aLtXwhARqQtyc+G112D//UM7hBKGiEht17IlTJ0KBx8c6mGUMEREarNmzeCVV+CHPwz9UEoYIiK12cSJkOIMubtKCUNEMkZreqdBhFfSK2GISKhq85reCxcu5Nxzz6VDhw60adOGffbZh+uvv758yvU333yThg0bkpOTQ25uLj/4wQ947LHHysuSve/KqwNWdvfdd9OpUyfatGnDZZddRlFRUdrfV01pPQyROsp+m/brtgDwETt3kWBtXdN74cKFHHHEEVxyySXMmTOHPfbYg9WrVzNu3DjeeecdzjrrLAA6d+5cPk37Sy+9xJAhQzjyyCOBnV/Xe9q0aYwePZoZM2bQqVMnTjvtNEaMGMEf/vCH9L65GlINQ0RCVVvX9P7tb3/LUUcdxV133cUee+wBwG677cZ1111XniwqO/XUU8nL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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "colors = 'rgbcmyk'\n", + "marks = ['-', '--', '..']\n", + "\n", + "styles = (color+mark for mark in marks for color in colors)\n", + "\n", + "for style, (name, times) in zip(styles, results.items()):\n", + " pyplot.plot(matrix_sizes, times, style, label=name)\n", + "\n", + "pyplot.legend()\n", + "\n", + "pyplot.ylabel('Calculation time')\n", + "pyplot.xlabel('Matrix size')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
matrix sizetime (s) on /device:CPU:0time (s) on /device:GPU:0
100.00540.1705
200.00450.0059
500.00530.0081
1000.01030.0081
10000.04370.0106
50002.87660.2573
1000022.46991.6363
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "devices = device_lib.list_local_devices()\n", + "\n", + "\n", + "make_table([[\"matrix size\"] + [\"time (s) on {}\".format(device.name) for device in devices]] + [\n", + " [size] + [results[device.name][size_index] for device in devices]\n", + " for size_index, size in enumerate(matrix_sizes)\n", + "])\n", + "set_column_style(0, bold=True, align='right')" + ] + } + ], + "metadata": { + "hide_input": false, + "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.5.2" + }, + "widgets": { + "state": { + "7ba735bb37af497cac93b37f587e1d16": { + "views": [ + { + "cell_index": 5 + } + ] + } + }, + "version": "1.2.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/02. Simple Neural Network training + evaluation.ipynb b/02. Simple Neural Network training + evaluation.ipynb new file mode 100644 index 0000000..6b90a6e --- /dev/null +++ b/02. Simple Neural Network training + evaluation.ipynb @@ -0,0 +1,188 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "import matplotlib\n", + "%matplotlib inline\n", + "matplotlib.rcParams['figure.figsize'] = (20, 10)\n", + "matplotlib.rcParams['font.size'] = 24\n", + "matplotlib.rcParams['lines.linewidth'] = 5\n", + "matplotlib.rcParams['lines.markersize'] = 20\n", + "\n", + "import tensorflow as tf\n", + "from tensorflow.python.client import device_lib\n", + "\n", + "import time\n", + "import numpy as np\n", + "from matplotlib import pyplot\n", + "from collections import defaultdict\n", + "from ipy_table import make_table, set_row_style, set_column_style\n", + "from jupyter_progressbar import ProgressBar\n", + "\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.model_selection import train_test_split\n", + "from keras.models import Sequential\n", + "from keras.layers import Activation\n", + "from keras.optimizers import SGD, Adam\n", + "from keras.layers import Dense, Dropout, Flatten\n", + "from keras.regularizers import l1, l2\n", + "from keras import regularizers\n", + "import numpy\n", + "import pickle\n", + "import tensorflow as tf" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
nametype
/device:CPU:0CPU
/device:GPU:0GPU
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "devices = device_lib.list_local_devices()\n", + "\n", + "make_table([[\"name\", \"type\"]] + [\n", + " [device.name, device.device_type]\n", + " for device in devices\n", + "])\n", + "set_row_style(0, bold=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6250/6250 [==============================] - 1s 167us/step\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "6250/6250 [==============================] - 0s 60us/step\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n" + ] + } + ], + "source": [ + "results = defaultdict(dict)\n", + "\n", + "for device in devices:\n", + " with tf.device(device.name):\n", + " with open(\"CatsAndDogs.pickle\", 'rb') as f:\n", + " data = pickle.load(f)\n", + "\n", + " X = data[\"dataset\"]\n", + " y = data[\"labels\"]\n", + " del data\n", + "\n", + " (X_train, X_test, y_train, y_test) = train_test_split(\n", + " X, y, test_size = 0.25, random_state = 42)\n", + "\n", + " model = Sequential()\n", + " model.add(Flatten(input_shape=X_train.shape[1:]))\n", + "\n", + " model.add(Dense(768, kernel_initializer=\"uniform\", activation=\"relu\"))\n", + " model.add(Dropout(0.2))\n", + "\n", + " model.add(Dense(384, kernel_initializer=\"uniform\", activation=\"relu\"))\n", + " model.add(Dropout(0.2))\n", + "\n", + " model.add(Dense(128, kernel_initializer=\"uniform\", activation=\"relu\"))\n", + " model.add(Dropout(0.2))\n", + "\n", + " model.add(Dense(2, activation=\"softmax\"))\n", + "\n", + " model.compile(loss=\"binary_crossentropy\", optimizer=Adam(lr=0.001), metrics=[\"accuracy\"])\n", + " \n", + " t0 = time.time()\n", + " model.fit(X_train, y_train, validation_split=0.25, epochs=5, batch_size=128, verbose=0)\n", + " t1 = time.time()\n", + " (loss, accuracy) = model.evaluate(X_test, y_test, verbose=0)\n", + " t2 = time.time()\n", + " \n", + " results[device.name]['training'] = t1 - t0\n", + " results[device.name]['evaluating'] = t2 - t1" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
deviceexecution time (s) trainingexecution time (s) evaluating
/device:GPU:08.33810.3781
/device:CPU:038.56781.0451
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "make_table([[\"device\", \"execution time (s) training\", \"execution time (s) evaluating\"]] + [\n", + " [device, result['training'], result['evaluating']]\n", + " for device, result in results.items()\n", + "])\n", + "set_column_style(0, bold=True, align='right')\n", + "set_row_style(0, bold=True, align='right')" + ] + } + ], + "metadata": { + "hide_input": false, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/03. Popular image classification models.ipynb b/03. Popular image classification models.ipynb new file mode 100644 index 0000000..11262a4 --- /dev/null +++ b/03. Popular image classification models.ipynb @@ -0,0 +1,256 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import os.path\n", + "import pickle\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.metrics import classification_report\n", + "\n", + "from jupyter_progressbar import ProgressBar\n", + "import numpy as np\n", + "\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense, Flatten, GlobalAveragePooling2D\n", + "from keras.optimizers import SGD\n", + "from keras import backend as K\n", + "from keras.applications.inception_v3 import preprocess_input as preprocess, InceptionV3\n", + "\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "matplotlib.rcParams['figure.figsize'] = (20, 10)\n", + "matplotlib.rcParams['font.size'] = 24\n", + "matplotlib.rcParams['lines.linewidth'] = 5\n", + "matplotlib.rcParams['lines.markersize'] = 20\n", + "\n", + "import tensorflow as tf\n", + "from tensorflow.python.client import device_lib\n", + "\n", + "import time\n", + "from matplotlib import pyplot\n", + "from collections import defaultdict\n", + "from ipy_table import make_table, set_row_style, set_column_style\n", + "from jupyter_progressbar import ProgressBar\n", + "\n", + "# Disable progressbar VGG-batches\n", + "ProgressBar = lambda x: x" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
nametype
/device:CPU:0CPU
/device:GPU:0GPU
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "devices = device_lib.list_local_devices()\n", + "\n", + "make_table([[\"name\", \"type\"]] + [\n", + " [device.name, device.device_type]\n", + " for device in devices\n", + "])\n", + "set_row_style(0, bold=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "with open('creepycrawly_and_cats.p3', 'rb') as f:\n", + " X, y = pickle.load(f)\n", + "classes = ['creepy crawly', 'cat']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "import numpy\n", + "from skimage.transform import resize\n", + "\n", + "def resize_for_model(X, model):\n", + " target = tuple([x.value for x in model.input.get_shape()][1:3])\n", + " if target[0] is None or target[1] is None:\n", + " return X\n", + " result = numpy.zeros((X.shape[0], target[0], target[1], X.shape[3]), dtype=X.dtype)\n", + " \n", + " for i in range(X.shape[0]):\n", + " result[i] = resize(X[i], target + (X.shape[3], ))\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "results = defaultdict(dict)\n", + "for device in devices:\n", + " from keras.applications.inception_v3 import InceptionV3, preprocess_input, decode_predictions\n", + " \n", + " with tf.device(device.name):\n", + " model = InceptionV3(weights='imagenet')\n", + " X_ = preprocess_input(resize_for_model(X, model))\n", + " t0 = time.time()\n", + " preds = model.predict(X_, verbose=0)\n", + " t1 = time.time()\n", + " \n", + " results[device.name]['inceptionv3'] = t1 - t0\n", + " K.clear_session()\n", + " \n", + " from keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions\n", + " with tf.device(device.name):\n", + " model = ResNet50(weights='imagenet')\n", + " X_ = preprocess_input(resize_for_model(X, model))\n", + " t0 = time.time()\n", + " preds = model.predict(X_, verbose=0)\n", + " t1 = time.time()\n", + " \n", + " results[device.name]['resnet50'] = t1 - t0\n", + " K.clear_session()\n", + "\n", + " vgg_batch_size = 2\n", + " \n", + " from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions\n", + " with tf.device(device.name):\n", + " model = VGG16(weights='imagenet', include_top=True)\n", + " X_ = preprocess_input(resize_for_model(X, model))\n", + " t0 = time.time()\n", + " for start, end in zip(\n", + " range(0, len(X), vgg_batch_size),\n", + " ProgressBar(range(vgg_batch_size, len(X), vgg_batch_size))\n", + " ):\n", + " model.predict(X_[start:end], verbose=0)\n", + " t1 = time.time()\n", + " \n", + " results[device.name]['vgg16'] = t1 - t0\n", + " K.clear_session()\n", + " \n", + " from keras.applications.vgg19 import VGG19, preprocess_input, decode_predictions\n", + " \n", + " with tf.device(device.name):\n", + " model = VGG19(weights='imagenet', include_top=True)\n", + " X_ = preprocess_input(resize_for_model(X, model))\n", + " t0 = time.time()\n", + " for start, end in zip(\n", + " range(0, len(X), vgg_batch_size),\n", + " ProgressBar(range(vgg_batch_size, len(X), vgg_batch_size))\n", + " ):\n", + " model.predict(X_[start:end], verbose=0)\n", + " t1 = time.time()\n", + " \n", + " results[device.name]['vgg19'] = t1 - t0\n", + " K.clear_session()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
deviceresnet50vgg19inceptionv3vgg16
/device:GPU:059.2201156.987515.0459129.3934
/device:CPU:0605.16311857.012689.15971445.7997
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model_names = list(next(iter(results.values())).keys())\n", + "\n", + "make_table([[\"device\"] + model_names] + [\n", + " [device] + [result[model_name] for model_name in model_names]\n", + " for device, result in results.items()\n", + "])\n", + "set_column_style(0, bold=True, align='right')\n", + "set_row_style(0, bold=True, align='right')" + ] + } + ], + "metadata": { + "hide_input": false, + "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.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}