blob: faa322ea2a1e62160b4a50cc56562682373aea3f [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# CNN Using Keras and MADlib\n",
"\n",
"E2E classification example using MADlib calling a Keras CNN. Based on model architecture in https://keras.io/examples/cifar10_cnn/\n",
"\n",
"To load images into tables we use the script called <em>madlib_image_loader.py</em> located at https://github.com/apache/madlib-site/tree/asf-site/community-artifacts/Deep-learning which uses the Python Imaging Library so supports multiple formats\n",
"http://www.pythonware.com/products/pil/\n",
"\n",
"\n",
"## Table of contents\n",
"<a href=\"#import_libraries\">1. Import libraries</a>\n",
"\n",
"<a href=\"#load_and_prepare_data\">2. Load dataset into table</a>\n",
"\n",
"<a href=\"#image_preproc\">3. Call image preprocessor</a>\n",
"\n",
"<a href=\"#define_and_load_model\">4. Define and load model architecture</a>\n",
"\n",
"<a href=\"#train\">5. Train</a>\n",
"\n",
"<a href=\"#plot\">6. Plots by iteration and time</a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/fmcquillan/anaconda/lib/python2.7/site-packages/IPython/config.py:13: ShimWarning: The `IPython.config` package has been deprecated since IPython 4.0. You should import from traitlets.config instead.\n",
" \"You should import from traitlets.config instead.\", ShimWarning)\n",
"/Users/fmcquillan/anaconda/lib/python2.7/site-packages/IPython/utils/traitlets.py:5: UserWarning: IPython.utils.traitlets has moved to a top-level traitlets package.\n",
" warn(\"IPython.utils.traitlets has moved to a top-level traitlets package.\")\n"
]
}
],
"source": [
"%load_ext sql"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"u'Connected: fmcquillan@madlib'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Greenplum Database 5.x on GCP for deep learning (PM demo machine)\n",
"#%sql postgresql://gpadmin@35.239.240.26:5432/madlib\n",
" \n",
"# PostgreSQL local\n",
"%sql postgresql://fmcquillan@localhost:5432/madlib"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>version</th>\n",
" </tr>\n",
" <tr>\n",
" <td>MADlib version: 1.16, git revision: rc/1.16-rc1, cmake configuration time: Mon Jul 1 17:45:09 UTC 2019, build type: Release, build system: Darwin-16.7.0, C compiler: Clang, C++ compiler: Clang</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'MADlib version: 1.16, git revision: rc/1.16-rc1, cmake configuration time: Mon Jul 1 17:45:09 UTC 2019, build type: Release, build system: Darwin-16.7.0, C compiler: Clang, C++ compiler: Clang',)]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sql select madlib.version();\n",
"#%sql select version();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"import_libraries\"></a>\n",
"# 1. Import libraries\n",
"From https://keras.io/examples/mnist_transfer_cnn/ import libraries and define some params"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Couldn't import dot_parser, loading of dot files will not be possible.\n"
]
}
],
"source": [
"from __future__ import print_function\n",
"import keras\n",
"from keras.datasets import cifar10\n",
"from keras.preprocessing.image import ImageDataGenerator\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, Dropout, Activation, Flatten\n",
"from keras.layers import Conv2D, MaxPooling2D\n",
"import os\n",
"\n",
"batch_size = 32\n",
"num_classes = 10\n",
"epochs = 100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Others needed in this workbook"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import sys\n",
"import os\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"load_and_prepare_data\"></a>\n",
"# 2. Set up image loader and load dataset into table\n",
"\n",
"First set up image loader using the script called <em>madlib_image_loader.py</em> located at https://github.com/apache/madlib-site/tree/asf-site/community-artifacts/Deep-learning"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"madlib_site_dir = '/Users/fmcquillan/Documents/Product/MADlib/Demos/data'\n",
"sys.path.append(madlib_site_dir)\n",
"\n",
"# Import image loader module\n",
"from madlib_image_loader import ImageLoader, DbCredentials\n",
"\n",
"# Specify database credentials, for connecting to db\n",
"db_creds = DbCredentials(user='fmcquillan',\n",
" host='localhost',\n",
" port='5432',\n",
" password='')\n",
"\n",
"# Specify database credentials, for connecting to db\n",
"#db_creds = DbCredentials(user='gpadmin', \n",
"# db_name='madlib',\n",
"# host='35.239.240.26',\n",
"# port='5432',\n",
"# password='')\n",
"\n",
"# Initialize ImageLoader (increase num_workers to run faster)\n",
"iloader = ImageLoader(num_workers=5, db_creds=db_creds)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First load CIFAR-10 data from Keras consisting of 50,000 32x32 color training images, labeled over 10 categories, and 10,000 test images."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"MainProcess: Connected to madlib db.\n",
"Executing: CREATE TABLE cifar_10_train_data (id SERIAL, x REAL[], y TEXT)\n",
"CREATE TABLE\n",
"Created table cifar_10_train_data in madlib db\n",
"Spawning 5 workers...\n",
"Initializing PoolWorker-1 [pid 28054]\n",
"PoolWorker-1: Created temporary directory /tmp/madlib_tdv3zEFPL1\n",
"Initializing PoolWorker-2 [pid 28055]\n",
"PoolWorker-2: Created temporary directory /tmp/madlib_bWb3jWWKsY\n",
"Initializing PoolWorker-3 [pid 28056]\n",
"PoolWorker-1: Connected to madlib db.\n",
"PoolWorker-3: Created temporary directory /tmp/madlib_KetBMAbjq5\n",
"Initializing PoolWorker-4 [pid 28057]\n",
"PoolWorker-2: Connected to madlib db.\n",
"PoolWorker-4: Created temporary directory /tmp/madlib_sME12BQHb1\n",
"Initializing PoolWorker-5 [pid 28059]\n",
"PoolWorker-3: Connected to madlib db.\n",
"PoolWorker-5: Created temporary directory /tmp/madlib_i6LP0aJJDY\n",
"PoolWorker-4: Connected to madlib db.\n",
"PoolWorker-5: Connected to madlib db.\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0000.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0000.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0000.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0000.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0000.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0001.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0001.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0001.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0001.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0001.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0002.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0002.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0002.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0002.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0002.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0003.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0003.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0003.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0003.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0003.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0004.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0004.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0004.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0004.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0004.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0005.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0005.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0005.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0005.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0005.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0006.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0006.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0006.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0006.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0006.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0007.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0007.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0007.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0007.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0007.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0008.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0008.tmp\n",
"PoolWorker-5: Wrote 1000 images to /tmp/madlib_i6LP0aJJDY/cifar_10_train_data0008.tmp\n",
"PoolWorker-2: Wrote 1000 images to /tmp/madlib_bWb3jWWKsY/cifar_10_train_data0008.tmp\n",
"PoolWorker-3: Wrote 1000 images to /tmp/madlib_KetBMAbjq5/cifar_10_train_data0008.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-5: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-2: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0009.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0009.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0010.tmp\n",
"PoolWorker-4: Wrote 1000 images to /tmp/madlib_sME12BQHb1/cifar_10_train_data0010.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-4: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-1: Wrote 1000 images to /tmp/madlib_tdv3zEFPL1/cifar_10_train_data0011.tmp\n",
"PoolWorker-1: Loaded 1000 images into cifar_10_train_data\n",
"PoolWorker-3: Removed temporary directory /tmp/madlib_KetBMAbjq5\n",
"PoolWorker-2: Removed temporary directory /tmp/madlib_bWb3jWWKsY\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"PoolWorker-4: Removed temporary directory /tmp/madlib_sME12BQHb1\n",
"PoolWorker-1: Removed temporary directory /tmp/madlib_tdv3zEFPL1\n",
"PoolWorker-5: Removed temporary directory /tmp/madlib_i6LP0aJJDY\n",
"Done! Loaded 50000 images in 24.227011919s\n",
"5 workers terminated.\n",
"MainProcess: Connected to madlib db.\n",
"Executing: CREATE TABLE cifar_10_test_data (id SERIAL, x REAL[], y TEXT)\n",
"CREATE TABLE\n",
"Created table cifar_10_test_data in madlib db\n",
"Spawning 5 workers...\n",
"Initializing PoolWorker-6 [pid 28066]\n",
"PoolWorker-6: Created temporary directory /tmp/madlib_yKNKBHEc3G\n",
"Initializing PoolWorker-7 [pid 28067]\n",
"PoolWorker-7: Created temporary directory /tmp/madlib_hb8ESuQLva\n",
"Initializing PoolWorker-8 [pid 28068]\n",
"PoolWorker-8: Created temporary directory /tmp/madlib_PmtDmYhSBj\n",
"PoolWorker-6: Connected to madlib db.\n",
"Initializing PoolWorker-9 [pid 28069]\n",
"PoolWorker-7: Connected to madlib db.\n",
"PoolWorker-9: Created temporary directory /tmp/madlib_h7oUVpBwyZ\n",
"Initializing PoolWorker-10 [pid 28071]\n",
"PoolWorker-8: Connected to madlib db.\n",
"PoolWorker-10: Created temporary directory /tmp/madlib_9TZoE98hbn\n",
"PoolWorker-9: Connected to madlib db.\n",
"PoolWorker-10: Connected to madlib db.\n",
"PoolWorker-8: Wrote 1000 images to /tmp/madlib_PmtDmYhSBj/cifar_10_test_data0000.tmp\n",
"PoolWorker-6: Wrote 1000 images to /tmp/madlib_yKNKBHEc3G/cifar_10_test_data0000.tmp\n",
"PoolWorker-7: Wrote 1000 images to /tmp/madlib_hb8ESuQLva/cifar_10_test_data0000.tmp\n",
"PoolWorker-9: Wrote 1000 images to /tmp/madlib_h7oUVpBwyZ/cifar_10_test_data0000.tmp\n",
"PoolWorker-10: Wrote 1000 images to /tmp/madlib_9TZoE98hbn/cifar_10_test_data0000.tmp\n",
"PoolWorker-8: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-7: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-6: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-10: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-9: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-8: Wrote 1000 images to /tmp/madlib_PmtDmYhSBj/cifar_10_test_data0001.tmp\n",
"PoolWorker-7: Wrote 1000 images to /tmp/madlib_hb8ESuQLva/cifar_10_test_data0001.tmp\n",
"PoolWorker-6: Wrote 1000 images to /tmp/madlib_yKNKBHEc3G/cifar_10_test_data0001.tmp\n",
"PoolWorker-10: Wrote 1000 images to /tmp/madlib_9TZoE98hbn/cifar_10_test_data0001.tmp\n",
"PoolWorker-9: Wrote 1000 images to /tmp/madlib_h7oUVpBwyZ/cifar_10_test_data0001.tmp\n",
"PoolWorker-8: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-7: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-6: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-10: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-9: Loaded 1000 images into cifar_10_test_data\n",
"PoolWorker-8: Removed temporary directory /tmp/madlib_PmtDmYhSBj\n",
"PoolWorker-7: Removed temporary directory /tmp/madlib_hb8ESuQLva\n",
"PoolWorker-6: Removed temporary directory /tmp/madlib_yKNKBHEc3G\n",
"PoolWorker-9: Removed temporary directory /tmp/madlib_h7oUVpBwyZ\n",
"PoolWorker-10: Removed temporary directory /tmp/madlib_9TZoE98hbn\n",
"Done! Loaded 10000 images in 4.54620194435s\n",
"5 workers terminated.\n"
]
}
],
"source": [
"# Load dataset into np array\n",
"(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n",
"\n",
"%sql DROP TABLE IF EXISTS cifar_10_train_data, cifar_10_test_data;\n",
"\n",
"# Save images to temporary directories and load into database\n",
"iloader.load_dataset_from_np(x_train, y_train, 'cifar_10_train_data', append=False)\n",
"iloader.load_dataset_from_np(x_test, y_test, 'cifar_10_test_data', append=False)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>count</th>\n",
" </tr>\n",
" <tr>\n",
" <td>50000</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(50000L,)]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%sql select count(*) from cifar_10_train_data;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"image_preproc\"></a>\n",
"# 3. Call image preprocessor\n",
"\n",
"Transforms from one image per row to multiple images per row for batch optimization. Also normalizes and one-hot encodes.\n",
"\n",
"Training data"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>source_table</th>\n",
" <th>output_table</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>dependent_vartype</th>\n",
" <th>class_values</th>\n",
" <th>buffer_size</th>\n",
" <th>normalizing_const</th>\n",
" <th>num_classes</th>\n",
" </tr>\n",
" <tr>\n",
" <td>cifar_10_train_data</td>\n",
" <td>cifar_10_train_data_packed</td>\n",
" <td>y</td>\n",
" <td>x</td>\n",
" <td>text</td>\n",
" <td>[u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']</td>\n",
" <td>1000</td>\n",
" <td>255.0</td>\n",
" <td>10</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'cifar_10_train_data', u'cifar_10_train_data_packed', u'y', u'x', u'text', [u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'], 1000, 255.0, 10)]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS cifar_10_train_data_packed, cifar_10_train_data_packed_summary;\n",
"\n",
"SELECT madlib.training_preprocessor_dl('cifar_10_train_data', -- Source table\n",
" 'cifar_10_train_data_packed', -- Output table\n",
" 'y', -- Dependent variable\n",
" 'x', -- Independent variable\n",
" 1000, -- Buffer size\n",
" 255 -- Normalizing constant\n",
" );\n",
"\n",
"SELECT * FROM cifar_10_train_data_packed_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Test data"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>source_table</th>\n",
" <th>output_table</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>dependent_vartype</th>\n",
" <th>class_values</th>\n",
" <th>buffer_size</th>\n",
" <th>normalizing_const</th>\n",
" <th>num_classes</th>\n",
" </tr>\n",
" <tr>\n",
" <td>cifar_10_test_data</td>\n",
" <td>cifar_10_test_data_packed</td>\n",
" <td>y</td>\n",
" <td>x</td>\n",
" <td>text</td>\n",
" <td>[u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']</td>\n",
" <td>1000</td>\n",
" <td>255.0</td>\n",
" <td>10</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'cifar_10_test_data', u'cifar_10_test_data_packed', u'y', u'x', u'text', [u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'], 1000, 255.0, 10)]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS cifar_10_test_data_packed, cifar_10_test_data_packed_summary;\n",
"\n",
"SELECT madlib.validation_preprocessor_dl('cifar_10_test_data', -- Source table\n",
" 'cifar_10_test_data_packed', -- Output table\n",
" 'y', -- Dependent variable\n",
" 'x', -- Independent variable\n",
" 'cifar_10_train_data_packed', -- Training preproc table\n",
" 1000 -- Buffer size\n",
" );\n",
"\n",
"SELECT * FROM cifar_10_test_data_packed_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"define_and_load_model\"></a>\n",
"# 4. Define and load model architecture\n",
"\n",
"Model architecture from https://keras.io/examples/cifar10_cnn/"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"conv2d_1 (Conv2D) (None, 32, 32, 32) 896 \n",
"_________________________________________________________________\n",
"activation_1 (Activation) (None, 32, 32, 32) 0 \n",
"_________________________________________________________________\n",
"conv2d_2 (Conv2D) (None, 30, 30, 32) 9248 \n",
"_________________________________________________________________\n",
"activation_2 (Activation) (None, 30, 30, 32) 0 \n",
"_________________________________________________________________\n",
"max_pooling2d_1 (MaxPooling2 (None, 15, 15, 32) 0 \n",
"_________________________________________________________________\n",
"dropout_1 (Dropout) (None, 15, 15, 32) 0 \n",
"_________________________________________________________________\n",
"conv2d_3 (Conv2D) (None, 15, 15, 64) 18496 \n",
"_________________________________________________________________\n",
"activation_3 (Activation) (None, 15, 15, 64) 0 \n",
"_________________________________________________________________\n",
"conv2d_4 (Conv2D) (None, 13, 13, 64) 36928 \n",
"_________________________________________________________________\n",
"activation_4 (Activation) (None, 13, 13, 64) 0 \n",
"_________________________________________________________________\n",
"max_pooling2d_2 (MaxPooling2 (None, 6, 6, 64) 0 \n",
"_________________________________________________________________\n",
"dropout_2 (Dropout) (None, 6, 6, 64) 0 \n",
"_________________________________________________________________\n",
"flatten_1 (Flatten) (None, 2304) 0 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 512) 1180160 \n",
"_________________________________________________________________\n",
"activation_5 (Activation) (None, 512) 0 \n",
"_________________________________________________________________\n",
"dropout_3 (Dropout) (None, 512) 0 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 10) 5130 \n",
"_________________________________________________________________\n",
"activation_6 (Activation) (None, 10) 0 \n",
"=================================================================\n",
"Total params: 1,250,858\n",
"Trainable params: 1,250,858\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model = Sequential()\n",
"model.add(Conv2D(32, (3, 3), padding='same',\n",
" input_shape=x_train.shape[1:]))\n",
"model.add(Activation('relu'))\n",
"model.add(Conv2D(32, (3, 3)))\n",
"model.add(Activation('relu'))\n",
"model.add(MaxPooling2D(pool_size=(2, 2)))\n",
"model.add(Dropout(0.25))\n",
"\n",
"model.add(Conv2D(64, (3, 3), padding='same'))\n",
"model.add(Activation('relu'))\n",
"model.add(Conv2D(64, (3, 3)))\n",
"model.add(Activation('relu'))\n",
"model.add(MaxPooling2D(pool_size=(2, 2)))\n",
"model.add(Dropout(0.25))\n",
"\n",
"model.add(Flatten())\n",
"model.add(Dense(512))\n",
"model.add(Activation('relu'))\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(num_classes))\n",
"model.add(Activation('softmax'))\n",
"\n",
"model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load into model architecture table using psycopg2"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>model_id</th>\n",
" <th>name</th>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>CNN from Keras docs for CIFAR-10</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(1, u'CNN from Keras docs for CIFAR-10')]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import psycopg2 as p2\n",
"#conn = p2.connect('postgresql://gpadmin@35.239.240.26:5432/madlib')\n",
"conn = p2.connect('postgresql://fmcquillan@localhost:5432/madlib')\n",
"cur = conn.cursor()\n",
"\n",
"%sql DROP TABLE IF EXISTS model_arch_library;\n",
"query = \"SELECT madlib.load_keras_model('model_arch_library', %s, NULL, %s)\"\n",
"cur.execute(query,[model.to_json(), \"CNN from Keras docs for CIFAR-10\"])\n",
"conn.commit()\n",
"\n",
"# check model loaded OK\n",
"%sql SELECT model_id, name FROM model_arch_library;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"train\"></a>\n",
"# 5. Train"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n"
]
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS cifar_10_model, cifar_10_model_summary;\n",
"\n",
"SELECT madlib.madlib_keras_fit('cifar_10_train_data_packed', -- source table\n",
" 'cifar_10_model', -- model output table\n",
" 'model_arch_library', -- model arch table\n",
" 1, -- model arch id\n",
" $$ loss='categorical_crossentropy', optimizer='rmsprop(lr=0.0001, decay=1e-6)', metrics=['accuracy']$$, -- compile_params\n",
" $$ batch_size=32, epochs=3 $$, -- fit_params\n",
" 3, -- num_iterations\n",
" 0, -- GPUs per host\n",
" 'cifar_10_test_data_packed', -- validation dataset\n",
" 2 -- metrics compute frequency\n",
" );"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"View the model summary:"
]
},
{
"cell_type": "code",
"execution_count": 110,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>source_table</th>\n",
" <th>model</th>\n",
" <th>dependent_varname</th>\n",
" <th>independent_varname</th>\n",
" <th>model_arch_table</th>\n",
" <th>model_arch_id</th>\n",
" <th>compile_params</th>\n",
" <th>fit_params</th>\n",
" <th>num_iterations</th>\n",
" <th>validation_table</th>\n",
" <th>metrics_compute_frequency</th>\n",
" <th>name</th>\n",
" <th>description</th>\n",
" <th>model_type</th>\n",
" <th>model_size</th>\n",
" <th>start_training_time</th>\n",
" <th>end_training_time</th>\n",
" <th>metrics_elapsed_time</th>\n",
" <th>madlib_version</th>\n",
" <th>num_classes</th>\n",
" <th>class_values</th>\n",
" <th>dependent_vartype</th>\n",
" <th>normalizing_const</th>\n",
" <th>metrics_type</th>\n",
" <th>training_metrics_final</th>\n",
" <th>training_loss_final</th>\n",
" <th>training_metrics</th>\n",
" <th>training_loss</th>\n",
" <th>validation_metrics_final</th>\n",
" <th>validation_loss_final</th>\n",
" <th>validation_metrics</th>\n",
" <th>validation_loss</th>\n",
" <th>metrics_iters</th>\n",
" </tr>\n",
" <tr>\n",
" <td>cifar_10_train_data_packed</td>\n",
" <td>cifar_10_model</td>\n",
" <td>y</td>\n",
" <td>x</td>\n",
" <td>model_arch_library</td>\n",
" <td>1</td>\n",
" <td> loss='categorical_crossentropy', optimizer='rmsprop(lr=0.0001, decay=1e-6)', metrics=['accuracy']</td>\n",
" <td> batch_size=32, epochs=3 </td>\n",
" <td>20</td>\n",
" <td>cifar_10_test_data_packed</td>\n",
" <td>2</td>\n",
" <td>None</td>\n",
" <td>None</td>\n",
" <td>madlib_keras</td>\n",
" <td>4886.20019531</td>\n",
" <td>2019-06-25 05:40:29.287703</td>\n",
" <td>2019-06-25 07:59:52.961506</td>\n",
" <td>[798.95044708252, 1616.68976902962, 2447.13853096962, 3273.68762302399, 4116.44566893578, 4962.07483291626, 5805.66080999374, 6665.33687210083, 7526.0603749752, 8363.67366909981]</td>\n",
" <td>1.16-dev</td>\n",
" <td>10</td>\n",
" <td>[u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9']</td>\n",
" <td>text</td>\n",
" <td>255.0</td>\n",
" <td>[u'accuracy']</td>\n",
" <td>0.836480021477</td>\n",
" <td>0.500134825706</td>\n",
" <td>[0.579240024089813, 0.672980010509491, 0.723999977111816, 0.75764000415802, 0.783959984779358, 0.79475998878479, 0.811240017414093, 0.822780013084412, 0.829559981822968, 0.836480021476746]</td>\n",
" <td>[1.19081699848175, 0.940543830394745, 0.800645172595978, 0.700933694839478, 0.636690974235535, 0.599389910697937, 0.556614756584167, 0.53840559720993, 0.517430067062378, 0.500134825706482]</td>\n",
" <td>0.778900027275</td>\n",
" <td>0.661625564098</td>\n",
" <td>[0.57150000333786, 0.653800010681152, 0.692200005054474, 0.721300005912781, 0.740000009536743, 0.751299977302551, 0.756099998950958, 0.769999980926514, 0.77240002155304, 0.778900027275085]</td>\n",
" <td>[1.20945084095001, 0.987037718296051, 0.871006071567535, 0.800125658512115, 0.751632690429688, 0.72808450460434, 0.704570233821869, 0.684175074100494, 0.675221920013428, 0.661625564098358]</td>\n",
" <td>[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(u'cifar_10_train_data_packed', u'cifar_10_model', u'y', u'x', u'model_arch_library', 1, u\" loss='categorical_crossentropy', optimizer='rmsprop(lr=0.0001, decay=1e-6)', metrics=['accuracy']\", u' batch_size=32, epochs=3 ', 20, u'cifar_10_test_data_packed', 2, None, None, u'madlib_keras', 4886.20019531, datetime.datetime(2019, 6, 25, 5, 40, 29, 287703), datetime.datetime(2019, 6, 25, 7, 59, 52, 961506), [798.95044708252, 1616.68976902962, 2447.13853096962, 3273.68762302399, 4116.44566893578, 4962.07483291626, 5805.66080999374, 6665.33687210083, 7526.0603749752, 8363.67366909981], u'1.16-dev', 10, [u'0', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'], u'text', 255.0, [u'accuracy'], 0.836480021477, 0.500134825706, [0.579240024089813, 0.672980010509491, 0.723999977111816, 0.75764000415802, 0.783959984779358, 0.79475998878479, 0.811240017414093, 0.822780013084412, 0.829559981822968, 0.836480021476746], [1.19081699848175, 0.940543830394745, 0.800645172595978, 0.700933694839478, 0.636690974235535, 0.599389910697937, 0.556614756584167, 0.53840559720993, 0.517430067062378, 0.500134825706482], 0.778900027275, 0.661625564098, [0.57150000333786, 0.653800010681152, 0.692200005054474, 0.721300005912781, 0.740000009536743, 0.751299977302551, 0.756099998950958, 0.769999980926514, 0.77240002155304, 0.778900027275085], [1.20945084095001, 0.987037718296051, 0.871006071567535, 0.800125658512115, 0.751632690429688, 0.72808450460434, 0.704570233821869, 0.684175074100494, 0.675221920013428, 0.661625564098358], [2, 4, 6, 8, 10, 12, 14, 16, 18, 20])]"
]
},
"execution_count": 110,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"SELECT * FROM cifar_10_model_summary;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Evaluate using test data (same values as last iteration from the fit output summary above)."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n",
"1 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/html": [
"<table>\n",
" <tr>\n",
" <th>loss</th>\n",
" <th>metric</th>\n",
" <th>metrics_type</th>\n",
" </tr>\n",
" <tr>\n",
" <td>0.661625564098</td>\n",
" <td>0.778900027275</td>\n",
" <td>[u'accuracy']</td>\n",
" </tr>\n",
"</table>"
],
"text/plain": [
"[(0.661625564098358, 0.778900027275085, [u'accuracy'])]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%sql\n",
"DROP TABLE IF EXISTS cifar10_validate;\n",
"\n",
"SELECT madlib.madlib_keras_evaluate('cifar_10_model', -- model\n",
" 'cifar_10_test_data_packed', -- test table\n",
" 'cifar10_validate' -- output table\n",
" );\n",
"\n",
"SELECT * FROM cifar10_validate;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id=\"plot\"></a>\n",
"# 6. Plots by iteration and by time\n",
"Accuracy by iteration"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1195ef9d0>"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# get accuracy and iteration number\n",
"iters_proxy = %sql SELECT metrics_iters FROM cifar_10_model_summary;\n",
"train_accuracy_proxy = %sql SELECT training_metrics FROM cifar_10_model_summary;\n",
"test_accuracy_proxy = %sql SELECT validation_metrics FROM cifar_10_model_summary;\n",
"\n",
"# get number of points\n",
"num_points_proxy = %sql SELECT array_length(metrics_iters,1) FROM cifar_10_model_summary;\n",
"num_points = num_points_proxy[0]\n",
"\n",
"# reshape to np arrays\n",
"iters = np.array(iters_proxy).reshape(num_points)\n",
"train_accuracy = np.array(train_accuracy_proxy).reshape(num_points)\n",
"test_accuracy = np.array(test_accuracy_proxy).reshape(num_points)\n",
"\n",
"#plot\n",
"plt.title('CIFAR-10 accuracy by iteration')\n",
"plt.xlabel('Iteration number')\n",
"plt.ylabel('Accuracy')\n",
"plt.grid(True)\n",
"plt.plot(iters, train_accuracy, 'g.-', label='Train')\n",
"plt.plot(iters, test_accuracy, 'r.-', label='Test')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Loss by iteration"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n",
"1 rows affected.\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x119279910>"
]
},
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# get loss\n",
"train_loss_proxy = %sql SELECT training_loss FROM cifar_10_model_summary;\n",
"test_loss_proxy = %sql SELECT validation_loss FROM cifar_10_model_summary;\n",
"\n",
"# reshape to np arrays\n",
"train_loss = np.array(train_loss_proxy).reshape(num_points)\n",
"test_loss = np.array(test_loss_proxy).reshape(num_points)\n",
"\n",
"#plot\n",
"plt.title('CIFAR-10 loss by iteration')\n",
"plt.xlabel('Iteration number')\n",
"plt.ylabel('Loss')\n",
"plt.grid(True)\n",
"plt.plot(iters, train_loss, 'g.-', label='Train')\n",
"plt.plot(iters, test_loss, 'r.-', label='Test')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Accuracy by time"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 rows affected.\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x119664410>"
]
},
"execution_count": 108,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# get time\n",
"time_proxy = %sql SELECT metrics_elapsed_time FROM cifar_10_model_summary;\n",
"\n",
"# reshape to np arrays\n",
"time = np.array(time_proxy).reshape(num_points)/60.0\n",
"\n",
"#plot\n",
"plt.title('CIFAR-10 accuracy by time')\n",
"plt.xlabel('Time (min)')\n",
"plt.ylabel('Accuracy')\n",
"plt.grid(True)\n",
"plt.plot(time, train_accuracy, 'g.-', label='Train')\n",
"plt.plot(time, test_accuracy, 'r.-', label='Test')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Time to achieve a given accuracy"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x119628690>"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#plot\n",
"plt.title('CIFAR-10 time by accuracy')\n",
"plt.xlabel('Accuracy')\n",
"plt.ylabel('Time (min)')\n",
"plt.grid(True)\n",
"plt.plot(train_accuracy, time, 'g.-', label='Train')\n",
"plt.plot(test_accuracy, time, 'r.-', label='Test')\n",
"plt.legend()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 1
}