diff --git a/Segment/Untitled.ipynb b/Segment/Untitled.ipynb new file mode 100644 index 0000000..f250428 --- /dev/null +++ b/Segment/Untitled.ipynb @@ -0,0 +1,368 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from keras.preprocessing.image import ImageDataGenerator\n", + "from keras.preprocessing import image\n", + "import keras\n", + "from keras.models import Sequential\n", + "from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation\n", + "import os\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hi\n" + ] + } + ], + "source": [ + "print('hi')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def get_result(result):\n", + " if result[0][0] == 1:\n", + " return('a')\n", + " elif result[0][1] == 1:\n", + " return ('b')\n", + " elif result[0][2] == 1:\n", + " return ('c')\n", + " elif result[0][3] == 1:\n", + " return ('d')\n", + " elif result[0][4] == 1:\n", + " return ('e')\n", + " elif result[0][5] == 1:\n", + " return ('f')\n", + " elif result[0][6] == 1:\n", + " return ('g')\n", + " elif result[0][7] == 1:\n", + " return ('h')\n", + " elif result[0][8] == 1:\n", + " return ('i')\n", + " elif result[0][9] == 1:\n", + " return ('j')\n", + " elif result[0][10] == 1:\n", + " return ('k')\n", + " elif result[0][11] == 1:\n", + " return ('l')\n", + " elif result[0][12] == 1:\n", + " return ('m')\n", + " elif result[0][13] == 1:\n", + " return ('n')\n", + " elif result[0][14] == 1:\n", + " return ('o')\n", + " elif result[0][15] == 1:\n", + " return ('p')\n", + " elif result[0][16] == 1:\n", + " return ('q')\n", + " elif result[0][17] == 1:\n", + " return ('r')\n", + " elif result[0][18] == 1:\n", + " return ('s')\n", + " elif result[0][19] == 1:\n", + " return ('t')\n", + " elif result[0][20] == 1:\n", + " return ('u')\n", + " elif result[0][21] == 1:\n", + " return ('v')\n", + " elif result[0][22] == 1:\n", + " return ('w')\n", + " elif result[0][23] == 1:\n", + " return ('x')\n", + " elif result[0][24] == 1:\n", + " return ('y')\n", + " elif result[0][25] == 1:\n", + " return ('z')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = pd.read_csv(\"A_Z Handwritten Data.csv\").astype('float32')\n", + "dataset.rename(columns={'0':'label'}, inplace=True)\n", + "\n", + "# Splite data the X - Our data , and y - the prdict label\n", + "X = dataset.drop('label',axis = 1)\n", + "y = dataset['label']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amount of each labels\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmQAAAI/CAYAAADZWMWIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAiWUlEQVR4nO3df7CmaVkf+O/lAYZpxzn8mIFMGsKBOOoKnUzgRAHdQGBVIOhKYlxIdtFdNqfcmHXBcpNGqxKslCWbFaMRle2NorhRSIz8WDtCLJRVkUjOwGCDCjjS/GhYEViPDD0KNNf+cd4pD03PTAPz3vdz5nw+Vaf6fe7znnNdfU9Vz7fu53nvu7o7AADM8wWzGwAAOOoEMgCAyQQyAIDJBDIAgMkEMgCAyQQyAIDJ7jG7gdtzzTXX9NbW1uw2AADu1I033vih7r72c/35xQayra2t7O7uzm4DAOBOVdW7P5+fd8sSAGAygQwAYDKBDABgssU+Q3bm3F62Tp6e3cbanH3+35rdAgCwEFbIAAAmGxLIquppVXXTRV+fqqonj6gPALBkQ25ZdvfLk7z8tuuq2kny95O8ZkR9AIAlG/4MWVV9SZJ/muSx3f2p0fUBAJZm6DNkVXXPJD+b5Lu6+z0jawMALNXoh/r/eZK3dfdLL/XNqtqpqt2q2r1wfm9wawAAcwy7ZVlVj0/yd5I88vbe092nkpxKkiuuu76HNAYAMNmQQFZV903y4iR/r7s/OqImAMBhMWqF7NuSPCDJj1fVwfHv7+6XDeoBAGCRRm178f1Jvn9ELQCAw2axRyedOL6ZXccLAQBHgKOTAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJlvsTv1nzu1l6+Tp2W2wctapCQCwNlbIAAAmGxLIat9vVNWTD4x9c1W9ekR9AIAlG3LLsru7qr4tyb+rql9NspHk+5I8aUR9AIAlG/YMWXe/tar+7yT/JMkXJnlJd988qj4AwFKNfqj/e5O8KcnHk2wPrg0AsEhDA1l3f6yqXpbklu7+s4u/X1U7SXaSZOPqa0e2BgAwzYxPWX5q9fUZuvtUd2939/bGsc3BbQEAzGHbCwCAyQQyAIDJhu/U393PG10TAGDJFnt00onjm9l1XA8AcAS4ZQkAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADDZYnfqP3NuL1snT89uY+3OOo0AAI68ta+QVdWDq+pdVXW/1fV9V9cPWXdtAIDDYO2BrLvfm+THkzx/NfT8JKe6+93rrg0AcBiMumX5L5PcWFXPTvLVSf7nQXUBABZvSCDr7k9U1f+a5NVJvra7Pz6iLgDAYTDyU5ZPTvKBJI+4vTdU1U5V7VbV7oXze+M6AwCYaEggq6obknxNkkcneU5VXXep93X3qe7e7u7tjWObI1oDAJhuxKcsK/sP9T+7u9+T5H9P8gPrrgsAcFiMWCH7B0ne092/vLr+sSRfVlWPG1AbAGDx1v5Qf3efSnLqwPWFJI9ad10AgMPC0UkAAJMt9uikE8c3s+tYIQDgCLBCBgAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMNlid+o/c24vWydPz26DJGedmAAAa7W2FbKq+pdV9ewD16+pqn994PoFVfWd66oPAHBYrPOW5W8meWySVNUXJLkmycMPfP+xSV6/xvoAAIfCOgPZ67MKZNkPYm9N8tGqum9VXZHkv0jy5jXWBwA4FNb2DFl3v7+qPllVfyn7wewNSY4neUySvSS/3d0fX1d9AIDDYt0P9d+2SvbYJD+Y/UD22OwHst+8+M1VtZNkJ0k2rr52za0BACzDure9uO05shPZv2X5n7K/QnbJ58e6+1R3b3f39saxzTW3BgCwDOsOZK9P8tQkH+nuC939kST3yX4oe8OaawMAHArrDmRnsv/pyv900dhed39ozbUBAA6FtT5D1t0Xklx90di3rrMmAMBh4+gkAIDJFnt00onjm9l1ZA8AcARYIQMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhssTv1nzm3l62Tp2e3cUlnnSAAANyF1r5CVlWvq6qvu2js2VX1Y+uuDQBwGIy4ZflzSZ5+0djTV+MAAEfeiED280meWlVXJElVbSX5i0l+Y0BtAIDFW3sg6+4PJ3ljkiethp6e5GXd3euuDQBwGIz6lOXB25a3e7uyqnaqareqdi+c3xvUGgDAXKMC2SuSPLGqHpnkyu5+06Xe1N2nunu7u7c3jm0Oag0AYK4hgay7b0nyuiQ/GQ/zAwB8mpEbw/5ckr+a5KUDawIALN6wjWG7++VJalQ9AIDDwtFJAACTLfbopBPHN7PriCIA4AiwQgYAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADDZYnfqP3NuL1snT89uA1i4s070AO4GhqyQVdVWVb31orHnVdV3jagPALBkblkCAEwmkAEATCaQAQBMNiqQ9eWMV9VOVe1W1e6F83sD2gIAmG9UIPtwkvteNHa/JB86ONDdp7p7u7u3N45tDmoNAGCuIYGsu29J8oGqemKSVNX9kjwpyW+MqA8AsGQj9yF7ZpIfraoXrK6/t7tvHlgfAGCRhgWy7v6dJH9zVD0AgMNisTv1nzi+mV07cAMAR4BtLwAAJhPIAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJlvs0Ulnzu1l6+Tp2W3AoXPWkWMAh86QQFZV90/y2tXlX0hyIckfra6/ors/PqIPAIAlGhLIuvvDSW5Ikqp6XpJbuvsHRtQGAFg6z5ABAEwmkAEATLaoQFZVO1W1W1W7F87vzW4HAGCIRQWy7j7V3dvdvb1xbHN2OwAAQywqkAEAHEUCGQDAZMM3hu3u542uCQCwZIvdqf/E8c3s2nEcADgC3LIEAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhssUcnnTm3l62Tp2e3AQBrd9ZRgUfesBWyqvqeqnpbVf12Vd1UVV85qjYAwJINWSGrqsckeWqSR3b3n1XVNUnuNaI2AMDSjbpleV2SD3X3nyVJd39oUF0AgMUbdcvyPyZ5cFW9o6p+rKoeN6guAMDiDQlk3X1Lkkcl2UnyR0leVlXfevH7qmqnqnaravfC+b0RrQEATDfsof7uvtDdr+vuf5bkHyX5O5d4z6nu3u7u7Y1jm6NaAwCYakggq6ovrarrDwzdkOTdI2oDACzdqIf6r0ryI1V1nySfTPL72b99CQBw5A0JZN19Y5LHjqgFAHDYLHan/hPHN7Nr52IA4AhwliUAwGQCGQDAZAIZAMBkAhkAwGQCGQDAZAIZAMBkAhkAwGQCGQDAZAIZAMBkAhkAwGSLPTrpzLm9bJ08PbsN7sRZx1sBwOdtSCCrqgtJzqzqvSvJf9fdfzyiNgDA0o26ZXlrd9/Q3Y9I8pEk3z6oLgDA4s14huwNSY5PqAsAsEhDA1lVbSR5YpJXjawLALBkowLZlVV1U5IPJ7lfkl++1Juqaqeqdqtq98L5vUGtAQDMNfQZsiQPSXKv3M4zZN19qru3u3t749jmoNYAAOYaesuyu/eSfEeS76qqe46sDQCwVMMf6u/uNyd5S5Knj64NALBEQ/Yh6+6rLrr++hF1AQAOg8Xu1H/i+GZ27QIPABwBzrIEAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhssUcnnTm3l62Tp2e3cZc66ygoAOAShqyQVdWDquqVVfXOqvqDqnphVV0xojYAwNKtPZBVVSX5hSSv6O7rk1yf5Mok/2LdtQEADoMRK2RPSPKn3f3iJOnuC0mek+SZVXXVgPoAAIs2IpA9PMmNBwe6+0+SnE3yxQPqAwAs2ohAVkn6dsY/faBqp6p2q2r3wvm99XcGALAAIwLZ25JsHxyoqquTPDDJ2w+Od/ep7t7u7u2NY5sDWgMAmG9EIHttkmNV9cwkqaqNJC9I8sLuvnVAfQCARVt7IOvuTvK0JN9UVe9M8uEkn+ru71t3bQCAw2DIPmTd/d7u/obVthdPSfKkqnrUiNoAAEtX+wtYy7O9vd27u7uz2wAAuFNVdWN3b9/5Oy/NWZYAAJMJZAAAkwlkAACTCWQAAJMJZAAAkwlkAACTCWQAAJMJZAAAkwlkAACTCWQAAJPdY3YDt+fMub1snTw9uw34vJx9/t+a3QIAh8CwQFZVF5KcWdX83STf0t3nR9UHAFiqkbcsb+3uG7r7EUk+nuTbBtYGAFisWc+Q/XqSL55UGwBgUYYHsqq6R5InZ//2JQDAkTfyof4rq+qm1etfT/ITF7+hqnaS7CTJxtXXjusMAGCikYHs1u6+4Y7e0N2nkpxKkiuuu75HNAUAMJt9yAAAJhPIAAAmGxbIuvuqUbUAAA6Txe7Uf+L4Znbtcg4AHAFuWQIATCaQAQBMJpABAEwmkAEATCaQAQBMJpABAEwmkAEATCaQAQBMJpABAEy22J36z5zby9bJ07PbAAAOsbOH5NQfK2QAAJMNCWRV9aCqemVVvbOqbq6qH66qe42oDQCwdGsPZFVVSX4hySu6+/okX5LkqiTft+7aAACHwYgVsick+dPufnGSdPeFJM9J8j9U1bEB9QEAFm1EIHt4khsPDnT3nyR5T5IvHlAfAGDRRgSyStKXM15VO1W1W1W7F87vDWgNAGC+EYHsbUm2Dw5U1dVJHpzk5oPj3X2qu7e7e3vj2OaA1gAA5hsRyF6b5FhVPTNJqmojyQuS/FR3nx9QHwBg0dYeyLq7kzwtyd+tqncmeUeSP03y3euuDQBwGAzZqb+735vk60fUAgA4bBZ7dNKJ45vZPSTHHQAAfD4cnQQAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADDZYnfqP3NuL1snT89uAz5rZ50wAcBnyQoZAMBkQwJZVXVVveDA9XdV1fNG1AYAWLpRK2R/luRvV9U1g+oBABwaowLZJ5OcSvKcQfUAAA6Nkc+Q/WiSv19VmwNrAgAs3h1+yrKq/vYdfb+7f+FyC3X3n1TVS5J8R5Jbb6feTpKdJNm4+trL/dUAAIfanW178fV38L1OctmBbOWHkrwpyYsv+Qu7T2X/1mauuO76/ix/NwDAoXSHgay7//u7slh3f6Sq/m2SZyX5ybvydwMAHFaX9QxZVT2wqn6iqn5pdf3lVfWsz7HmC5L4tCUAwMrlPtT/U0lek+Qvrq7fkeTZl1uku6868PoPu/tYdz/vcn8eAODu7HKPTrqmu/9tVT03Sbr7k1V1YY195cTxzew6ggYAOAIud4XsY1V1/+w/yJ+qenSSvbV1BQBwhFzuCtl3JnlVkr9cVa9Pcm2Sb1pbVwAAR8hlBbLuflNVPS7JlyapJG/v7k+stTMAgCPisgJZVd07yT9M8tXZv23561X1ou7+03U2BwBwFFzuLcuXJPlokh9ZXT8jyc8k+bvraAoA4Ci53ED2pd39Vw9c/2pVvWUdDQEAHDWX+ynLN68+WZkkqaqvTPL69bQEAHC03Nnh4mey/8zYPZM8s6res7p+SJLfWX97AAB3f3d2y/KpQ7oAADjC7uxw8XcfvK6qByS591o7Wjlzbi9bJ0+PKMWanHXSAgBclss9XPwbquqdSd6V5P9JcjbJL13Gz3VV/cyB63tU1R9V1S9+jv0CANztXO5D/f88yaOTvKO7H5rkibm8h/o/luQRVXXl6vprkpz7rLsEALgbu9xA9onu/nCSL6iqL+juX01yw2X+7C8lue3e1TOS/Nxn1yIAwN3b5QayP66qq5L8WpJ/U1U/nOSTl/mzL03y9NVu/38lyW999m0CANx9XW4g+6+T3JrkOUleneTmJF9/OT/Y3b+dZCv7q2P/4Y7eW1U7VbVbVbsXzu9dZmsAAIfb5R4u/rEDlz/9OdR5VZIfSPL4JPe/gzqnkpxKkiuuu74/hzoAAIfOnW0M+9HsbwT7Gd9K0t199WXW+ckke919pqoe/1l1CABwN3dn+5B90V1RpLvfl+SH74rfBQBwd3O5h4t/Trr7qkuMvS7J69ZZFwDgMLnch/oBAFiTta6QfT5OHN/MrqN3AIAjwAoZAMBkAhkAwGQCGQDAZAIZAMBkAhkAwGQCGQDAZAIZAMBkAhkAwGQCGQDAZIvdqf/Mub1snTw9uw0uw1knKgDA52XoCllV3TKyHgDAYeCWJQDAZAIZAMBkAhkAwGSLCmRVtVNVu1W1e+H83ux2AACGWFQg6+5T3b3d3dsbxzZntwMAMMSiAhkAwFE0OpAdq6r3Hfj6zsH1AQAWZ+jGsN1tRQ4A4CICEgDAZIs9OunE8c3sOpIHADgCrJABAEwmkAEATCaQAQBMJpABAEwmkAEATCaQAQBMJpABAEwmkAEATCaQAQBMttid+s+c28vWydOz27jLnHXqAABwO4atkFXVLQdeP6Wq3llVf2lUfQCApRq+QlZVT0zyI0m+trvfM7o+AMDSDA1kVfVfJvk/kzylu28eWRsAYKlGBrIrkrwyyeO7+/cG1gUAWLSRn7L8RJLfTPKs23tDVe1U1W5V7V44vzeuMwCAiUYGsk8l+eYkf72qvvtSb+juU9293d3bG8c2B7YGADDP0GfIuvt8VT01ya9X1R9290+MrA8AsETDP2XZ3R+pqicl+bWq+lB3v3J0DwAASzIskHX3VQdevzfJQ0fVBgBYssXu1H/i+GZ27W4PABwBzrIEAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhssUcnnTm3l62Tp2e3ceicddwUABw601bIquqWWbUBAJbELUsAgMkEMgCAyQQyAIDJFhXIqmqnqnaravfC+b3Z7QAADLGoQNbdp7p7u7u3N45tzm4HAGCIRQUyAICjaEogq6p7JPmzGbUBAJZm1grZw5PcPKk2AMCiDN+pv6q+Lcl3JHn2Hb3vxPHN7Np1HgA4AoYHsu5+UZIXja4LALBUHuoHAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYTCADAJhMIAMAmEwgAwCYbPhO/ZfrzLm9bJ08fafvO+t4JQDgkJuyQlZVt8yoCwCwRG5ZAgBMJpABAEwmkAEATLaoQFZVO1W1W1W7F87vzW4HAGCIRQWy7j7V3dvdvb1xbHN2OwAAQywqkAEAHEUCGQDAZFMCWXdfNaMuAMASLXan/hPHN7NrF34A4AhwyxIAYDKBDABgMoEMAGAygQwAYDKBDABgMoEMAGAygQwAYDKBDABgMoEMAGAygQwAYLLFHp105txetk6ent3GdGcdHwUAd3tDVsiq6paLrr+1ql44ojYAwNK5ZQkAMJlABgAw2ahnyK6sqpsOXN8vyasG1QYAWLRRgezW7r7htouq+tYk2xe/qap2kuwkycbV1w5qDQBgrkXdsuzuU9293d3bG8c2Z7cDADDEogIZAMBRJJABAEw25Bmy7r7qouufSvJTI2oDACzdYnfqP3F8M7t2qQcAjgC3LAEAJhPIAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJlvs0Ulnzu1l6+Tp2W3cpc46CgoAuIQhK2RV9cCq+tmq+oOqurGq3lBVTxtRGwBg6dYeyKqqkrwiya9198O6+1FJnp7kQeuuDQBwGIy4ZfmEJB/v7hfdNtDd707yIwNqAwAs3ohblg9P8qYBdQAADqXhn7Ksqh+tqrdU1X++xPd2qmq3qnYvnN8b3RoAwBQjAtnbkjzytovu/vYkT0xy7cVv7O5T3b3d3dsbxzYHtAYAMN+IQPYrSe5dVf/TgbFjA+oCABwKaw9k3d1JvjHJ46rqXVX1xiQ/neSfrLs2AMBhMGRj2O7+QPa3ugAA4CKL3an/xPHN7NrZHgA4ApxlCQAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMJlABgAwmUAGADCZQAYAMJlABgAw2WKPTjpzbi9bJ09f1nvPOmIJADjEhgWyqrqQ5MyBoW/s7rOj6gMALNXIFbJbu/uGgfUAAA4Fz5ABAEw2coXsyqq6afX6Xd39tIG1AQAWa1G3LKtqJ8lOkmxcfe2IngAAplvULcvuPtXd2929vXFsc3Y7AABDLCqQAQAcRQIZAMBkwwJZd181qhYAwGGy2J36TxzfzK4d+AGAI8AtSwCAyQQyAIDJBDIAgMkEMgCAyQQyAIDJBDIAgMkEMgCAyQQyAIDJBDIAgMkWu1P/mXN72Tp5enYb3IGzTlIAgLuEFTIAgMmGrZBV1YUkZw4MvbS7nz+qPgDAUo28ZXlrd98wsB4AwKHgliUAwGQjA9mVVXXTga//ZmBtAIDFWtQty6raSbKTJBtXXzuiJwCA6RZ1y7K7T3X3dndvbxzbnN0OAMAQiwpkAABH0chblldW1U0Hrl/d3ScH1gcAWKRhgay7N0bVAgA4TBZ7dNKJ45vZdTQPAHAEeIYMAGAygQwAYDKBDABgMoEMAGAygQwAYDKBDABgMoEMAGAygQwAYDKBDABgssXu1H/m3F62Tp6e3caRctbJCAAwhRUyAIDJ1r5CVlUXkpxJcs8kn0zy00l+qLs/te7aAACHwYhblrd29w1JUlUPSPKzSTaT/LMBtQEAFm/oLcvu/mCSnST/qKpqZG0AgKUa/gxZd//Bqu4DRtcGAFiiWQ/1X3J1rKp2qmq3qnYvnN8b3RMAwBTDA1lVPSzJhSQfvPh73X2qu7e7e3vj2Obo1gAAphgayKrq2iQvSvLC7u6RtQEAlmrEpyyvrKqb8ufbXvxMkh8cUBcA4FBYeyDr7o111wAAOMwWe3TSieOb2XWUDwBwBDg6CQBgMoEMAGAygQwAYDKBDABgMoEMAGAygQwAYDKBDABgMoEMAGAygQwAYLLF7tR/5txetk6ent0G3O2cdQIGwOJYIQMAmGxYIKuqv1BVL62qm6vqd6rqP1TVl4yqDwCwVEMCWVVVkpcneV13/+Xu/vIk353kgSPqAwAs2ahnyP5mkk9094tuG+jumwbVBgBYtFG3LB+R5MZBtQAADpVFPdRfVTtVtVtVuxfO781uBwBgiFGB7G1JHnVnb+ruU9293d3bG8c2B7QFADDfqED2K0muqKp/cNtAVf31qnrcoPoAAIs1JJB1dyd5WpKvWW178bYkz0vy/hH1AQCWbNhO/d39/iTfPKoeAMBhsdijk04c38yuI14AgCNgUZ+yBAA4igQyAIDJBDIAgMkEMgCAyQQyAIDJBDIAgMkEMgCAyQQyAIDJBDIAgMkWu1P/mXN72Tp5enYbh9ZZpxwAwKExZIWsqi5U1U1V9ZaqelNVPXZEXQCAw2DUCtmt3X1DklTV1yX5/iSPG1QbAGDRZjxDdnWS/29CXQCARRq1QnZlVd2U5N5JrkvyhEF1AQAWb8Yty8ckeUlVPaK7++CbqmonyU6SbFx97aDWAADmGn7LsrvfkOSaJJ+RuLr7VHdvd/f2xrHN0a0BAEwxPJBV1Zcl2Ujy4dG1AQCWaPQzZElSSb6luy8Mqg0AsGhDAll3b4yoAwBwGDk6CQBgssUenXTi+GZ2Hf8DABwBVsgAACYTyAAAJhPIAAAmE8gAACYTyAAAJhPIAAAmE8gAACYTyAAAJhPIAAAmW+xO/WfO7WXr5OnZbTDJWac0AHCEDFshq6qnVVVX1ZeNqgkAcBiMvGX5jCS/keTpA2sCACzekEBWVVcl+aokz4pABgDwaUatkH1jkld39zuSfKSqHjmoLgDA4o0KZM9I8tLV65eurj9DVe1U1W5V7V44vzeoNQCAudb+Kcuqun+SJyR5RFV1ko0kXVX/uLv74Hu7+1SSU0lyxXXX92f8MgCAu6ERK2TflOQl3f2Q7t7q7gcneVeSrx5QGwBg8UYEsmckeflFY/8+yd8bUBsAYPHWfsuyux9/ibF/te66AACHhaOTAAAmW+zRSSeOb2bX8TkAwBFghQwAYDKBDABgMoEMAGAygQwAYLK6aLP8xaiqjyZ5++w+jpBrknxodhNHiPkey3yPZb7HMt/j3NFcP6S7r/1cf/FiP2WZ5O3dvT27iaOiqnbN9zjmeyzzPZb5Hst8j7POuXbLEgBgMoEMAGCyJQeyU7MbOGLM91jmeyzzPZb5Hst8j7O2uV7sQ/0AAEfFklfIAACOhEUGsqp6UlW9vap+v6pOzu7nsKiqn6yqD1bVWw+M3a+qfrmq3rn6874Hvvfc1Ry/vaq+7sD4o6rqzOp7/6qqajV+RVW9bDX+W1W1NfQvuDBV9eCq+tWq+t2qeltV/S+rcXO+BlV176p6Y1W9ZTXf37saN99rUlUbVfXmqvrF1bW5XpOqOruap5uqanc1Zr7XpKruU1U/X1W/t/o3/DHT57u7F/WVZCPJzUkeluReSd6S5Mtn93UYvpL8jSSPTPLWA2P/IsnJ1euTSf631esvX83tFUkeuprzjdX33pjkMUkqyS8lefJq/B8medHq9dOTvGz233nyfF+X5JGr11+U5B2reTXn65nvSnLV6vU9k/xWkkeb77XO+Xcm+dkkv7i6Ntfrm+uzSa65aMx8r2++fzrJ/7h6fa8k95k939Mn5RKT9Jgkrzlw/dwkz53d12H5SrKVTw9kb09y3er1ddnf3+0z5jXJa1Zzf12S3zsw/owk/8fB96xe3yP7m+PV7L/zUr6SvDLJ15jzIXN9LMmbknyl+V7bHD8oyWuTPCF/HsjM9frm+2w+M5CZ7/XM9dVJ3nXx33/2fC/xluXxJO89cP2+1Rifmwd29weSZPXnA1bjtzfPx1evLx7/tJ/p7k8m2Uty/7V1foislqP/WvZXbcz5mqxuod2U5INJfrm7zff6/FCSf5zkUwfGzPX6dJL/WFU3VtXOasx8r8fDkvxRkhevbsn/66r6wkye7yUGsrrEmI+C3vVub57vaP79t7mEqroqyb9P8uzu/pM7euslxsz5Z6G7L3T3DdlfvfmKqnrEHbzdfH+OquqpST7Y3Tde7o9cYsxcf3a+qrsfmeTJSb69qv7GHbzXfH9+7pH9x3t+vLv/WpKPZf8W5e0ZMt9LDGTvS/LgA9cPSvL+Sb3cHfxhVV2XJKs/P7gav715ft/q9cXjn/YzVXWPJJtJPrK2zg+Bqrpn9sPYv+nuX1gNm/M16+4/TvK6JE+K+V6Hr0ryDVV1NslLkzyhqv6vmOu16e73r/78YJKXJ/mKmO91eV+S961W2JPk57Mf0KbO9xID2X9Ocn1VPbSq7pX9h+FeNbmnw+xVSb5l9fpbsv+c023jT199EuShSa5P8sbVMu1Hq+rRq0+LPPOin7ntd31Tkl/p1Q3yo2g1Pz+R5He7+wcPfMucr0FVXVtV91m9vjLJf5Xk92K+73Ld/dzuflB3b2X/3+Bf6e7/NuZ6LarqC6vqi257neRrk7w15nstuvv/TfLeqvrS1dATk/xOZs/37IfrbueBu6dk/xNrNyf5ntn9HJavJD+X5ANJPpH9dP6s7N+zfm2Sd67+vN+B93/Pao7fntUnQ1bj29n/x+DmJC/Mn28gfO8k/y7J72f/kyUPm/13njzfX539JejfTnLT6usp5nxt8/1Xkrx5Nd9vTfJPV+Pme73z/vj8+UP95no9c/yw7H+K7y1J3nbb//fM91rn/IYku6t/T16R5L6z59tO/QAAky3xliUAwJEikAEATCaQAQBMJpABAEwmkAEATCaQAQBMJpABAEwmkAEATPb/A+kNVwSXcnKDAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Amount of each labels\")\n", + "\n", + "# Change label to alphabets\n", + "alphabets_mapper = {0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G',7:'H',8:'I',9:'J',10:'K',11:'L',12:'M',13:'N',14:'O',15:'P',16:'Q',17:'R',18:'S',19:'T',20:'U',21:'V',22:'W',23:'X',24:'Y',25:'Z'} \n", + "dataset_alphabets = dataset.copy()\n", + "dataset['label'] = dataset['label'].map(alphabets_mapper)\n", + "\n", + "label_size = dataset.groupby('label').size()\n", + "label_size.plot.barh(figsize=(10,10))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "# splite the data\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y)\n", + "\n", + "# scale data\n", + "standard_scaler = MinMaxScaler()\n", + "standard_scaler.fit(X_train)\n", + "\n", + "X_train = standard_scaler.transform(X_train)\n", + "X_test = standard_scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from keras.utils import np_utils\n", + "\n", + "X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')\n", + "X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')\n", + "\n", + "y_train = np_utils.to_categorical(y_train)\n", + "y_test = np_utils.to_categorical(y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_train[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28, 28, 1)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train[0].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 26, 26, 32) 320 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 11, 11, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_1 (MaxPooling2 (None, 5, 5, 32) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 800) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 128) 102528 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 26) 3354 \n", + "=================================================================\n", + "Total params: 115,450\n", + "Trainable params: 115,450\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = Sequential()\n", + "model.add(Conv2D(32, (3, 3), input_shape = (28,28,1), activation = 'relu'))\n", + "model.add(MaxPooling2D(pool_size = (2, 2)))\n", + "\n", + "\n", + "model.add(Conv2D(32, (3, 3), activation = 'relu'))\n", + "model.add(MaxPooling2D(pool_size = (2, 2)))\n", + "\n", + "model.add(Flatten())\n", + "model.add(Dense(units = 128, activation = 'relu'))\n", + "model.add(Dense(units = 26, activation = 'softmax'))\n", + "\n", + "\n", + "model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])\n", + "\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/20\n", + "1092/1092 [==============================] - 130s 119ms/step - loss: 0.0169 - accuracy: 0.9950 - val_loss: 0.0126 - val_accuracy: 0.9976\n", + "Epoch 2/20\n", + "1092/1092 [==============================] - 129s 118ms/step - loss: 0.0130 - accuracy: 0.9957 - val_loss: 0.0136 - val_accuracy: 0.9970\n", + "Epoch 3/20\n", + " 978/1092 [=========================>....] - ETA: 12s - loss: 0.0110 - accuracy: 0.9963" + ] + } + ], + "source": [ + "history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "in user code:\n\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1478 predict_function *\n return step_function(self, iterator)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1468 step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 run\n return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica\n return self._call_for_each_replica(fn, args, kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica\n return fn(*args, **kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1461 run_step **\n outputs = model.predict_step(data)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1434 predict_step\n return self(x, training=False)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__\n input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:234 assert_input_compatibility\n raise ValueError('Input ' + str(input_index) + ' of layer ' +\n\n ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 28, 1)\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmypred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1627\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msteps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1628\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_predict_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1629\u001b[0;31m \u001b[0mtmp_batch_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1630\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshould_sync\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1631\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masync_wait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 826\u001b[0m \u001b[0mtracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 827\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtm\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 828\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 829\u001b[0m \u001b[0mcompiler\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"xla\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_experimental_compile\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"nonXla\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 830\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 869\u001b[0m \u001b[0;31m# This is the first call of __call__, so we have to initialize.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 870\u001b[0m \u001b[0minitializers\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 871\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_initialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0madd_initializers_to\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitializers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 872\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 873\u001b[0m \u001b[0;31m# At this point we know that the initialization is complete (or less\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m_initialize\u001b[0;34m(self, args, kwds, add_initializers_to)\u001b[0m\n\u001b[1;32m 723\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_graph_deleter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFunctionDeleter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lifted_initializer_graph\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 724\u001b[0m self._concrete_stateful_fn = (\n\u001b[0;32m--> 725\u001b[0;31m self._stateful_fn._get_concrete_function_internal_garbage_collected( # pylint: disable=protected-access\n\u001b[0m\u001b[1;32m 726\u001b[0m *args, **kwds))\n\u001b[1;32m 727\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_get_concrete_function_internal_garbage_collected\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2967\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2968\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2969\u001b[0;31m \u001b[0mgraph_function\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_maybe_define_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2970\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2971\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_maybe_define_function\u001b[0;34m(self, args, kwargs)\u001b[0m\n\u001b[1;32m 3359\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3360\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_cache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmissed\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcall_context_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3361\u001b[0;31m \u001b[0mgraph_function\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_create_graph_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3362\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_cache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprimary\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcache_key\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3363\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_create_graph_function\u001b[0;34m(self, args, kwargs, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m 3194\u001b[0m \u001b[0marg_names\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase_arg_names\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmissing_arg_names\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3195\u001b[0m graph_function = ConcreteFunction(\n\u001b[0;32m-> 3196\u001b[0;31m func_graph_module.func_graph_from_py_func(\n\u001b[0m\u001b[1;32m 3197\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3198\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_python_function\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py\u001b[0m in \u001b[0;36mfunc_graph_from_py_func\u001b[0;34m(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m 988\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moriginal_func\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_decorator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpython_func\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 989\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 990\u001b[0;31m \u001b[0mfunc_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpython_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfunc_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfunc_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 991\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 992\u001b[0m \u001b[0;31m# invariant: `func_outputs` contains only Tensors, CompositeTensors,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36mwrapped_fn\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 632\u001b[0m \u001b[0mxla_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mExit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 633\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweak_wrapped_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__wrapped__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 635\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 975\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# pylint:disable=broad-except\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 976\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"ag_error_metadata\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 977\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mag_error_metadata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 978\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 979\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: in user code:\n\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1478 predict_function *\n return step_function(self, iterator)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1468 step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 run\n return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica\n return self._call_for_each_replica(fn, args, kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica\n return fn(*args, **kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1461 run_step **\n outputs = model.predict_step(data)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1434 predict_step\n return self(x, training=False)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__\n input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:234 assert_input_compatibility\n raise ValueError('Input ' + str(input_index) + ' of layer ' +\n\n ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 28, 1)\n" + ] + } + ], + "source": [ + "mypred = model.predict(X_train[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Segment/download.png b/Segment/download.png new file mode 100644 index 0000000..ce9b749 Binary files /dev/null and b/Segment/download.png differ diff --git a/Segment/download_2.png b/Segment/download_2.png new file mode 100644 index 0000000..2a9d4d0 Binary files /dev/null and b/Segment/download_2.png differ diff --git a/Segment/final-Copy1.ipynb b/Segment/final-Copy1.ipynb new file mode 100644 index 0000000..73b2abf --- /dev/null +++ b/Segment/final-Copy1.ipynb @@ -0,0 +1,1495 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np \n", + "import pandas as pd \n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import os\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "import tensorflow as tf\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense\n", + "from keras.layers import Dropout\n", + "from keras.layers import Flatten\n", + "from keras.layers.convolutional import Conv2D\n", + "from keras.layers.convolutional import MaxPooling2D\n", + "from keras import backend as K\n", + "from keras.utils import np_utils\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix\n", + "\n", + "#ignore warning messages \n", + "import warnings\n", + "warnings.filterwarnings('ignore') \n", + "\n", + "sns.set()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = pd.read_csv(\"A_Z Handwritten Data.csv\").astype('float32')\n", + "dataset.rename(columns={'0':'label'}, inplace=True)\n", + "\n", + "# Splite data the X - Our data , and y - the prdict label\n", + "X = dataset.drop('label',axis = 1)\n", + "y = dataset['label']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amount of each labels\n" + ] + }, + { + "data": { + "image/png": "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7dq1nuZt9SdnL7zwgnJzc3XIIYfooIMO0rhx47R69Wqvx/KNRx55RL///e+VmZkpSdq8ebOOPPJI9e/fX2lpaSosLNTq1av1ySefqLGxUccff7wkafLkyVq9erWampr0yiuvaNy4cXu9Lklr165VYWGhJGnixIl67rnn1NTUZP6XtEQ4HNacOXPUo0cPde/eXdnZ2froo4/I2yUnnXSS7r33XqWlpSkWi6m5uVk1NTXk7aJdu3Zp8eLFmjFjhiT+PnHTBx98IEk677zzdPrpp+v+++8nbxf97W9/04QJE9SvXz91795dixcvVs+ePT3N2+pyVlVVpXA43PJ1Zmamdu7c6eFE/vLHP/5Rw4cPb/m6tTz/+fVwOKydO3equrpa6enpSktL2+v1f36vtLQ0paen64svvjDxa1lp0KBBLf+zfvTRR3rqqacUCATI20Xdu3fXLbfcooKCAo0YMYI/3y679tprNWvWLPXu3VsSf5+4qaamRiNGjNBtt92me+65Rw899JA+/fRT8nbJ3//+dzU3N2vGjBmKRCJ68MEHPf/zbXU5SyaTCgQCLV87jrPX12if1vJs7fXvyru1/B3HUTBo9R8nI7Zv367zzjtPl19+ufr370/eLps5c6ZefPFFffbZZ/roo4/I2yXLly/X4YcfrhEjRrS8xt8n7jnhhBO0YMEChUIh9e3bV2eddZZuueUW8nZJc3OzXnzxRd144416+OGHtXnzZn388cee5p3Wgd/Hdf369dPGjRtbvo5Goy2X6NB+/fr12+tGxK/z/OfXP//8c2VmZqpv376qra1Vc3OzunXrtlf+mZmZ+vzzz9WvXz8lEgnV19frkEMOMf0rWeXVV1/VzJkzddVVV6mgoEAvv/wyebvk/fff1549ezRkyBD17NlTeXl5Wr16tbp169byPeTdeZ588klFo1FFIhF9+eWX2r17tz755BPydsnGjRvV1NTUUoYdx9ERRxzB3ycuOfTQQzVixAj17dtXknTaaad5/veJ1VX55JNP1osvvqgvvvhCDQ0Nqqio0CmnnOL1WL513HHH6cMPP2z5CPfxxx/XKaecoiOOOEIHHHCAXn31VUlSWVmZTjnlFHXv3l3Dhw/Xk08+KUlatWpVS/6nnnqqVq1aJemrv7iHDx+u7t27e/J72eCzzz7TRRddpEWLFqmgoEASebupsrJSxcXF2rNnj/bs2aNnnnlGU6ZMIW+X3H333Xr88cdVVlammTNnasyYMbrrrrvI2yW1tbVasGCB4vG46urq9Oijj+p3v/sdebtk9OjRWrdunWpqatTc3Kznn39e48eP9zTvgOM4jnu/cseVl5frjjvuUFNTk8466yxdcMEFXo/kO2PGjNG9996rrKwsvfjii5o7d67i8bhOPfVUXXnllQoEAnr77bdVXFysuro6DR06VHPnzlWPHj30ySefaM6cOYrFYjr88MN100036eCDD9auXbs0Z84cffzxxwqFQlq0aJGysrK8/lU9U1JSohUrVmjAgAEtr02ZMkU//OEPydslt956q5566il169ZNeXl5uvjii/nzbcDKlSv18ssva968eeTtoj/96U96+umnlUwmdfbZZ+vnP/85ebvor3/9q+655x41NTVp5MiRKi4u1oYNGzzL2/pyBgAAkEqsvqwJAACQaihnAAAAFqGcAQAAWIRyBgAAYBHKGQAAgEUoZwAAABahnAEAAFiEcgYAAGCR/wOFe/nRiV36tQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Amount of each labels\")\n", + "\n", + "# Change label to alphabets\n", + "alphabets_mapper = {0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G',7:'H',8:'I',9:'J',10:'K',11:'L',12:'M',13:'N',14:'O',15:'P',16:'Q',17:'R',18:'S',19:'T',20:'U',21:'V',22:'W',23:'X',24:'Y',25:'Z'} \n", + "dataset_alphabets = dataset.copy()\n", + "dataset['label'] = dataset['label'].map(alphabets_mapper)\n", + "\n", + "label_size = dataset.groupby('label').size()\n", + "label_size.plot.barh(figsize=(10,10))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# splite the data\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y)\n", + "\n", + "# scale data\n", + "standard_scaler = MinMaxScaler()\n", + "standard_scaler.fit(X_train)\n", + "\n", + "X_train = standard_scaler.transform(X_train)\n", + "X_test = standard_scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')\n", + "X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')\n", + "\n", + "y_train = np_utils.to_categorical(y_train)\n", + "y_test = np_utils.to_categorical(y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/20\n", + "1092/1092 [==============================] - 156s 141ms/step - loss: 0.5139 - accuracy: 0.8566 - val_loss: 0.0949 - val_accuracy: 0.9747\n", + "Epoch 2/20\n", + "1092/1092 [==============================] - 137s 125ms/step - loss: 0.0984 - accuracy: 0.9732 - val_loss: 0.0700 - val_accuracy: 0.9804\n", + "Epoch 3/20\n", + "1092/1092 [==============================] - 129s 118ms/step - loss: 0.0716 - accuracy: 0.9797 - val_loss: 0.0579 - val_accuracy: 0.9837\n", + "Epoch 4/20\n", + "1092/1092 [==============================] - 129s 118ms/step - loss: 0.0559 - accuracy: 0.9842 - val_loss: 0.0496 - val_accuracy: 0.9861\n", + "Epoch 5/20\n", + "1092/1092 [==============================] - 160s 146ms/step - loss: 0.0469 - accuracy: 0.9862 - val_loss: 0.0476 - val_accuracy: 0.9867\n", + "Epoch 6/20\n", + "1092/1092 [==============================] - 144s 132ms/step - loss: 0.0406 - accuracy: 0.9881 - val_loss: 0.0456 - val_accuracy: 0.9866\n", + "Epoch 7/20\n", + "1092/1092 [==============================] - 177s 162ms/step - loss: 0.0339 - accuracy: 0.9896 - val_loss: 0.0390 - val_accuracy: 0.9891\n", + "Epoch 8/20\n", + "1092/1092 [==============================] - 131s 120ms/step - loss: 0.0294 - accuracy: 0.9910 - val_loss: 0.0363 - val_accuracy: 0.9896\n", + "Epoch 9/20\n", + "1092/1092 [==============================] - 116s 106ms/step - loss: 0.0262 - accuracy: 0.9920 - val_loss: 0.0358 - val_accuracy: 0.9901\n", + "Epoch 10/20\n", + "1092/1092 [==============================] - 131s 120ms/step - loss: 0.0227 - accuracy: 0.9928 - val_loss: 0.0357 - val_accuracy: 0.9897\n", + "Epoch 11/20\n", + "1092/1092 [==============================] - 111s 102ms/step - loss: 0.0199 - accuracy: 0.9936 - val_loss: 0.0325 - val_accuracy: 0.9911\n", + "Epoch 12/20\n", + "1092/1092 [==============================] - 113s 103ms/step - loss: 0.0176 - accuracy: 0.9940 - val_loss: 0.0324 - val_accuracy: 0.9912\n", + "Epoch 13/20\n", + "1092/1092 [==============================] - 113s 103ms/step - loss: 0.0165 - accuracy: 0.9943 - val_loss: 0.0300 - val_accuracy: 0.9925\n", + "Epoch 14/20\n", + "1092/1092 [==============================] - 113s 103ms/step - loss: 0.0156 - accuracy: 0.9946 - val_loss: 0.0313 - val_accuracy: 0.9923\n", + "Epoch 15/20\n", + "1092/1092 [==============================] - 113s 104ms/step - loss: 0.0138 - accuracy: 0.9954 - val_loss: 0.0284 - val_accuracy: 0.9932\n", + "Epoch 16/20\n", + "1092/1092 [==============================] - 112s 102ms/step - loss: 0.0129 - accuracy: 0.9956 - val_loss: 0.0279 - val_accuracy: 0.9936\n", + "Epoch 17/20\n", + "1092/1092 [==============================] - 112s 102ms/step - loss: 0.0122 - accuracy: 0.9957 - val_loss: 0.0305 - val_accuracy: 0.9932\n", + "Epoch 18/20\n", + "1092/1092 [==============================] - 112s 103ms/step - loss: 0.0115 - accuracy: 0.9961 - val_loss: 0.0292 - val_accuracy: 0.9932\n", + "Epoch 19/20\n", + "1092/1092 [==============================] - 115s 105ms/step - loss: 0.0114 - accuracy: 0.9960 - val_loss: 0.0294 - val_accuracy: 0.9937\n", + "Epoch 20/20\n", + "1092/1092 [==============================] - 116s 106ms/step - loss: 0.0111 - accuracy: 0.9961 - val_loss: 0.0275 - val_accuracy: 0.9943\n" + ] + } + ], + "source": [ + "cls = Sequential()\n", + "cls.add(Conv2D(32, (5, 5), input_shape=(28, 28, 1), activation='relu'))\n", + "cls.add(MaxPooling2D(pool_size=(2, 2)))\n", + "cls.add(Dropout(0.3))\n", + "cls.add(Flatten())\n", + "cls.add(Dense(128, activation='relu'))\n", + "cls.add(Dense(len(y.unique()), activation='softmax'))\n", + "\n", + "cls.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", + "history = cls.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "cls.save('my_model.h5')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import PIL\n", + "from PIL import Image, ImageEnhance, ImageDraw, ImageFont\n", + "from IPython.display import display\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "img = Image.open('n_image copy.jpg')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACEAAAAoCAAAAABVgMx7AAACTElEQVR4nHWTy3LjNhBFDx96kLQzcpJJVaqySOX/v2syZc/IkvkmCJwsHEn2QnfXwMHtbqCBFyWTZ+dLOJmis5OZvGuhzEl5LLjp+Q8Ab1rCzcL0Lar25hf+dSaVeD2f/bnS8qMmu60x7vJbcN7t51QRNre16Vjlcxov4Zf9ajWRbnXA3/+uH4ryxcDDSa9EBUaXKzD7yhMussTJ4GqE2sV4RcJwAN/EYK/ftYHWcE3Ua8HhPUswaqCqqcfuahH1/bbKZCxDqmKR97gnXZrLQ/eQDVnX4Ggb1YLfMnC4eJw14wvKNJtcpgZWD9Uti/bTlvIkeu57IxUmnrh6jIPtL1uUtde1q/LCpB8fMq1SsZgXM7TNPkWyOHPIFhg4h+X/l0ow6aDUjydVfi06Q7BzNn77B5TO1pW/0DaufgX1fHSJDtKg2BuEPI7q8/yYsai2g06QKyE69tsMXV6S7YbN9mgY9Pgi7GbRk7tmY3dOLroUbDTOaU66NgT5oSkjC446dioPpEH159STKXo220ftPOuslOjkq6uym2SOlp8mPlGjxhS0RvPtshZU6TqucXV4zFbyrkxpepzAIL837W38wvtcRF+nHIyMAvZXoHNeGtBO+coiuikPwwdEF6lIYyc5is8ULL5dtk+r0Td2aKzBiMtTju0Hi9agbCFR00tM3cOk0+2fOHjszdjUsPfTv/2kdVOu9YDkdwBy12KA+T4x87JK2FHeIwoOfZKU362Dti5iirvsbhaKoi82ZPfrGOrvTdfvw/1uOR0wIxb/AetB2NNoPMSRAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import cv2" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_img = cv2.imread('n_image copy.jpg', cv2.IMREAD_GRAYSCALE)\n", + "my_lol_img = cv2.resize(my_lol_img, (28, 28))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize = (5,5))\n", + "plt.imshow(my_lol_img, cmap='gray')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[255, 255, 255, 255, 255, 255, 255, 253, 254, 254, 255, 244, 254,\n", + " 252, 255, 255, 255, 255, 255, 255, 251, 254, 254, 253, 250, 253,\n", + " 251, 254],\n", + " [255, 255, 255, 255, 255, 255, 254, 253, 253, 252, 252, 254, 252,\n", + " 254, 255, 255, 255, 255, 255, 255, 255, 241, 254, 253, 250, 255,\n", + " 250, 254],\n", + " [255, 255, 255, 255, 255, 255, 252, 242, 252, 250, 254, 254, 250,\n", + " 255, 255, 255, 255, 255, 255, 255, 254, 254, 249, 252, 247, 245,\n", + " 250, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 254, 248, 249, 254, 252, 253,\n", + " 252, 255, 255, 255, 255, 255, 255, 250, 250, 253, 248, 251, 253,\n", + " 250, 254],\n", + " [255, 255, 255, 255, 255, 255, 217, 18, 32, 176, 250, 254, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 255, 239, 254, 205, 22, 146,\n", + " 251, 255],\n", + " [253, 254, 253, 254, 254, 254, 229, 63, 0, 116, 243, 253, 252,\n", + " 254, 255, 255, 255, 255, 255, 255, 252, 253, 237, 7, 7, 141,\n", + " 249, 254],\n", + " [254, 252, 251, 251, 255, 237, 255, 171, 4, 1, 215, 254, 252,\n", + " 253, 255, 255, 255, 255, 255, 255, 250, 253, 249, 5, 5, 140,\n", + " 250, 255],\n", + " [254, 253, 252, 253, 253, 255, 210, 3, 8, 2, 8, 248, 248,\n", + " 255, 255, 255, 255, 255, 255, 255, 254, 254, 247, 3, 2, 111,\n", + " 239, 255],\n", + " [254, 250, 250, 250, 251, 255, 212, 3, 8, 4, 3, 100, 253,\n", + " 251, 255, 255, 255, 255, 255, 255, 249, 252, 244, 5, 7, 5,\n", + " 184, 254],\n", + " [248, 250, 254, 254, 251, 248, 9, 0, 130, 254, 45, 21, 233,\n", + " 255, 255, 255, 255, 255, 255, 255, 255, 254, 246, 200, 4, 2,\n", + " 177, 254],\n", + " [253, 249, 249, 249, 249, 133, 2, 47, 193, 254, 143, 8, 58,\n", + " 252, 255, 255, 255, 255, 255, 255, 252, 250, 253, 201, 7, 3,\n", + " 185, 255],\n", + " [253, 243, 255, 246, 251, 21, 0, 87, 255, 253, 249, 1, 15,\n", + " 113, 253, 255, 246, 253, 244, 250, 253, 254, 252, 205, 0, 4,\n", + " 183, 254],\n", + " [247, 254, 250, 252, 181, 13, 21, 149, 248, 253, 254, 242, 8,\n", + " 8, 147, 253, 253, 247, 249, 250, 251, 254, 250, 196, 15, 2,\n", + " 187, 255],\n", + " [252, 248, 252, 253, 50, 6, 42, 252, 251, 254, 254, 236, 156,\n", + " 6, 32, 205, 255, 252, 252, 250, 246, 254, 253, 200, 1, 2,\n", + " 187, 255],\n", + " [252, 253, 250, 214, 44, 2, 86, 252, 251, 243, 251, 254, 202,\n", + " 34, 3, 5, 229, 254, 250, 250, 254, 243, 239, 216, 35, 4,\n", + " 184, 254],\n", + " [244, 253, 252, 97, 4, 2, 252, 249, 250, 255, 249, 248, 254,\n", + " 217, 68, 7, 86, 253, 250, 253, 253, 254, 244, 250, 156, 2,\n", + " 186, 255],\n", + " [255, 251, 240, 89, 6, 249, 255, 251, 250, 246, 253, 255, 251,\n", + " 255, 115, 7, 1, 239, 253, 251, 245, 252, 252, 255, 160, 4,\n", + " 184, 254],\n", + " [252, 251, 142, 2, 4, 249, 255, 255, 255, 255, 255, 255, 255,\n", + " 254, 252, 156, 11, 21, 166, 254, 254, 249, 253, 254, 161, 6,\n", + " 185, 255],\n", + " [254, 252, 141, 12, 12, 239, 251, 255, 255, 255, 255, 255, 255,\n", + " 255, 252, 254, 13, 1, 77, 255, 254, 254, 240, 203, 12, 1,\n", + " 186, 253],\n", + " [250, 187, 2, 4, 203, 248, 252, 255, 255, 255, 255, 255, 255,\n", + " 252, 252, 252, 250, 86, 1, 81, 224, 247, 251, 205, 5, 6,\n", + " 184, 255],\n", + " [253, 175, 2, 3, 201, 255, 245, 255, 255, 255, 255, 255, 255,\n", + " 250, 249, 254, 252, 247, 133, 3, 38, 221, 253, 205, 5, 0,\n", + " 187, 253],\n", + " [254, 201, 38, 35, 215, 246, 254, 255, 255, 255, 255, 255, 255,\n", + " 254, 254, 248, 253, 252, 252, 157, 22, 1, 5, 162, 3, 4,\n", + " 181, 204],\n", + " [254, 253, 214, 221, 254, 255, 253, 255, 255, 255, 255, 255, 255,\n", + " 254, 254, 255, 252, 254, 249, 253, 193, 26, 4, 4, 4, 2,\n", + " 187, 172],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 253, 255, 17, 20, 11, 10,\n", + " 187, 254],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 250, 254, 243, 249, 203, 197,\n", + " 254, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 255, 245, 252, 254, 251, 249,\n", + " 252, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 252, 249, 246, 248, 251, 250,\n", + " 252, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 253, 244, 250, 254, 252, 254,\n", + " 252, 255]], dtype=uint8)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_img" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28, 28)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_img.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_img = np.array(my_lol_img) / 255\n", + "my_lol_img = my_lol_img.reshape(-1, 28, 28, 1)\n", + "#y_train = np.array(y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [1. ],\n", + " [0.95686275],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.98431373],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.94509804],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.94901961],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.97647059],\n", + " [0.98823529],\n", + " [0.96862745],\n", + " [0.96078431],\n", + " [0.98039216],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.97254902],\n", + " [0.97647059],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.97254902],\n", + " [0.98431373],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.85098039],\n", + " [0.07058824],\n", + " [0.1254902 ],\n", + " [0.69019608],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.9372549 ],\n", + " [0.99607843],\n", + " [0.80392157],\n", + " [0.08627451],\n", + " [0.57254902],\n", + " [0.98431373],\n", + " [1. ]],\n", + "\n", + " [[0.99215686],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.89803922],\n", + " [0.24705882],\n", + " [0. ],\n", + " [0.45490196],\n", + " [0.95294118],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.92941176],\n", + " [0.02745098],\n", + " [0.02745098],\n", + " [0.55294118],\n", + " [0.97647059],\n", + " [0.99607843]],\n", + "\n", + " [[0.99607843],\n", + " [0.98823529],\n", + " [0.98431373],\n", + " [0.98431373],\n", + " [1. ],\n", + " [0.92941176],\n", + " [1. ],\n", + " [0.67058824],\n", + " [0.01568627],\n", + " [0.00392157],\n", + " [0.84313725],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.97647059],\n", + " [0.01960784],\n", + " [0.01960784],\n", + " [0.54901961],\n", + " [0.98039216],\n", + " [1. ]],\n", + "\n", + " [[0.99607843],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.82352941],\n", + " [0.01176471],\n", + " [0.03137255],\n", + " [0.00784314],\n", + " [0.03137255],\n", + " [0.97254902],\n", + " [0.97254902],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.96862745],\n", + " [0.01176471],\n", + " [0.00784314],\n", + " [0.43529412],\n", + " [0.9372549 ],\n", + " [1. ]],\n", + "\n", + " [[0.99607843],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.98431373],\n", + " [1. ],\n", + " [0.83137255],\n", + " [0.01176471],\n", + " [0.03137255],\n", + " [0.01568627],\n", + " [0.01176471],\n", + " [0.39215686],\n", + " [0.99215686],\n", + " [0.98431373],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.97647059],\n", + " [0.98823529],\n", + " [0.95686275],\n", + " [0.01960784],\n", + " [0.02745098],\n", + " [0.01960784],\n", + " [0.72156863],\n", + " [0.99607843]],\n", + "\n", + " [[0.97254902],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.98431373],\n", + " [0.97254902],\n", + " [0.03529412],\n", + " [0. ],\n", + " [0.50980392],\n", + " [0.99607843],\n", + " [0.17647059],\n", + " [0.08235294],\n", + " [0.91372549],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.96470588],\n", + " [0.78431373],\n", + " [0.01568627],\n", + " [0.00784314],\n", + " [0.69411765],\n", + " [0.99607843]],\n", + "\n", + " [[0.99215686],\n", + " [0.97647059],\n", + " [0.97647059],\n", + " [0.97647059],\n", + " [0.97647059],\n", + " [0.52156863],\n", + " [0.00784314],\n", + " [0.18431373],\n", + " [0.75686275],\n", + " [0.99607843],\n", + " [0.56078431],\n", + " [0.03137255],\n", + " [0.22745098],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.78823529],\n", + " [0.02745098],\n", + " [0.01176471],\n", + " [0.7254902 ],\n", + " [1. ]],\n", + "\n", + " [[0.99215686],\n", + " [0.95294118],\n", + " [1. ],\n", + " [0.96470588],\n", + " [0.98431373],\n", + " [0.08235294],\n", + " [0. ],\n", + " [0.34117647],\n", + " [1. ],\n", + " [0.99215686],\n", + " [0.97647059],\n", + " [0.00392157],\n", + " [0.05882353],\n", + " [0.44313725],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.96470588],\n", + " [0.99215686],\n", + " [0.95686275],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.80392157],\n", + " [0. ],\n", + " [0.01568627],\n", + " [0.71764706],\n", + " [0.99607843]],\n", + "\n", + " [[0.96862745],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [0.98823529],\n", + " [0.70980392],\n", + " [0.05098039],\n", + " [0.08235294],\n", + " [0.58431373],\n", + " [0.97254902],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.94901961],\n", + " [0.03137255],\n", + " [0.03137255],\n", + " [0.57647059],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [0.96862745],\n", + " [0.97647059],\n", + " [0.98039216],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [0.76862745],\n", + " [0.05882353],\n", + " [0.00784314],\n", + " [0.73333333],\n", + " [1. ]],\n", + "\n", + " [[0.98823529],\n", + " [0.97254902],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.19607843],\n", + " [0.02352941],\n", + " [0.16470588],\n", + " [0.98823529],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.9254902 ],\n", + " [0.61176471],\n", + " [0.02352941],\n", + " [0.1254902 ],\n", + " [0.80392157],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.96470588],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.78431373],\n", + " [0.00392157],\n", + " [0.00784314],\n", + " [0.73333333],\n", + " [1. ]],\n", + "\n", + " [[0.98823529],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.83921569],\n", + " [0.17254902],\n", + " [0.00784314],\n", + " [0.3372549 ],\n", + " [0.98823529],\n", + " [0.98431373],\n", + " [0.95294118],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.79215686],\n", + " [0.13333333],\n", + " [0.01176471],\n", + " [0.01960784],\n", + " [0.89803922],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.95294118],\n", + " [0.9372549 ],\n", + " [0.84705882],\n", + " [0.1372549 ],\n", + " [0.01568627],\n", + " [0.72156863],\n", + " [0.99607843]],\n", + "\n", + " [[0.95686275],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.38039216],\n", + " [0.01568627],\n", + " [0.00784314],\n", + " [0.98823529],\n", + " [0.97647059],\n", + " [0.98039216],\n", + " [1. ],\n", + " [0.97647059],\n", + " [0.97254902],\n", + " [0.99607843],\n", + " [0.85098039],\n", + " [0.26666667],\n", + " [0.02745098],\n", + " [0.3372549 ],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.95686275],\n", + " [0.98039216],\n", + " [0.61176471],\n", + " [0.00784314],\n", + " [0.72941176],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [0.98431373],\n", + " [0.94117647],\n", + " [0.34901961],\n", + " [0.02352941],\n", + " [0.97647059],\n", + " [1. ],\n", + " [0.98431373],\n", + " [0.98039216],\n", + " [0.96470588],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.98431373],\n", + " [1. ],\n", + " [0.45098039],\n", + " [0.02745098],\n", + " [0.00392157],\n", + " [0.9372549 ],\n", + " [0.99215686],\n", + " [0.98431373],\n", + " [0.96078431],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [1. ],\n", + " [0.62745098],\n", + " [0.01568627],\n", + " [0.72156863],\n", + " [0.99607843]],\n", + "\n", + " [[0.98823529],\n", + " [0.98431373],\n", + " [0.55686275],\n", + " [0.00784314],\n", + " [0.01568627],\n", + " [0.97647059],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.61176471],\n", + " [0.04313725],\n", + " [0.08235294],\n", + " [0.65098039],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.97647059],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.63137255],\n", + " [0.02352941],\n", + " [0.7254902 ],\n", + " [1. ]],\n", + "\n", + " [[0.99607843],\n", + " [0.98823529],\n", + " [0.55294118],\n", + " [0.04705882],\n", + " [0.04705882],\n", + " [0.9372549 ],\n", + " [0.98431373],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.05098039],\n", + " [0.00392157],\n", + " [0.30196078],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.94117647],\n", + " [0.79607843],\n", + " [0.04705882],\n", + " [0.00392157],\n", + " [0.72941176],\n", + " [0.99215686]],\n", + "\n", + " [[0.98039216],\n", + " [0.73333333],\n", + " [0.00784314],\n", + " [0.01568627],\n", + " [0.79607843],\n", + " [0.97254902],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.3372549 ],\n", + " [0.00392157],\n", + " [0.31764706],\n", + " [0.87843137],\n", + " [0.96862745],\n", + " [0.98431373],\n", + " [0.80392157],\n", + " [0.01960784],\n", + " [0.02352941],\n", + " [0.72156863],\n", + " [1. ]],\n", + "\n", + " [[0.99215686],\n", + " [0.68627451],\n", + " [0.00784314],\n", + " [0.01176471],\n", + " [0.78823529],\n", + " [1. ],\n", + " [0.96078431],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.97647059],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.96862745],\n", + " [0.52156863],\n", + " [0.01176471],\n", + " [0.14901961],\n", + " [0.86666667],\n", + " [0.99215686],\n", + " [0.80392157],\n", + " [0.01960784],\n", + " [0. ],\n", + " [0.73333333],\n", + " [0.99215686]],\n", + "\n", + " [[0.99607843],\n", + " [0.78823529],\n", + " [0.14901961],\n", + " [0.1372549 ],\n", + " [0.84313725],\n", + " [0.96470588],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.97254902],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.61568627],\n", + " [0.08627451],\n", + " [0.00392157],\n", + " [0.01960784],\n", + " [0.63529412],\n", + " [0.01176471],\n", + " [0.01568627],\n", + " [0.70980392],\n", + " [0.8 ]],\n", + "\n", + " [[0.99607843],\n", + " [0.99215686],\n", + " [0.83921569],\n", + " [0.86666667],\n", + " [0.99607843],\n", + " [1. ],\n", + " [0.99215686],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.97647059],\n", + " [0.99215686],\n", + " [0.75686275],\n", + " [0.10196078],\n", + " [0.01568627],\n", + " [0.01568627],\n", + " [0.01568627],\n", + " [0.00784314],\n", + " [0.73333333],\n", + " [0.6745098 ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.06666667],\n", + " [0.07843137],\n", + " [0.04313725],\n", + " [0.03921569],\n", + " [0.73333333],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.95294118],\n", + " [0.97647059],\n", + " [0.79607843],\n", + " [0.77254902],\n", + " [0.99607843],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.96078431],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.98431373],\n", + " [0.97647059],\n", + " [0.98823529],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.97647059],\n", + " [0.96470588],\n", + " [0.97254902],\n", + " [0.98431373],\n", + " [0.98039216],\n", + " [0.98823529],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99215686],\n", + " [0.95686275],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [1. ]]]])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_img" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "import keras" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "model = keras.models.load_model('my_model.h5')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_prediction = model.predict(my_lol_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.1581924e-07, 4.1368559e-10, 6.4555923e-07, 2.2491538e-05,\n", + " 1.4397167e-12, 3.6010979e-15, 5.0695167e-11, 8.0478216e-08,\n", + " 3.4654861e-12, 6.4896874e-08, 1.4367749e-06, 8.8046843e-05,\n", + " 7.5111379e-06, 2.3038849e-01, 1.7430016e-06, 5.7561249e-09,\n", + " 4.5668517e-07, 4.1635683e-08, 5.5010565e-09, 1.1502559e-11,\n", + " 7.6300371e-01, 6.4844764e-03, 3.5521356e-07, 3.8272912e-08,\n", + " 2.2634480e-07, 2.1373243e-10]], dtype=float32)" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Largest element present in given array: 0.7630037\n" + ] + } + ], + "source": [ + "max = my_lol_prediction[0][0]; \n", + " \n", + "#Loop through the array \n", + "for i in range(0, len(my_lol_prediction[0])): \n", + " #Compare elements of array with max \n", + " if(my_lol_prediction[0][i] > max): \n", + " max = my_lol_prediction[0][i]; \n", + " \n", + "print(\"Largest element present in given array: \" + str(max)); " + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + } + ], + "source": [ + "for i in range(0, len(my_lol_prediction[0])):\n", + " if(my_lol_prediction[0][i] == max):\n", + " print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9999999418151907\n" + ] + } + ], + "source": [ + "mysum = 0\n", + "for i in range(0, len(my_lol_prediction[0])):\n", + " mysum = mysum + my_lol_prediction[0][i]\n", + "print(mysum)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_prediction_2 = np_utils.to_categorical(my_lol_prediction)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.]]], dtype=float32)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_prediction_2" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "in user code:\n\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1478 predict_function *\n return step_function(self, iterator)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1468 step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 run\n return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica\n return self._call_for_each_replica(fn, args, kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica\n return fn(*args, **kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1461 run_step **\n outputs = model.predict_step(data)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1434 predict_step\n return self(x, training=False)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__\n input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:234 assert_input_compatibility\n raise ValueError('Input ' + str(input_index) + ' of layer ' +\n\n ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 28, 1)\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmy_lol_prediction_3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1627\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msteps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1628\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_predict_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1629\u001b[0;31m \u001b[0mtmp_batch_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1630\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshould_sync\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1631\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masync_wait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 826\u001b[0m \u001b[0mtracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 827\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtm\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 828\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 829\u001b[0m \u001b[0mcompiler\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"xla\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_experimental_compile\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"nonXla\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 830\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 860\u001b[0m \u001b[0;31m# In this case we have not created variables on the first call. So we can\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 861\u001b[0m \u001b[0;31m# run the first trace but we should fail if variables are created.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 862\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stateful_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 863\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_created_variables\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 864\u001b[0m raise ValueError(\"Creating variables on a non-first call to a function\"\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2939\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2940\u001b[0m (graph_function,\n\u001b[0;32m-> 2941\u001b[0;31m filtered_flat_args) = self._maybe_define_function(args, kwargs)\n\u001b[0m\u001b[1;32m 2942\u001b[0m return graph_function._call_flat(\n\u001b[1;32m 2943\u001b[0m filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_maybe_define_function\u001b[0;34m(self, args, kwargs)\u001b[0m\n\u001b[1;32m 3355\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minput_signature\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3356\u001b[0m call_context_key in self._function_cache.missed):\n\u001b[0;32m-> 3357\u001b[0;31m return self._define_function_with_shape_relaxation(\n\u001b[0m\u001b[1;32m 3358\u001b[0m args, kwargs, flat_args, filtered_flat_args, cache_key_context)\n\u001b[1;32m 3359\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_define_function_with_shape_relaxation\u001b[0;34m(self, args, kwargs, flat_args, filtered_flat_args, cache_key_context)\u001b[0m\n\u001b[1;32m 3277\u001b[0m expand_composites=True)\n\u001b[1;32m 3278\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3279\u001b[0;31m graph_function = self._create_graph_function(\n\u001b[0m\u001b[1;32m 3280\u001b[0m args, kwargs, override_flat_arg_shapes=relaxed_arg_shapes)\n\u001b[1;32m 3281\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_cache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marg_relaxed\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrank_only_cache_key\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_create_graph_function\u001b[0;34m(self, args, kwargs, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m 3194\u001b[0m \u001b[0marg_names\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase_arg_names\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmissing_arg_names\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3195\u001b[0m graph_function = ConcreteFunction(\n\u001b[0;32m-> 3196\u001b[0;31m func_graph_module.func_graph_from_py_func(\n\u001b[0m\u001b[1;32m 3197\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3198\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_python_function\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py\u001b[0m in \u001b[0;36mfunc_graph_from_py_func\u001b[0;34m(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m 988\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moriginal_func\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_decorator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpython_func\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 989\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 990\u001b[0;31m \u001b[0mfunc_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpython_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfunc_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfunc_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 991\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 992\u001b[0m \u001b[0;31m# invariant: `func_outputs` contains only Tensors, CompositeTensors,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36mwrapped_fn\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 632\u001b[0m \u001b[0mxla_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mExit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 633\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweak_wrapped_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__wrapped__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 635\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 975\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# pylint:disable=broad-except\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 976\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"ag_error_metadata\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 977\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mag_error_metadata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 978\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 979\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: in user code:\n\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1478 predict_function *\n return step_function(self, iterator)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1468 step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 run\n return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica\n return self._call_for_each_replica(fn, args, kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica\n return fn(*args, **kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1461 run_step **\n outputs = model.predict_step(data)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1434 predict_step\n return self(x, training=False)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__\n input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:234 assert_input_compatibility\n raise ValueError('Input ' + str(input_index) + ' of layer ' +\n\n ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 28, 1)\n" + ] + } + ], + "source": [ + "my_lol_prediction_3 = model.predict(X_train[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28, 28, 1)" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train[0].shape" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Segment/final.ipynb b/Segment/final.ipynb new file mode 100644 index 0000000..5c78c5c --- /dev/null +++ b/Segment/final.ipynb @@ -0,0 +1,1520 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "ImportError", + "evalue": "dlopen(/Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/_pywrap_tfe.so, 2): Library not loaded: @rpath/_pywrap_tensorflow_internal.so\n Referenced from: /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/_pywrap_tfe.so\n Reason: image not found", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpreprocessing\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mMinMaxScaler\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mtensorflow\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSequential\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlayers\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mDense\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0msys\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0m_sys\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtools\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_util\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0m_module_util\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlazy_loader\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mLazyLoader\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0m_LazyLoader\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpywrap_tensorflow\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0m_pywrap_tensorflow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meager\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0;31m# pylint: enable=wildcard-import\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/context.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprotobuf\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mconfig_pb2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprotobuf\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrewriter_config_pb2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpywrap_tfe\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtf2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclient\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpywrap_tf_session\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/pywrap_tfe.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;31m# pylint: disable=invalid-import-order,g-bad-import-order, wildcard-import, unused-import\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpywrap_tensorflow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpython\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_pywrap_tfe\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mImportError\u001b[0m: dlopen(/Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/_pywrap_tfe.so, 2): Library not loaded: @rpath/_pywrap_tensorflow_internal.so\n Referenced from: /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/_pywrap_tfe.so\n Reason: image not found" + ] + } + ], + "source": [ + "import numpy as np \n", + "import pandas as pd \n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import os\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "import tensorflow as tf\n", + "from keras.models import Sequential\n", + "from keras.layers import Dense\n", + "from keras.layers import Dropout\n", + "from keras.layers import Flatten\n", + "from keras.layers.convolutional import Conv2D\n", + "from keras.layers.convolutional import MaxPooling2D\n", + "from keras import backend as K\n", + "from keras.utils import np_utils\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix\n", + "\n", + "#ignore warning messages \n", + "import warnings\n", + "warnings.filterwarnings('ignore') \n", + "\n", + "sns.set()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "dataset = pd.read_csv(\"A_Z Handwritten Data.csv\").astype('float32')\n", + "dataset.rename(columns={'0':'label'}, inplace=True)\n", + "\n", + "# Splite data the X - Our data , and y - the prdict label\n", + "X = dataset.drop('label',axis = 1)\n", + "y = dataset['label']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Amount of each labels\n" + ] + }, + { + "data": { + "image/png": "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7dq1nuZt9SdnL7zwgnJzc3XIIYfooIMO0rhx47R69Wqvx/KNRx55RL///e+VmZkpSdq8ebOOPPJI9e/fX2lpaSosLNTq1av1ySefqLGxUccff7wkafLkyVq9erWampr0yiuvaNy4cXu9Lklr165VYWGhJGnixIl67rnn1NTUZP6XtEQ4HNacOXPUo0cPde/eXdnZ2froo4/I2yUnnXSS7r33XqWlpSkWi6m5uVk1NTXk7aJdu3Zp8eLFmjFjhiT+PnHTBx98IEk677zzdPrpp+v+++8nbxf97W9/04QJE9SvXz91795dixcvVs+ePT3N2+pyVlVVpXA43PJ1Zmamdu7c6eFE/vLHP/5Rw4cPb/m6tTz/+fVwOKydO3equrpa6enpSktL2+v1f36vtLQ0paen64svvjDxa1lp0KBBLf+zfvTRR3rqqacUCATI20Xdu3fXLbfcooKCAo0YMYI/3y679tprNWvWLPXu3VsSf5+4qaamRiNGjNBtt92me+65Rw899JA+/fRT8nbJ3//+dzU3N2vGjBmKRCJ68MEHPf/zbXU5SyaTCgQCLV87jrPX12if1vJs7fXvyru1/B3HUTBo9R8nI7Zv367zzjtPl19+ufr370/eLps5c6ZefPFFffbZZ/roo4/I2yXLly/X4YcfrhEjRrS8xt8n7jnhhBO0YMEChUIh9e3bV2eddZZuueUW8nZJc3OzXnzxRd144416+OGHtXnzZn388cee5p3Wgd/Hdf369dPGjRtbvo5Goy2X6NB+/fr12+tGxK/z/OfXP//8c2VmZqpv376qra1Vc3OzunXrtlf+mZmZ+vzzz9WvXz8lEgnV19frkEMOMf0rWeXVV1/VzJkzddVVV6mgoEAvv/wyebvk/fff1549ezRkyBD17NlTeXl5Wr16tbp169byPeTdeZ588klFo1FFIhF9+eWX2r17tz755BPydsnGjRvV1NTUUoYdx9ERRxzB3ycuOfTQQzVixAj17dtXknTaaad5/veJ1VX55JNP1osvvqgvvvhCDQ0Nqqio0CmnnOL1WL513HHH6cMPP2z5CPfxxx/XKaecoiOOOEIHHHCAXn31VUlSWVmZTjnlFHXv3l3Dhw/Xk08+KUlatWpVS/6nnnqqVq1aJemrv7iHDx+u7t27e/J72eCzzz7TRRddpEWLFqmgoEASebupsrJSxcXF2rNnj/bs2aNnnnlGU6ZMIW+X3H333Xr88cdVVlammTNnasyYMbrrrrvI2yW1tbVasGCB4vG46urq9Oijj+p3v/sdebtk9OjRWrdunWpqatTc3Kznn39e48eP9zTvgOM4jnu/cseVl5frjjvuUFNTk8466yxdcMEFXo/kO2PGjNG9996rrKwsvfjii5o7d67i8bhOPfVUXXnllQoEAnr77bdVXFysuro6DR06VHPnzlWPHj30ySefaM6cOYrFYjr88MN100036eCDD9auXbs0Z84cffzxxwqFQlq0aJGysrK8/lU9U1JSohUrVmjAgAEtr02ZMkU//OEPydslt956q5566il169ZNeXl5uvjii/nzbcDKlSv18ssva968eeTtoj/96U96+umnlUwmdfbZZ+vnP/85ebvor3/9q+655x41NTVp5MiRKi4u1oYNGzzL2/pyBgAAkEqsvqwJAACQaihnAAAAFqGcAQAAWIRyBgAAYBHKGQAAgEUoZwAAABahnAEAAFiEcgYAAGCR/wOFe/nRiV36tQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Amount of each labels\")\n", + "\n", + "# Change label to alphabets\n", + "alphabets_mapper = {0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G',7:'H',8:'I',9:'J',10:'K',11:'L',12:'M',13:'N',14:'O',15:'P',16:'Q',17:'R',18:'S',19:'T',20:'U',21:'V',22:'W',23:'X',24:'Y',25:'Z'} \n", + "dataset_alphabets = dataset.copy()\n", + "dataset['label'] = dataset['label'].map(alphabets_mapper)\n", + "\n", + "label_size = dataset.groupby('label').size()\n", + "label_size.plot.barh(figsize=(10,10))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# splite the data\n", + "X_train, X_test, y_train, y_test = train_test_split(X,y)\n", + "\n", + "# scale data\n", + "standard_scaler = MinMaxScaler()\n", + "standard_scaler.fit(X_train)\n", + "\n", + "X_train = standard_scaler.transform(X_train)\n", + "X_test = standard_scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')\n", + "X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')\n", + "\n", + "y_train = np_utils.to_categorical(y_train)\n", + "y_test = np_utils.to_categorical(y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/20\n", + "1092/1092 [==============================] - 156s 141ms/step - loss: 0.5139 - accuracy: 0.8566 - val_loss: 0.0949 - val_accuracy: 0.9747\n", + "Epoch 2/20\n", + "1092/1092 [==============================] - 137s 125ms/step - loss: 0.0984 - accuracy: 0.9732 - val_loss: 0.0700 - val_accuracy: 0.9804\n", + "Epoch 3/20\n", + "1092/1092 [==============================] - 129s 118ms/step - loss: 0.0716 - accuracy: 0.9797 - val_loss: 0.0579 - val_accuracy: 0.9837\n", + "Epoch 4/20\n", + "1092/1092 [==============================] - 129s 118ms/step - loss: 0.0559 - accuracy: 0.9842 - val_loss: 0.0496 - val_accuracy: 0.9861\n", + "Epoch 5/20\n", + "1092/1092 [==============================] - 160s 146ms/step - loss: 0.0469 - accuracy: 0.9862 - val_loss: 0.0476 - val_accuracy: 0.9867\n", + "Epoch 6/20\n", + "1092/1092 [==============================] - 144s 132ms/step - loss: 0.0406 - accuracy: 0.9881 - val_loss: 0.0456 - val_accuracy: 0.9866\n", + "Epoch 7/20\n", + "1092/1092 [==============================] - 177s 162ms/step - loss: 0.0339 - accuracy: 0.9896 - val_loss: 0.0390 - val_accuracy: 0.9891\n", + "Epoch 8/20\n", + "1092/1092 [==============================] - 131s 120ms/step - loss: 0.0294 - accuracy: 0.9910 - val_loss: 0.0363 - val_accuracy: 0.9896\n", + "Epoch 9/20\n", + "1092/1092 [==============================] - 116s 106ms/step - loss: 0.0262 - accuracy: 0.9920 - val_loss: 0.0358 - val_accuracy: 0.9901\n", + "Epoch 10/20\n", + "1092/1092 [==============================] - 131s 120ms/step - loss: 0.0227 - accuracy: 0.9928 - val_loss: 0.0357 - val_accuracy: 0.9897\n", + "Epoch 11/20\n", + "1092/1092 [==============================] - 111s 102ms/step - loss: 0.0199 - accuracy: 0.9936 - val_loss: 0.0325 - val_accuracy: 0.9911\n", + "Epoch 12/20\n", + "1092/1092 [==============================] - 113s 103ms/step - loss: 0.0176 - accuracy: 0.9940 - val_loss: 0.0324 - val_accuracy: 0.9912\n", + "Epoch 13/20\n", + "1092/1092 [==============================] - 113s 103ms/step - loss: 0.0165 - accuracy: 0.9943 - val_loss: 0.0300 - val_accuracy: 0.9925\n", + "Epoch 14/20\n", + "1092/1092 [==============================] - 113s 103ms/step - loss: 0.0156 - accuracy: 0.9946 - val_loss: 0.0313 - val_accuracy: 0.9923\n", + "Epoch 15/20\n", + "1092/1092 [==============================] - 113s 104ms/step - loss: 0.0138 - accuracy: 0.9954 - val_loss: 0.0284 - val_accuracy: 0.9932\n", + "Epoch 16/20\n", + "1092/1092 [==============================] - 112s 102ms/step - loss: 0.0129 - accuracy: 0.9956 - val_loss: 0.0279 - val_accuracy: 0.9936\n", + "Epoch 17/20\n", + "1092/1092 [==============================] - 112s 102ms/step - loss: 0.0122 - accuracy: 0.9957 - val_loss: 0.0305 - val_accuracy: 0.9932\n", + "Epoch 18/20\n", + "1092/1092 [==============================] - 112s 103ms/step - loss: 0.0115 - accuracy: 0.9961 - val_loss: 0.0292 - val_accuracy: 0.9932\n", + "Epoch 19/20\n", + "1092/1092 [==============================] - 115s 105ms/step - loss: 0.0114 - accuracy: 0.9960 - val_loss: 0.0294 - val_accuracy: 0.9937\n", + "Epoch 20/20\n", + "1092/1092 [==============================] - 116s 106ms/step - loss: 0.0111 - accuracy: 0.9961 - val_loss: 0.0275 - val_accuracy: 0.9943\n" + ] + } + ], + "source": [ + "cls = Sequential()\n", + "cls.add(Conv2D(32, (5, 5), input_shape=(28, 28, 1), activation='relu'))\n", + "cls.add(MaxPooling2D(pool_size=(2, 2)))\n", + "cls.add(Dropout(0.3))\n", + "cls.add(Flatten())\n", + "cls.add(Dense(128, activation='relu'))\n", + "cls.add(Dense(len(y.unique()), activation='softmax'))\n", + "\n", + "cls.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n", + "history = cls.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "cls.save('my_model.h5')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import PIL\n", + "from PIL import Image, ImageEnhance, ImageDraw, ImageFont\n", + "from IPython.display import display\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "img = Image.open('n_image copy.jpg')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACEAAAAoCAAAAABVgMx7AAACTElEQVR4nHWTy3LjNhBFDx96kLQzcpJJVaqySOX/v2syZc/IkvkmCJwsHEn2QnfXwMHtbqCBFyWTZ+dLOJmis5OZvGuhzEl5LLjp+Q8Ab1rCzcL0Lar25hf+dSaVeD2f/bnS8qMmu60x7vJbcN7t51QRNre16Vjlcxov4Zf9ajWRbnXA3/+uH4ryxcDDSa9EBUaXKzD7yhMussTJ4GqE2sV4RcJwAN/EYK/ftYHWcE3Ua8HhPUswaqCqqcfuahH1/bbKZCxDqmKR97gnXZrLQ/eQDVnX4Ggb1YLfMnC4eJw14wvKNJtcpgZWD9Uti/bTlvIkeu57IxUmnrh6jIPtL1uUtde1q/LCpB8fMq1SsZgXM7TNPkWyOHPIFhg4h+X/l0ow6aDUjydVfi06Q7BzNn77B5TO1pW/0DaufgX1fHSJDtKg2BuEPI7q8/yYsai2g06QKyE69tsMXV6S7YbN9mgY9Pgi7GbRk7tmY3dOLroUbDTOaU66NgT5oSkjC446dioPpEH159STKXo220ftPOuslOjkq6uym2SOlp8mPlGjxhS0RvPtshZU6TqucXV4zFbyrkxpepzAIL837W38wvtcRF+nHIyMAvZXoHNeGtBO+coiuikPwwdEF6lIYyc5is8ULL5dtk+r0Td2aKzBiMtTju0Hi9agbCFR00tM3cOk0+2fOHjszdjUsPfTv/2kdVOu9YDkdwBy12KA+T4x87JK2FHeIwoOfZKU362Dti5iirvsbhaKoi82ZPfrGOrvTdfvw/1uOR0wIxb/AetB2NNoPMSRAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import cv2" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_img = cv2.imread('n_image copy.jpg', cv2.IMREAD_GRAYSCALE)\n", + "my_lol_img = cv2.resize(my_lol_img, (28, 28))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize = (5,5))\n", + "plt.imshow(my_lol_img, cmap='gray')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[255, 255, 255, 255, 255, 255, 255, 253, 254, 254, 255, 244, 254,\n", + " 252, 255, 255, 255, 255, 255, 255, 251, 254, 254, 253, 250, 253,\n", + " 251, 254],\n", + " [255, 255, 255, 255, 255, 255, 254, 253, 253, 252, 252, 254, 252,\n", + " 254, 255, 255, 255, 255, 255, 255, 255, 241, 254, 253, 250, 255,\n", + " 250, 254],\n", + " [255, 255, 255, 255, 255, 255, 252, 242, 252, 250, 254, 254, 250,\n", + " 255, 255, 255, 255, 255, 255, 255, 254, 254, 249, 252, 247, 245,\n", + " 250, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 254, 248, 249, 254, 252, 253,\n", + " 252, 255, 255, 255, 255, 255, 255, 250, 250, 253, 248, 251, 253,\n", + " 250, 254],\n", + " [255, 255, 255, 255, 255, 255, 217, 18, 32, 176, 250, 254, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 255, 239, 254, 205, 22, 146,\n", + " 251, 255],\n", + " [253, 254, 253, 254, 254, 254, 229, 63, 0, 116, 243, 253, 252,\n", + " 254, 255, 255, 255, 255, 255, 255, 252, 253, 237, 7, 7, 141,\n", + " 249, 254],\n", + " [254, 252, 251, 251, 255, 237, 255, 171, 4, 1, 215, 254, 252,\n", + " 253, 255, 255, 255, 255, 255, 255, 250, 253, 249, 5, 5, 140,\n", + " 250, 255],\n", + " [254, 253, 252, 253, 253, 255, 210, 3, 8, 2, 8, 248, 248,\n", + " 255, 255, 255, 255, 255, 255, 255, 254, 254, 247, 3, 2, 111,\n", + " 239, 255],\n", + " [254, 250, 250, 250, 251, 255, 212, 3, 8, 4, 3, 100, 253,\n", + " 251, 255, 255, 255, 255, 255, 255, 249, 252, 244, 5, 7, 5,\n", + " 184, 254],\n", + " [248, 250, 254, 254, 251, 248, 9, 0, 130, 254, 45, 21, 233,\n", + " 255, 255, 255, 255, 255, 255, 255, 255, 254, 246, 200, 4, 2,\n", + " 177, 254],\n", + " [253, 249, 249, 249, 249, 133, 2, 47, 193, 254, 143, 8, 58,\n", + " 252, 255, 255, 255, 255, 255, 255, 252, 250, 253, 201, 7, 3,\n", + " 185, 255],\n", + " [253, 243, 255, 246, 251, 21, 0, 87, 255, 253, 249, 1, 15,\n", + " 113, 253, 255, 246, 253, 244, 250, 253, 254, 252, 205, 0, 4,\n", + " 183, 254],\n", + " [247, 254, 250, 252, 181, 13, 21, 149, 248, 253, 254, 242, 8,\n", + " 8, 147, 253, 253, 247, 249, 250, 251, 254, 250, 196, 15, 2,\n", + " 187, 255],\n", + " [252, 248, 252, 253, 50, 6, 42, 252, 251, 254, 254, 236, 156,\n", + " 6, 32, 205, 255, 252, 252, 250, 246, 254, 253, 200, 1, 2,\n", + " 187, 255],\n", + " [252, 253, 250, 214, 44, 2, 86, 252, 251, 243, 251, 254, 202,\n", + " 34, 3, 5, 229, 254, 250, 250, 254, 243, 239, 216, 35, 4,\n", + " 184, 254],\n", + " [244, 253, 252, 97, 4, 2, 252, 249, 250, 255, 249, 248, 254,\n", + " 217, 68, 7, 86, 253, 250, 253, 253, 254, 244, 250, 156, 2,\n", + " 186, 255],\n", + " [255, 251, 240, 89, 6, 249, 255, 251, 250, 246, 253, 255, 251,\n", + " 255, 115, 7, 1, 239, 253, 251, 245, 252, 252, 255, 160, 4,\n", + " 184, 254],\n", + " [252, 251, 142, 2, 4, 249, 255, 255, 255, 255, 255, 255, 255,\n", + " 254, 252, 156, 11, 21, 166, 254, 254, 249, 253, 254, 161, 6,\n", + " 185, 255],\n", + " [254, 252, 141, 12, 12, 239, 251, 255, 255, 255, 255, 255, 255,\n", + " 255, 252, 254, 13, 1, 77, 255, 254, 254, 240, 203, 12, 1,\n", + " 186, 253],\n", + " [250, 187, 2, 4, 203, 248, 252, 255, 255, 255, 255, 255, 255,\n", + " 252, 252, 252, 250, 86, 1, 81, 224, 247, 251, 205, 5, 6,\n", + " 184, 255],\n", + " [253, 175, 2, 3, 201, 255, 245, 255, 255, 255, 255, 255, 255,\n", + " 250, 249, 254, 252, 247, 133, 3, 38, 221, 253, 205, 5, 0,\n", + " 187, 253],\n", + " [254, 201, 38, 35, 215, 246, 254, 255, 255, 255, 255, 255, 255,\n", + " 254, 254, 248, 253, 252, 252, 157, 22, 1, 5, 162, 3, 4,\n", + " 181, 204],\n", + " [254, 253, 214, 221, 254, 255, 253, 255, 255, 255, 255, 255, 255,\n", + " 254, 254, 255, 252, 254, 249, 253, 193, 26, 4, 4, 4, 2,\n", + " 187, 172],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 253, 255, 17, 20, 11, 10,\n", + " 187, 254],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 250, 254, 243, 249, 203, 197,\n", + " 254, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 255, 245, 252, 254, 251, 249,\n", + " 252, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 252, 249, 246, 248, 251, 250,\n", + " 252, 255],\n", + " [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", + " 255, 255, 255, 255, 255, 255, 255, 253, 244, 250, 254, 252, 254,\n", + " 252, 255]], dtype=uint8)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_img" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28, 28)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_img.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_img = np.array(my_lol_img) / 255\n", + "my_lol_img = my_lol_img.reshape(-1, 28, 28, 1)\n", + "#y_train = np.array(y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [1. ],\n", + " [0.95686275],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.98431373],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.94509804],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.94901961],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.97647059],\n", + " [0.98823529],\n", + " [0.96862745],\n", + " [0.96078431],\n", + " [0.98039216],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.97254902],\n", + " [0.97647059],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.97254902],\n", + " [0.98431373],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.85098039],\n", + " [0.07058824],\n", + " [0.1254902 ],\n", + " [0.69019608],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.9372549 ],\n", + " [0.99607843],\n", + " [0.80392157],\n", + " [0.08627451],\n", + " [0.57254902],\n", + " [0.98431373],\n", + " [1. ]],\n", + "\n", + " [[0.99215686],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.89803922],\n", + " [0.24705882],\n", + " [0. ],\n", + " [0.45490196],\n", + " [0.95294118],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.92941176],\n", + " [0.02745098],\n", + " [0.02745098],\n", + " [0.55294118],\n", + " [0.97647059],\n", + " [0.99607843]],\n", + "\n", + " [[0.99607843],\n", + " [0.98823529],\n", + " [0.98431373],\n", + " [0.98431373],\n", + " [1. ],\n", + " [0.92941176],\n", + " [1. ],\n", + " [0.67058824],\n", + " [0.01568627],\n", + " [0.00392157],\n", + " [0.84313725],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.97647059],\n", + " [0.01960784],\n", + " [0.01960784],\n", + " [0.54901961],\n", + " [0.98039216],\n", + " [1. ]],\n", + "\n", + " [[0.99607843],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.82352941],\n", + " [0.01176471],\n", + " [0.03137255],\n", + " [0.00784314],\n", + " [0.03137255],\n", + " [0.97254902],\n", + " [0.97254902],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.96862745],\n", + " [0.01176471],\n", + " [0.00784314],\n", + " [0.43529412],\n", + " [0.9372549 ],\n", + " [1. ]],\n", + "\n", + " [[0.99607843],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.98431373],\n", + " [1. ],\n", + " [0.83137255],\n", + " [0.01176471],\n", + " [0.03137255],\n", + " [0.01568627],\n", + " [0.01176471],\n", + " [0.39215686],\n", + " [0.99215686],\n", + " [0.98431373],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.97647059],\n", + " [0.98823529],\n", + " [0.95686275],\n", + " [0.01960784],\n", + " [0.02745098],\n", + " [0.01960784],\n", + " [0.72156863],\n", + " [0.99607843]],\n", + "\n", + " [[0.97254902],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.98431373],\n", + " [0.97254902],\n", + " [0.03529412],\n", + " [0. ],\n", + " [0.50980392],\n", + " [0.99607843],\n", + " [0.17647059],\n", + " [0.08235294],\n", + " [0.91372549],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.96470588],\n", + " [0.78431373],\n", + " [0.01568627],\n", + " [0.00784314],\n", + " [0.69411765],\n", + " [0.99607843]],\n", + "\n", + " [[0.99215686],\n", + " [0.97647059],\n", + " [0.97647059],\n", + " [0.97647059],\n", + " [0.97647059],\n", + " [0.52156863],\n", + " [0.00784314],\n", + " [0.18431373],\n", + " [0.75686275],\n", + " [0.99607843],\n", + " [0.56078431],\n", + " [0.03137255],\n", + " [0.22745098],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.78823529],\n", + " [0.02745098],\n", + " [0.01176471],\n", + " [0.7254902 ],\n", + " [1. ]],\n", + "\n", + " [[0.99215686],\n", + " [0.95294118],\n", + " [1. ],\n", + " [0.96470588],\n", + " [0.98431373],\n", + " [0.08235294],\n", + " [0. ],\n", + " [0.34117647],\n", + " [1. ],\n", + " [0.99215686],\n", + " [0.97647059],\n", + " [0.00392157],\n", + " [0.05882353],\n", + " [0.44313725],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.96470588],\n", + " [0.99215686],\n", + " [0.95686275],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.80392157],\n", + " [0. ],\n", + " [0.01568627],\n", + " [0.71764706],\n", + " [0.99607843]],\n", + "\n", + " [[0.96862745],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [0.98823529],\n", + " [0.70980392],\n", + " [0.05098039],\n", + " [0.08235294],\n", + " [0.58431373],\n", + " [0.97254902],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.94901961],\n", + " [0.03137255],\n", + " [0.03137255],\n", + " [0.57647059],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [0.96862745],\n", + " [0.97647059],\n", + " [0.98039216],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [0.76862745],\n", + " [0.05882353],\n", + " [0.00784314],\n", + " [0.73333333],\n", + " [1. ]],\n", + "\n", + " [[0.98823529],\n", + " [0.97254902],\n", + " [0.98823529],\n", + " [0.99215686],\n", + " [0.19607843],\n", + " [0.02352941],\n", + " [0.16470588],\n", + " [0.98823529],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.9254902 ],\n", + " [0.61176471],\n", + " [0.02352941],\n", + " [0.1254902 ],\n", + " [0.80392157],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.96470588],\n", + " [0.99607843],\n", + " [0.99215686],\n", + " [0.78431373],\n", + " [0.00392157],\n", + " [0.00784314],\n", + " [0.73333333],\n", + " [1. ]],\n", + "\n", + " [[0.98823529],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.83921569],\n", + " [0.17254902],\n", + " [0.00784314],\n", + " [0.3372549 ],\n", + " [0.98823529],\n", + " [0.98431373],\n", + " [0.95294118],\n", + " [0.98431373],\n", + " [0.99607843],\n", + " [0.79215686],\n", + " [0.13333333],\n", + " [0.01176471],\n", + " [0.01960784],\n", + " [0.89803922],\n", + " [0.99607843],\n", + " [0.98039216],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.95294118],\n", + " [0.9372549 ],\n", + " [0.84705882],\n", + " [0.1372549 ],\n", + " [0.01568627],\n", + " [0.72156863],\n", + " [0.99607843]],\n", + "\n", + " [[0.95686275],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.38039216],\n", + " [0.01568627],\n", + " [0.00784314],\n", + " [0.98823529],\n", + " [0.97647059],\n", + " [0.98039216],\n", + " [1. ],\n", + " [0.97647059],\n", + " [0.97254902],\n", + " [0.99607843],\n", + " [0.85098039],\n", + " [0.26666667],\n", + " [0.02745098],\n", + " [0.3372549 ],\n", + " [0.99215686],\n", + " [0.98039216],\n", + " [0.99215686],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.95686275],\n", + " [0.98039216],\n", + " [0.61176471],\n", + " [0.00784314],\n", + " [0.72941176],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [0.98431373],\n", + " [0.94117647],\n", + " [0.34901961],\n", + " [0.02352941],\n", + " [0.97647059],\n", + " [1. ],\n", + " [0.98431373],\n", + " [0.98039216],\n", + " [0.96470588],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.98431373],\n", + " [1. ],\n", + " [0.45098039],\n", + " [0.02745098],\n", + " [0.00392157],\n", + " [0.9372549 ],\n", + " [0.99215686],\n", + " [0.98431373],\n", + " [0.96078431],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [1. ],\n", + " [0.62745098],\n", + " [0.01568627],\n", + " [0.72156863],\n", + " [0.99607843]],\n", + "\n", + " [[0.98823529],\n", + " [0.98431373],\n", + " [0.55686275],\n", + " [0.00784314],\n", + " [0.01568627],\n", + " [0.97647059],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.61176471],\n", + " [0.04313725],\n", + " [0.08235294],\n", + " [0.65098039],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.97647059],\n", + " [0.99215686],\n", + " [0.99607843],\n", + " [0.63137255],\n", + " [0.02352941],\n", + " [0.7254902 ],\n", + " [1. ]],\n", + "\n", + " [[0.99607843],\n", + " [0.98823529],\n", + " [0.55294118],\n", + " [0.04705882],\n", + " [0.04705882],\n", + " [0.9372549 ],\n", + " [0.98431373],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.05098039],\n", + " [0.00392157],\n", + " [0.30196078],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.94117647],\n", + " [0.79607843],\n", + " [0.04705882],\n", + " [0.00392157],\n", + " [0.72941176],\n", + " [0.99215686]],\n", + "\n", + " [[0.98039216],\n", + " [0.73333333],\n", + " [0.00784314],\n", + " [0.01568627],\n", + " [0.79607843],\n", + " [0.97254902],\n", + " [0.98823529],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.98039216],\n", + " [0.3372549 ],\n", + " [0.00392157],\n", + " [0.31764706],\n", + " [0.87843137],\n", + " [0.96862745],\n", + " [0.98431373],\n", + " [0.80392157],\n", + " [0.01960784],\n", + " [0.02352941],\n", + " [0.72156863],\n", + " [1. ]],\n", + "\n", + " [[0.99215686],\n", + " [0.68627451],\n", + " [0.00784314],\n", + " [0.01176471],\n", + " [0.78823529],\n", + " [1. ],\n", + " [0.96078431],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.97647059],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.96862745],\n", + " [0.52156863],\n", + " [0.01176471],\n", + " [0.14901961],\n", + " [0.86666667],\n", + " [0.99215686],\n", + " [0.80392157],\n", + " [0.01960784],\n", + " [0. ],\n", + " [0.73333333],\n", + " [0.99215686]],\n", + "\n", + " [[0.99607843],\n", + " [0.78823529],\n", + " [0.14901961],\n", + " [0.1372549 ],\n", + " [0.84313725],\n", + " [0.96470588],\n", + " [0.99607843],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [0.97254902],\n", + " [0.99215686],\n", + " [0.98823529],\n", + " [0.98823529],\n", + " [0.61568627],\n", + " [0.08627451],\n", + " [0.00392157],\n", + " [0.01960784],\n", + " [0.63529412],\n", + " [0.01176471],\n", + " [0.01568627],\n", + " [0.70980392],\n", + " [0.8 ]],\n", + "\n", + " [[0.99607843],\n", + " [0.99215686],\n", + " [0.83921569],\n", + " [0.86666667],\n", + " [0.99607843],\n", + " [1. ],\n", + " [0.99215686],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99607843],\n", + " [0.99607843],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.97647059],\n", + " [0.99215686],\n", + " [0.75686275],\n", + " [0.10196078],\n", + " [0.01568627],\n", + " [0.01568627],\n", + " [0.01568627],\n", + " [0.00784314],\n", + " [0.73333333],\n", + " [0.6745098 ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99215686],\n", + " [1. ],\n", + " [0.06666667],\n", + " [0.07843137],\n", + " [0.04313725],\n", + " [0.03921569],\n", + " [0.73333333],\n", + " [0.99607843]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.95294118],\n", + " [0.97647059],\n", + " [0.79607843],\n", + " [0.77254902],\n", + " [0.99607843],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.96078431],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.98431373],\n", + " [0.97647059],\n", + " [0.98823529],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.98823529],\n", + " [0.97647059],\n", + " [0.96470588],\n", + " [0.97254902],\n", + " [0.98431373],\n", + " [0.98039216],\n", + " [0.98823529],\n", + " [1. ]],\n", + "\n", + " [[1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [1. ],\n", + " [0.99215686],\n", + " [0.95686275],\n", + " [0.98039216],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [0.99607843],\n", + " [0.98823529],\n", + " [1. ]]]])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_img" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "import keras" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "model = keras.models.load_model('my_model.h5')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_prediction = model.predict(my_lol_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.1581924e-07, 4.1368559e-10, 6.4555923e-07, 2.2491538e-05,\n", + " 1.4397167e-12, 3.6010979e-15, 5.0695167e-11, 8.0478216e-08,\n", + " 3.4654861e-12, 6.4896874e-08, 1.4367749e-06, 8.8046843e-05,\n", + " 7.5111379e-06, 2.3038849e-01, 1.7430016e-06, 5.7561249e-09,\n", + " 4.5668517e-07, 4.1635683e-08, 5.5010565e-09, 1.1502559e-11,\n", + " 7.6300371e-01, 6.4844764e-03, 3.5521356e-07, 3.8272912e-08,\n", + " 2.2634480e-07, 2.1373243e-10]], dtype=float32)" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Largest element present in given array: 0.7630037\n" + ] + } + ], + "source": [ + "max = my_lol_prediction[0][0]; \n", + " \n", + "#Loop through the array \n", + "for i in range(0, len(my_lol_prediction[0])): \n", + " #Compare elements of array with max \n", + " if(my_lol_prediction[0][i] > max): \n", + " max = my_lol_prediction[0][i]; \n", + " \n", + "print(\"Largest element present in given array: \" + str(max)); " + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + } + ], + "source": [ + "for i in range(0, len(my_lol_prediction[0])):\n", + " if(my_lol_prediction[0][i] == max):\n", + " print(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.9999999418151907\n" + ] + } + ], + "source": [ + "mysum = 0\n", + "for i in range(0, len(my_lol_prediction[0])):\n", + " mysum = mysum + my_lol_prediction[0][i]\n", + "print(mysum)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "my_lol_prediction_2 = np_utils.to_categorical(my_lol_prediction)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.]]], dtype=float32)" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_lol_prediction_2" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "in user code:\n\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1478 predict_function *\n return step_function(self, iterator)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1468 step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 run\n return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica\n return self._call_for_each_replica(fn, args, kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica\n return fn(*args, **kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1461 run_step **\n outputs = model.predict_step(data)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1434 predict_step\n return self(x, training=False)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__\n input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:234 assert_input_compatibility\n raise ValueError('Input ' + str(input_index) + ' of layer ' +\n\n ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 28, 1)\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmy_lol_prediction_3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1627\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msteps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1628\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_predict_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1629\u001b[0;31m \u001b[0mtmp_batch_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1630\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshould_sync\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1631\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masync_wait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 826\u001b[0m \u001b[0mtracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 827\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtm\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 828\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 829\u001b[0m \u001b[0mcompiler\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"xla\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_experimental_compile\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"nonXla\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 830\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 860\u001b[0m \u001b[0;31m# In this case we have not created variables on the first call. So we can\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 861\u001b[0m \u001b[0;31m# run the first trace but we should fail if variables are created.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 862\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stateful_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 863\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_created_variables\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 864\u001b[0m raise ValueError(\"Creating variables on a non-first call to a function\"\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2939\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2940\u001b[0m (graph_function,\n\u001b[0;32m-> 2941\u001b[0;31m filtered_flat_args) = self._maybe_define_function(args, kwargs)\n\u001b[0m\u001b[1;32m 2942\u001b[0m return graph_function._call_flat(\n\u001b[1;32m 2943\u001b[0m filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_maybe_define_function\u001b[0;34m(self, args, kwargs)\u001b[0m\n\u001b[1;32m 3355\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minput_signature\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3356\u001b[0m call_context_key in self._function_cache.missed):\n\u001b[0;32m-> 3357\u001b[0;31m return self._define_function_with_shape_relaxation(\n\u001b[0m\u001b[1;32m 3358\u001b[0m args, kwargs, flat_args, filtered_flat_args, cache_key_context)\n\u001b[1;32m 3359\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_define_function_with_shape_relaxation\u001b[0;34m(self, args, kwargs, flat_args, filtered_flat_args, cache_key_context)\u001b[0m\n\u001b[1;32m 3277\u001b[0m expand_composites=True)\n\u001b[1;32m 3278\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3279\u001b[0;31m graph_function = self._create_graph_function(\n\u001b[0m\u001b[1;32m 3280\u001b[0m args, kwargs, override_flat_arg_shapes=relaxed_arg_shapes)\n\u001b[1;32m 3281\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_function_cache\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marg_relaxed\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrank_only_cache_key\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgraph_function\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_create_graph_function\u001b[0;34m(self, args, kwargs, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m 3194\u001b[0m \u001b[0marg_names\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase_arg_names\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmissing_arg_names\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3195\u001b[0m graph_function = ConcreteFunction(\n\u001b[0;32m-> 3196\u001b[0;31m func_graph_module.func_graph_from_py_func(\n\u001b[0m\u001b[1;32m 3197\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3198\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_python_function\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py\u001b[0m in \u001b[0;36mfunc_graph_from_py_func\u001b[0;34m(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes)\u001b[0m\n\u001b[1;32m 988\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moriginal_func\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_decorator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpython_func\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 989\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 990\u001b[0;31m \u001b[0mfunc_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpython_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfunc_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfunc_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 991\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 992\u001b[0m \u001b[0;31m# invariant: `func_outputs` contains only Tensors, CompositeTensors,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36mwrapped_fn\u001b[0;34m(*args, **kwds)\u001b[0m\n\u001b[1;32m 632\u001b[0m \u001b[0mxla_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mExit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 633\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mweak_wrapped_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__wrapped__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 635\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 636\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 975\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# pylint:disable=broad-except\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 976\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"ag_error_metadata\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 977\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mag_error_metadata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 978\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 979\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: in user code:\n\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1478 predict_function *\n return step_function(self, iterator)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1468 step_function **\n outputs = model.distribute_strategy.run(run_step, args=(data,))\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 run\n return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica\n return self._call_for_each_replica(fn, args, kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica\n return fn(*args, **kwargs)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1461 run_step **\n outputs = model.predict_step(data)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:1434 predict_step\n return self(x, training=False)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/base_layer.py:998 __call__\n input_spec.assert_input_compatibility(self.input_spec, inputs, self.name)\n /Users/nishanthkrishna/opt/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/input_spec.py:234 assert_input_compatibility\n raise ValueError('Input ' + str(input_index) + ' of layer ' +\n\n ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: (None, 28, 1)\n" + ] + } + ], + "source": [ + "my_lol_prediction_3 = model.predict(X_train[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28, 28, 1)" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train[0].shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Segment/final_img.png b/Segment/final_img.png new file mode 100644 index 0000000..743d8a1 Binary files /dev/null and b/Segment/final_img.png differ diff --git a/Segment/line_img.png b/Segment/line_img.png new file mode 100644 index 0000000..fa8b22b Binary files /dev/null and b/Segment/line_img.png differ diff --git a/Segment/mo_img.png b/Segment/mo_img.png new file mode 100644 index 0000000..8430476 Binary files /dev/null and b/Segment/mo_img.png differ diff --git a/Segment/my_model.h5 b/Segment/my_model.h5 new file mode 100644 index 0000000..ce2c242 Binary files /dev/null and b/Segment/my_model.h5 differ diff --git a/Segment/n_image copy.jpg b/Segment/n_image copy.jpg new file mode 100644 index 0000000..bc79a32 Binary files /dev/null and b/Segment/n_image copy.jpg differ diff --git a/Segment/segment.ipynb b/Segment/segment.ipynb new file mode 100644 index 0000000..93de424 --- /dev/null +++ b/Segment/segment.ipynb @@ -0,0 +1,2151 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "import PIL\n", + "from PIL import Image, ImageEnhance, ImageDraw, ImageFont\n", + "from IPython.display import display\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "img = Image.open('download.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGL/B+lRp33ljIYMAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(img)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(659, 821)" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img.size" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAEkUlEQVR4nO3dTahncxzH8fc8mRlPwxRD5KFEmoUixEJhYaFsLCgpSyvZyM5WFmIjG6VYEbEhZUk2wk4mC0rIw3jIs2GuxTnX+V+PY+5c/2O8XvXrnu7/nF/ff7f76XfO//f7/QsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4E1dXt1Y7ll0IwF85u/qsWqluWXItMEubl10AvzquaWS1e5mFwFwJrPn4pvp6PP5smYXAXAms+fhhbDUFF7BAYM3H1rFVHbPMQmCuBNZ8bB9bDc+zgN8QWPPxzdiqPl9mITBXAms+to2tppEWsEBgzcdiYO1cZiEwVwJrnjYtuwCYI4E1H6Y1wN8QWPOxeEtoLSH8AYE1Hx66w98QWPNxYGw13RoCCwTWfGwZW00z3oEF/jHm47uxnVx9+Rfn7WpaxnOw4RPFbdVH1U8bXCMslcCaj51N8692/ea13dWV1bXVDeN525oCa3u1r3qlenL8CbBhzmtYkrNS3VZdWN1dPVK9M/5+tb1ffVp9XH3SMA1i9bUD1X1ZQA1soDOrD6ufqyeawmu1vVbdU13VMOI6rTq12lOdVd1cPbVw/jPVCf/qOwD+N86t9rc2pN5qCKlrOrSpDlsaRmUHx+sfyG0/sAEuq75tCqvnq72H2dfjYx8Hq0uPSHUACx5sCqsXq+PX0dcFTeF3/7org5kwD2setjY8ZK/6qrqj9a0n/GLhereEHDUE1jzsqS4ej/dXH6yzv00Nt4M1zZ6H/zyBNQ+rz5tq7d7uh+vnhWMjLI4aAmseNjcty/m+tYFzOM5tmtLw0Tr7gtkQWPOxumnfltb/d7mxOnY8fm6dfQGscUbDrPWV6o3W9605FzWMqlYaJpLabhk4os5oWGKzUr1ZnXiY/ZxTPd00PeKKI1EcwKI91XsNIbOv3y9+PhQ3NXy6uBpWD2d0BWyA0xvWEa4ux/kngbW1urdpOc7+6vY8nwQ2yI7qpYbA+bA65RCvu7x6tmlU9Xh1/gbUB7DGo00jpMUR1qaG0dLmhj2w9lbXjecfGK/5vroroyqOciYVzser1a0N28rc2bD76LENOzUc03DLd3zDCGp154ZvG4Lrserlf7dc4P/qpOrt1m4t82ftk+r16qHqkiXUCkvjG4bnYVN1fcP2xzV9qerWhoXML1Q/Noy43m3a6A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAID/iF8AkNOhqHDllTIAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "re_img = img.resize((300,300))\n", + "re_img.save('mo_img.png')\n", + "mo_img = Image.open('mo_img.png')\n", + "display(mo_img)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import asarray" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "data = asarray(mo_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(300, 300, 4)" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]],\n", + "\n", + " [[0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]],\n", + "\n", + " [[0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]],\n", + "\n", + " ...,\n", + "\n", + " [[0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]],\n", + "\n", + " [[0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]],\n", + "\n", + " [[0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]]], dtype=uint8)" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "data_1 = data" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import sum" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "index 74 is out of bounds for axis 0 with size 74", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mmy_list\u001b[0m \u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m300\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mmy_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m: index 74 is out of bounds for axis 0 with size 74" + ] + } + ], + "source": [ + "my_list =[]\n", + "for i in range(300): \n", + " my_list.append((sum(data_1[i])))" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.6509803921568628,\n", + " 2.411764705882353,\n", + " 2.556862745098039,\n", + " 2.396078431372549,\n", + " 2.2941176470588234,\n", + " 2.3490196078431373,\n", + " 2.447058823529412,\n", + " 2.2941176470588234,\n", + " 2.3607843137254902,\n", + " 2.4352941176470586,\n", + " 2.43921568627451,\n", + " 2.3372549019607844,\n", + " 2.407843137254902,\n", + " 2.4745098039215687,\n", + " 2.407843137254902,\n", + " 2.447058823529412,\n", + " 2.831372549019608,\n", + " 10.427450980392157,\n", + " 15.733333333333333,\n", + " 12.364705882352942,\n", + " 8.737254901960783,\n", + " 6.901960784313726,\n", + " 6.015686274509804,\n", + " 5.427450980392157,\n", + " 5.513725490196078,\n", + " 5.537254901960784,\n", + " 5.603921568627451,\n", + " 5.698039215686275,\n", + " 5.686274509803922,\n", + " 5.949019607843137,\n", + " 6.76078431372549,\n", + " 6.796078431372549,\n", + " 6.47843137254902,\n", + " 7.145098039215687,\n", + " 11.647058823529411,\n", + " 12.435294117647059,\n", + " 4.474509803921569,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0,\n", + " 0.0]" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_list" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [], + "source": [ + "my_rows = []\n", + "for i in range(300):\n", + " my_rows.append(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 1,\n", + " 2,\n", + " 3,\n", + " 4,\n", + " 5,\n", + " 6,\n", + " 7,\n", + " 8,\n", + " 9,\n", + " 10,\n", + " 11,\n", + " 12,\n", + " 13,\n", + " 14,\n", + " 15,\n", + " 16,\n", + " 17,\n", + " 18,\n", + " 19,\n", + " 20,\n", + " 21,\n", + " 22,\n", + " 23,\n", + " 24,\n", + " 25,\n", + " 26,\n", + " 27,\n", + " 28,\n", + " 29,\n", + " 30,\n", + " 31,\n", + " 32,\n", + " 33,\n", + " 34,\n", + " 35,\n", + " 36,\n", + " 37,\n", + " 38,\n", + " 39,\n", + " 40,\n", + " 41,\n", + " 42,\n", + " 43,\n", + " 44,\n", + " 45,\n", + " 46,\n", + " 47,\n", + " 48,\n", + " 49,\n", + " 50,\n", + " 51,\n", + " 52,\n", + " 53,\n", + " 54,\n", + " 55,\n", + " 56,\n", + " 57,\n", + " 58,\n", + " 59,\n", + " 60,\n", + " 61,\n", + " 62,\n", + " 63,\n", + " 64,\n", + " 65,\n", + " 66,\n", + " 67,\n", + " 68,\n", + " 69,\n", + " 70,\n", + " 71,\n", + " 72,\n", + " 73,\n", + " 74,\n", + " 75,\n", + " 76,\n", + " 77,\n", + " 78,\n", + " 79,\n", + " 80,\n", + " 81,\n", + " 82,\n", + " 83,\n", + " 84,\n", + " 85,\n", + " 86,\n", + " 87,\n", + " 88,\n", + " 89,\n", + " 90,\n", + " 91,\n", + " 92,\n", + " 93,\n", + " 94,\n", + " 95,\n", + " 96,\n", + " 97,\n", + " 98,\n", + " 99,\n", + " 100,\n", + " 101,\n", + " 102,\n", + " 103,\n", + " 104,\n", + " 105,\n", + " 106,\n", + " 107,\n", + " 108,\n", + " 109,\n", + " 110,\n", + " 111,\n", + " 112,\n", + " 113,\n", + " 114,\n", + " 115,\n", + " 116,\n", + " 117,\n", + " 118,\n", + " 119,\n", + " 120,\n", + " 121,\n", + " 122,\n", + " 123,\n", + " 124,\n", + " 125,\n", + " 126,\n", + " 127,\n", + " 128,\n", + " 129,\n", + " 130,\n", + " 131,\n", + " 132,\n", + " 133,\n", + " 134,\n", + " 135,\n", + " 136,\n", + " 137,\n", + " 138,\n", + " 139,\n", + " 140,\n", + " 141,\n", + " 142,\n", + " 143,\n", + " 144,\n", + " 145,\n", + " 146,\n", + " 147,\n", + " 148,\n", + " 149,\n", + " 150,\n", + " 151,\n", + " 152,\n", + " 153,\n", + " 154,\n", + " 155,\n", + " 156,\n", + " 157,\n", + " 158,\n", + " 159,\n", + " 160,\n", + " 161,\n", + " 162,\n", + " 163,\n", + " 164,\n", + " 165,\n", + " 166,\n", + " 167,\n", + " 168,\n", + " 169,\n", + " 170,\n", + " 171,\n", + " 172,\n", + " 173,\n", + " 174,\n", + " 175,\n", + " 176,\n", + " 177,\n", + " 178,\n", + " 179,\n", + " 180,\n", + " 181,\n", + " 182,\n", + " 183,\n", + " 184,\n", + " 185,\n", + " 186,\n", + " 187,\n", + " 188,\n", + " 189,\n", + " 190,\n", + " 191,\n", + " 192,\n", + " 193,\n", + " 194,\n", + " 195,\n", + " 196,\n", + " 197,\n", + " 198,\n", + " 199,\n", + " 200,\n", + " 201,\n", + " 202,\n", + " 203,\n", + " 204,\n", + " 205,\n", + " 206,\n", + " 207,\n", + " 208,\n", + " 209,\n", + " 210,\n", + " 211,\n", + " 212,\n", + " 213,\n", + " 214,\n", + " 215,\n", + " 216,\n", + " 217,\n", + " 218,\n", + " 219,\n", + " 220,\n", + " 221,\n", + " 222,\n", + " 223,\n", + " 224,\n", + " 225,\n", + " 226,\n", + " 227,\n", + " 228,\n", + " 229,\n", + " 230,\n", + " 231,\n", + " 232,\n", + " 233,\n", + " 234,\n", + " 235,\n", + " 236,\n", + " 237,\n", + " 238,\n", + " 239,\n", + " 240,\n", + " 241,\n", + " 242,\n", + " 243,\n", + " 244,\n", + " 245,\n", + " 246,\n", + " 247,\n", + " 248,\n", + " 249,\n", + " 250,\n", + " 251,\n", + " 252,\n", + " 253,\n", + " 254,\n", + " 255,\n", + " 256,\n", + " 257,\n", + " 258,\n", + " 259,\n", + " 260,\n", + " 261,\n", + " 262,\n", + " 263,\n", + " 264,\n", + " 265,\n", + " 266,\n", + " 267,\n", + " 268,\n", + " 269,\n", + " 270,\n", + " 271,\n", + " 272,\n", + " 273,\n", + " 274,\n", + " 275,\n", + " 276,\n", + " 277,\n", + " 278,\n", + " 279,\n", + " 280,\n", + " 281,\n", + " 282,\n", + " 283,\n", + " 284,\n", + " 285,\n", + " 286,\n", + " 287,\n", + " 288,\n", + " 289,\n", + " 290,\n", + " 291,\n", + " 292,\n", + " 293,\n", + " 294,\n", + " 295,\n", + " 296,\n", + " 297,\n", + " 298,\n", + " 299]" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_rows" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(my_rows,my_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAAlCAYAAAD4BdQJAAADRElEQVR4nO3dT6imUxwH8M/9N/8MwxSXRpgSaRaKEAuFhYWysaA0ZWklG9nZykJsZKOUWRGxIWVJNsJOJgtKTGPcQcwYrrnX4jyv87yDmeu+953nuPf7qdN9uu/znH5vt/vtPM97znmJltyFg9gxdCEREWdzNY5jFQ8PXEtEk2aHLiD+coE6sto7ZCERrUpgteMEfumOjw9ZSESrEljt+K1r1OCKiJ4EVjvmuwbbhiwkolUJrHZs7xrleVZEnCGB1Y4TXYMfhiwkolUJrHYsdI060oqIngRWO/qBtXPIQiJalcBq08zQBUS0KIHVjkxriDiHBFY7+reEWUsY8Q8SWO3IQ/eIc0hgtWO5a9Rbw4joSWC1Y65r1BnvEdGTf4x2/Nq1S/DTWc7boy7jWVE+UVzAUfwx5RojBpXAasdOdf7VnjNe24s7cA/u785bUANrOw7jQ7zW/YyImJprlSU5q3gEN+BJvIQvu9+P2jf4Ht/hmDINYvTaMp6RBdQRMUVX4ghO41U1vEbtYzyFO5UR1+W4DIu4Cg/h9d75b+LC8/oOImLL2I8l4yH1uRJSd1vbVIc5ZVS20l3/nNz2R8QU3IqTali9gwPr7OtQ18cKbtmQ6iIiep5Xw+o97J6gr+vV8Ht24soiGpF5WG2YVx6yw894zGTrCX/sXZ9bwtg0ElhtWMRN3fESvp2wvxnldpA6ez7ify+B1YbR8ybG93Zfr9O944ywYtNIYLVhVl2Wc8p44KzHfnVKw9EJ+4poRgKrHaNN++ZM/nd5ALu647cn7CsiYsw+Zdb6Kj412bfm3KiMqlaViaTZbjkiNtQ+ZYnNKj7DRevs5xq8oU6PuH0jiouI6FvE10rIHPb3xc9r8aDy6eIorF6U0VVETMEVyjrC0XKc/xJY83haXY6zhEfl+WRETMkOvK8EzhFcusbrbsNb6qjqEK6bQn0REWNeVkdI/RHWjDJamlX2wDqAe7vzl7trTuEJGVXFJpdJhe34CAeVbWUeV3Yf3aXs1LBNueXbrYygRjs3nFSC6xV8cH7LjYit6mJ8YXxrmX9rx/AJXsDNA9QaMZh8w3AbZnCfsv0x9UtV55WFzO/id2XE9ZW60V/ElvIncpyhqMfjzQ0AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(mo_img.crop((0,39,300,76)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "def getRow(mylist):\n", + " i=0\n", + " while(mylist[i]==0.0):\n", + " i=i+1\n", + " print(i)\n", + " j=i\n", + " while(mylist[j]!=0.0):\n", + " j=j+1\n", + " print(j)" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "39\n", + "76\n" + ] + } + ], + "source": [ + "getRow(my_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "line_img = mo_img.crop((0,39,300,76))" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(300, 37)" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "line_img.size" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAAlCAYAAAD4BdQJAAADRElEQVR4nO3dT6imUxwH8M/9N/8MwxSXRpgSaRaKEAuFhYWysaA0ZWklG9nZykJsZKOUWRGxIWVJNsJOJgtKTGPcQcwYrrnX4jyv87yDmeu+953nuPf7qdN9uu/znH5vt/vtPM97znmJltyFg9gxdCEREWdzNY5jFQ8PXEtEk2aHLiD+coE6sto7ZCERrUpgteMEfumOjw9ZSESrEljt+K1r1OCKiJ4EVjvmuwbbhiwkolUJrHZs7xrleVZEnCGB1Y4TXYMfhiwkolUJrHYsdI060oqIngRWO/qBtXPIQiJalcBq08zQBUS0KIHVjkxriDiHBFY7+reEWUsY8Q8SWO3IQ/eIc0hgtWO5a9Rbw4joSWC1Y65r1BnvEdGTf4x2/Nq1S/DTWc7boy7jWVE+UVzAUfwx5RojBpXAasdOdf7VnjNe24s7cA/u785bUANrOw7jQ7zW/YyImJprlSU5q3gEN+BJvIQvu9+P2jf4Ht/hmDINYvTaMp6RBdQRMUVX4ghO41U1vEbtYzyFO5UR1+W4DIu4Cg/h9d75b+LC8/oOImLL2I8l4yH1uRJSd1vbVIc5ZVS20l3/nNz2R8QU3IqTali9gwPr7OtQ18cKbtmQ6iIiep5Xw+o97J6gr+vV8Ht24soiGpF5WG2YVx6yw894zGTrCX/sXZ9bwtg0ElhtWMRN3fESvp2wvxnldpA6ez7ify+B1YbR8ybG93Zfr9O944ywYtNIYLVhVl2Wc8p44KzHfnVKw9EJ+4poRgKrHaNN++ZM/nd5ALu647cn7CsiYsw+Zdb6Kj412bfm3KiMqlaViaTZbjkiNtQ+ZYnNKj7DRevs5xq8oU6PuH0jiouI6FvE10rIHPb3xc9r8aDy6eIorF6U0VVETMEVyjrC0XKc/xJY83haXY6zhEfl+WRETMkOvK8EzhFcusbrbsNb6qjqEK6bQn0REWNeVkdI/RHWjDJamlX2wDqAe7vzl7trTuEJGVXFJpdJhe34CAeVbWUeV3Yf3aXs1LBNueXbrYygRjs3nFSC6xV8cH7LjYit6mJ8YXxrmX9rx/AJXsDNA9QaMZh8w3AbZnCfsv0x9UtV55WFzO/id2XE9ZW60V/ElvIncpyhqMfjzQ0AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "line_img" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [], + "source": [ + "line_img.save('line_img.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# word segmentation starts" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAAlCAYAAAD4BdQJAAADRElEQVR4nO3dT6imUxwH8M/9N/8MwxSXRpgSaRaKEAuFhYWysaA0ZWklG9nZykJsZKOUWRGxIWVJNsJOJgtKTGPcQcwYrrnX4jyv87yDmeu+953nuPf7qdN9uu/znH5vt/vtPM97znmJltyFg9gxdCEREWdzNY5jFQ8PXEtEk2aHLiD+coE6sto7ZCERrUpgteMEfumOjw9ZSESrEljt+K1r1OCKiJ4EVjvmuwbbhiwkolUJrHZs7xrleVZEnCGB1Y4TXYMfhiwkolUJrHYsdI060oqIngRWO/qBtXPIQiJalcBq08zQBUS0KIHVjkxriDiHBFY7+reEWUsY8Q8SWO3IQ/eIc0hgtWO5a9Rbw4joSWC1Y65r1BnvEdGTf4x2/Nq1S/DTWc7boy7jWVE+UVzAUfwx5RojBpXAasdOdf7VnjNe24s7cA/u785bUANrOw7jQ7zW/YyImJprlSU5q3gEN+BJvIQvu9+P2jf4Ht/hmDINYvTaMp6RBdQRMUVX4ghO41U1vEbtYzyFO5UR1+W4DIu4Cg/h9d75b+LC8/oOImLL2I8l4yH1uRJSd1vbVIc5ZVS20l3/nNz2R8QU3IqTali9gwPr7OtQ18cKbtmQ6iIiep5Xw+o97J6gr+vV8Ht24soiGpF5WG2YVx6yw894zGTrCX/sXZ9bwtg0ElhtWMRN3fESvp2wvxnldpA6ez7ify+B1YbR8ybG93Zfr9O944ywYtNIYLVhVl2Wc8p44KzHfnVKw9EJ+4poRgKrHaNN++ZM/nd5ALu647cn7CsiYsw+Zdb6Kj412bfm3KiMqlaViaTZbjkiNtQ+ZYnNKj7DRevs5xq8oU6PuH0jiouI6FvE10rIHPb3xc9r8aDy6eIorF6U0VVETMEVyjrC0XKc/xJY83haXY6zhEfl+WRETMkOvK8EzhFcusbrbsNb6qjqEK6bQn0REWNeVkdI/RHWjDJamlX2wDqAe7vzl7trTuEJGVXFJpdJhe34CAeVbWUeV3Yf3aXs1LBNueXbrYygRjs3nFSC6xV8cH7LjYit6mJ8YXxrmX9rx/AJXsDNA9QaMZh8w3AbZnCfsv0x9UtV55WFzO/id2XE9ZW60V/ElvIncpyhqMfjzQ0AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "line_img" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import asarray" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [], + "source": [ + "data = asarray(line_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(37, 300, 4)" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 1,\n", + " 2,\n", + " 3,\n", + " 4,\n", + " 5,\n", + " 6,\n", + " 7,\n", + " 8,\n", + " 9,\n", + " 10,\n", + " 11,\n", + " 12,\n", + " 13,\n", + " 14,\n", + " 15,\n", + " 16,\n", + " 17,\n", + " 18,\n", + " 19,\n", + " 20,\n", + " 21,\n", + " 22,\n", + " 23,\n", + " 24,\n", + " 25,\n", + " 26,\n", + " 27,\n", + " 28,\n", + " 29,\n", + " 30,\n", + " 31,\n", + " 32,\n", + " 33,\n", + " 34,\n", + " 35,\n", + " 36,\n", + " 37,\n", + " 38,\n", + " 39,\n", + " 40,\n", + " 41,\n", + " 42,\n", + " 43,\n", + " 44,\n", + " 45,\n", + " 46,\n", + " 47,\n", + " 48,\n", + " 49,\n", + " 50,\n", + " 51,\n", + " 52,\n", + " 53,\n", + " 54,\n", + " 55,\n", + " 56,\n", + " 57,\n", + " 58,\n", + " 59,\n", + " 60,\n", + " 61,\n", + " 62,\n", + " 63,\n", + " 64,\n", + " 65,\n", + " 66,\n", + " 67,\n", + " 68,\n", + " 69,\n", + " 70,\n", + " 71,\n", + " 72,\n", + " 73,\n", + " 74,\n", + " 75,\n", + " 76,\n", + " 77,\n", + " 78,\n", + " 79,\n", + " 80,\n", + " 81,\n", + " 82,\n", + " 83,\n", + " 84,\n", + " 85,\n", + " 86,\n", + " 87,\n", + " 88,\n", + " 89,\n", + " 90,\n", + " 91,\n", + " 92,\n", + " 93,\n", + " 94,\n", + " 95,\n", + " 96,\n", + " 97,\n", + " 98,\n", + " 99,\n", + " 100,\n", + " 101,\n", + " 102,\n", + " 103,\n", + " 104,\n", + " 105,\n", + " 106,\n", + " 107,\n", + " 108,\n", + " 109,\n", + " 110,\n", + " 111,\n", + " 112,\n", + " 113,\n", + " 114,\n", + " 115,\n", + " 116,\n", + " 117,\n", + " 118,\n", + " 119,\n", + " 120,\n", + " 121,\n", + " 122,\n", + " 123,\n", + " 124,\n", + " 125,\n", + " 126,\n", + " 127,\n", + " 128,\n", + " 129,\n", + " 130,\n", + " 131,\n", + " 132,\n", + " 133,\n", + " 134,\n", + " 135,\n", + " 136,\n", + " 137,\n", + " 138,\n", + " 139,\n", + " 140,\n", + " 141,\n", + " 142,\n", + " 143,\n", + " 144,\n", + " 145,\n", + " 146,\n", + " 147,\n", + " 148,\n", + " 149,\n", + " 150,\n", + " 151,\n", + " 152,\n", + " 153,\n", + " 154,\n", + " 155,\n", + " 156,\n", + " 157,\n", + " 158,\n", + " 159,\n", + " 160,\n", + " 161,\n", + " 162,\n", + " 163,\n", + " 164,\n", + " 165,\n", + " 166,\n", + " 167,\n", + " 168,\n", + " 169,\n", + " 170,\n", + " 171,\n", + " 172,\n", + " 173,\n", + " 174,\n", + " 175,\n", + " 176,\n", + " 177,\n", + " 178,\n", + " 179,\n", + " 180,\n", + " 181,\n", + " 182,\n", + " 183,\n", + " 184,\n", + " 185,\n", + " 186,\n", + " 187,\n", + " 188,\n", + " 189,\n", + " 190,\n", + " 191,\n", + " 192,\n", + " 193,\n", + " 194,\n", + " 195,\n", + " 196,\n", + " 197,\n", + " 198,\n", + " 199,\n", + " 200,\n", + " 201,\n", + " 202,\n", + " 203,\n", + " 204,\n", + " 205,\n", + " 206,\n", + " 207,\n", + " 208,\n", + " 209,\n", + " 210,\n", + " 211,\n", + " 212,\n", + " 213,\n", + " 214,\n", + " 215,\n", + " 216,\n", + " 217,\n", + " 218,\n", + " 219,\n", + " 220,\n", + " 221,\n", + " 222,\n", + " 223,\n", + " 224,\n", + " 225,\n", + " 226,\n", + " 227,\n", + " 228,\n", + " 229,\n", + " 230,\n", + " 231,\n", + " 232,\n", + " 233,\n", + " 234,\n", + " 235,\n", + " 236,\n", + " 237,\n", + " 238,\n", + " 239,\n", + " 240,\n", + " 241,\n", + " 242,\n", + " 243,\n", + " 244,\n", + " 245,\n", + " 246,\n", + " 247,\n", + " 248,\n", + " 249,\n", + " 250,\n", + " 251,\n", + " 252,\n", + " 253,\n", + " 254,\n", + " 255,\n", + " 256,\n", + " 257,\n", + " 258,\n", + " 259,\n", + " 260,\n", + " 261,\n", + " 262,\n", + " 263,\n", + " 264,\n", + " 265,\n", + " 266,\n", + " 267,\n", + " 268,\n", + " 269,\n", + " 270,\n", + " 271,\n", + " 272,\n", + " 273,\n", + " 274,\n", + " 275,\n", + " 276,\n", + " 277,\n", + " 278,\n", + " 279,\n", + " 280,\n", + " 281,\n", + " 282,\n", + " 283,\n", + " 284,\n", + " 285,\n", + " 286,\n", + " 287,\n", + " 288,\n", + " 289,\n", + " 290,\n", + " 291,\n", + " 292,\n", + " 293,\n", + " 294,\n", + " 295,\n", + " 296,\n", + " 297,\n", + " 298,\n", + " 299]" + ] + }, + "execution_count": 166, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_cols = []\n", + "for i in range(300):\n", + " my_cols.append(i)\n", + "my_cols\n" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(37, 300, 4)" + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "data_1=data.reshape(74,600)" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(data_1)" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 0, 0, 34], dtype=uint8)" + ] + }, + "execution_count": 196, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[10][98]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 219, + "metadata": {}, + "outputs": [], + "source": [ + "my_col_list =[]\n", + "for j in range(300):\n", + " for i in range(37):\n", + " col_list_1=[]\n", + " col_list_1.append(data[i][j][3])\n", + " my_col_list.append((sum(col_list_1)))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 1,\n", + " 76,\n", + " 154,\n", + " 154,\n", + " 147,\n", + " 140,\n", + " 144,\n", + " 128,\n", + " 56,\n", + " 50,\n", + " 60,\n", + " 28,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0]" + ] + }, + "execution_count": 220, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_col_list" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 202, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(my_cols,my_col_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": {}, + "outputs": [], + "source": [ + "def getCol(mylist):\n", + " i=0\n", + " while(mylist[i]==0.0):\n", + " i=i+1\n", + " print(i)\n", + " j=i\n", + " while(mylist[j]!=0.0):\n", + " j=j+1\n", + " print(j)" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "97\n", + "110\n" + ] + } + ], + "source": [ + "getCol(my_col_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 208, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(300, 37)" + ] + }, + "execution_count": 208, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "line_img.size" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "display(line_img.crop())" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAlCAYAAACZFGMnAAABhUlEQVR4nKXVT2oUQRTH8c9MJhMnBkbiMoK6UBD3WbgQNAsXgheQ3METeAav4QVE8Qiia0FBV2YRkjFiYkzUcVGv6EoySVX0wY+upt+36/X7U01n97COCxrtKrYxxeOacz+uF4sdlluhXXyP9XYr9DOkgKvQIATDVmghRPq+Jmg3BJNWaD6Udz03NGqFSuu1Qv+U8jK8au/9VyIOQ4owq9BciK4zqtCPEOyc4T/G5fzWka4+42OOy7iDNTzCKEM9R+tzKxxuhPO14tmXvLiCDfzGc6n/poXe4inuKob0OraOOb4Px/tOKcMq9grgBW7PciztWQG8xlINGOBVAN+kJFRtBZsBfXIy5SesH85/il2bOqKva6F9Ke1ViK6wc2YP5szw8tt3nKPL804LRahnQr+kb8nhNZ0RfV3GpjUgQxN8jPuxxmN5v4CGOCie94po5qV+fJDDeiP9BSd4Ik3xotThQ6n4S7gpOv4SPjg6FqdpE+/yxD6UJpXu4BzgK15GyIv4jI2/xEZbD3bA4hwAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(mo_img.crop((97,39,110,76)))" + ] + }, + { + "cell_type": "code", + "execution_count": 235, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAABoAAAAlCAYAAABcZvm2AAACZ0lEQVR4nL3XT4hPURQH8M/85p9hGBRDI0yJJgtFiIXCwkLZWFBSllaykZ2tLMRGNkqZFREbUpZkI+xEFpSYBmOIGX/G/H4W9z73zc/vN34z4zl1eve9e+753nPvOd97H0m24yBmKVBW4AMqOFAEQCk+50iRLCwSaARfYvtDkUDfo8oBFgLUEhXaigRqj0rYr8KARqLCcJFArVFJkRUO1FEkUF6aigT6b+mdX7pCuO6/J8NYVNISFgLUHJXEEP9UMqdfoy7Ap0nsuyS6KgsZ2opB/GwEqEOqn64qm4XYip3YE+1ac0DteIb7uBKfdWWVQD0VHEIfjuMCXsTvmb7Ge7zFO6Ecsr4xnDIJMS/DAMZxOQea6UOcwLYY4RIsRjeWYz+u5uyvY24toF4MVTl/Gp3v0FjKN8dVKMfxZ9RIrE0YzYHcwtoGnNeS/uijjI3VnWdzIHfQOU0QWCNN+nT2sSSE1xffP+OImfHdx9z430tXEjZ0fXwfwpsZgBBSvhzbGdsoSeuZzWCmzDCea0+IqCTRz7cqw+lIr5Tag3kg0mHXrPZhOBXZi9mxfTPf0SNUeQWPzewWtE6IoiIU8IRrQY9AJRU8wbxpgqzENalMtlQbdONV7HzmT1JtRPYJ2ZqBnFfjkrNU4LmMdqYC1IKTEu0M4bA6+zwLd6PhABY1CLIZN6Qo+rH6b4Mu5maUj6hJKoFWgf92RfuxOOYbjtWLIpOsoB4If3vDOCqctrMF5m4TlqYzzjhj8tEIeAn3/hYJzMdzE4+IevoOj3AOGxpxnklT1N3CMU26TLYIBHkbP2KEL6UDckryC510oah6PawhAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(mo_img.crop((97,39,123,76)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 236, + "metadata": {}, + "outputs": [], + "source": [ + "final_img = mo_img.crop((97,39,123,76))" + ] + }, + { + "cell_type": "code", + "execution_count": 237, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAABoAAAAlCAYAAABcZvm2AAACZ0lEQVR4nL3XT4hPURQH8M/85p9hGBRDI0yJJgtFiIXCwkLZWFBSllaykZ2tLMRGNkqZFREbUpZkI+xEFpSYBmOIGX/G/H4W9z73zc/vN34z4zl1eve9e+753nPvOd97H0m24yBmKVBW4AMqOFAEQCk+50iRLCwSaARfYvtDkUDfo8oBFgLUEhXaigRqj0rYr8KARqLCcJFArVFJkRUO1FEkUF6aigT6b+mdX7pCuO6/J8NYVNISFgLUHJXEEP9UMqdfoy7Ap0nsuyS6KgsZ2opB/GwEqEOqn64qm4XYip3YE+1ac0DteIb7uBKfdWWVQD0VHEIfjuMCXsTvmb7Ge7zFO6Ecsr4xnDIJMS/DAMZxOQea6UOcwLYY4RIsRjeWYz+u5uyvY24toF4MVTl/Gp3v0FjKN8dVKMfxZ9RIrE0YzYHcwtoGnNeS/uijjI3VnWdzIHfQOU0QWCNN+nT2sSSE1xffP+OImfHdx9z430tXEjZ0fXwfwpsZgBBSvhzbGdsoSeuZzWCmzDCea0+IqCTRz7cqw+lIr5Tag3kg0mHXrPZhOBXZi9mxfTPf0SNUeQWPzewWtE6IoiIU8IRrQY9AJRU8wbxpgqzENalMtlQbdONV7HzmT1JtRPYJ2ZqBnFfjkrNU4LmMdqYC1IKTEu0M4bA6+zwLd6PhABY1CLIZN6Qo+rH6b4Mu5maUj6hJKoFWgf92RfuxOOYbjtWLIpOsoB4If3vDOCqctrMF5m4TlqYzzjhj8tEIeAn3/hYJzMdzE4+IevoOj3AOGxpxnklT1N3CMU26TLYIBHkbP2KEL6UDckryC510oah6PawhAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "execution_count": 237, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_img" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "metadata": {}, + "outputs": [], + "source": [ + "final_img.save('final_img.png')" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000..7cf55e7 --- /dev/null +++ b/css/styles.css @@ -0,0 +1,10 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +#canvas{ + border: 2px solid black; + background-color: white; +} \ No newline at end of file diff --git a/file.html b/file.html new file mode 100644 index 0000000..5351c3d --- /dev/null +++ b/file.html @@ -0,0 +1,21 @@ + + + + + + + + + + MyCanvas + + + + + + + + + + + \ No newline at end of file diff --git a/js/canvas.js b/js/canvas.js new file mode 100644 index 0000000..00849a0 --- /dev/null +++ b/js/canvas.js @@ -0,0 +1,101 @@ +window.addEventListener('load',()=> { + + const canvas = document.querySelector('#canvas'); + const ctx = canvas.getContext('2d'); + canvas.height = window.innerHeight; + canvas.width = window.innerWidth; + + let painting = false; + + function startPosition(e) { + painting =true; + + draw(e); + + //fadeOut();// + + //window.clearTimeout(myvar);// + + } + + function endPosition() { + painting =false; + //var myvar = window.setTimeout(function(){ alert("Hello"); },1000);// + ctx.beginPath(); + } + + function draw(e) { + if(!painting) return; + + ctx.lineWidth = 5; + ctx.lineCap = 'round'; + ctx.strokeStyle = 'whilte'; + + ctx.lineTo(e.clientX,e.clientY); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(e.clientX,e.clientY); + + + + } + + var timeoutInMiliseconds = 3000; + var timeoutId; + + function startTimer() { + // window.setTimeout returns an Id that can be used to start and stop a timer + timeoutId = window.setTimeout(doInactive, timeoutInMiliseconds) + } + + function resetTimer() { + window.clearTimeout(timeoutId) + startTimer(); + } + + function doInactive(e) { + // does whatever you need it to actually do - probably signs them out or stops polling the server for info + alert("timeout"); + + + /*console.log(canvas.toDataURL()); + var link = document.createElement('a'); + link.download = 'download.png'; + link.href = canvas.toDataURL(); + link.click(); + link.delete;*/ + + + + //ctx.clearRect(0,0,canvas.width,canvas.height);// + } + + function setupTimers () { + //document.addEventListener("mousemove", resetTimer, false);// + document.addEventListener("mousedown", resetTimer, false); + //document.addEventListener("keypress", resetTimer, false);// + //document.addEventListener("touchmove", resetTimer, false);// + + startTimer(); + } + + function fadeOut() { + ctx.fillStyle = "rgba(255,255,255,0.1)"; + ctx.fillRect(0, 0, canvas.width, canvas.height); + setTimeout(fadeOut,200); + } + + + + canvas.addEventListener("mousedown", startPosition); + canvas.addEventListener("mouseup", endPosition); + canvas.addEventListener("mousemove", draw); + + setupTimers(); + //canvas.addEventListener("mouseup", setupTimers);// + +}); + + + + diff --git a/number_recoginition_capstone.ipynb b/number_recoginition_capstone.ipynb new file mode 100644 index 0000000..36f46fe --- /dev/null +++ b/number_recoginition_capstone.ipynb @@ -0,0 +1,1048 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "rffwkDWTz_Fo" + }, + "source": [ + "# Capstone Project\n", + "## Image classifier for the SVHN dataset\n", + "### Instructions\n", + "\n", + "In this notebook, you will create a neural network that classifies real-world images digits. You will use concepts from throughout this course in building, training, testing, validating and saving your Tensorflow classifier model.\n", + "\n", + "This project is peer-assessed. Within this notebook you will find instructions in each section for how to complete the project. Pay close attention to the instructions as the peer review will be carried out according to a grading rubric that checks key parts of the project instructions. Feel free to add extra cells into the notebook as required.\n", + "\n", + "### How to submit\n", + "\n", + "When you have completed the Capstone project notebook, you will submit a pdf of the notebook for peer review. First ensure that the notebook has been fully executed from beginning to end, and all of the cell outputs are visible. This is important, as the grading rubric depends on the reviewer being able to view the outputs of your notebook. Save the notebook as a pdf (you could download the notebook with File -> Download .ipynb, open the notebook locally, and then File -> Download as -> PDF via LaTeX), and then submit this pdf for review.\n", + "\n", + "### Let's get started!\n", + "\n", + "We'll start by running some imports, and loading the dataset. For this project you are free to make further imports throughout the notebook as you wish. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "O3vI8jSIz_Fs" + }, + "outputs": [ + { + "output_type": "error", + "ename": "ModuleNotFoundError", + "evalue": "No module named 'tensorflow'", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mtensorflow\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mtf\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mscipy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mio\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mloadmat\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'matplotlib'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'inline'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'tensorflow'" + ] + } + ], + "source": [ + "import tensorflow as tf\n", + "from scipy.io import loadmat\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "from tensorflow.keras.layers import Dense,Flatten,Conv2D,MaxPooling2D,BatchNormalization,Dropout\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint,ReduceLROnPlateau\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting scipy\n", + " Downloading scipy-1.6.2-cp39-cp39-win_amd64.whl (32.7 MB)\n", + "Collecting numpy<1.23.0,>=1.16.5\n", + " Downloading numpy-1.20.2-cp39-cp39-win_amd64.whl (13.7 MB)\n", + "Installing collected packages: numpy, scipy\n", + " WARNING: Failed to write executable - trying to use .deleteme logic\n", + "ERROR: Could not install packages due to an OSError: [WinError 2] The system cannot find the file specified: 'c:\\\\python39\\\\Scripts\\\\f2py.exe' -> 'c:\\\\python39\\\\Scripts\\\\f2py.exe.deleteme'\n", + "\n" + ] + } + ], + "source": [ + " !pip install scipy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "8OrHY7TRz_Fx" + }, + "source": [ + "For the capstone project, you will use the [SVHN dataset](http://ufldl.stanford.edu/housenumbers/). This is an image dataset of over 600,000 digit images in all, and is a harder dataset than MNIST as the numbers appear in the context of natural scene images. SVHN is obtained from house numbers in Google Street View images.\n", + "\n", + "* Y. Netzer, T. Wang, A. Coates, A. Bissacco, B. Wu and A. Y. Ng. \"Reading Digits in Natural Images with Unsupervised Feature Learning\". NIPS Workshop on Deep Learning and Unsupervised Feature Learning, 2011.\n", + "\n", + "The train and test datasets required for this project can be downloaded from [here](http://ufldl.stanford.edu/housenumbers/train.tar.gz) and [here](http://ufldl.stanford.edu/housenumbers/test.tar.gz). Once unzipped, you will have two files: `train_32x32.mat` and `test_32x32.mat`. You should store these files in Drive for use in this Colab notebook.\n", + "\n", + "Your goal is to develop an end-to-end workflow for building, training, validating, evaluating and saving a neural network that classifies a real-world image into one of ten classes." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "colab_type": "code", + "id": "r8BHW8P_2wxw", + "outputId": "659d5ac1-f605-43c7-c114-d262c082e800" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount(\"/content/gdrive\", force_remount=True).\n" + ] + } + ], + "source": [ + "# Run this cell to connect to your Drive folder\n", + "\n", + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "YWdiz3n_z_Fy" + }, + "outputs": [], + "source": [ + "# Load the dataset from your Drive folder\n", + "\n", + "train = loadmat('/content/gdrive/My Drive/train_32x32.mat')\n", + "test = loadmat('/content/gdrive/My Drive/test_32x32.mat')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Sot1IcuZz_F2" + }, + "source": [ + "Both `train` and `test` are dictionaries with keys `X` and `y` for the input images and labels respectively." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_Q1n_Ai2z_F3" + }, + "source": [ + "## 1. Inspect and preprocess the dataset\n", + "* Extract the training and testing images and labels separately from the train and test dictionaries loaded for you.\n", + "* Select a random sample of images and corresponding labels from the dataset (at least 10), and display them in a figure.\n", + "* Convert the training and test images to grayscale by taking the average across all colour channels for each pixel. _Hint: retain the channel dimension, which will now have size 1._\n", + "* Select a random sample of the grayscale images and corresponding labels from the dataset (at least 10), and display them in a figure." + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "-WIH5hyXz_F4", + "outputId": "e51e8a80-911b-41a7-df93-e1cfc2fb2733" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "scaled image sizes : \n", + "train images:(73257, 32, 32, 3)\n", + "test images:(26032, 32, 32, 3)\n" + ] + } + ], + "source": [ + "train_images = train['X']\n", + "test_images = test['X']\n", + "train_labels = train['y']\n", + "test_labels = test['y']\n", + "\n", + "train_images = train_images/255\n", + "test_images = test_images/255\n", + "train_labels = train_labels[:,0]\n", + "test_labels = test_labels[:,0]\n", + "scaled_train_images = train_images.transpose((3,0,1,2))\n", + "scaled_test_images = test_images.transpose((3,0,1,2))\n", + "\n", + "\n", + "print('scaled image sizes : ')\n", + "print('train images:' + str(scaled_train_images.shape))\n", + "print('test images:' + str(scaled_test_images.shape))" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "6SR4gYffz_F_" + }, + "outputs": [], + "source": [ + "def plot_random_images(images,labels,rows,columns):\n", + "\n", + " num_train_images = images.shape[0]\n", + "\n", + " random_inx = np.random.choice(num_train_images, rows*columns)\n", + " random_train_images = images[random_inx,...]\n", + " random_train_labels = labels[random_inx, ...]\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " fig, axes = plt.subplots(rows, columns,figsize = (16,16))\n", + " fig.subplots_adjust(hspace=-0.7, wspace= 0.2)\n", + "\n", + " for i,ax in enumerate(axes.flat):\n", + "\n", + " ax.imshow(np.squeeze(random_train_images[i]))\n", + " ax.text(6., -1.0, f'Digit {random_train_labels[i]}',fontsize = 20)\n", + " ax.get_xaxis().set_visible(False)\n", + " ax.get_yaxis().set_visible(False)\n", + " \n", + " \n", + " plt.show()\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 406 + }, + "colab_type": "code", + "id": "ghAbFwh57GBq", + "outputId": "1ec22b47-ffd2-4e9e-f57d-755b7d024f58" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_random_images(scaled_train_images,train_labels,2,5)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "UXYwWhHpz_GD" + }, + "outputs": [], + "source": [ + "grayscale_train_images = np.mean(scaled_train_images, axis= 3)\n", + "grayscale_train_images = grayscale_train_images[...,np.newaxis]\n", + "\n", + "grayscale_test_images = np.mean(scaled_test_images, axis= 3)\n", + "grayscale_test_images = grayscale_test_images[...,np.newaxis]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 406 + }, + "colab_type": "code", + "id": "CGHZvq4zz_GK", + "outputId": "2d7f65e0-f983-4b95-f2dd-1cb6594237be" + }, + "outputs": [ + { + "output_type": "error", + "ename": "NameError", + "evalue": "name 'plot_random_images' is not defined", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplot_random_images\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgrayscale_train_images\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mtrain_labels\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'plot_random_images' is not defined" + ] + } + ], + "source": [ + "plot_random_images(grayscale_train_images,train_labels,2,5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7e7iSyWXz_GN" + }, + "source": [ + "## 2. MLP neural network classifier\n", + "* Build an MLP classifier model using the Sequential API. Your model should use only Flatten and Dense layers, with the final layer having a 10-way softmax output. \n", + "* You should design and build the model yourself. Feel free to experiment with different MLP architectures. _Hint: to achieve a reasonable accuracy you won't need to use more than 4 or 5 layers._\n", + "* Print out the model summary (using the summary() method)\n", + "* Compile and train the model (we recommend a maximum of 30 epochs), making use of both training and validation sets during the training run. \n", + "* Your model should track at least one appropriate metric, and use at least two callbacks during training, one of which should be a ModelCheckpoint callback.\n", + "* As a guide, you should aim to achieve a final categorical cross entropy training loss of less than 1.0 (the validation loss might be higher).\n", + "* Plot the learning curves for loss vs epoch and accuracy vs epoch for both training and validation sets.\n", + "* Compute and display the loss and accuracy of the trained model on the test set." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "l14VCBFVz_GO" + }, + "outputs": [], + "source": [ + "def get_mlp_model(input_shape):\n", + "\n", + " model = Sequential([\n", + " Dense(64,activation = 'relu',input_shape = input_shape),\n", + " Dense(64,activation = 'relu'),\n", + " Flatten(),\n", + " Dense(128,activation = 'relu'),\n", + " Dense(128,activation = 'relu'),\n", + " Dense(11,activation = 'softmax')\n", + "\n", + "\n", + "\n", + " ])\n", + "\n", + " model.compile(\n", + " optimizer = \"adam\",\n", + " loss = \"sparse_categorical_crossentropy\",\n", + " metrics = ['accuracy']\n", + " )\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 357 + }, + "colab_type": "code", + "id": "7eUgirn1pTWS", + "outputId": "913e6df2-c806-497c-d10e-816c446f5b56" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_45\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "dense_112 (Dense) (None, 32, 32, 64) 128 \n", + "_________________________________________________________________\n", + "dense_113 (Dense) (None, 32, 32, 64) 4160 \n", + "_________________________________________________________________\n", + "flatten_56 (Flatten) (None, 65536) 0 \n", + "_________________________________________________________________\n", + "dense_114 (Dense) (None, 128) 8388736 \n", + "_________________________________________________________________\n", + "dense_115 (Dense) (None, 128) 16512 \n", + "_________________________________________________________________\n", + "dense_116 (Dense) (None, 11) 1419 \n", + "=================================================================\n", + "Total params: 8,410,955\n", + "Trainable params: 8,410,955\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "model = get_mlp_model(grayscale_train_images[0].shape)\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 717 + }, + "colab_type": "code", + "id": "beEZO1kvz_GR", + "outputId": "0f9d1b8c-9422-4270-d9e8-9861d415d7c7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 1.5435 - accuracy: 0.4757\n", + "Epoch 00001: val_accuracy improved from -inf to 0.66048, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 219s 112ms/step - loss: 1.5435 - accuracy: 0.4757 - val_loss: 1.0738 - val_accuracy: 0.6605\n", + "Epoch 2/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.9566 - accuracy: 0.7035\n", + "Epoch 00002: val_accuracy improved from 0.66048 to 0.71426, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 219s 113ms/step - loss: 0.9566 - accuracy: 0.7035 - val_loss: 0.9218 - val_accuracy: 0.7143\n", + "Epoch 3/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.8506 - accuracy: 0.7385\n", + "Epoch 00003: val_accuracy improved from 0.71426 to 0.73628, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 220s 113ms/step - loss: 0.8506 - accuracy: 0.7385 - val_loss: 0.8617 - val_accuracy: 0.7363\n", + "Epoch 4/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.7865 - accuracy: 0.7589\n", + "Epoch 00004: val_accuracy improved from 0.73628 to 0.74747, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 222s 114ms/step - loss: 0.7865 - accuracy: 0.7589 - val_loss: 0.8228 - val_accuracy: 0.7475\n", + "Epoch 5/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.7446 - accuracy: 0.7732\n", + "Epoch 00005: val_accuracy improved from 0.74747 to 0.76376, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 221s 114ms/step - loss: 0.7446 - accuracy: 0.7732 - val_loss: 0.7744 - val_accuracy: 0.7638\n", + "Epoch 6/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.7051 - accuracy: 0.7849\n", + "Epoch 00006: val_accuracy did not improve from 0.76376\n", + "1946/1946 [==============================] - 222s 114ms/step - loss: 0.7051 - accuracy: 0.7849 - val_loss: 0.7801 - val_accuracy: 0.7618\n", + "Epoch 7/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.6750 - accuracy: 0.7943\n", + "Epoch 00007: val_accuracy improved from 0.76376 to 0.77013, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 222s 114ms/step - loss: 0.6750 - accuracy: 0.7943 - val_loss: 0.7652 - val_accuracy: 0.7701\n", + "Epoch 8/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.6491 - accuracy: 0.8014\n", + "Epoch 00008: val_accuracy improved from 0.77013 to 0.78342, saving model to /content/checkpoint_mlp_best/checkpoint\n", + "1946/1946 [==============================] - 224s 115ms/step - loss: 0.6491 - accuracy: 0.8014 - val_loss: 0.7330 - val_accuracy: 0.7834\n", + "Epoch 9/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.6253 - accuracy: 0.8097\n", + "Epoch 00009: val_accuracy did not improve from 0.78342\n", + "1946/1946 [==============================] - 222s 114ms/step - loss: 0.6253 - accuracy: 0.8097 - val_loss: 0.7432 - val_accuracy: 0.7759\n", + "Epoch 10/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.6064 - accuracy: 0.8137\n", + "Epoch 00010: val_accuracy did not improve from 0.78342\n", + "1946/1946 [==============================] - 222s 114ms/step - loss: 0.6064 - accuracy: 0.8137 - val_loss: 0.7791 - val_accuracy: 0.7649\n" + ] + } + ], + "source": [ + "early_stopping = EarlyStopping(monitor = \"val_accuracy\",mode = \"max\",patience = 3)\n", + "\n", + "\n", + "\n", + "checkpoint = ModelCheckpoint(filepath = '/content/checkpoint_mlp_best/checkpoint',save_freq = \"epoch\",save_weights_only = True,verbose = 1, save_best_only = True,monitor = \"val_accuracy\")\n", + "\n", + "history = model.fit(grayscale_train_images,train_labels,\n", + " epochs = 10,\n", + " validation_split= 0.15,\n", + " callbacks=[early_stopping,checkpoint],\n", + " verbose = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 295 + }, + "colab_type": "code", + "id": "pPPbzGhVz_GW", + "outputId": "514028b1-670c-4e13-e206-51abc942834a" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "try:\n", + " plt.plot(history.history['accuracy'])\n", + " plt.plot(history.history['val_accuracy'])\n", + "except KeyError:\n", + " plt.plot(history.history['acc'])\n", + " plt.plot(history.history['val_acc'])\n", + "plt.title('Accuracy vs. epochs')\n", + "plt.ylabel('Loss')\n", + "plt.xlabel('Epoch')\n", + "plt.legend(['Training', 'Validation'], loc='lower right')\n", + "plt.show() " + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 295 + }, + "colab_type": "code", + "id": "7b5_8VsCz_GZ", + "outputId": "a31960e5-06c1-40c6-db22-2ad53e44ab01" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(history.history['loss'])\n", + "plt.plot(history.history['val_loss'])\n", + "plt.title('Loss vs. epochs')\n", + "plt.ylabel('Loss')\n", + "plt.xlabel('Epoch')\n", + "plt.legend(['Training', 'Validation'], loc='upper right')\n", + "plt.show() " + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "b0kH6VYqz_Gc", + "outputId": "bed011f6-70b7-43ad-bb91-9c265421f55a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "814/814 [==============================] - 22s 27ms/step - loss: 0.9530 - accuracy: 0.7319\n", + "Test loss: 0.9530481696128845\n", + "Test accuracy: 0.7318684458732605\n" + ] + } + ], + "source": [ + "test_loss, test_accuracy = model.evaluate(grayscale_test_images, test_labels)\n", + "print(f\"Test loss: {test_loss}\")\n", + "print(f\"Test accuracy: {test_accuracy}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ncPtDtCLz_Gg" + }, + "source": [ + "## 3. CNN neural network classifier\n", + "* Build a CNN classifier model using the Sequential API. Your model should use the Conv2D, MaxPool2D, BatchNormalization, Flatten, Dense and Dropout layers. The final layer should again have a 10-way softmax output. \n", + "* You should design and build the model yourself. Feel free to experiment with different CNN architectures. _Hint: to achieve a reasonable accuracy you won't need to use more than 2 or 3 convolutional layers and 2 fully connected layers.)_\n", + "* The CNN model should use fewer trainable parameters than your MLP model.\n", + "* Compile and train the model (we recommend a maximum of 30 epochs), making use of both training and validation sets during the training run.\n", + "* Your model should track at least one appropriate metric, and use at least two callbacks during training, one of which should be a ModelCheckpoint callback.\n", + "* You should aim to beat the MLP model performance with fewer parameters!\n", + "* Plot the learning curves for loss vs epoch and accuracy vs epoch for both training and validation sets.\n", + "* Compute and display the loss and accuracy of the trained model on the test set." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "yk2mH3Npz_Gh" + }, + "outputs": [], + "source": [ + "def get_cnn_model(input_shape):\n", + "\n", + " model = Sequential([\n", + " \n", + "\n", + " Conv2D(64,input_shape = input_shape,kernel_size = (3,3),activation = \"relu\",padding = 'SAME'),\n", + " Conv2D(64,kernel_size = (3,3),activation = \"relu\",padding = 'SAME'),\n", + " MaxPooling2D(pool_size = (2,2)),\n", + " BatchNormalization(),\n", + " Conv2D(128,kernel_size = (3,3),activation = \"relu\",padding = 'SAME'),\n", + " MaxPooling2D(pool_size = (2,2)),\n", + " Dropout(0.5),\n", + " Flatten(),\n", + " Dense(64,activation = \"relu\"),\n", + " Dense(64,activation = \"relu\"),\n", + " Dense(11,activation = \"softmax\")\n", + " ])\n", + "\n", + "\n", + " model.compile(optimizer='adam',\n", + " loss='sparse_categorical_crossentropy',\n", + " metrics=['accuracy'])\n", + "\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 527 + }, + "colab_type": "code", + "id": "lbgRgZ5cz_Gn", + "outputId": "af258135-eee7-4573-831e-5f1b1195bae1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_38\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d_107 (Conv2D) (None, 32, 32, 64) 640 \n", + "_________________________________________________________________\n", + "conv2d_108 (Conv2D) (None, 32, 32, 64) 36928 \n", + "_________________________________________________________________\n", + "max_pooling2d_53 (MaxPooling (None, 16, 16, 64) 0 \n", + "_________________________________________________________________\n", + "batch_normalization_34 (Batc (None, 16, 16, 64) 256 \n", + "_________________________________________________________________\n", + "conv2d_109 (Conv2D) (None, 16, 16, 128) 73856 \n", + "_________________________________________________________________\n", + "max_pooling2d_54 (MaxPooling (None, 8, 8, 128) 0 \n", + "_________________________________________________________________\n", + "dropout_3 (Dropout) (None, 8, 8, 128) 0 \n", + "_________________________________________________________________\n", + "flatten_49 (Flatten) (None, 8192) 0 \n", + "_________________________________________________________________\n", + "dense_91 (Dense) (None, 64) 524352 \n", + "_________________________________________________________________\n", + "dense_92 (Dense) (None, 64) 4160 \n", + "_________________________________________________________________\n", + "dense_93 (Dense) (None, 11) 715 \n", + "=================================================================\n", + "Total params: 640,907\n", + "Trainable params: 640,779\n", + "Non-trainable params: 128\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "cnn_model = get_cnn_model(grayscale_train_images[0].shape)\n", + "cnn_model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 649 + }, + "colab_type": "code", + "id": "nkmS2vV2z_Gs", + "outputId": "fe2c9d1c-3e6e-4ce2-d475-54e20c33464a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.7756 - accuracy: 0.7552\n", + "Epoch 00001: val_accuracy improved from -inf to 0.86341, saving model to /content/checkpoint_cnn_best/checkpoint\n", + "1946/1946 [==============================] - 594s 305ms/step - loss: 0.7756 - accuracy: 0.7552 - val_loss: 0.4789 - val_accuracy: 0.8634\n", + "Epoch 2/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.4716 - accuracy: 0.8581\n", + "Epoch 00002: val_accuracy improved from 0.86341 to 0.87888, saving model to /content/checkpoint_cnn_best/checkpoint\n", + "1946/1946 [==============================] - 594s 305ms/step - loss: 0.4716 - accuracy: 0.8581 - val_loss: 0.4080 - val_accuracy: 0.8789\n", + "Epoch 3/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.4169 - accuracy: 0.8732\n", + "Epoch 00003: val_accuracy improved from 0.87888 to 0.88052, saving model to /content/checkpoint_cnn_best/checkpoint\n", + "1946/1946 [==============================] - 593s 305ms/step - loss: 0.4169 - accuracy: 0.8732 - val_loss: 0.4001 - val_accuracy: 0.8805\n", + "Epoch 4/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.3823 - accuracy: 0.8836\n", + "Epoch 00004: val_accuracy improved from 0.88052 to 0.88862, saving model to /content/checkpoint_cnn_best/checkpoint\n", + "1946/1946 [==============================] - 593s 305ms/step - loss: 0.3823 - accuracy: 0.8836 - val_loss: 0.3735 - val_accuracy: 0.8886\n", + "Epoch 5/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.3576 - accuracy: 0.8907\n", + "Epoch 00005: val_accuracy improved from 0.88862 to 0.90081, saving model to /content/checkpoint_cnn_best/checkpoint\n", + "1946/1946 [==============================] - 593s 305ms/step - loss: 0.3576 - accuracy: 0.8907 - val_loss: 0.3440 - val_accuracy: 0.9008\n", + "Epoch 6/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.3349 - accuracy: 0.8975\n", + "Epoch 00006: val_accuracy improved from 0.90081 to 0.90663, saving model to /content/checkpoint_cnn_best/checkpoint\n", + "1946/1946 [==============================] - 595s 306ms/step - loss: 0.3349 - accuracy: 0.8975 - val_loss: 0.3223 - val_accuracy: 0.9066\n", + "Epoch 7/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.3144 - accuracy: 0.9038\n", + "Epoch 00007: val_accuracy did not improve from 0.90663\n", + "1946/1946 [==============================] - 595s 306ms/step - loss: 0.3144 - accuracy: 0.9038 - val_loss: 0.3270 - val_accuracy: 0.9049\n", + "Epoch 8/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.3006 - accuracy: 0.9087\n", + "Epoch 00008: val_accuracy did not improve from 0.90663\n", + "1946/1946 [==============================] - 593s 305ms/step - loss: 0.3006 - accuracy: 0.9087 - val_loss: 0.3340 - val_accuracy: 0.9023\n", + "Epoch 9/10\n", + "1946/1946 [==============================] - ETA: 0s - loss: 0.2815 - accuracy: 0.9136\n", + "Epoch 00009: val_accuracy did not improve from 0.90663\n", + "1946/1946 [==============================] - 595s 306ms/step - loss: 0.2815 - accuracy: 0.9136 - val_loss: 0.3365 - val_accuracy: 0.9058\n" + ] + } + ], + "source": [ + "early_stopping = EarlyStopping(monitor = \"val_accuracy\",mode = \"max\",patience = 3)\n", + "\n", + "checkpoint = ModelCheckpoint(filepath = '/content/checkpoint_cnn_best/checkpoint',save_freq = \"epoch\",save_weights_only = True,verbose = 1, save_best_only = True,monitor = \"val_accuracy\")\n", + "\n", + "\n", + "history = cnn_model.fit(grayscale_train_images,train_labels,epochs = 10,validation_split= 0.15,callbacks = [checkpoint,early_stopping])" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 295 + }, + "colab_type": "code", + "id": "VytQECDVz_Gv", + "outputId": "2dcb2ab2-3619-4617-feb5-dd12495c861e" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "try:\n", + " plt.plot(history.history['accuracy'])\n", + " plt.plot(history.history['val_accuracy'])\n", + "except KeyError:\n", + " plt.plot(history.history['acc'])\n", + " plt.plot(history.history['val_acc'])\n", + "plt.title('Accuracy vs. epochs')\n", + "plt.ylabel('Loss')\n", + "plt.xlabel('Epoch')\n", + "plt.legend(['Training', 'Validation'], loc='lower right')\n", + "plt.show() " + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 295 + }, + "colab_type": "code", + "id": "60mJypwQz_Gx", + "outputId": "7e1a0317-1578-47fe-c561-a46023e39ff9" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(history.history['loss'])\n", + "plt.plot(history.history['val_loss'])\n", + "plt.title('Loss vs. epochs')\n", + "plt.ylabel('Loss')\n", + "plt.xlabel('Epoch')\n", + "plt.legend(['Training', 'Validation'], loc='upper right')\n", + "plt.show() " + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "w2v80qosz_G0", + "outputId": "fa802da4-ddf1-4373-9a50-e1e48b2a9d2c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "814/814 [==============================] - 64s 79ms/step - loss: 0.3765 - accuracy: 0.8968\n", + "Test loss: 0.3764943778514862\n", + "Test accuracy: 0.8968192934989929\n" + ] + } + ], + "source": [ + "test_loss, test_accuracy = cnn_model.evaluate(grayscale_test_images, test_labels)\n", + "print(f\"Test loss: {test_loss}\")\n", + "print(f\"Test accuracy: {test_accuracy}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "3iBYFPWUz_G4" + }, + "source": [ + "## 4. Get model predictions\n", + "* Load the best weights for the MLP and CNN models that you saved during the training run.\n", + "* Randomly select 5 images and corresponding labels from the test set and display the images with their labels.\n", + "* Alongside the image and label, show each model’s predictive distribution as a bar chart, and the final model prediction given by the label with maximum probability." + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "colab_type": "code", + "id": "XMYYWs0oz_G5", + "outputId": "ed72eb4a-ed5f-4322-865b-9cadd3fd0059" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "814/814 [==============================] - 21s 26ms/step - loss: 0.9082 - accuracy: 0.7475\n", + "MLP best weights model \n", + "Test loss: 0.9081620573997498\n", + "Test accuracy: 0.7475031018257141\n" + ] + } + ], + "source": [ + "model_best_epoch_file = tf.train.latest_checkpoint(\"checkpoint_mlp_best\")\n", + "model = get_mlp_model(grayscale_train_images[0].shape)\n", + "model.load_weights(model_best_epoch_file)\n", + "\n", + "test_loss, test_accuracy = model.evaluate(grayscale_test_images, test_labels)\n", + "print(\"MLP best weights model \")\n", + "print(f\"Test loss: {test_loss}\")\n", + "print(f\"Test accuracy: {test_accuracy}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 85 + }, + "colab_type": "code", + "id": "8yUPWbFCz_G8", + "outputId": "eba978e4-d225-4488-f3fd-4600fa4b51b6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "814/814 [==============================] - 62s 77ms/step - loss: 0.3639 - accuracy: 0.8937\n", + "CNN best weights model \n", + "Test loss: 0.36391595005989075\n", + "Test accuracy: 0.8937077522277832\n" + ] + } + ], + "source": [ + "model_best_epoch_file = tf.train.latest_checkpoint(\"checkpoint_cnn_best\")\n", + "model = get_cnn_model(grayscale_train_images[0].shape)\n", + "model.load_weights(model_best_epoch_file)\n", + "\n", + "test_loss, test_accuracy = model.evaluate(grayscale_test_images, test_labels)\n", + "print(\"CNN best weights model \")\n", + "print(f\"Test loss: {test_loss}\")\n", + "print(f\"Test accuracy: {test_accuracy}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 716 + }, + "colab_type": "code", + "id": "W48syko0z_G-", + "outputId": "c841bce4-44eb-405b-8071-25c16b30810f" + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light", + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "num_test_images = grayscale_test_images.shape[0]\n", + "\n", + "random_inx = np.random.choice(num_test_images, 5)\n", + "random_test_images = grayscale_test_images[random_inx, ...]\n", + "random_test_labels = test_labels[random_inx, ...]\n", + "\n", + "predictions = model.predict(random_test_images)\n", + "\n", + "fig, axes = plt.subplots(5, 2, figsize=(16, 12))\n", + "fig.subplots_adjust(hspace=0.4, wspace=-0.2)\n", + "\n", + "for i, (prediction, image, label) in enumerate(zip(predictions, random_test_images, random_test_labels)):\n", + " axes[i, 0].imshow(np.squeeze(image))\n", + " axes[i, 0].get_xaxis().set_visible(False)\n", + " axes[i, 0].get_yaxis().set_visible(False)\n", + " axes[i, 0].text(10., -1.5, f'Digit {label}')\n", + " axes[i, 1].bar(np.arange(len(prediction)), prediction)\n", + " axes[i, 1].set_xticks(np.arange(len(prediction)))\n", + " axes[i, 1].set_title(f\"Categorical distribution. Model prediction: {np.argmax(prediction)}\")\n", + " \n", + "plt.show()" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "name": "Copy of Capstone Project.ipynb", + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3.9.0 64-bit", + "metadata": { + "interpreter": { + "hash": "63fd5069d213b44bf678585dea6b12cceca9941eaf7f819626cde1f2670de90d" + } + } + }, + "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.0-final" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} \ No newline at end of file