{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Build ML web app - assignment 1" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 28, 28)\n", "(10000, 28, 28)\n" ] } ], "source": [ "from tensorflow import keras\n", "\n", "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n", "print(x_train.shape)\n", "print(x_test.shape)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def visualize_input(img, ax):\n", " ax.imshow(img, cmap='gray')\n", " width, height = img.shape\n", " thresh = img.max()/2.5\n", " for x in range(width):\n", " for y in range(height):\n", " ax.annotate(str(round(img[x][y],2)), xy=(y,x),\n", " horizontalalignment='center',\n", " verticalalignment='center',\n", " color='white' if img[x][y]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "fig = plt.figure(figsize = (10,10)) \n", "ax = fig.add_subplot(111)\n", "visualize_input(x_train[0], ax)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, '[2]')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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doVCoYgNAND3xTxA+fn5qqioUGVlpdasWaPGxkZdf/31am1tPePxZWVlCgQC4W348OGxHgkA0AP5nHMunic4cuSIRo4cqaeeekp33HHHafvb29vV3t4e/jgUChGhPiyanwOqra31vOayyy7zvKYvSk9Pj2odPweEWAgGg0pOTu5yf9xfHZCSkqIrr7xSDQ0NZ9zv9/vl9/vjPQYAoIeJ+88BHT16VHv37lVWVla8TwUA6EViHqD77rtPNTU1+uSTT/Svf/1Lc+bMUUJCgm6++eZYnwoA0IvF/Ftw+/fv180336zDhw9r2LBhuu6667R161YNGzYs1qcCAPRiMQ/Q+vXrY/0p0YdceumlntdE84KCaF/O//HHH3tes3v3bs9ruus7An//+9+jWpefnx/jSYDT8V5wAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAICJuP9COuB/zZ8/v1vO884770S1btasWZ7X5OTkeF4zbtw4z2vGjx/vec2YMWM8rwG6C4+AAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIJ3w0a3qqys9LwmJSXF85pf//rXntdEa//+/Z7X/P73v/e85umnn/a8JjEx0fMaSZo3b57nNX/+85+jOhf6Lx4BAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmeDNSdKuamppuWYNTEhISolqXlZUV40mA0/EICABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwwZuRAgZefPFFz2t+9rOfeV4zZMgQz2uA7sIjIACACQIEADDhOUC1tbWaNWuWsrOz5fP5tGnTpoj9zjk9+uijysrKUmJiooqKirRnz55YzQsA6CM8B6itrU0TJ05UeXn5GfevXr1azz77rJ577jlt27ZNF198sWbMmKHjx49f8LAAgL7D84sQiouLVVxcfMZ9zjk988wzevjhh3XTTTdJkl544QVlZGRo06ZNWrBgwYVNCwDoM2L6HFBjY6Oam5tVVFQUvi0QCCg/P19btmw545r29naFQqGIDQDQ98U0QM3NzZKk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++87Se6pp55y77//vvv000+dc8498cQTLiUlxW3evNnt3LnT3XTTTS43N9d98cUXxpPH1tmuQ2trq7vvvvvcli1bXGNjo3vzzTfdN7/5TXfFFVe448ePW48eM0uXLnWBQMBVV1e7gwcPhrdjx46Fj1myZIkbMWKEe+utt9z27dtdQUGBKygoMJw69s51HRoaGtxPfvITt337dtfY2Og2b97sRo0a5QoLC40nj9QrAuScc7/61a/ciBEj3ODBg92UKVPc1q1brUfqdvPnz3dZWVlu8ODB7rLLLnPz5893DQ0N1mPF3dtvv+0knbYtXLjQOXfqpdiPPPKIy8jIcH6/302bNs3V19fbDh0HZ7sOx44dc9OnT3fDhg1zgwYNciNHjnR33nlnn/tH2pn++yW5tWvXho/54osv3N133+0uvfRSN2TIEDdnzhx38OBBu6Hj4FzXYd++fa6wsNClpqY6v9/v8vLy3P333++CwaDt4F/B7wMCAJjo8c8BAQD6JgIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACb+HwnzMI9v5x0LAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import random\n", "import matplotlib.pyplot as plt\n", "i = random.randint(0,60000)\n", "plt.imshow(x_train[i],cmap='gray') # Color map\n", "plt.title([y_train[i]])" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8),\n", " array([5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949],\n", " dtype=int64))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# How many images are there in every digit?\n", "import numpy as np\n", "np.unique(y_train,return_counts=True)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8),\n", " array([ 980, 1135, 1032, 1010, 982, 892, 958, 1028, 974, 1009],\n", " dtype=int64))" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.unique(y_test,return_counts=True)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n", "0.0\n" ] } ], "source": [ "# Normalization : Scaling down the value to a specific range(0-1)\n", "x_train=x_train/255\n", "x_test = x_test/255\n", "\n", "# AFter Normalization\n", "print(x_train.max())\n", "print(x_train.min())" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "from keras.layers import Dense\n", "from keras.layers import Flatten" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "1500/1500 [==============================] - 13s 8ms/step - loss: 3.2063 - accuracy: 0.8986 - val_loss: 0.6879 - val_accuracy: 0.9189\n", "Epoch 2/10\n", "1500/1500 [==============================] - 12s 8ms/step - loss: 0.3889 - accuracy: 0.9335 - val_loss: 0.4031 - val_accuracy: 0.9345\n", "Epoch 3/10\n", "1500/1500 [==============================] - 12s 8ms/step - loss: 0.3103 - accuracy: 0.9388 - val_loss: 0.3946 - val_accuracy: 0.9368\n", "Epoch 4/10\n", "1500/1500 [==============================] - 12s 8ms/step - loss: 0.2950 - accuracy: 0.9385 - val_loss: 0.3703 - val_accuracy: 0.9377\n", "Epoch 5/10\n", "1500/1500 [==============================] - 12s 8ms/step - loss: 0.2744 - accuracy: 0.9439 - val_loss: 0.3204 - val_accuracy: 0.9419\n", "Epoch 6/10\n", "1500/1500 [==============================] - 12s 8ms/step - loss: 0.2417 - accuracy: 0.9481 - val_loss: 0.2982 - val_accuracy: 0.9454\n", "Epoch 7/10\n", "1500/1500 [==============================] - 13s 8ms/step - loss: 0.2174 - accuracy: 0.9538 - val_loss: 0.3228 - val_accuracy: 0.9504\n", "Epoch 8/10\n", "1500/1500 [==============================] - 11s 8ms/step - loss: 0.2152 - accuracy: 0.9564 - val_loss: 0.3443 - val_accuracy: 0.9463\n", "Epoch 9/10\n", "1500/1500 [==============================] - 12s 8ms/step - loss: 0.2122 - accuracy: 0.9578 - val_loss: 0.4409 - val_accuracy: 0.9382\n", "Epoch 10/10\n", "1500/1500 [==============================] - 14s 9ms/step - loss: 0.2056 - accuracy: 0.9590 - val_loss: 0.3617 - val_accuracy: 0.9479\n" ] } ], "source": [ "model = keras.models.Sequential()\n", "model.add(Flatten(input_shape=(28,28))) # 784\n", "model.add(Dense(392,activation='relu'))\n", "model.add(Dense(10,activation='softmax'))\n", "\n", "model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])\n", "history = model.fit(x_train,y_train,epochs=10,validation_split=0.2)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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SZLJZNLKlSv14IMPatq0aSosLNS3v/1t5ebmBkPRxZjNZk2aNCnUtxKS1NRU/rBFED6PyMLnEXn4TCILn8fgLtayEhByYFm6dKkaGhr0wAMPqLa2VvPmzdOmTZuCg2YrKytlNveO5b366qv13HPP6Vvf+pa+8Y1vaNq0aXr55Zc1e/bs4Dlf//rX1draqi9/+ctqamrStddeq02bNslut4daHgAAGINCXocl1rDGS2Th84gsfB6Rh88ksvB5jBz2EroIm82mNWvW9BvkC+PweUQWPo/Iw2cSWfg8Rg4tLAAAIOLRwgIAACIegQUAAEQ8AgsAAIh4BBYAABDxCCwX8fjjj6ugoEB2u10lJSXavn270SXFpLVr16qoqEgpKSnKysrSkiVL9O677xpdFno89NBDwUUgYYzq6mp99rOf1bhx45SQkKA5c+Zox44dRpcVkzwej7797W+rsLBQCQkJuuyyy/Td7353SPvlYHAElgvYuHGjysrKtGbNGu3atUtz587V4sWLVV9fb3RpMWfLli26++679dZbb+n1119XV1eXrr/+erW2thpdWsyrqKjQz372M1155ZVGlxKzzp49q2uuuUbx8fH605/+pP379+uHP/yh0tPTjS4tJj388MN64okntG7dOh04cEAPP/ywHnnkEf3kJz8xurSoxrTmCygpKVFRUZHWrVsnyb9vUl5enu69916tWrXK4OpiW0NDg7KysrRlyxZ94AMfMLqcmNXS0qKrrrpKP/3pT/Xggw9q3rx5euyxx4wuK+asWrVK//u//6s33njD6FIg6eMf/7iys7P185//PHjslltuUUJCgn79618bWFl0o4VlEG63Wzt37lRpaWnwmNlsVmlpqbZu3WpgZZAkp9MpScrIyDC4kth2991366abbur3/wlG3x/+8ActXLhQt912m7KysjR//nw99dRTRpcVs66++mqVl5frvffekyT985//1Jtvvqkbb7zR4MqiW8h7CcWKxsZGeTye4B5JAdnZ2Tp48KBBVUHyt3StXLlS11xzTb89qTC6NmzYoF27dqmiosLoUmLe0aNH9cQTT6isrEzf+MY3VFFRoX/7t3+T1WrVnXfeaXR5MWfVqlVyuVyaPn26LBaLPB6Pvve97+mOO+4wurSoRmBB1Ln77ru1d+9evfnmm0aXErOqqqp033336fXXX2eT0gjg9Xq1cOFCff/735ckzZ8/X3v37tX69esJLAZ4/vnn9Zvf/EbPPfecZs2apd27d2vlypXKzc3l87gEBJZBZGZmymKxqK6urt/xuro65eTkGFQV7rnnHr3yyiv6+9//rkmTJhldTszauXOn6uvrddVVVwWPeTwe/f3vf9e6devU2dkpi8ViYIWxZcKECZo5c2a/YzNmzNCLL75oUEWx7Wtf+5pWrVqlZcuWSZLmzJmjEydOaO3atQSWS8AYlkFYrVYtWLBA5eXlwWNer1fl5eVatGiRgZXFJp/Pp3vuuUcvvfSS/vrXv6qwsNDokmLaRz7yEe3Zs0e7d+8OPhYuXKg77rhDu3fvJqyMsmuuuea8af7vvfeeJk+ebFBFsa2trU1mc/9frxaLRV6v16CKxgZaWC6grKxMd955pxYuXKji4mI99thjam1t1YoVK4wuLebcfffdeu655/T73/9eKSkpqq2tlSQ5HA4lJCQYXF3sSUlJOW/8UFJSksaNG8e4IgN85Stf0dVXX63vf//7+vSnP63t27frySef1JNPPml0aTHpE5/4hL73ve8pPz9fs2bN0ttvv60f/ehH+sIXvmB0adHNhwv6yU9+4svPz/dZrVZfcXGx76233jK6pJgkacDHL37xC6NLQ4/rrrvOd9999xldRsz6n//5H9/s2bN9NpvNN336dN+TTz5pdEkxy+Vy+e677z5ffn6+z263+6ZMmeL75je/6evs7DS6tKjGOiwAACDiMYYFAABEPAILAACIeAQWAAAQ8QgsAAAg4hFYAABAxCOwAACAiEdgAQAAEY/AAgAAIh6BBQAARDwCCwAAiHgEFgAAEPEILAAAIOL9/5pgmkbTGJLKAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot(history.history['loss'])\n", "plt.plot(history.history['val_loss'])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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Cu8fREREJAsGlms4WalHY1sHfNTumBDB+hUiIiI5MLBcg6V+ZRrrV4iIiGTDwHINh4otl4M4nZmIiEguDCxXIQgiDpew4JaIiEhu7nJ3wJl1CCKW352AgtIGTGT9ChERkWzcRFEU5e7EQNDr9fDz84NOp4OvL8MFERHRUNDXz29eEiIiIiKnx8BCRERETo+BhYiIiJweAwsRERE5PQYWIiIicnoMLEREROT0GFiIiIjI6TGwEBERkdPrV2DZsGEDYmNjodFokJaWhvz8/F7bGo1GrFq1CvHx8dBoNEhMTMSePXts2rz66quYPHkyfH194evri/T0dHz88cf96RoRERENQ3YHlh07diA7OxvPPfccjh49isTERGRmZqKmpqbH9itWrMDGjRuxbt06FBYWYuHChZg9ezaOHTtmbTNy5Ei89NJLKCgowJEjR3D77bdj1qxZ+O677/p/ZkRERDRs2L00f1paGqZNm4b169cDAARBQFRUFJYsWYJly5Z1ax8REYFnnnkGixYtsu6bM2cOtFottm3b1uv7BAYG4g9/+AN+/vOf96lfXJqfiIho6HHI0vzt7e0oKChARkZG5wsoFMjIyMDBgwd7PMZgMECj0djs02q1OHDgQI/tTSYT3n33XTQ3NyM9Pb3XvhgMBuj1epuNiIiIhie7AktdXR1MJhPCwsJs9oeFhaGqqqrHYzIzM7F69WqcOXMGgiBg37592LVrFyorK23affvtt/D29oZarcbChQvx/vvvY8KECb32JScnB35+ftYtKirKnlMhIiKiIcTd0W+wdu1aPProo0hISICbmxvi4+ORlZWFN99806bduHHjcPz4ceh0OvzjH//AggULsH///l5Dy/Lly5GdnW39WqfTITo6miMtREREQ4jlc/taFSp2BZbg4GAolUpUV1fb7K+urkZ4eHiPx4SEhGD37t1oa2vDpUuXEBERgWXLliEuLs6mnUqlwujRowEAycnJOHz4MNauXYuNGzf2+LpqtRpqtdr6teWEOdJCREQ09DQ2NsLPz6/X5+0KLCqVCsnJycjNzcWPf/xjAFLRbW5uLhYvXnzVYzUaDSIjI2E0GrFz50789Kc/vWp7QRBgMBj63LeIiAiUl5fDx8cHbm5ufT7uWvR6PaKiolBeXs5iXifA74fz4ffEufD74Vz4/bg2URTR2NiIiIiIq7az+5JQ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(history.history['accuracy'])\n", "plt.plot(history.history['val_accuracy'])" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "import os\n", "import matplotlib.pyplot as plt\n", "\n", "index_of_8 = np.where( y_train == 8)[0][0]\n", "image_of_8 = x_train[index_of_8]\n", "\n", "# plt.imshow(image_of_8, cmap='gray')\n", "# plt.show()\n", "\n", "if not os.path.exists('./tmp'):\n", " os.makedirs('./tmp')\n", "plt.imsave('./tmp/8.png', image_of_8, cmap='gray')\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1/1 [==============================] - 0s 41ms/step\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAbh0lEQVR4nO3df2xV9f3H8dcF6QWxvayU9vYKxQIqUwQzJl2DMIQKdI6BsASdf6AhGrC4KRM3nPxyW+qYEafrZImGYhRxbAMmWzBQbcm2FgPKiNE1lBSpoy3Yyb1QpBD6+f5BvN9daYFzubfv/ng+kk/Se8553/Pm47GvnntOT33OOScAADpYL+sGAAA9EwEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAE1dZN/BVra2tOnLkiFJTU+Xz+azbAQB45JzTiRMnFAqF1KtX++c5nS6Ajhw5oiFDhli3AQC4QnV1dRo8eHC76zvdR3CpqanWLQAAEuBS38+TFkAlJSW67rrr1LdvX+Xl5em99967rDo+dgOA7uFS38+TEkBvvvmmFi9erBUrVuj999/XmDFjNG3aNB09ejQZuwMAdEUuCcaNG+eKioqir8+dO+dCoZArLi6+ZG04HHaSGAwGg9HFRzgcvuj3+4SfAZ05c0Z79+5VQUFBdFmvXr1UUFCgysrKC7ZvaWlRJBKJGQCA7i/hAfTZZ5/p3LlzysrKilmelZWlhoaGC7YvLi5WIBCIDu6AA4CewfwuuKVLlyocDkdHXV2ddUsAgA6Q8N8DysjIUO/evdXY2BizvLGxUcFg8ILt/X6//H5/otsAAHRyCT8DSklJ0dixY1VWVhZd1traqrKyMuXn5yd6dwCALiopT0JYvHix5s2bp29+85saN26cnn/+eTU3N+uBBx5Ixu4AAF1QUgJo7ty5OnbsmJYvX66Ghgbdeuut2r59+wU3JgAAei6fc85ZN/G/IpGIAoGAdRsAgCsUDoeVlpbW7nrzu+AAAD0TAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABNXWTcAoOfq37+/55ry8nLPNaFQyHONJI0fP95zzaFDh+LaV0/EGRAAwAQBBAAwkfAAWrlypXw+X8wYOXJkoncDAOjiknIN6Oabb9bOnTv/fydXcakJABArKclw1VVXKRgMJuOtAQDdRFKuAR04cEChUEjDhg3Tfffdp8OHD7e7bUtLiyKRSMwAAHR/CQ+gvLw8lZaWavv27XrppZdUW1urCRMm6MSJE21uX1xcrEAgEB1DhgxJdEsAgE7I55xzydzB8ePHNXToUD333HOaP3/+BetbWlrU0tISfR2JRAghoIfg94C6t3A4rLS0tHbXJ/3ugAEDBuiGG25QTU1Nm+v9fr/8fn+y2wAAdDJJ/z2gkydP6uDBg8rOzk72rgAAXUjCA+jxxx9XRUWFDh06pH/+85+6++671bt3b917772J3hUAoAtL+Edwn376qe699141NTVp0KBBuv3221VVVaVBgwYlelcAgC4s4QG0cePGRL8lAMV3Ib0jf/D7/PPPPdfccccdnmvGjh3ruaa6utpzjSQ1NTXFVYfLw7PgAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmEj6H6QDLIwaNSquuh/+8Ieea4YOHRrXvry64YYbPNfk5OQkoZO2PfPMM55rbrrpJs81Pp/Pc81//vMfzzWSlJKSElcdLg9nQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEzwNG93S5MmT46qbP39+gjtJnJaWFs81r732Wlz7imf+fvrTn8a1L6+cc55rSktL49pXU1NTXHW4PJwBAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMMHDSNHprVy50nPNkiVLEt9IO9avX++55tixY55rnn322Q7ZjyTdeuutnmvefvttzzUZGRmea+L5N/3xj3/0XIPk4wwIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACR5Gik6vf//+nmv69esX174++eQTzzU/+9nPPNfU19d7ronHiBEj4qp78sknPdcMGjTIc01zc7PnmngeTnv69GnPNUg+zoAAACYIIACACc8BtGvXLs2YMUOhUEg+n09btmyJWe+c0/Lly5Wdna1+/fqpoKBABw4cSFS/AIBuwnMANTc3a8yYMSopKWlz/erVq/XCCy9o7dq12r17t/r3769p06bxGSwAIIbnmxAKCwtVWFjY5jrnnJ5//nk99dRTmjlzpiTp1VdfVVZWlrZs2aJ77rnnyroFAHQbCb0GVFtbq4aGBhUUFESXBQIB5eXlqbKyss2alpYWRSKRmAEA6P4SGkANDQ2SpKysrJjlWVlZ0XVfVVxcrEAgEB1DhgxJZEsAgE7K/C64pUuXKhwOR0ddXZ11SwCADpDQAAoGg5KkxsbGmOWNjY3RdV/l9/uVlpYWMwAA3V9CAyg3N1fBYFBlZWXRZZFIRLt371Z+fn4idwUA6OI83wV38uRJ1dTURF/X1tZq3759Sk9PV05Ojh599FH94he/0PXXX6/c3FwtW7ZMoVBIs2bNSmTfAIAuznMA7dmzR3fccUf09eLFiyVJ8+bNU2lpqZ544gk1NzfroYce0vHjx3X77bdr+/bt6tu3b+K6BgB0eT7nnLNu4n9FIhEFAgHrNtCJ5OXlea55+eWX49rXTTfd5Lnmtdde81zz8MMPe66J5/+LtWvXeq6RpLvuustzzeeff+655pe//KXnmjVr1niugY1wOHzR6/rmd8EBAHomAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJz3+OAeho+/bt81xTVVUV177ieRr25MmTPdfceeednmvieQp0Tk6O55p4rVq1ynPNiy++mIRO0FVwBgQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEwQQAMAEDyNFp9fS0uK5JhKJJKGTtoVCIc81f/rTnzzX+Hw+zzXOOc81kvTKK694rtmyZUtc+0LPxRkQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEzyMFN3SJ598Yt1Cp/C3v/0trrpnn33Wc01dXV1c+0LPxRkQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAEzyMFJ1e7969PddMmDAhrn35fL646jrCX//6V881M2bMSEInQGJwBgQAMEEAAQBMeA6gXbt2acaMGQqFQvL5fNqyZUvM+vvvv18+ny9mTJ8+PVH9AgC6Cc8B1NzcrDFjxqikpKTdbaZPn676+vroeOONN66oSQBA9+P5JoTCwkIVFhZedBu/369gMBh3UwCA7i8p14DKy8uVmZmpG2+8UQsXLlRTU1O727a0tCgSicQMAED3l/AAmj59ul599VWVlZXpV7/6lSoqKlRYWKhz5861uX1xcbECgUB0DBkyJNEtAQA6oYT/HtA999wT/fqWW27R6NGjNXz4cJWXl2vKlCkXbL906VItXrw4+joSiRBCANADJP027GHDhikjI0M1NTVtrvf7/UpLS4sZAIDuL+kB9Omnn6qpqUnZ2dnJ3hUAoAvx/BHcyZMnY85mamtrtW/fPqWnpys9PV2rVq3SnDlzFAwGdfDgQT3xxBMaMWKEpk2bltDGAQBdm+cA2rNnj+64447o6y+v38ybN08vvfSS9u/fr/Xr1+v48eMKhUKaOnWqfv7zn8vv9yeuawBAl+c5gCZNmiTnXLvr33777StqCPiqjRs3eq6ZPXt2XPu62LFtrTP3BsSDZ8EBAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwk/E9yo+cIhUKeax544AHPNXPmzPFcE++To99//33PNf/6178818QzD5mZmZ5rgM6MMyAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmeBgp4jZlyhTPNU8//XQSOrnQU089FVfdb3/7W881s2bN8lwTz8NIP/roI881QGfGGRAAwAQBBAAwQQABAEwQQAAAEwQQAMAEAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATPIwUmjRpUlx1L7zwQmIbacf3vvc9zzU7d+6Ma1/BYNBzzfLly+Pal1eHDh3qkP0AHYUzIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYIIAAACZ4GCl05513xlUXCAQ811RUVHiu2bZtm+eaPn36eK6RpO9+97uea+KZB5/P57nm2LFjnmuAzowzIACACQIIAGDCUwAVFxfrtttuU2pqqjIzMzVr1ixVV1fHbHP69GkVFRVp4MCBuuaaazRnzhw1NjYmtGkAQNfnKYAqKipUVFSkqqoq7dixQ2fPntXUqVPV3Nwc3eaxxx7TW2+9pU2bNqmiokJHjhzR7NmzE944AKBr83QTwvbt22Nel5aWKjMzU3v37tXEiRMVDof1yiuvaMOGDZo8ebIkad26dfr617+uqqoqfetb30pc5wCALu2KrgGFw2FJUnp6uiRp7969Onv2rAoKCqLbjBw5Ujk5OaqsrGzzPVpaWhSJRGIGAKD7izuAWltb9eijj2r8+PEaNWqUJKmhoUEpKSkaMGBAzLZZWVlqaGho832Ki4sVCASiY8iQIfG2BADoQuIOoKKiIn344YfauHHjFTWwdOlShcPh6Kirq7ui9wMAdA1x/SLqokWLtG3bNu3atUuDBw+OLg8Ggzpz5oyOHz8ecxbU2NioYDDY5nv5/X75/f542gAAdGGezoCcc1q0aJE2b96sd955R7m5uTHrx44dqz59+qisrCy6rLq6WocPH1Z+fn5iOgYAdAuezoCKioq0YcMGbd26VampqdHrOoFAQP369VMgEND8+fO1ePFipaenKy0tTY888ojy8/O5Aw4AEMNTAL300kuSpEmTJsUsX7dune6//35J0po1a9SrVy/NmTNHLS0tmjZtmn73u98lpFkAQPfhKYCcc5fcpm/fviopKVFJSUncTaFjtba2xlV3OcdDImriebDorFmzPNdI0m9+8xvPNZ9//rnnmpdfftlzzZc/AALdBc+CAwCYIIAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCYiOsvoqJ7yczM7LB9HTt2zHPNjh07PNdMmDDBc028HnjgAc81b731VhI6AboWzoAAACYIIACACQIIAGCCAAIAmCCAAAAmCCAAgAkCCABgggACAJgggAAAJgggAIAJAggAYIIAAgCY4GGk0Mcff9xh+/r+97/vucbn83mu+e9//+u5RpJKSko8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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import keras.utils as image\n", "\n", "img = image.load_img(path=\"./tmp/8.png\", color_mode= 'grayscale', target_size=(28, 28))\n", "img = image.img_to_array(img)\n", "plt.imshow(image.array_to_img(img), cmap=\"gray\")\n", "img = img.astype('float')/255\n", "test_img = img.reshape((1, 28, 28, 1))\n", "#img_class = model.predict_classes(test_img)\n", "img_class = np.argmax(model.predict(test_img), axis = 1)\n", "prediction = img_class[0]" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prediction" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "313/313 [==============================] - 2s 6ms/step\n" ] }, { "data": { "text/plain": [ "0.9807" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import accuracy_score,confusion_matrix,classification_report\n", "\n", "y_pred = model.predict(x_test)\n", "y_pred = np.argmax(y_pred,axis=1)\n", "accuracy_score(y_pred,y_test)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 969, 0, 1, 2, 0, 2, 2, 0, 0, 2],\n", " [ 1, 1127, 0, 0, 1, 1, 3, 4, 2, 4],\n", " [ 0, 2, 1007, 2, 2, 0, 0, 6, 3, 0],\n", " [ 0, 0, 1, 991, 0, 11, 1, 1, 2, 3],\n", " [ 1, 0, 4, 0, 970, 1, 1, 0, 4, 15],\n", " [ 2, 0, 0, 3, 0, 868, 2, 1, 4, 5],\n", " [ 2, 2, 2, 0, 3, 3, 949, 0, 1, 1],\n", " [ 1, 1, 7, 5, 2, 0, 0, 1012, 2, 14],\n", " [ 2, 3, 9, 5, 0, 4, 0, 1, 952, 3],\n", " [ 2, 0, 1, 2, 4, 2, 0, 3, 4, 962]],\n", " dtype=int64)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "confusion_matrix(y_pred,y_test)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.99 0.99 0.99 978\n", " 1 0.99 0.99 0.99 1143\n", " 2 0.98 0.99 0.98 1022\n", " 3 0.98 0.98 0.98 1010\n", " 4 0.99 0.97 0.98 996\n", " 5 0.97 0.98 0.98 885\n", " 6 0.99 0.99 0.99 963\n", " 7 0.98 0.97 0.98 1044\n", " 8 0.98 0.97 0.97 979\n", " 9 0.95 0.98 0.97 980\n", "\n", " accuracy 0.98 10000\n", " macro avg 0.98 0.98 0.98 10000\n", "weighted avg 0.98 0.98 0.98 10000\n", "\n" ] } ], "source": [ "print(classification_report(y_pred,y_test))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model.save(\"mnist.hdf5\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Now it's time to use our hdf5 model file for prediction!" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "import streamlit as st\n", "from streamlit_drawable_canvas import st_canvas\n", "from tensorflow import keras\n", "import cv2\n", "import numpy as np\n", "model_new = keras.models.load_model('mnist.hdf5')\n", "\n", "st.title(\"MNIST Digit Recognizer\")\n", "\n", "SIZE = 192\n", "\n", "canvas_result = st_canvas(\n", " fill_color=\"#ffffff\",\n", " stroke_width=10,\n", " stroke_color='#ffffff',\n", " background_color=\"#000000\",\n", " height=150,\n", " width=150,\n", " drawing_mode='freedraw',\n", " key=\"canvas\",\n", ")\n", "\n", "if canvas_result.image_data is not None:\n", " img_color = cv2.resize(canvas_result.image_data.astype('uint8'), (28, 28))\n", " img_rescaling = cv2.resize(img_color, (SIZE, SIZE), interpolation=cv2.INTER_NEAREST)\n", " st.write('Input Image')\n", " st.image(img_rescaling)\n", " \n", "if st.button('Predict'):\n", " img_grey = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)\n", " pred = model_new.predict(img_grey.reshape(1, 28, 28, 1))\n", " st.write(f'result: {np.argmax(pred[0])}')\n", " st.bar_chart(pred[0])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Seperation of frontend and backend\n", "\n", "For this, we should use FastAPI and UviCorn." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Deployment on streamlit cloud\n", "\n", "- https://docs.streamlit.io/streamlit-community-cloud/get-started/deploy-an-app" ] } ], "metadata": { "interpreter": { "hash": "63b504d217b8b0366be198d66d8512b5f82260e903e4eeb3759a93449a8d2761" }, "kernelspec": { "display_name": "Python 3.7.0 64-bit", "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.9.18" } }, "nbformat": 4, "nbformat_minor": 4 }