{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Training on Cifar 10 Using MXNet and H2O\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "https://www.cs.toronto.edu/~kriz/cifar.html\n", "\n", "The CIFAR-10 dataset\n", "\n", "The CIFAR-10 dataset consists of 60000 32x32 colour images in 10 classes, with 6000 images per class. There are 50000 training images and 10000 test images. \n", "\n", "The dataset is divided into five training batches and one test batch, each with 10000 images. The test batch contains exactly 1000 randomly-selected images from each class. The training batches contain the remaining images in random order, but some training batches may contain more images from one class than another. Between them, the training batches contain exactly 5000 images from each class. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import matplotlib\n", "import scipy.io\n", "import matplotlib.pyplot as plt\n", "\n", "import cPickle\n", "import numpy as np\n", "from scipy.misc import imsave\n", "from IPython.display import Image, display, HTML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Step 1: Preprocess the data" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "!mkdir -p ~/.h2o/datasets/" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2016-10-21 20:21:14-- https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n", "Resolving www.cs.toronto.edu (www.cs.toronto.edu)... 128.100.3.30\n", "Connecting to www.cs.toronto.edu (www.cs.toronto.edu)|128.100.3.30|:443... connected.\n", "HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable\n", "\n", " The file is already fully retrieved; nothing to do.\n", "\n" ] } ], "source": [ "!wget -c https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz -O ~/.h2o/datasets/cifar-10-python.tar.gz" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cifar-10-batches-py/\n", "cifar-10-batches-py/data_batch_4\n", "cifar-10-batches-py/readme.html\n", "cifar-10-batches-py/test_batch\n", "cifar-10-batches-py/data_batch_3\n", "cifar-10-batches-py/batches.meta\n", "cifar-10-batches-py/data_batch_2\n", "cifar-10-batches-py/data_batch_5\n", "cifar-10-batches-py/data_batch_1\n" ] } ], "source": [ "!tar xvzf ~/.h2o/datasets/cifar-10-python.tar.gz -C ~/.h2o/datasets/" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'num_cases_per_batch': 10000, 'label_names': ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'], 'num_vis': 3072}\n" ] } ], "source": [ "import os.path\n", "with open(os.path.expanduser(\"~/.h2o/datasets/cifar-10-batches-py/batches.meta\")) as fd:\n", " meta = cPickle.load(fd)\n", "print meta" ] }, { "cell_type": "code", "execution_count": 206, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['airplane',\n", " 'automobile',\n", " 'bird',\n", " 'cat',\n", " 'deer',\n", " 'dog',\n", " 'frog',\n", " 'horse',\n", " 'ship',\n", " 'truck']" ] }, "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = meta['label_names']\n", "labels" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def load_cifar10_image_list(filepath):\n", " images = []\n", " labels = []\n", " with open(filepath, 'rb') as fd:\n", " d = cPickle.load(fd)\n", " for image, label, filename in zip(d['data'], d['labels'], d['filenames']):\n", " x = np.array(image)\n", " x = np.dstack((x[:1024], x[1024:2048], x[2048:]))\n", " x = x.reshape(32,32,3)\n", " filename=os.path.expanduser(\"~/.h2o/datasets/cifar-10-batches-py/\"+filename)\n", " imsave(filename, x)\n", " images.append(filename)\n", " labels.append(label)\n", " return images, labels" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "x_train = []\n", "y_train = []\n", "\n", "for batch in range(1,6):\n", " batch_name = os.path.expanduser('~/.h2o/datasets/cifar-10-batches-py/data_batch_%d' % batch)\n", " x,y = load_cifar10_image_list(batch_name)\n", " x_train.extend(x)\n", " y_train.extend(y)" ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "abandoned_ship_s_000004.png\r\n", "automobile_s_002079.png\r\n", "bufo_viridis_s_000446.png\r\n", "chihuahua_s_001646.png\r\n", "domestic_cat_s_000619.png\r\n", "ferry_s_000003.png\r\n", "jetliner_s_001695.png\r\n", "monoplane_s_000189.png\r\n", "pekinese_s_001349.png\r\n", "rangifer_tarandus_s_000158.png\r\n", "stealth_bomber_s_002241.png\r\n", "tip_truck_s_000896.png\r\n", "yosemite_toad_s_000052.png\r\n" ] } ], "source": [ "!ls ~/.h2o/datasets/cifar-10-batches-py/ | sed -n '1~5000p' # show every 5000th file" ] }, { "cell_type": "code", "execution_count": 183, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nD3rJ7tEb4ySaAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nqIUAiPgfxCJRYo/3RuEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for x in x_train[:10]:\n", " display(Image(filename=x))" ] }, { "cell_type": "code", "execution_count": 198, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['frog',\n", " 'truck',\n", " 'truck',\n", " 'deer',\n", " 'automobile',\n", " 'automobile',\n", " 'bird',\n", " 'horse',\n", " 'ship',\n", " 'cat']" ] }, "execution_count": 198, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[labels[x] for x in y_train[:10]]" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "50000" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(x_train)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [], "source": [ "batch_test = os.path.expanduser('~/.h2o/datasets/cifar-10-batches-py/test_batch')\n", "x_test, y_test = load_cifar10_image_list(batch_test)" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking whether there is an H2O instance running at http://localhost:54321. connected.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
H2O cluster uptime:04 secs
H2O cluster version:3.11.0.99999
H2O cluster version age:2 hours and 25 minutes
H2O cluster name:arno
H2O cluster total nodes:1
H2O cluster free memory:13.96 Gb
H2O cluster total cores:12
H2O cluster allowed cores:12
H2O cluster status:accepting new members, healthy
H2O connection url:http://localhost:54321
H2O connection proxy:None
Python version:2.7.12 final
" ], "text/plain": [ "-------------------------- ------------------------------\n", "H2O cluster uptime: 04 secs\n", "H2O cluster version: 3.11.0.99999\n", "H2O cluster version age: 2 hours and 25 minutes\n", "H2O cluster name: arno\n", "H2O cluster total nodes: 1\n", "H2O cluster free memory: 13.96 Gb\n", "H2O cluster total cores: 12\n", "H2O cluster allowed cores: 12\n", "H2O cluster status: accepting new members, healthy\n", "H2O connection url: http://localhost:54321\n", "H2O connection proxy:\n", "Python version: 2.7.12 final\n", "-------------------------- ------------------------------" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import h2o\n", "h2o.init()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fri Oct 21 20:56:20 2016 \r\n", "+-----------------------------------------------------------------------------+\r\n", "| NVIDIA-SMI 367.44 Driver Version: 367.44 |\r\n", "|-------------------------------+----------------------+----------------------+\r\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\r\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\r\n", "|===============================+======================+======================|\r\n", "| 0 GeForce GTX 980 Ti Off | 0000:01:00.0 On | N/A |\r\n", "| 7% 62C P0 74W / 275W | 792MiB / 6076MiB | 0% Default |\r\n", "+-------------------------------+----------------------+----------------------+\r\n", "| 1 TITAN X (Pascal) Off | 0000:02:00.0 Off | N/A |\r\n", "| 23% 34C P8 8W / 250W | 1MiB / 12189MiB | 0% Default |\r\n", "+-------------------------------+----------------------+----------------------+\r\n", " \r\n", "+-----------------------------------------------------------------------------+\r\n", "| Processes: GPU Memory |\r\n", "| GPU PID Type Process name Usage |\r\n", "|=============================================================================|\r\n", "| 0 692 G ...-gpu-active-device-id=0x1b00 --mojo-appli 36MiB |\r\n", "| 0 1581 G /usr/lib/xorg/Xorg 542MiB |\r\n", "| 0 2570 G compiz 211MiB |\r\n", "+-----------------------------------------------------------------------------+\r\n" ] } ], "source": [ "!nvidia-smi" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [], "source": [ "train_df = {\"x0\": x_train, \"x1\": y_train }" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": true }, "outputs": [], "source": [ "test_df = {\"x0\" : x_test, \"x1\": y_test }" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parse progress: |█████████████████████████████████████████████████████████████████████████████| 100%\n" ] } ], "source": [ "train_hf = h2o.H2OFrame(train_df)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parse progress: |█████████████████████████████████████████████████████████████████████████████| 100%\n" ] } ], "source": [ "test_hf = h2o.H2OFrame(test_df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's turn the class label into a factor" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [], "source": [ "train_hf['x1'] = train_hf['x1'].asfactor()\n", "test_hf['x1'] = test_hf['x1'].asfactor()" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
x0 x1
/home/arno/.h2o/datasets/cifar-10-batches-py/leptodactylus_pentadactylus_s_000004.png 6
/home/arno/.h2o/datasets/cifar-10-batches-py/camion_s_000148.png 9
/home/arno/.h2o/datasets/cifar-10-batches-py/tipper_truck_s_001250.png 9
/home/arno/.h2o/datasets/cifar-10-batches-py/american_elk_s_001521.png 4
/home/arno/.h2o/datasets/cifar-10-batches-py/station_wagon_s_000293.png 1
/home/arno/.h2o/datasets/cifar-10-batches-py/coupe_s_001735.png 1
/home/arno/.h2o/datasets/cifar-10-batches-py/cassowary_s_001300.png 2
/home/arno/.h2o/datasets/cifar-10-batches-py/cow_pony_s_001168.png 7
/home/arno/.h2o/datasets/cifar-10-batches-py/sea_boat_s_001584.png 8
/home/arno/.h2o/datasets/cifar-10-batches-py/tabby_s_001355.png 3
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_hf.head(10)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from h2o.estimators.deepwater import H2ODeepWaterEstimator" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [], "source": [ "deepwater_model = H2ODeepWaterEstimator(\n", " epochs=10, ## \n", " nfolds=3, ## 3-fold cross-validation\n", " learning_rate=2e-3,\n", " mini_batch_size=64,\n", "# problem_type='image', ## autodetected by default\n", " network='vgg',\n", "# network_definition_file=\"mycnn.json\" ## provide your own mxnet .json model\n", " image_shape=[32,32], \n", " channels=3,\n", " gpu=True\n", ")" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "deepwater Model Build progress: |█████████████████████████████████████████████████████████████| 100%\n" ] } ], "source": [ "deepwater_model.train(x=['x0'], y='x1', training_frame=train_hf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Anytime, especially during training, you can inspect the model in Flow (http://localhost:54321)\n", "\n", "![Flow model inspection while the model is training](images/flow-models.png)\n", "\n", "Here's the first (of three) cross-validation models:\n", "![Flow model inspection while the model is training](images/cifar10-flow.png)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "training error: 0.16713273474\n" ] } ], "source": [ "train_error = deepwater_model.model_performance(train=True).mean_per_class_error()\n", "print \"training error:\", train_error" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cross-validated error: 0.3618\n" ] } ], "source": [ "xval_error = deepwater_model.model_performance(xval=True).mean_per_class_error()\n", "print \"cross-validated error:\", xval_error" ] }, { "cell_type": "code", "execution_count": 207, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Details\n", "=============\n", "H2ODeepWaterEstimator : Deep Water\n", "Model Key: DeepWater_model_python_1477112436466_1\n", "Status of Deep Learning Model: vgg, 107.4 MB, predicting x1, 10-class classification, 501,760 training samples, mini-batch size 64\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "
input_neuronsratemomentum
30720.00133180.99
" ], "text/plain": [ " input_neurons rate momentum\n", "-- --------------- ---------- ----------\n", " 3072 0.00133177 0.99" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "ModelMetricsMultinomial: deepwater\n", "** Reported on train data. **\n", "\n", "MSE: 0.148682043417\n", "RMSE: 0.385593106029\n", "LogLoss: 0.495613927236\n", "Mean Per-Class Error: 0.16713273474\n", "Confusion Matrix: vertical: actual; across: predicted\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
0123456789ErrorRate
748.020.029.016.012.04.06.02.095.043.00.2328205227 / 975
2.0932.00.04.00.00.04.00.033.038.00.079960581 / 1,013
26.06.0726.053.064.025.073.09.017.08.00.2790467281 / 1,007
11.05.015.0739.025.095.076.04.011.013.00.2565392255 / 994
10.01.027.036.0824.022.055.017.07.09.00.1825397184 / 1,008
1.03.010.0167.037.0749.026.08.07.04.00.2598814263 / 1,012
1.05.011.023.010.04.0946.01.01.00.00.055888256 / 1,002
11.02.014.045.053.055.06.0802.04.026.00.2121807216 / 1,018
7.011.00.04.01.00.01.00.0941.015.00.039795939 / 980
4.046.01.08.00.02.01.00.013.0957.00.072674475 / 1,032
821.01031.0833.01095.01026.0956.01194.0843.01129.01113.00.16701521,677 / 10,041
" ], "text/plain": [ "0 1 2 3 4 5 6 7 8 9 Error Rate\n", "--- ---- --- ---- ---- --- ---- --- ---- ---- --------- --------------\n", "748 20 29 16 12 4 6 2 95 43 0.232821 227 / 975\n", "2 932 0 4 0 0 4 0 33 38 0.0799605 81 / 1,013\n", "26 6 726 53 64 25 73 9 17 8 0.279047 281 / 1,007\n", "11 5 15 739 25 95 76 4 11 13 0.256539 255 / 994\n", "10 1 27 36 824 22 55 17 7 9 0.18254 184 / 1,008\n", "1 3 10 167 37 749 26 8 7 4 0.259881 263 / 1,012\n", "1 5 11 23 10 4 946 1 1 0 0.0558882 56 / 1,002\n", "11 2 14 45 53 55 6 802 4 26 0.212181 216 / 1,018\n", "7 11 0 4 1 0 1 0 941 15 0.0397959 39 / 980\n", "4 46 1 8 0 2 1 0 13 957 0.0726744 75 / 1,032\n", "821 1031 833 1095 1026 956 1194 843 1129 1113 0.167015 1,677 / 10,041" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Top-10 Hit Ratios: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
khit_ratio
10.8329848
20.9298874
30.9638482
40.9804800
50.9900408
60.9953191
70.9971118
80.9985061
90.9996016
100.9999999
" ], "text/plain": [ "k hit_ratio\n", "--- -----------\n", "1 0.832985\n", "2 0.929887\n", "3 0.963848\n", "4 0.98048\n", "5 0.990041\n", "6 0.995319\n", "7 0.997112\n", "8 0.998506\n", "9 0.999602\n", "10 1" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "ModelMetricsMultinomial: deepwater\n", "** Reported on cross-validation data. **\n", "\n", "MSE: 0.326416394664\n", "RMSE: 0.571328622304\n", "LogLoss: 1.09564677029\n", "Mean Per-Class Error: 0.3618\n", "Confusion Matrix: vertical: actual; across: predicted\n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
0123456789ErrorRate
3144.0196.0379.0136.0221.045.035.0119.0422.0303.00.37121,856 / 5,000
82.03867.024.048.026.030.067.039.095.0722.00.22661,133 / 5,000
273.028.02535.0464.0716.0373.0284.0180.070.077.00.4932,465 / 5,000
64.050.0313.02424.0416.0847.0446.0225.077.0138.00.51522,576 / 5,000
112.023.0399.0365.03154.0191.0277.0386.043.050.00.36921,846 / 5,000
28.026.0282.01190.0379.02466.0176.0343.023.087.00.50682,534 / 5,000
32.063.0228.0456.0465.0130.03458.048.042.078.00.30841,542 / 5,000
49.026.0164.0271.0648.0315.058.03340.019.0110.00.3321,660 / 5,000
416.0245.074.0125.071.043.044.036.03705.0241.00.2591,295 / 5,000
149.0457.036.0123.039.057.084.0122.0116.03817.00.23661,183 / 5,000
4349.04981.04434.05602.06135.04497.04929.04838.04612.05623.00.361818,090 / 50,000
" ], "text/plain": [ "0 1 2 3 4 5 6 7 8 9 Error Rate\n", "---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ------- ---------------\n", "3144 196 379 136 221 45 35 119 422 303 0.3712 1,856 / 5,000\n", "82 3867 24 48 26 30 67 39 95 722 0.2266 1,133 / 5,000\n", "273 28 2535 464 716 373 284 180 70 77 0.493 2,465 / 5,000\n", "64 50 313 2424 416 847 446 225 77 138 0.5152 2,576 / 5,000\n", "112 23 399 365 3154 191 277 386 43 50 0.3692 1,846 / 5,000\n", "28 26 282 1190 379 2466 176 343 23 87 0.5068 2,534 / 5,000\n", "32 63 228 456 465 130 3458 48 42 78 0.3084 1,542 / 5,000\n", "49 26 164 271 648 315 58 3340 19 110 0.332 1,660 / 5,000\n", "416 245 74 125 71 43 44 36 3705 241 0.259 1,295 / 5,000\n", "149 457 36 123 39 57 84 122 116 3817 0.2366 1,183 / 5,000\n", "4349 4981 4434 5602 6135 4497 4929 4838 4612 5623 0.3618 18,090 / 50,000" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Top-10 Hit Ratios: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
khit_ratio
10.6382
20.8062400
30.8841000
40.9291999
50.9570000
60.9757199
70.9861399
80.9930800
90.9977
101.0
" ], "text/plain": [ "k hit_ratio\n", "--- -----------\n", "1 0.6382\n", "2 0.80624\n", "3 0.8841\n", "4 0.9292\n", "5 0.957\n", "6 0.97572\n", "7 0.98614\n", "8 0.99308\n", "9 0.9977\n", "10 1" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Cross-Validation Metrics Summary: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
meansdcv_1_validcv_2_validcv_3_valid
accuracy0.63818210.00840140.63905900.65227540.6232119
err0.36181790.00840140.36094100.34772460.3767881
err_count6030.0133.607646014.05807.06269.0
logloss1.09569180.02456051.07505511.06740631.1446139
max_per_class_error0.57224570.02895570.61193110.58892820.5158778
mean_per_class_accuracy0.63812960.00833420.6387210.65226010.6234079
mean_per_class_error0.36187040.00833420.36127900.34773990.3765921
mse0.32643120.00681550.32821960.31383430.3372396
r20.96042040.00096800.96041330.96210070.9587473
rmse0.5712790.00597750.57290450.56020920.5807233
" ], "text/plain": [ " mean sd cv_1_valid cv_2_valid cv_3_valid\n", "----------------------- -------- ----------- ------------ ------------ ------------\n", "accuracy 0.638182 0.00840136 0.639059 0.652275 0.623212\n", "err 0.361818 0.00840136 0.360941 0.347725 0.376788\n", "err_count 6030 133.608 6014 5807 6269\n", "logloss 1.09569 0.0245605 1.07506 1.06741 1.14461\n", "max_per_class_error 0.572246 0.0289557 0.611931 0.588928 0.515878\n", "mean_per_class_accuracy 0.63813 0.00833415 0.638721 0.65226 0.623408\n", "mean_per_class_error 0.36187 0.00833415 0.361279 0.34774 0.376592\n", "mse 0.326431 0.00681546 0.32822 0.313834 0.33724\n", "r2 0.96042 0.000968027 0.960413 0.962101 0.958747\n", "rmse 0.571279 0.00597746 0.572905 0.560209 0.580723" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Scoring History: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
timestampdurationtraining_speedepochsiterationssamplestraining_rmsetraining_loglosstraining_classification_error
2016-10-21 22:12:49 0.000 secNone0.000.0nannannan
2016-10-21 22:12:5111 min 58.395 sec1570 obs/sec0.0409612048.00.89759752.28870620.8667463
2016-10-21 22:13:0312 min 10.833 sec1614 obs/sec0.40961020480.00.77953561.77338450.6586993
2016-10-21 22:13:1412 min 22.031 sec1611 obs/sec0.737281836864.00.76725141.66575080.6262324
2016-10-21 22:13:2512 min 33.166 sec1613 obs/sec1.064962653248.00.72635321.54425340.5658799
------------------------------
2016-10-21 22:17:5116 min 58.599 sec1602 obs/sec8.76544214438272.00.42813800.58747730.2013744
2016-10-21 22:18:0217 min 9.884 sec1603 obs/sec9.09312222454656.00.40434930.52080310.1792650
2016-10-21 22:18:1317 min 21.089 sec1603 obs/sec9.4208230471040.00.39583500.50475250.1763769
2016-10-21 22:18:2317 min 31.071 sec1603 obs/sec9.70752237485376.00.40619670.53160240.1815556
2016-10-21 22:18:3517 min 42.397 sec1602 obs/sec10.0352245501760.00.38559310.49561390.1670152
" ], "text/plain": [ " timestamp duration training_speed epochs iterations samples training_rmse training_logloss training_classification_error\n", "--- ------------------- ----------------- ---------------- -------- ------------ --------- --------------- ------------------ -------------------------------\n", " 2016-10-21 22:12:49 0.000 sec 0.0 0 0.0 nan nan nan\n", " 2016-10-21 22:12:51 11 min 58.395 sec 1570 obs/sec 0.04096 1 2048.0 0.897597488277 2.28870621872 0.866746340006\n", " 2016-10-21 22:13:03 12 min 10.833 sec 1614 obs/sec 0.4096 10 20480.0 0.779535578742 1.77338451478 0.658699332736\n", " 2016-10-21 22:13:14 12 min 22.031 sec 1611 obs/sec 0.73728 18 36864.0 0.767251372555 1.6657507864 0.626232446967\n", " 2016-10-21 22:13:25 12 min 33.166 sec 1613 obs/sec 1.06496 26 53248.0 0.726353156118 1.54425342968 0.565879892441\n", "--- --- --- --- --- --- --- --- --- ---\n", " 2016-10-21 22:17:51 16 min 58.599 sec 1602 obs/sec 8.76544 214 438272.0 0.428138001841 0.587477274356 0.201374365103\n", " 2016-10-21 22:18:02 17 min 9.884 sec 1603 obs/sec 9.09312 222 454656.0 0.404349271993 0.520803121082 0.179265013445\n", " 2016-10-21 22:18:13 17 min 21.089 sec 1603 obs/sec 9.4208 230 471040.0 0.39583503793 0.504752473458 0.176376854895\n", " 2016-10-21 22:18:23 17 min 31.071 sec 1603 obs/sec 9.70752 237 485376.0 0.406196650909 0.531602392717 0.18155562195\n", " 2016-10-21 22:18:35 17 min 42.397 sec 1602 obs/sec 10.0352 245 501760.0 0.385593106029 0.495613927236 0.167015237526" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "See the whole table with table.as_data_frame()\n" ] }, { "data": { "text/plain": [] }, "execution_count": 207, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deepwater_model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Predict " ] }, { "cell_type": "code", "execution_count": 173, "metadata": { "collapsed": false }, "outputs": [], "source": [ "random_test_image_hf = test_hf[int(np.random.random()*len(test_df)),:]['x0']" ] }, { "cell_type": "code", "execution_count": 174, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
x0
/home/arno/.h2o/datasets/cifar-10-batches-py/domestic_cat_s_000907.png
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 174, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random_test_image_hf" ] }, { "cell_type": "code", "execution_count": 175, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'/home/arno/.h2o/datasets/cifar-10-batches-py/domestic_cat_s_000907.png'" ] }, "execution_count": 175, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filename = random_test_image_hf.as_data_frame(use_pandas=False)[1][0]\n", "filename" ] }, { "cell_type": "code", "execution_count": 176, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 176, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(filename=filename)" ] }, { "cell_type": "code", "execution_count": 177, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "deepwater prediction progress: |██████████████████████████████████████████████████████████████| 100%\n" ] } ], "source": [ "pred = deepwater_model.predict(random_test_image_hf)" ] }, { "cell_type": "code", "execution_count": 178, "metadata": { "collapsed": false }, "outputs": [], "source": [ "predlabel = int(pred['predict'].as_data_frame(use_pandas=False)[1][0])" ] }, { "cell_type": "code", "execution_count": 179, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'cat'" ] }, "execution_count": 179, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels[predlabel]" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-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 }