Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### In this notebook we practice using TensorFlow by classifying images in the popular MNIST handwritten numbers dataset. Instructions for setting up TensorFlow in a virtual environment can be found [here](https://www.tensorflow.org/install/pip?lang=python3#package-location). In the same article there are instructions on how to get started experimenting with the MNIST dataset which we use to build our model."
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [],
"source": [
"#Import tensorflow and relevant packages\n",
"import tensorflow as tf\n",
"\n",
"import matplotlib\n",
"from matplotlib import pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {},
"outputs": [],
"source": [
"mnist = tf.keras.datasets.mnist"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [],
"source": [
"#import images\n",
"(x_train, y_train),(x_test, y_test) = mnist.load_data()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We have imported 60,000 handwritten images, it may be useful to see what they look like"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAI/CAYAAACf7mYiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xm81dP+x/HPuo2aJKWiOKaIUEmReUrJnAxXusaUqYiMVyLXmETIGEmmDPfm+hkuaTBXMhUyFKLhaFIpDd/fH/K5n/W9Zx/77LP3/p6z1+v5ePwev/fyXft7Ft/2ad3vmlwURQIAABCSvyTdAAAAgHyjAwQAAIJDBwgAAASHDhAAAAgOHSAAABAcOkAAACA4dIAAAEBw6AABAIDg0AECAADBqVqWyg0bNoyKiopy1BSUZPbs2VJcXOyyfV+eZTKmTp1aHEVRo2zfl+eZf3w3C0suvps8y2Sk+yzL1AEqKiqSKVOmZN4qlFm7du1ycl+eZTKcc3NycV+eZ/7x3Swsufhu8iyTke6zZAgMAAAEhw4QAAAIDh0gAAAQHDpAAAAgOHSAAABAcOgAAQCA4NABAgAAwaEDBAAAgkMHCAAABIcOEAAACA4dIAAAEJwynQUGVDTff/+9Vx42bJjmoUOHar7ooou8en379tXcvHnzHLUOAFBR8QYIAAAEhw4QAAAIDh0gAAAQnIKaA7R+/XqvvHr16rQ+9+ijj2pesWKF5hkzZnj17rjjDs1XXnml5uHDh3v1NtpoI81DhgzxrvXp0yetNiG1uXPnam7Tpo13bcmSJZqdc5rtsxPxn/nChQuz3UQkaObMmZoPOeQQ79r06dM1N2rUKG9tQmoPPPCAV+7du7dm+zv9iy++8Oq1aNEitw1DweMNEAAACA4dIAAAEJwKOwS2dOlSzevWrfOuffTRR5pfffVVzXb4Q0Tk/vvvL1cbioqKvHL//v01P/TQQ5o33nhjr96+++6r+aCDDipXG/C7OXPmaD7ggAM0L1682Ktnh73sc6lRo4ZXb8GCBZq/+eYbzVtttZVXr0qVKpk1uBKYNWuWV7b/Ldu3b5/v5mTNe++9p/nggw9OsCVI5fXXX9d88cUXe9f+8peS/3e5/W4D2cAbIAAAEBw6QAAAIDgVZgjshx9+8MqtW7fWHB/myCX7+tUOc4n4q7vOPPNMzZtttplXr06dOppZaZK+NWvWaLZDXiIinTt31hzf/TkV+2fohhtu8K7ts88+mrfffnvN8WFT+5wLjR2GEBH5/PPPNVe2IbAoijTbob0vv/wyiebgT9jnsmrVqgRbErbZs2d75UceeUTzyy+/rPmDDz5IeY/HH39cc3xX/ddee03zaaedpjk+vSQpvAECAADBoQMEAACCQwcIAAAEp8LMAdp00029cuPGjTVnYw5Qp06dUv6s5557TrNdLm2XWyP3Lr30Us3x3bUzMWHCBM12h28RkWOPPVazff4ffvhhuX9uZXHnnXd6ZfsdqWyWL1+u+cYbb9Tct29frx5z8pJjd9a/9tprU9Zr27atZrvNSe3atXPSrtC89dZbmk844QTv2vz58zXbeXXHHXecV8/Ow+zRo0fKn2XvYXfcv/vuu8vQ4tzhDRAAAAgOHSAAABCcCjMEZpeYi/jL8caOHetd22uvvTR369Yt5T3tUud//vOfmqtXr+7VmzdvnuZhw4al12BkhX2VOnr0aM321WmcHb6KP3/7OtYuyWzZsqVX77LLLtNs/3yV9nMLTXyH9crMHqBpxZ878uerr77yyocffrjmRYsWpfzcTTfdpDm+yz7SEz8Y3C5379q1q2Y7dCwicswxx2gePHiwZrtViIj/u+OMM87Q/OSTT6ZsU8eOHf+k1fnHGyAAABAcOkAAACA4dIAAAEBwKswcoLg99thD86677upds3N4BgwYoPmWW27x6l1//fUlfiauSZMmmu0SWmTf3LlzvXKbNm00L1myRHP85OdTTjlF8wMPPKDZLq2NXzvppJM016pVy6u3+eaba7bHnzz22GNevcsvv1xzfJv3yujHH3/UHH8WlVmqOSWHHnponluCPzz44INeOdURNvEl1gceeGDO2hSK8ePHe+XDDjusxHonnniiV3744Yc12y1h4iZPnqy5tHk/9sgLO3ezouANEAAACA4dIAAAEJwKOwRmlfYqbpNNNkl5ze50u++++2qOD68gt4qLizXffPPN3jW7y7fd/Xvrrbf26vXp00ezHc60J76XVC6rlStXeuVbb71Vc3zn5MrI7qwb/3etTOI7e3/yyScl1ovv+o7csn+m7HdHxB9qts/FTlVA5uzvp4suusi7Zv/Ou+aaazTb7UBESv+71urXr19a9Z566inN8WkIFQFvgAAAQHDo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1s656iJykoj8K+E2IQNRFF0RRVGzKIqK5Pfn+EYURT0SbhYAEdkwYiLOuS1F5DgReSLZFuVGoQ+BNRaR551zIr//u46JoujlZJuETEVRtNY5d76IvCIiVUTk4SiKPku4WUDwnHNPiMgBItLQOfeDiAyMouihZFuFcnjWObepiKwRkfOiKFqcdINygaMwAABAcAp6CAwAAKAkdIAAAEBw6AABAIDg0AECAADBoQMEAACCQwcIAAAEp0z7ADVs2DAqKirKUVNQktmzZ0txcXFJR0CUC88yGVOnTi2OoqhRtu/L88w/vpuFJRffTZ5lMtJ9lmXqABUVFcmUKVMybxXKrF27djm5L88yGc65Obm4L88z//huFpZcfDd5lslI91kyBAYAAIJDBwgAAASHDhAAAAgOHSAAABAcOkAAACA4dIAAAEBw6AABAIDg0AECAADBoQMEAACCQwcIAAAEp0xHYQD5cv3113vla665RnP79u01v/rqq169jTfeOLcNAwBkVffu3TVHUeRdGzt2bM5+Lm+AAABAcOgAAQCA4NABAgAAwQlyDtDq1au98po1azRPnjxZ89y5c716f/vb3zRXrRrkf7qcWrJkieY777zTu/aXv/y3rz516lTN3333nVdvl112yVHrUFbFxcWa165d6117//33NR999NGa7XPO1Omnn675vvvu865VqVKl3PcP3bp167zy119/rblfv36aX3rppby1CZXLDTfc4JX//e9/a77ooovy1g7eAAEAgODQAQIAAMEp6HEcO6QyZMgQzW+88YZX77333kvrfnZIzC7LRnbUqlVL81FHHeVde+SRR/LcGqRj3rx5XnnUqFGa77//fs3r16/36tmhSzvs5Zwrd5vsn5VNNtnEuzZ48GDNNWrUKPfPClF8CsGOO+6ouVmzZpqXL1/u1atTp05uG4YKzf4dHB8Cq169uuauXbvmrU28AQIAAMGhAwQAAIJT6YfAFi5cqHnYsGHeNVv+9ddfNcd3mtx66601b7rppprtaiMRf0VJnz59NDdq1KiszUYJ7GtQ+0xQcV1++eVeefTo0Qm1pGRDhw71yr1799a87bbb5rs5Be+HH37QvHTpUu8aQ2Bhsyusf/vtN+/akUceqbljx455axNvgAAAQHDoAAEAgODQAQIAAMGpFHOAVq1a5ZXtUtZ7771Xc3zMOZX4bsETJkzQbHesbdy4sVdv/vz5Jf4s5gBlh33OH374YYItQbrs2L1I6jlAm2++uVe+5JJLNNsl8qXtBD1p0iTNzz//fJnaifyIz69ExTZr1iyvbLd3efjhhzVvtNFGGd3ffmfffvttzTvttJNXLz5XL194AwQAAIJDBwgAAASnUgyBvfXWW175pptuKvM97Cu3iRMnetfq1aun+eeffy7zvZEd9lDaGTNmpPWZd9991ytvueWWmjfeeOPsNAwpHXvssV550aJFJdaLD21lsiT6nHPO0dyyZUvvWvxQ3D+cccYZXnmrrbYq889F+uxO3vEdo1HxdO/e3St/8sknmq+//nrN2223XUb3v/jiizUvWLBA87hx47x68SHyfOENEAAACA4dIAAAEBw6QAAAIDiVYg5QuieBt2jRwisfdNBBmu3ps3bOT9ycOXPK1jhkTd26dTVfdNFF3jV79Ehp/9weZXLcccdlsXUoSXxuT2nfrfKaNm2a5uLi4rQ+Y+eEiYhUrVopfuUVhOnTp3vlbbbZJqGWIJX499XO4YofV5GOuXPnemW7zN7+rqgo88N4AwQAAIJDBwgAAASnUrwPvueee7zyXnvtpblz586a4zs3165du8w/yy7VQ3J69erllVMNgaGw2ROkhw0bpnnlypVpff7SSy/NeptCFx/23GSTTTQvXrxY88yZM/PWJqTvrrvu0vzOO+9419q0aaO5qKgorfvZobIbb7zRu7Z8+XLNhx12mOZ8nvheGt4AAQCA4NABAgAAwakUQ2B2dZCIyLnnnpuzn/XGG2/k7N7IXLoHZqLysTuz9+/f37v22WefaU53Vcq+++6rmT8r2VezZk2vbA/EHTVqVL6bgzQsW7ZMsz1JoVq1al69xx9/XHOtWrXSuvegQYM0jxgxwrtmV2G+9NJL6TU2j/jtAAAAgkMHCAAABIcOEAAACE6lmAOUqbFjx2q2Y6BRFHn17O6XU6dOTXm/rl27amZX0/yyczns80KylixZ4pWffvppzemO+duTodN9tvXr1/fKdu7JPvvsozk+xwEIwU8//eSVDznkEM3z58/XbOfviPzvaQqp2LlCt912W8p6d955Z1r3SwpvgAAAQHDoAAEAgOBUyiGwNWvWaP7xxx81X3PNNV690aNHl/h5u6RaJPVS2ebNm3vlkSNH/ulngEJnX68fcMAB3rWvv/46L22wS69FRA4//PC8/FykL90Da5GZ+N9j48eP19ypU6eUde3fXRMmTPDqNWnSRPPf/vY3zatWrfLq2QPK7ZSS+CHWRxxxRMr2VwT8LQ4AAIJDBwgAAASnwg6BrVu3TvMPP/zgXbOv3b///nvN8Z0r7RBWly5dND/xxBNePXtgm7V27Vqv/O9//1vzX//6V81VqlQp8fNAoYuvqIyX05HJLt/xHYf79u2ruXXr1mVuA7Lv0Ucf9cpDhw5NqCWFadKkSV7ZHjYaX01pv1c777yz5vjJB7b81FNPaZ41a5ZXz/69a4fNbr311rTaXlHwBggAAASHDhAAAAgOHSAAABCcCjMHyM75ERGZPn265g4dOqT83D333KP54IMP9q5tu+22mn/99VfNH3/8sVfvvffeK/He8+bN88qnn366ZrsTdLx9VatWmP+sBSPdeSKvvfaa5uOOOy6nbQpV06ZNNX/wwQfetWeeeUazXYpbvXr1jH7WQw89pHngwIEZ3QO51blzZ82cBp9bb731lma7u7OI/x1r0KCBd+0///mP5rp162ru16+fV+/555/XbOcDlXZ6gt1Zeuutt/bq2ZMV4m2qCHgDBAAAgkMHCAAABCfRsRo77DVs2DDv2oABA1J+zi5B79mzp+aaNWt69VauXKnZ7kj57rvvevVq1Kih2S7js8NwIv5O0Pvvv7/mE044watnd6SuU6dOin8LkWbNmqW8Bl+6h6E+8MADmq+99lrNjRs3zkm7Qrfxxht75bPOOiur9+/fv79mhsAqpviwxx9+++03r7x06VLN8T83SI/dSmC77bbzrtmDRw899NC07jd8+HCvbKeKvPzyy2ndww6PHXPMMd61ijjsZfEGCAAABIcOEAAACE7eh8Dsap477rhD82WXXebVszPV7cFrIv6Ol3bYa86cOV69s88+W/PEiRM177LLLl69J598UvOOO+6oefXq1V69Cy64QPPDDz+sOb7j6dNPPy2p2NVjX375Zcp68F199dWab7jhhrQ+Y4fD7OdReUybNi3pJuBPpNoJP75yyB5ijcyceOKJmu3fgyIi9erVK/P9li1b5pXfeeedEuvFd522K6yt+vXrl7kNSeINEAAACA4dIAAAEBw6QAAAIDh5nwP04osvarbzfuLLxceNG6d5991396598cUXmkeMGKF59OjRXj27pM8u97PL6EVSj53a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0UYbaX7rrbc0L1261Kt31113aT722GO9a82aNStzm7bYYgvNRx99tHdtyy23LPP9kFt2R2cRkUsuuUTzq6++mvJzI0eO1LzHHntotn/ukHtRFGk+//zzvWuPP/645u+++05zvXr1ct+wBPAGCAAABIcOEAAACE6lHAI7+OCDNdepU0dzaUNg6bKH9E2YMMG71qpVq3LfH0jSsGHDNF922WXlvt+YMWPKfQ/roosu8srt2rXTfPbZZ2vu1q2bV69+/fpZbQdSW7ZsmVcePXp0Wp8rKirSzPSC5NjDZ//973971+yzffvttzV37tw59w1LAG+AAABAcOgAAQCA4FTKITC7auC+++7TfPLJJ3v17A6l22yzjeZvvvkm5b0XLVqkedy4cd41hsAKk13lZFdJiYg8/fTTmgcPHpzyHnYH8dtuuy2LrcsuuxInXZtttplX3nfffct8j5YtW3pluypzwYIFmidNmuTVe//990vMu+++u1evdevWZW4T0mdXfnXp0sW7ZlcVWe+9955XtsOZSE61atU0x5+JXfk1d+7cvLUpKbwBAgAAwaEDBAAAgkMHCAAABKdSzgGyjjzySM277babd80u42vYsKHm0uYAWb179y5n61BRzJgxwys/+eSTmu3O4IsXL/bq2ROsS/P666+Xo3X5M3nyZM12vF8k9a7L1atX98p264lsWL16teadd97Zu5bqu/rMM894ZeYA5dYTTzyh+euvv/au9ejRQ/Pw4cM1161bN/cNQ7lceumlXvm5557T/Omnn+a7OXnHGyAAABAcOkAAACA4lX4IzBoyZIhXtof02cMd07VmzZpytwn5ZXc3njZtmuZ0h6g23nhjr3zBBRdoji//PvDAAzVXrVo5vkoNGjQoMSfJLpcubXi6Zs2amnv16pXTNsFf7j5x4kTNLVq08Ordfvvtmhn2qlzi21NYI0aM0Hz99dd717I9DJ4U3gABAIDg0AECAADBoQMEAACCUzkmLqRpzz339Movv/yy5kMOOURzfIv2VK6++mqvfP/995ejdciWX3/9VfN1113nXbv11ls1N2rUSPMBBxzg1bvxxhs122NS4ku+43OCkJl169Z55YEDB2oeOnRoWvf48ssvNTdr1iw7DYOaMmWKV3711Vc12+0gzjrrLK+ePVoBlZs91sRuT/Hmm2969Y444oh8NSmneAMEAACC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Xr0XXnhBM0NgAAAAFQAdIAAAEBw6QAAAIDiJzgG64YYbNNsdZOO6du3qle2y2Uzm/axatcor2zHMf/3rX2m1g6W2FZMdt16xYkXKepxanRt2y4P69eunrPf9999rtjupx+ckOOc029PlDz300HK1E3/u0Ucf1Wy3lLDzROLs6d/xJdV2l327fcmYMWO8evYUAGTf22+/rdl+v0RErr32Ws32uzh+/PiU95s8ebLmynYqAm+AAABAcOgAAQCA4CQ6BNavXz/N8cMq7U6vjzzyiHettJ0s0xF/5dqrV68S6+2xxx5e+fHHH89aG5Abixcv1vzRRx+lrNelS5e07mcP9JwzZ453zb76ta/tS9t1PCTxA1Az0aNHD839+/fXzBBm7t1yyy2aJ06cqDm+s/u6des09+nTR7PdPVpEpE2bNpqnTJmiuVOnTl69d955R/Ouu+5a1mbjTzRt2lTz0qVLvWtvvPGGZjsEFh8qs3//bb311tluYt7wBggAAASHDhAAAAhOokNgHTp00DxhwoSc/iy7E+3555+fsl61atU0X3755d41hr0qBrvSa9myZd616dOnp3UPO7Sy9957a7YrJEREfvrpJ83ffvutd83uZvv5559rHjJkSFptKETr16/X/Nprr2mOr+5K5dRTT/XKdiUScmvevHle2X7P7A7rcXb3/BNPPFFzaSuC7HfOru4T8Q/KtTsJIzvs8GP8d9r8+fM122cUd+aZZ2pu3LhxFluXX7wBAgAAwaEDBAAAgkMHCAAABCfROUD5ZJe0x5f0Wc8++6zmww8/PKdtCsWaNWs022XlIv7cmUmTJml+6aWXUt7vl19+0Tx16tSM2mR3/164cGHKepdcconm+I7kdil2abseh8Qug37wwQc1l/ads9Kth+yzW0jExU/5tjbffHPNV155ZZl/bu/evVPeD7kVX8Jud+guzRVXXJGL5uQdb4AAAEBw6AABAIDgFPQQ2NChQzXb5bl/+Uvqfl9892ekxw5zDRs2zLtmd95Od5l6nB1iskNP8V1p7dJd67LLLvPK5557rubmzZtn1KZQ2SHIp556yrv2wAMPaLbDWfvvv79Xz37PbrvtNs3xHeFRMdgtH+Jq1KhRrnszfFxxfPXVV5rT/TuzMivMfysAAIBS0AECAADBKaghMHson4i/46V9hRdfaTJ27FjNDRs2zFHrClvP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9erV8+rZw1CRnBtvvFFzfPd1OwRmfyfY7yxKZ1fAxn+/ffLJJyk/t8kmm2i+/PLLNV9yySUp69mDywsVb4AAAEBw6AABAIDg0AECAADByfkcoDi7DPr2229P6zNTp071ynYOkF36984773j17PL2Cy+8sEztLEmbNm00Z3spfiGJj+n/8ssvKevecccdms8444y07m+fw4svvuhdi+/4nEr16tU116pVK63P4M/de++9mnfbbTfN2267bVqftzt0i4icdNJJmu0S+2uvvdarl+5zR/YNHDhQ8yOPPKI5vux9r7320vzwww9rrlo1738NVVqbbbaZ5mnTpnnXiouLU37O/n1lTz7IhpUrV2b1fvnEGyAAABAcOkAAACA4eX/3aJc626Wrw4cPT/mZTA8eta/Ms3HgpX3laJfnxg/9C9HcuXM126WaIv5zsFsTZKpBgwblvodll+vatqLs7KHG9913n+YqVaqk/Mzq1as128NxRUTmz5+v+eqrr9bcp0+fcrUTmZszZ45XtsNeP/zwQ8rPDRgwQDPDzuUXHzps0qRJVu9fo0YNzfGtZ+zv+zFjxmg++OCDs9qGXOMNEAAACA4dIAAAEJxEp99feumlmu++++6s398Oe6U6iC9T48eP1xzqENi8efM0H3LIIZrjqxGyMfyYbfZQwV9//VVzRWxrRVba4cFHHHFEymt211o7xG1XdYr4B2NeccUVmu3reeTXAw884JXjh3L+oW3btl7ZHq6Jis+uHNtll128a3YIrEuXLnlrU7bx2x4AAASHDhAAAAgOHSAAABCcgt6C084fsHM77O6yIiL169fXzMnE6bP/rb766qsEW1J2kyZN0swJ8Jmz3x0Rf95A165dNS9evNirZ+eP1axZU3P8BPFrrrmmxHrIr6eeekrzzTff7F1LNb/SzpMUEalbt272G4bExZfIVya8AQIAAMGhAwQAAIJTKYfAGjVqpHnHHXfUfN1113n19t1337TuZ3cvZQgs+x577LGkmyALFy70yj169CixXosWLbwyBzWWrmnTpl7ZHk47bNgwzR07dvTqnX766Zq7d++u2W6nIJL5LvAov2XLlmm+7bbbNMd3S7e7fNutChjyKlx22HPTTTdNsCXlwxsgAAAQHDpAAAAgOIm+37dDWRdddJF3za4qatWqlXft3HPP1Rx/BZ8vzzzzjOZrr73W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\n",
"text/plain": [
"<Figure size 720x720 with 25 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,10))\n",
"for i in range(25):\n",
" plt.subplot(5,5,i+1)\n",
" plt.xticks([])\n",
" plt.yticks([])\n",
" plt.grid(False)\n",
" plt.imshow(x_train[i], cmap=\"Greys\")\n",
" plt.xlabel(y_train[i])"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {},
"outputs": [],
"source": [
"#normalize and reshape data so that we can build our model\n",
"x_train, x_test = x_train / 255.0, x_test / 255.0\n",
"\n",
"x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)\n",
"x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### We build our model using a sequential model in keras. "
]
},
{
"cell_type": "code",
"execution_count": 128,
"metadata": {},
"outputs": [],
"source": [
"model = tf.keras.models.Sequential([\n",
" tf.keras.layers.Flatten(),\n",
" tf.keras.layers.Dense(600, activation=tf.nn.relu),\n",
" tf.keras.layers.Dropout(0.15),\n",
" tf.keras.layers.Dense(13, activation=tf.nn.softmax)\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 129,
"metadata": {},
"outputs": [],
"source": [
"model.compile(optimizer='Adamax',\n",
" loss='sparse_categorical_crossentropy',\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### We fit the data and observe that by the final round we achieve 99% accuracy"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/6\n",
"60000/60000 [==============================] - 8s 132us/step - loss: 0.2350 - acc: 0.9327\n",
"Epoch 2/6\n",
"60000/60000 [==============================] - 7s 115us/step - loss: 0.1034 - acc: 0.9695\n",
"Epoch 3/6\n",
"60000/60000 [==============================] - 7s 116us/step - loss: 0.0690 - acc: 0.9801\n",
"Epoch 4/6\n",
"60000/60000 [==============================] - 7s 116us/step - loss: 0.0499 - acc: 0.9859\n",
"Epoch 5/6\n",
"60000/60000 [==============================] - 7s 117us/step - loss: 0.0386 - acc: 0.9893\n",
"Epoch 6/6\n",
"60000/60000 [==============================] - 8s 139us/step - loss: 0.0297 - acc: 0.9919\n"
]
},
{
"data": {
"text/plain": [
"<tensorflow.python.keras.callbacks.History at 0x150bc8c18>"
]
},
"execution_count": 130,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.fit(x_train, y_train, epochs=6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### When we evaluate our model on the testing data we observe that we achieved 98.12% accuracy. This is not bad considering our model was quite simple, but could certainly be improved upon significantly"
]
},
{
"cell_type": "code",
"execution_count": 131,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10000/10000 [==============================] - 1s 61us/step\n"
]
},
{
"data": {
"text/plain": [
"[0.06176375358246732, 0.9812]"
]
},
"execution_count": 131,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.evaluate(x_test, y_test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}