{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# DeepLearning\n",
"\n",
"## MNIST Dataset using DeepWater and Custom MXNet Model\n",
"\n",
"The MNIST database is a well-known academic dataset used to benchmark\n",
"classification performance. The data consists of 60,000 training images and\n",
"10,000 test images. Each image is a standardized $28^2$ pixel greyscale image of\n",
"a single handwritten digit. An example of the scanned handwritten digits is\n",
"shown\n",
"![Example MNIST digit images](images/mnist.png)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"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": [
"
H2O cluster uptime: \n",
"2 hours 6 mins \n",
"H2O cluster version: \n",
"3.11.0.99999 \n",
"H2O cluster version age: \n",
"9 hours and 12 minutes \n",
"H2O cluster name: \n",
"arno \n",
"H2O cluster total nodes: \n",
"1 \n",
"H2O cluster free memory: \n",
"13.65 Gb \n",
"H2O cluster total cores: \n",
"12 \n",
"H2O cluster allowed cores: \n",
"12 \n",
"H2O cluster status: \n",
"locked, healthy \n",
"H2O connection url: \n",
"http://localhost:54321 \n",
"H2O connection proxy: \n",
"None \n",
"Python version: \n",
"2.7.12 final
"
],
"text/plain": [
"-------------------------- ----------------------\n",
"H2O cluster uptime: 2 hours 6 mins\n",
"H2O cluster version: 3.11.0.99999\n",
"H2O cluster version age: 9 hours and 12 minutes\n",
"H2O cluster name: arno\n",
"H2O cluster total nodes: 1\n",
"H2O cluster free memory: 13.65 Gb\n",
"H2O cluster total cores: 12\n",
"H2O cluster allowed cores: 12\n",
"H2O cluster status: locked, 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": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import os.path\n",
"PATH = os.path.expanduser(\"~/h2o-3/\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Parse progress: |█████████████████████████████████████████████████████████████████████████████| 100%\n"
]
}
],
"source": [
"test_df = h2o.import_file(PATH + \"bigdata/laptop/mnist/test.csv.gz\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Parse progress: |█████████████████████████████████████████████████████████████████████████████| 100%\n"
]
}
],
"source": [
"train_df = h2o.import_file(PATH + \"/bigdata/laptop/mnist/train.csv.gz\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Specify the response and predictor columns"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"y = \"C785\"\n",
"x = train_df.names[0:784]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Convert the number to a class"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train_df[y] = train_df[y].asfactor()\n",
"test_df[y] = test_df[y].asfactor()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Train Deep Learning model and validate on test set"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### LeNET 1989\n",
"\n",
"![lenet](./images/lenet.jpg)\n",
"\n",
"In this demo you will learn how to build a simple LeNET Model usix MXNET."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def lenet(num_classes):\n",
" import mxnet as mx\n",
" data = mx.symbol.Variable('data')\n",
" # first conv\n",
" conv1 = mx.symbol.Convolution(data=data, kernel=(5,5), num_filter=20)\n",
" tanh1 = mx.symbol.Activation(data=conv1, act_type=\"tanh\")\n",
" pool1 = mx.symbol.Pooling(data=tanh1, pool_type=\"max\", kernel=(2,2), stride=(2,2))\n",
" # second conv\n",
" conv2 = mx.symbol.Convolution(data=pool1, kernel=(5,5), num_filter=50)\n",
" tanh2 = mx.symbol.Activation(data=conv2, act_type=\"tanh\")\n",
" pool2 = mx.symbol.Pooling(data=tanh2, pool_type=\"max\", kernel=(2,2), stride=(2,2))\n",
" # first fullc\n",
" flatten = mx.symbol.Flatten(data=pool2)\n",
" fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)\n",
" tanh3 = mx.symbol.Activation(data=fc1, act_type=\"tanh\")\n",
" # second fullc\n",
" fc2 = mx.symbol.FullyConnected(data=tanh3, num_hidden=num_classes)\n",
" # loss\n",
" lenet = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')\n",
" return lenet"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"nclasses = 10 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we instantiate our lenet model using 10 classes"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"mxnet_model = lenet(nclasses)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To import the model inside the DeepWater training engine we need to save the model to a file:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"model_filename=\"/tmp/symbol_lenet-py.json\"\n",
"mxnet_model.save(model_filename)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"plot \n",
" \n",
"\n",
"convolution0 \n",
" \n",
"Convolution \n",
"5x5/1, 20 \n",
" \n",
"\n",
"activation0 \n",
" \n",
"Activation \n",
"tanh \n",
" \n",
"\n",
"activation0->convolution0 \n",
" \n",
" \n",
"20x24x24 \n",
" \n",
"\n",
"pooling0 \n",
" \n",
"Pooling \n",
"max, 2x2/2 \n",
" \n",
"\n",
"pooling0->activation0 \n",
" \n",
" \n",
"20x24x24 \n",
" \n",
"\n",
"convolution1 \n",
" \n",
"Convolution \n",
"5x5/1, 50 \n",
" \n",
"\n",
"convolution1->pooling0 \n",
" \n",
" \n",
"20x12x12 \n",
" \n",
"\n",
"activation1 \n",
" \n",
"Activation \n",
"tanh \n",
" \n",
"\n",
"activation1->convolution1 \n",
" \n",
" \n",
"50x8x8 \n",
" \n",
"\n",
"pooling1 \n",
" \n",
"Pooling \n",
"max, 2x2/2 \n",
" \n",
"\n",
"pooling1->activation1 \n",
" \n",
" \n",
"50x8x8 \n",
" \n",
"\n",
"flatten0 \n",
" \n",
"Flatten \n",
" \n",
"\n",
"flatten0->pooling1 \n",
" \n",
" \n",
"50x4x4 \n",
" \n",
"\n",
"fullyconnected0 \n",
" \n",
"FullyConnected \n",
"500 \n",
" \n",
"\n",
"fullyconnected0->flatten0 \n",
" \n",
" \n",
"800 \n",
" \n",
"\n",
"activation2 \n",
" \n",
"Activation \n",
"tanh \n",
" \n",
"\n",
"activation2->fullyconnected0 \n",
" \n",
" \n",
"500 \n",
" \n",
"\n",
"fullyconnected1 \n",
" \n",
"FullyConnected \n",
"10 \n",
" \n",
"\n",
"fullyconnected1->activation2 \n",
" \n",
" \n",
"500 \n",
" \n",
"\n",
"softmax \n",
" \n",
"SoftmaxOutput \n",
" \n",
"\n",
"softmax->fullyconnected1 \n",
" \n",
" \n",
"10 \n",
" \n",
" \n",
" \n"
],
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# pip install graphviz\n",
"# sudo apt-get install graphviz\n",
"import mxnet as mx\n",
"import graphviz\n",
"mx.viz.plot_network(mxnet_model, shape={\"data\":(1, 1, 28, 28)}, node_attrs={\"shape\":'rect',\"fixedsize\":'false'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The model is just the structure of the network expressed as a json dict"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\r\n",
" \"nodes\": [\r\n",
" {\r\n",
" \"op\": \"null\", \r\n",
" \"param\": {}, \r\n",
" \"name\": \"data\", \r\n",
" \"inputs\": [], \r\n",
" \"backward_source_id\": -1\r\n",
" }, \r\n",
" {\r\n",
" \"op\": \"null\", \r\n",
" \"param\": {}, \r\n",
" \"name\": \"convolution0_weight\", \r\n",
" \"inputs\": [], \r\n",
" \"backward_source_id\": -1\r\n",
" }, \r\n",
" {\r\n",
" \"op\": \"null\", \r\n",
" \"param\": {}, \r\n",
" \"name\": \"convolution0_bias\", \r\n"
]
}
],
"source": [
"!head -n 20 $model_filename"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Importing the LeNET model architecture for training in H2O\n",
"\n",
"We have defined the model and saved the structure to a file. We are ready to start the training procedure."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from h2o.estimators.deepwater import H2ODeepWaterEstimator"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"lenet_model = H2ODeepWaterEstimator(\n",
" epochs=10,\n",
" learning_rate=1e-3, \n",
" mini_batch_size=64,\n",
" network_definition_file=model_filename,\n",
"# network='lenet', ## equivalent pre-configured model\n",
" image_shape=[28,28],\n",
" problem_type='dataset', ## Not 'image' since we're not passing paths to image files, but raw numbers\n",
" ignore_const_cols=False, ## We need to keep all 28x28=784 pixel values, even if some are always 0\n",
" channels=1\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"deepwater Model Build progress: |█████████████████████████████████████████████████████████████| 100%\n"
]
}
],
"source": [
"lenet_model.train(x=train_df.names, y=y, training_frame=train_df, validation_frame=test_df)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model error: 0.0200332124248\n"
]
}
],
"source": [
"error = lenet_model.model_performance(valid=True).mean_per_class_error()\n",
"print \"model error:\", error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A More powerful Architecture\n",
"\n",
"the beauty of deeplearning is that we can compose a new model with even more \"capacity\" to try to get a higher accuracy."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def cnn(num_classes):\n",
" import mxnet as mx\n",
" data = mx.symbol.Variable('data')\n",
"\n",
" inputdropout = mx.symbol.Dropout(data=data, p=0.1)\n",
"\n",
" # first convolution\n",
" conv1 = mx.symbol.Convolution(data=data, kernel=(5,5), num_filter=50)\n",
" tanh1 = mx.symbol.Activation(data=conv1, act_type=\"relu\")\n",
" pool1 = mx.symbol.Pooling(data=tanh1, pool_type=\"max\", pad=(1,1), kernel=(3,3), stride=(2,2))\n",
" \n",
" # second convolution\n",
" conv2 = mx.symbol.Convolution(data=pool1, kernel=(5,5), num_filter=100)\n",
" tanh2 = mx.symbol.Activation(data=conv2, act_type=\"relu\")\n",
" pool2 = mx.symbol.Pooling(data=tanh2, pool_type=\"max\", pad=(1,1), kernel=(3,3), stride=(2,2))\n",
" \n",
" # first fully connected layer \n",
" flatten = mx.symbol.Flatten(data=pool2)\n",
" fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=1024)\n",
" relu3 = mx.symbol.Activation(data=fc1, act_type=\"relu\")\n",
" inputdropout = mx.symbol.Dropout(data=fc1, p=0.5)\n",
" \n",
" # second fully connected layer\n",
" flatten = mx.symbol.Flatten(data=relu3)\n",
" fc2 = mx.symbol.FullyConnected(data=flatten, num_hidden=1024)\n",
" relu4 = mx.symbol.Activation(data=fc2, act_type=\"relu\")\n",
" inputdropout = mx.symbol.Dropout(data=fc2, p=0.5)\n",
" \n",
" # third fully connected layer\n",
" fc3 = mx.symbol.FullyConnected(data=relu4, num_hidden=num_classes)\n",
" # loss\n",
" cnn = mx.symbol.SoftmaxOutput(data=fc3, name='softmax')\n",
" return cnn"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"nclasses = 10"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"mxnet_model = cnn(nclasses)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"model_filename=\"/tmp/symbol_cnn-py.json\"\n",
"mxnet_model.save(model_filename)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from h2o.estimators.deepwater import H2ODeepWaterEstimator"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Importing the lenet model architecture for training in H2O\n"
]
}
],
"source": [
"print(\"Importing the lenet model architecture for training in H2O\")"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"model = H2ODeepWaterEstimator(\n",
" epochs=20, \n",
" learning_rate=1e-3, \n",
" mini_batch_size=64,\n",
" network_definition_file=model_filename,\n",
" image_shape=[28,28], \n",
" channels=1,\n",
" ignore_const_cols=False ## We need to keep all 28x28=784 pixel values, even if some are always 0\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"deepwater Model Build progress: |█████████████████████████████████████████████████████████████| 100%\n"
]
}
],
"source": [
"model.train(x=train_df.names, y=y, training_frame=train_df, validation_frame=test_df)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"model error: 0.0111236907698\n"
]
}
],
"source": [
"error = model.model_performance(valid=True).mean_per_class_error()\n",
"print \"model error:\", error"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Visualizing the results"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import matplotlib\n",
"import numpy as np\n",
"import scipy.io\n",
"import matplotlib.pyplot as plt\n",
"from IPython.display import Image, display\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = test_df.as_data_frame()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"image = df.T[int(np.random.random()*784)]"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(785,)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"image.shape"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(image[:-1].reshape(28, 28), plt.cm.gray);"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n"
]
}
],
"source": [
"print image[-1]"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Parse progress: |█████████████████████████████████████████████████████████████████████████████| 100%\n"
]
}
],
"source": [
"image_hf = h2o.H2OFrame.from_python(image.to_dict())"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"deepwater prediction progress: |██████████████████████████████████████████████████████████████| 100%\n"
]
}
],
"source": [
"prediction = model.predict(image_hf)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" predict \n",
" 1 \n",
"
"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": []
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"prediction['predict']"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"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.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}