Last active
March 9, 2016 12:42
-
-
Save balzer82/3d4e2dcce16a84aac4f8 to your computer and use it in GitHub Desktop.
A Simple Neural Network with Lasagne/Theano and Keras
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Keras\n", | |
"\n", | |
"http://keras.io - Deep Learning library for Theano and TensorFlow" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"from keras.models import Sequential\n", | |
"from keras.layers.core import Dense, Activation, Dropout\n", | |
"from keras.optimizers import SGD, Adagrad, Adadelta" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"\n", | |
"#%matplotlib inline\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Train a Neural Network to predict a function\n", | |
"\n", | |
"Which should be possible for every function: http://neuralnetworksanddeeplearning.com/chap4.html\n", | |
"\n", | |
"Let's try it for\n", | |
"\n", | |
"$f(x) = 0.2+0.4 x^2+0.3x \\sin(15 x) + 0.05 \\cos(50 x)$\n", | |
"\n", | |
"with a learned function $g(x)$ to fullfill\n", | |
"\n", | |
"$|g(x) - f(x)| < \\epsilon$" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"f = lambda x: 0.2+0.4*x**2+0.3*x*np.sin(15*x)+0.05*np.cos(50*x)\n", | |
"#f = lambda x: np.sin(5*x)\n", | |
"x = np.linspace(0, 1, 100)\n", | |
"y = f(x)\n", | |
"plt.plot(x, y);\n", | |
"plt.close()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"X = x.reshape((-1, 1))\n", | |
"#y = y.reshape((-1, 1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(100, 1)\n", | |
"(100,)\n" | |
] | |
} | |
], | |
"source": [ | |
"print(np.shape(X))\n", | |
"print(np.shape(y))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Neural Network\n", | |
"\n", | |
"1. Input Layer, size 1\n", | |
"2. Hidden Layer, fully connected, size 200\n", | |
"3. Output Layer, fully connected, size 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model = Sequential()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"model.add(Dense(input_dim=1, output_dim=300, init=\"uniform\"))\n", | |
"model.add(Activation(\"relu\"))\n", | |
"model.add(Dense(output_dim=1, init=\"uniform\"))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Compile the model" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"model.compile(loss='mean_squared_error', optimizer=Adagrad(lr=0.03, epsilon=1e-05))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Train the Model" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Epoch 1/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0496 \n", | |
"Epoch 2/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0240 \n", | |
"Epoch 3/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0264 \n", | |
"Epoch 4/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0213 \n", | |
"Epoch 5/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0216 \n", | |
"Epoch 6/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0220 \n", | |
"Epoch 7/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0203 \n", | |
"Epoch 8/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0223 \n", | |
"Epoch 9/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0207 \n", | |
"Epoch 10/10\n", | |
"100/100 [==============================] - 0s - loss: 0.0208 \n" | |
] | |
} | |
], | |
"source": [ | |
"model_hist = model.fit(X, y, nb_epoch=10000, batch_size=10)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Evaluate the Model" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Epsilon=0.111\n" | |
] | |
} | |
], | |
"source": [ | |
"eps=[]\n", | |
"for x_i in x:\n", | |
" # because sometimes, there is a 'nan' in model.predict()\n", | |
" if not np.isnan(x_i):\n", | |
" eps.append(np.abs(model.predict(np.array([[x_i]])) - f(x_i)))\n", | |
"\n", | |
"print('Epsilon=%.3f' % (np.sum(eps)/len(x)))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Plot Results" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"plt.semilogy(model_hist.history['loss'])\n", | |
"plt.xlabel('Epoch #')\n", | |
"plt.ylabel('Loss')\n", | |
"plt.savefig('Loss.png', dpi=150)\n", | |
"plt.close()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\ngg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10d8dbf90>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(x, y, label='f(x)');\n", | |
"plt.plot(x, model.predict(X), label='g(x)')\n", | |
"plt.legend(loc='best')\n", | |
"plt.savefig('f_x_g_x.png', dpi=150)\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"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.11" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment