Skip to content

Instantly share code, notes, and snippets.

@ypwhs
Last active July 29, 2017 11:32
Show Gist options
  • Select an option

  • Save ypwhs/6e077045d4f9f4121b2fcbf18aae110d to your computer and use it in GitHub Desktop.

Select an option

Save ypwhs/6e077045d4f9f4121b2fcbf18aae110d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"from keras.layers import *\n",
"from keras.models import *\n",
"from keras.optimizers import *\n",
"from keras.utils.np_utils import to_categorical\n",
"from keras.datasets.mnist import load_data\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"(X_train, y_train), (X_test, y_test) = load_data()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"X_train = X_train / 255.0\n",
"X_test = X_test / 255.0\n",
"X_train = np.vstack([X_train, 1 - X_train])\n",
"y_train = np.vstack([y_train, y_train])\n",
"X_test = np.vstack([X_test, 1 - X_test])\n",
"y_test = np.vstack([y_test, y_test])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"y_train = to_categorical(y_train)\n",
"y_test = to_categorical(y_test)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((120000, 28, 28), (120000, 10))"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train.shape, y_train.shape"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nAAAC+z9Li5KbB5JDAgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x113532610>"
]
},
"metadata": {
"image/png": {
"height": 257,
"width": 370
}
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import random\n",
"\n",
"%matplotlib inline\n",
"%config InlineBackend.figure_format = 'retina'\n",
"n_train = X_train.shape[0]\n",
"\n",
"for i in range(15):\n",
" plt.subplot(3, 5, i+1)\n",
" index = random.randint(0, n_train-1)\n",
" plt.title(str(np.argmax(y_train[index])))\n",
" plt.imshow(X_train[index], cmap='gray')\n",
" plt.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"model = Sequential()\n",
"model.add(Flatten(input_shape=X_train.shape[1:]))\n",
"model.add(Dense(512, activation='relu'))\n",
"model.add(Dropout(0.2))\n",
"model.add(Dense(10, activation='softmax'))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"flatten_1 (Flatten) (None, 784) 0 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 512) 401920 \n",
"_________________________________________________________________\n",
"dropout_1 (Dropout) (None, 512) 0 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 10) 5130 \n",
"=================================================================\n",
"Total params: 407,050\n",
"Trainable params: 407,050\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python2.7/site-packages/keras/models.py:844: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.\n",
" warnings.warn('The `nb_epoch` argument in `fit` '\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 120000 samples, validate on 20000 samples\n",
"Epoch 1/10\n",
"120000/120000 [==============================] - 9s - loss: 0.4500 - acc: 0.8681 - val_loss: 0.2245 - val_acc: 0.9314\n",
"Epoch 2/10\n",
"120000/120000 [==============================] - 8s - loss: 0.2254 - acc: 0.9321 - val_loss: 0.1599 - val_acc: 0.9520\n",
"Epoch 3/10\n",
"120000/120000 [==============================] - 9s - loss: 0.1791 - acc: 0.9463 - val_loss: 0.1366 - val_acc: 0.9600\n",
"Epoch 4/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1570 - acc: 0.9524 - val_loss: 0.1149 - val_acc: 0.9656\n",
"Epoch 5/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1406 - acc: 0.9570 - val_loss: 0.1334 - val_acc: 0.9602\n",
"Epoch 6/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1321 - acc: 0.9606 - val_loss: 0.1150 - val_acc: 0.9658\n",
"Epoch 7/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1192 - acc: 0.9639 - val_loss: 0.1178 - val_acc: 0.9663\n",
"Epoch 8/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1151 - acc: 0.9650 - val_loss: 0.1028 - val_acc: 0.9708\n",
"Epoch 9/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1082 - acc: 0.9676 - val_loss: 0.1048 - val_acc: 0.9706\n",
"Epoch 10/10\n",
"120000/120000 [==============================] - 8s - loss: 0.1014 - acc: 0.9689 - val_loss: 0.1014 - val_acc: 0.9721\n"
]
},
{
"data": {
"text/plain": [
"<keras.callbacks.History at 0x1226c9e10>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.compile(optimizer='adam', \n",
" loss='categorical_crossentropy',\n",
" metrics=['accuracy'])\n",
"\n",
"model.fit(X_train, y_train, batch_size=128, epochs=10, validation_data=(X_test, y_test))"
]
},
{
"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.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment