Skip to content
Snippets Groups Projects
ocr_project.ipynb 126 KiB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Mini-Project OCR Code\n",
    "\n",
    "This is a walkthrough of the process we went through to develop an OCR model that recognizes handwriting.\n",
    "\n",
    "Our libraries used are listed in the README, we will utilize requirements.txt to load them all at once.\n",
    "\n",
    "**IMPORTANT** Make sure to use `python3.6` (the version we use for class projects) to run our program with little issues. Information can be found [here](https://courses.cs.vt.edu/cs4804/Spring24/projects/project0.html#python-installation) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": [
     "hide_output"
    ]
   },
   "outputs": [],
   "source": [
    "# Install libraries\n",
    "%pip install -r requirements.txt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load libraries\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import cv2\n",
    "\n",
    "from keras import layers, models\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import LabelBinarizer\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Helper functions for loading dataset\n",
    "\n",
    "We need to load our dataset. We will create a helper function for the model OCR. This function will load the English Handwritten Characters dataset that should be in given path."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_eng_dataset(datasetPath):\n",
    "\t # initialize the list of data and labels\n",
    "    data = []\n",
    "    labels = []\n",
    "\n",
    "    # loop over the rows of the A-Z handwritten digit dataset\n",
    "    for row in open(datasetPath):\n",
    "        # Skip the first row\n",
    "        if row == \"image,label\\n\":\n",
    "            continue\n",
    "\n",
    "        # parse the label and image from the row\n",
    "        row = row.split(\",\")\n",
    "        imagePath = \"eng_dataset/\" + row[0] # hardcode the path\n",
    "        try:\n",
    "            image = cv2.imread(imagePath)\n",
    "            image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)\n",
    "        except cv2.error as e:\n",
    "            print(\"[ERROR] loading image \", row[0], \" fail\")\n",
    "            continue\n",
    "        \n",
    "        label = row[1][:-1] if len(row[1]) > 1 else row[1] # remove '\\n' at end\n",
    "\n",
    "        # update the list of data and labels\n",
    "        data.append(image)\n",
    "        labels.append(label)\n",
    "\n",
    "    # convert the data and labels to NumPy arrays\n",
    "    data = np.array(data)\n",
    "    labels = np.array(labels, dtype=\"U1\")\n",
    "\t# return a 2-tuple of the English Handwritten Characters data and labels\n",
    "    return (data, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dataset Pre-Processing\n",
    "\n",
    "Next we will pre-process the dataset in order to train the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def process_dataset(data, labels):\n",
    "    \"\"\"\n",
    "    Help function to pre-process the dataset for ready to train model.\n",
    "    \"\"\"\n",
    "    # the architecture we're using is designed for 32x32 images,\n",
    "    # so we need to resize them to 32x32\n",
    "    data = [cv2.resize(image, (32, 32)) for image in data]\n",
    "    data = np.array(data, dtype=\"float32\")\n",
    "\n",
    "    # add a channel dimension to every image in the dataset and \n",
    "    # data = np.expand_dims(data, axis=-1)\n",
    "\n",
    "    # scale the pixel intensities of the images from [0, 255] down to [0, 1]\n",
    "    data /= 255.0\n",
    "\n",
    "    # convert the labels from integers to vectors\n",
    "    le = LabelBinarizer()\n",
    "    labels = le.fit_transform(labels)\n",
    "\n",
    "    # account for skew in the labeled data\n",
    "    classTotals = labels.sum(axis=0)\n",
    "    classWeight = {}\n",
    "    # loop over all classes and calculate the class weight\n",
    "    for i in range(0, len(classTotals)):\n",
    "        classWeight[i] = classTotals.max() / classTotals[i]\n",
    "\n",
    "    return data, labels, classWeight"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Verification\n",
    "\n",
    "To verify that the dataset looks correct, let's plot the first 25 images from the training set and display the class name below each image.\n",
    "\n",
    "We define the helper function here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def show_train_data(train_images, train_labels):\n",
    "    class_names = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', \n",
    "                   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', \n",
    "                   'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n",
    "                   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', \n",
    "                   'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']\n",
    "\n",
    "    plt.figure(figsize=(10,10))\n",
    "    for i in range(25):\n",
    "        plt.subplot(5,5,i+1)\n",
    "        plt.xticks([])\n",
    "        plt.yticks([])\n",
    "        plt.grid(False)\n",
    "        plt.imshow(train_images[i])\n",
    "        # The CIFAR labels happen to be arrays, \n",
    "        # which is why you need the extra index\n",
    "        index = np.where(train_labels[i] == 1)[0][0]\n",
    "        plt.xlabel(class_names[index])\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load and Pre-Process\n",
    "\n",
    "First, we need to load and pre-process the data. We will use the functions we defined previously.\n",
    "\n",
    "Make sure the English Handwritten Characters dataset is loocated in `/eng_dataset` in the following format:\n",
    "\n",
    "```\n",
    ".\n",
    "├── ocr_project.ipynb\n",
    "└── eng_dataset\n",
    "    ├── english.csv\n",
    "    └── Img\n",
    "        ├── imgXXX-XXX.png\n",
    "        └── ...\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define directories here\n",
    "datasetPath = \"eng_dataset/english.csv\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[INFO] loading datasets...\n",
      "[INFO] pre-processing datasets...\n"
     ]
    }
   ],
   "source": [
    "# load the English Handwritten Characters datasets\n",
    "print(\"[INFO] loading datasets...\")\n",
    "(data, labels) = load_eng_dataset(datasetPath)\n",
    "\n",
    "# pre-process the data and labels for training\n",
    "print(\"[INFO] pre-processing datasets...\")\n",
    "data, labels, classWeight = process_dataset(data, labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training\n",
    "\n",
    "Time to begin the training, we need to split the data for training and testing first. The training data will be shown here."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x720 with 25 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Training image Shape: (2898, 32, 32)'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Testing image Shape: (512, 32, 32)'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# partition the data into training and testing splits using 90% of\n",
    "# the data for training and the remaining 10% for testing\n",
    "(train_images, test_images, train_labels, test_labels) = train_test_split(data,\n",
    "        labels, test_size=0.15, stratify=labels, random_state=42)\n",
    "    \n",
    "# show train data in plot\n",
    "show_train_data(train_images, train_labels)\n",
    "\n",
    "# Show shapes\n",
    "display(f\"Training image Shape: {train_images.shape}\")\n",
    "display(f\"Testing image Shape: {test_images.shape}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Looks great!\n",
    "\n",
    "### Modeling\n",
    "\n",
    "We need to define some parameters for our model. Here is what they mean:\n",
    "\n",
    "- `EPOCHS` - amount of iterations to fit the model\n",
    "- `BATCH_SIZE` - size of slices of the dataset\n",
    "\n",
    "Info about model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "EPOCHS = 80\n",
    "BATCH_SIZE = 50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[INFO] compiling model...\n",
      "[INFO] building model...\n"
     ]
    }
   ],
   "source": [
    "# initialize and compile our deep neural network\n",
    "print(\"[INFO] compiling model...\")\n",
    "model = models.Sequential(name = \"OCR_CNN\")\n",
    "model.add(layers.Conv2D(32, (3, 3), activation='relu', use_bias=False))\n",
    "model.add(layers.MaxPooling2D((2, 2)))\n",
    "model.add(layers.Conv2D(64, (3, 3), activation='relu', use_bias=False))\n",
    "model.add(layers.MaxPooling2D((2, 2)))\n",
    "#model.add(layers.Conv2D(64, (3, 3), activation='relu', use_bias=False))\n",
    "model.add(layers.Flatten())\n",
    "model.add(layers.Dense(128, activation='relu'))\n",
    "model.add(layers.Dropout(0.5))\n",
    "model.add(layers.Dense(62, activation='softmax'))\n",
    "# build model\n",
    "print(\"[INFO] building model...\")\n",
    "model.build(input_shape=(BATCH_SIZE, 32, 32, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"OCR_CNN\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_51 (Conv2D)           (50, 30, 30, 32)          288       \n",
      "_________________________________________________________________\n",
      "max_pooling2d_34 (MaxPooling (50, 15, 15, 32)          0         \n",
      "_________________________________________________________________\n",
      "conv2d_52 (Conv2D)           (50, 13, 13, 64)          18432     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_35 (MaxPooling (50, 6, 6, 64)            0         \n",
      "_________________________________________________________________\n",
      "flatten_17 (Flatten)         (50, 2304)                0         \n",
      "_________________________________________________________________\n",
      "dense_32 (Dense)             (50, 128)                 295040    \n",
      "_________________________________________________________________\n",
      "dropout_8 (Dropout)          (50, 128)                 0         \n",
      "_________________________________________________________________\n",
      "dense_33 (Dense)             (50, 62)                  7998      \n",
      "=================================================================\n",
      "Total params: 321,758\n",
      "Trainable params: 321,758\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Use categorical_crossentropy for one-hot coding labels\n",
    "model.compile(optimizer='adam',\n",
    "    loss='categorical_crossentropy',\n",
    "    metrics=['accuracy'])\n",
    "\n",
    "display(model.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since we are using a CNN, we need to add the channel parameter to our training and test data shapes. This is so our data is represented as `(batch_size, new_height, new_width, filters)`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(512, 32, 32, 1)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Keras needs a channel dimension for the model\n",
    "# Since the images are greyscale, the channel can be 1\n",
    "train_images = train_images.reshape(-1, 32, 32, 1)\n",
    "test_images = test_images.reshape(-1, 32, 32, 1)\n",
    "display(test_images.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[INFO] training model...\n",
      "Epoch 1/80\n",
      "57/57 [==============================] - 3s 40ms/step - loss: 4.1263 - accuracy: 0.0200 - val_loss: 4.0838 - val_accuracy: 0.0762\n",
      "Epoch 2/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 3.9482 - accuracy: 0.0579 - val_loss: 3.6387 - val_accuracy: 0.1348\n",
      "Epoch 3/80\n",
      "57/57 [==============================] - 2s 40ms/step - loss: 3.4824 - accuracy: 0.1268 - val_loss: 3.0436 - val_accuracy: 0.2773\n",
      "Epoch 4/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 2.9919 - accuracy: 0.2152 - val_loss: 2.5431 - val_accuracy: 0.3848\n",
      "Epoch 5/80\n",
      "57/57 [==============================] - 2s 41ms/step - loss: 2.6030 - accuracy: 0.2886 - val_loss: 2.1482 - val_accuracy: 0.5020\n",
      "Epoch 6/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 2.2868 - accuracy: 0.3490 - val_loss: 1.8642 - val_accuracy: 0.5605\n",
      "Epoch 7/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 2.0885 - accuracy: 0.4115 - val_loss: 1.6513 - val_accuracy: 0.5957\n",
      "Epoch 8/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 1.8573 - accuracy: 0.4670 - val_loss: 1.5443 - val_accuracy: 0.6035\n",
      "Epoch 9/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 1.6904 - accuracy: 0.5032 - val_loss: 1.3878 - val_accuracy: 0.6465\n",
      "Epoch 10/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 1.5709 - accuracy: 0.5421 - val_loss: 1.2869 - val_accuracy: 0.6543\n",
      "Epoch 11/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 1.4515 - accuracy: 0.5702 - val_loss: 1.2251 - val_accuracy: 0.6777\n",
      "Epoch 12/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 1.3549 - accuracy: 0.5797 - val_loss: 1.1648 - val_accuracy: 0.6738\n",
      "Epoch 13/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 1.2908 - accuracy: 0.6015 - val_loss: 1.1176 - val_accuracy: 0.7070\n",
      "Epoch 14/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 1.2471 - accuracy: 0.6173 - val_loss: 1.0772 - val_accuracy: 0.7188\n",
      "Epoch 15/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 1.1482 - accuracy: 0.6513 - val_loss: 1.0406 - val_accuracy: 0.7129\n",
      "Epoch 16/80\n",
      "57/57 [==============================] - 2s 30ms/step - loss: 1.0662 - accuracy: 0.6534 - val_loss: 1.0068 - val_accuracy: 0.7344\n",
      "Epoch 17/80\n",
      "57/57 [==============================] - 2s 31ms/step - loss: 1.0530 - accuracy: 0.6633 - val_loss: 0.9945 - val_accuracy: 0.7344\n",
      "Epoch 18/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 1.0029 - accuracy: 0.6675 - val_loss: 0.9942 - val_accuracy: 0.7246\n",
      "Epoch 19/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.9219 - accuracy: 0.7103 - val_loss: 0.9844 - val_accuracy: 0.7246\n",
      "Epoch 20/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.9073 - accuracy: 0.7100 - val_loss: 0.9860 - val_accuracy: 0.7266\n",
      "Epoch 21/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.8509 - accuracy: 0.7310 - val_loss: 0.9577 - val_accuracy: 0.7461\n",
      "Epoch 22/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.8417 - accuracy: 0.7265 - val_loss: 0.9592 - val_accuracy: 0.7480\n",
      "Epoch 23/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.8113 - accuracy: 0.7317 - val_loss: 0.9147 - val_accuracy: 0.7402\n",
      "Epoch 24/80\n",
      "57/57 [==============================] - 2s 40ms/step - loss: 0.7345 - accuracy: 0.7475 - val_loss: 0.9604 - val_accuracy: 0.7422\n",
      "Epoch 25/80\n",
      "57/57 [==============================] - 2s 40ms/step - loss: 0.7125 - accuracy: 0.7683 - val_loss: 0.9708 - val_accuracy: 0.7344\n",
      "Epoch 26/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.6743 - accuracy: 0.7658 - val_loss: 0.9696 - val_accuracy: 0.7344\n",
      "Epoch 27/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.6806 - accuracy: 0.7707 - val_loss: 0.9611 - val_accuracy: 0.7520\n",
      "Epoch 28/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.6684 - accuracy: 0.7704 - val_loss: 0.9740 - val_accuracy: 0.7480\n",
      "Epoch 29/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.6236 - accuracy: 0.7893 - val_loss: 0.9719 - val_accuracy: 0.7441\n",
      "Epoch 30/80\n",
      "57/57 [==============================] - 2s 39ms/step - loss: 0.6148 - accuracy: 0.7925 - val_loss: 0.9768 - val_accuracy: 0.7441\n",
      "Epoch 31/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.5969 - accuracy: 0.7971 - val_loss: 0.9384 - val_accuracy: 0.7461\n",
      "Epoch 32/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.5668 - accuracy: 0.8104 - val_loss: 0.9279 - val_accuracy: 0.7637\n",
      "Epoch 33/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.5786 - accuracy: 0.7978 - val_loss: 0.9732 - val_accuracy: 0.7500\n",
      "Epoch 34/80\n",
      "57/57 [==============================] - 2s 41ms/step - loss: 0.5362 - accuracy: 0.8139 - val_loss: 0.9789 - val_accuracy: 0.7617\n",
      "Epoch 35/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.5333 - accuracy: 0.8188 - val_loss: 0.9604 - val_accuracy: 0.7578\n",
      "Epoch 36/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.5207 - accuracy: 0.8220 - val_loss: 0.9480 - val_accuracy: 0.7500\n",
      "Epoch 37/80\n",
      "57/57 [==============================] - 2s 40ms/step - loss: 0.4855 - accuracy: 0.8346 - val_loss: 1.0021 - val_accuracy: 0.7500\n",
      "Epoch 38/80\n",
      "57/57 [==============================] - 2s 39ms/step - loss: 0.4904 - accuracy: 0.8241 - val_loss: 0.9739 - val_accuracy: 0.7559\n",
      "Epoch 39/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.4762 - accuracy: 0.8329 - val_loss: 1.0013 - val_accuracy: 0.7422\n",
      "Epoch 40/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.4636 - accuracy: 0.8332 - val_loss: 1.0122 - val_accuracy: 0.7520\n",
      "Epoch 41/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.4644 - accuracy: 0.8413 - val_loss: 0.9958 - val_accuracy: 0.7676\n",
      "Epoch 42/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.4382 - accuracy: 0.8430 - val_loss: 1.0455 - val_accuracy: 0.7461\n",
      "Epoch 43/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.4152 - accuracy: 0.8539 - val_loss: 1.0369 - val_accuracy: 0.7598\n",
      "Epoch 44/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.4241 - accuracy: 0.8430 - val_loss: 1.1106 - val_accuracy: 0.7402\n",
      "Epoch 45/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.4116 - accuracy: 0.8508 - val_loss: 1.0125 - val_accuracy: 0.7461\n",
      "Epoch 46/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.3994 - accuracy: 0.8596 - val_loss: 1.0470 - val_accuracy: 0.7695\n",
      "Epoch 47/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.4325 - accuracy: 0.8452 - val_loss: 1.0454 - val_accuracy: 0.7461\n",
      "Epoch 48/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.3701 - accuracy: 0.8718 - val_loss: 1.0575 - val_accuracy: 0.7578\n",
      "Epoch 49/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.3781 - accuracy: 0.8666 - val_loss: 1.0279 - val_accuracy: 0.7734\n",
      "Epoch 50/80\n",
      "57/57 [==============================] - 2s 34ms/step - loss: 0.3822 - accuracy: 0.8722 - val_loss: 1.0828 - val_accuracy: 0.7559\n",
      "Epoch 51/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.3535 - accuracy: 0.8715 - val_loss: 1.0420 - val_accuracy: 0.7500\n",
      "Epoch 52/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.3446 - accuracy: 0.8785 - val_loss: 1.0947 - val_accuracy: 0.7520\n",
      "Epoch 53/80\n",
      "57/57 [==============================] - 2s 39ms/step - loss: 0.3421 - accuracy: 0.8824 - val_loss: 1.0699 - val_accuracy: 0.7461\n",
      "Epoch 54/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.3586 - accuracy: 0.8694 - val_loss: 1.0417 - val_accuracy: 0.7656\n",
      "Epoch 55/80\n",
      "57/57 [==============================] - 2s 40ms/step - loss: 0.3285 - accuracy: 0.8768 - val_loss: 1.0780 - val_accuracy: 0.7617\n",
      "Epoch 56/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.3199 - accuracy: 0.8841 - val_loss: 1.0870 - val_accuracy: 0.7656\n",
      "Epoch 57/80\n",
      "57/57 [==============================] - 2s 42ms/step - loss: 0.3201 - accuracy: 0.8894 - val_loss: 1.0548 - val_accuracy: 0.7676\n",
      "Epoch 58/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2920 - accuracy: 0.8954 - val_loss: 1.0703 - val_accuracy: 0.7695\n",
      "Epoch 59/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.3039 - accuracy: 0.8916 - val_loss: 1.1101 - val_accuracy: 0.7617\n",
      "Epoch 60/80\n",
      "57/57 [==============================] - 2s 42ms/step - loss: 0.3221 - accuracy: 0.8897 - val_loss: 1.1130 - val_accuracy: 0.7520\n",
      "Epoch 61/80\n",
      "57/57 [==============================] - 2s 39ms/step - loss: 0.3108 - accuracy: 0.8919 - val_loss: 1.0888 - val_accuracy: 0.7520\n",
      "Epoch 62/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.3157 - accuracy: 0.8915 - val_loss: 1.1258 - val_accuracy: 0.7578\n",
      "Epoch 63/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.3056 - accuracy: 0.8933 - val_loss: 1.1095 - val_accuracy: 0.7676\n",
      "Epoch 64/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2912 - accuracy: 0.8964 - val_loss: 1.1501 - val_accuracy: 0.7520\n",
      "Epoch 65/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2861 - accuracy: 0.8982 - val_loss: 1.1846 - val_accuracy: 0.7500\n",
      "Epoch 66/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.2736 - accuracy: 0.9020 - val_loss: 1.1524 - val_accuracy: 0.7441\n",
      "Epoch 67/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.2727 - accuracy: 0.8985 - val_loss: 1.1769 - val_accuracy: 0.7715\n",
      "Epoch 68/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.2652 - accuracy: 0.9077 - val_loss: 1.2352 - val_accuracy: 0.7461\n",
      "Epoch 69/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.2589 - accuracy: 0.9062 - val_loss: 1.2367 - val_accuracy: 0.7422\n",
      "Epoch 70/80\n",
      "57/57 [==============================] - 2s 36ms/step - loss: 0.2690 - accuracy: 0.8968 - val_loss: 1.1756 - val_accuracy: 0.7559\n",
      "Epoch 71/80\n",
      "57/57 [==============================] - 2s 31ms/step - loss: 0.2689 - accuracy: 0.9041 - val_loss: 1.1749 - val_accuracy: 0.7441\n",
      "Epoch 72/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.2475 - accuracy: 0.9168 - val_loss: 1.2030 - val_accuracy: 0.7402\n",
      "Epoch 73/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.2404 - accuracy: 0.9105 - val_loss: 1.2158 - val_accuracy: 0.7480\n",
      "Epoch 74/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2526 - accuracy: 0.9101 - val_loss: 1.1893 - val_accuracy: 0.7559\n",
      "Epoch 75/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2342 - accuracy: 0.9210 - val_loss: 1.2666 - val_accuracy: 0.7266\n",
      "Epoch 76/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2523 - accuracy: 0.9105 - val_loss: 1.2919 - val_accuracy: 0.7383\n",
      "Epoch 77/80\n",
      "57/57 [==============================] - 2s 38ms/step - loss: 0.2451 - accuracy: 0.9077 - val_loss: 1.2883 - val_accuracy: 0.7480\n",
      "Epoch 78/80\n",
      "57/57 [==============================] - 2s 35ms/step - loss: 0.2559 - accuracy: 0.9094 - val_loss: 1.2495 - val_accuracy: 0.7480\n",
      "Epoch 79/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2562 - accuracy: 0.8992 - val_loss: 1.2393 - val_accuracy: 0.7598\n",
      "Epoch 80/80\n",
      "57/57 [==============================] - 2s 37ms/step - loss: 0.2341 - accuracy: 0.9189 - val_loss: 1.3221 - val_accuracy: 0.7500\n"
     ]
    }
   ],
   "source": [
    "# train the network\n",
    "print(\"[INFO] training model...\")\n",
    "history = model.fit(x=train_images, \n",
    "    y=train_labels, \n",
    "    validation_data=(test_images, test_labels), \n",
    "    batch_size=BATCH_SIZE,\n",
    "    epochs=EPOCHS, \n",
    "    steps_per_epoch=len(train_images)//BATCH_SIZE,\n",
    "    class_weight=classWeight)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Validation\n",
    "\n",
    "Now, we need to validate our data. Using the test data we split earlier, we can evaluate our  model. Let's plot our training accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot accuracies\n",
    "plt.plot(history.history['accuracy'], label='Training Accuracy')\n",
    "plt.plot(history.history['val_accuracy'], label = 'Validation Accuracy')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.ylim([0, 1])\n",
    "plt.legend(loc='lower right')\n",
    "plt.title(\"Training and Value Accuracy\")\n",
    "plt.savefig(\"accuracy_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A big difference between training accuracy and validation accuracy means we could have potentially overfitted the model.\n",
    "\n",
    "### Evaluation\n",
    "\n",
    "We can evaluate the loss and accuracy with the `evaluate` function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[INFO] evaluating network...\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "('Unrecognized keyword arguments:', dict_keys(['batch_shape']))",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-100-d3feebf6d1e4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtensorflow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeras\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodels\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mload_model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"[INFO] evaluating network...\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./model.h5\"\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      5\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtest_images\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mBATCH_SIZE\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0mdisplay\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"test loss, test acc:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/saving/save.py\u001b[0m in \u001b[0;36mload_model\u001b[0;34m(filepath, custom_objects, compile, options)\u001b[0m\n\u001b[1;32m    199\u001b[0m             (isinstance(filepath, h5py.File) or h5py.is_hdf5(filepath))):\n\u001b[1;32m    200\u001b[0m           return hdf5_format.load_model_from_hdf5(filepath, custom_objects,\n\u001b[0;32m--> 201\u001b[0;31m                                                   compile)\n\u001b[0m\u001b[1;32m    202\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    203\u001b[0m         \u001b[0mfilepath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpath_to_string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/saving/hdf5_format.py\u001b[0m in \u001b[0;36mload_model_from_hdf5\u001b[0;34m(filepath, custom_objects, compile)\u001b[0m\n\u001b[1;32m    179\u001b[0m     \u001b[0mmodel_config\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjson_utils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_config\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    180\u001b[0m     model = model_config_lib.model_from_config(model_config,\n\u001b[0;32m--> 181\u001b[0;31m                                                custom_objects=custom_objects)\n\u001b[0m\u001b[1;32m    182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    183\u001b[0m     \u001b[0;31m# set weights\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/saving/model_config.py\u001b[0m in \u001b[0;36mmodel_from_config\u001b[0;34m(config, custom_objects)\u001b[0m\n\u001b[1;32m     50\u001b[0m                     '`Sequential.from_config(config)`?')\n\u001b[1;32m     51\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[0mdeserialize\u001b[0m  \u001b[0;31m# pylint: disable=g-import-not-at-top\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 52\u001b[0;31m   \u001b[0;32mreturn\u001b[0m \u001b[0mdeserialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcustom_objects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcustom_objects\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     53\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/layers/serialization.py\u001b[0m in \u001b[0;36mdeserialize\u001b[0;34m(config, custom_objects)\u001b[0m\n\u001b[1;32m    210\u001b[0m       \u001b[0mmodule_objects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mLOCAL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mALL_OBJECTS\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    211\u001b[0m       \u001b[0mcustom_objects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcustom_objects\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 212\u001b[0;31m       printable_module_name='layer')\n\u001b[0m",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/utils/generic_utils.py\u001b[0m in \u001b[0;36mdeserialize_keras_object\u001b[0;34m(identifier, module_objects, custom_objects, printable_module_name)\u001b[0m\n\u001b[1;32m    676\u001b[0m             custom_objects=dict(\n\u001b[1;32m    677\u001b[0m                 \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_GLOBAL_CUSTOM_OBJECTS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\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[0;32m--> 678\u001b[0;31m                 list(custom_objects.items())))\n\u001b[0m\u001b[1;32m    679\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    680\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mCustomObjectScope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcustom_objects\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~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/engine/sequential.py\u001b[0m in \u001b[0;36mfrom_config\u001b[0;34m(cls, config, custom_objects)\u001b[0m\n\u001b[1;32m    431\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mlayer_config\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlayer_configs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    432\u001b[0m       layer = layer_module.deserialize(layer_config,\n\u001b[0;32m--> 433\u001b[0;31m                                        custom_objects=custom_objects)\n\u001b[0m\u001b[1;32m    434\u001b[0m       \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlayer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    435\u001b[0m     if (not model.inputs and build_input_shape and\n",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/layers/serialization.py\u001b[0m in \u001b[0;36mdeserialize\u001b[0;34m(config, custom_objects)\u001b[0m\n\u001b[1;32m    210\u001b[0m       \u001b[0mmodule_objects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mLOCAL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mALL_OBJECTS\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    211\u001b[0m       \u001b[0mcustom_objects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcustom_objects\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 212\u001b[0;31m       printable_module_name='layer')\n\u001b[0m",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/utils/generic_utils.py\u001b[0m in \u001b[0;36mdeserialize_keras_object\u001b[0;34m(identifier, module_objects, custom_objects, printable_module_name)\u001b[0m\n\u001b[1;32m    679\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    680\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mCustomObjectScope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcustom_objects\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--> 681\u001b[0;31m           \u001b[0mdeserialized_obj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls_config\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    682\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    683\u001b[0m       \u001b[0;31m# Then `cls` may be a function returning a class.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/engine/base_layer.py\u001b[0m in \u001b[0;36mfrom_config\u001b[0;34m(cls, config)\u001b[0m\n\u001b[1;32m    746\u001b[0m         \u001b[0mA\u001b[0m \u001b[0mlayer\u001b[0m \u001b[0minstance\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    747\u001b[0m     \"\"\"\n\u001b[0;32m--> 748\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mconfig\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    749\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    750\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0mcompute_output_shape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput_shape\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~/miniconda3/envs/intro_to_ai/lib/python3.6/site-packages/keras/engine/input_layer.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, input_shape, batch_size, dtype, input_tensor, sparse, name, ragged, type_spec, **kwargs)\u001b[0m\n\u001b[1;32m    132\u001b[0m         \u001b[0minput_shape\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch_input_shape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\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    133\u001b[0m     \u001b[0;32mif\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[0;32m--> 134\u001b[0;31m       \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Unrecognized keyword arguments:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\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[1;32m    135\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    136\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0msparse\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mragged\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: ('Unrecognized keyword arguments:', dict_keys(['batch_shape']))"
     ]
    }
   ],
   "source": [
    "# evaluate the network\n",
    "#from tensorflow.keras.models import load_model\n",
    "#print(\"[INFO] evaluating network...\")\n",
    "#model = load_model(\"./model.h5\")\n",
    "results = model.evaluate(test_images, test_labels, batch_size=BATCH_SIZE)\n",
    "display(f\"test loss, test acc:\", results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predictions\n",
    "\n",
    "Let's predict with our model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[INFO] predicting test samples...\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'predictions shape:'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(512, 62)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.60      0.67      0.63         9\n",
      "           1       0.88      0.78      0.82         9\n",
      "           2       0.89      1.00      0.94         8\n",
      "           3       0.75      0.75      0.75         8\n",
      "           4       0.62      0.62      0.62         8\n",
      "           5       0.71      0.62      0.67         8\n",
      "           6       0.73      1.00      0.84         8\n",
      "           7       0.88      0.88      0.88         8\n",
      "           8       0.73      1.00      0.84         8\n",
      "           9       0.57      0.50      0.53         8\n",
      "           A       0.89      0.89      0.89         9\n",
      "           B       1.00      0.62      0.77         8\n",
      "           C       0.67      0.89      0.76         9\n",
      "           D       1.00      1.00      1.00         8\n",
      "           E       0.86      0.75      0.80         8\n",
      "           F       0.89      1.00      0.94         8\n",
      "           G       1.00      0.75      0.86         8\n",
      "           H       0.78      0.88      0.82         8\n",
      "           I       0.57      0.50      0.53         8\n",
      "           G       0.71      0.56      0.63         9\n",
      "           K       0.88      0.88      0.88         8\n",
      "           L       1.00      0.88      0.93         8\n",
      "           M       0.86      0.67      0.75         9\n",
      "           N       0.67      0.67      0.67         9\n",
      "           O       0.50      0.62      0.56         8\n",
      "           P       0.46      0.75      0.57         8\n",
      "           Q       1.00      0.78      0.88         9\n",
      "           R       1.00      0.75      0.86         8\n",
      "           S       0.80      1.00      0.89         8\n",
      "           T       0.83      0.62      0.71         8\n",
      "           U       0.70      0.88      0.78         8\n",
      "           V       0.88      0.88      0.88         8\n",
      "           W       0.71      0.62      0.67         8\n",
      "           X       0.73      0.89      0.80         9\n",
      "           Y       1.00      1.00      1.00         8\n",
      "           Z       1.00      0.62      0.77         8\n",
      "           a       0.67      0.50      0.57         8\n",
      "           b       1.00      0.62      0.77         8\n",
      "           c       0.43      0.33      0.38         9\n",
      "           d       0.89      0.89      0.89         9\n",
      "           e       0.46      0.75      0.57         8\n",
      "           f       1.00      0.56      0.71         9\n",
      "           g       0.86      0.75      0.80         8\n",
      "           h       0.88      0.78      0.82         9\n",
      "           i       0.78      0.88      0.82         8\n",
      "           g       0.64      0.88      0.74         8\n",
      "           k       0.86      0.75      0.80         8\n",
      "           l       0.54      0.78      0.64         9\n",
      "           m       0.89      1.00      0.94         8\n",
      "           n       0.75      0.75      0.75         8\n",
      "           o       0.86      0.75      0.80         8\n",
      "           p       1.00      0.67      0.80         9\n",
      "           q       0.67      0.50      0.57         8\n",
      "           r       0.50      0.62      0.56         8\n",
      "           s       0.50      0.56      0.53         9\n",
      "           t       1.00      0.75      0.86         8\n",
      "           u       0.83      0.62      0.71         8\n",
      "           v       0.56      0.62      0.59         8\n",
      "           w       0.67      0.75      0.71         8\n",
      "           x       0.67      0.75      0.71         8\n",
      "           y       0.86      0.75      0.80         8\n",
      "           z       0.58      0.88      0.70         8\n",
      "\n",
      "    accuracy                           0.75       512\n",
      "   macro avg       0.77      0.75      0.75       512\n",
      "weighted avg       0.77      0.75      0.75       512\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"[INFO] predicting test samples...\")\n",
    "predictions = model.predict(test_images, batch_size=BATCH_SIZE)\n",
    "display(\"predictions shape:\", predictions.shape)\n",
    "\n",
    "# labels for readability\n",
    "labelNames = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', \n",
    "                   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', \n",
    "                   'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n",
    "                   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', \n",
    "                   'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']\n",
    "\n",
    "print(classification_report(test_labels.argmax(axis=1),\n",
    "    predictions.argmax(axis=1), target_names=labelNames))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Saving\n",
    "\n",
    "Lets save the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[INFO] saving trained model...\n"
     ]
    }
   ],
   "source": [
    " # save the model to disk\n",
    "print(\"[INFO] saving trained model...\")\n",
    "model.save(\"OCR_CNN.h5\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Intro_to_AI",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}