diff --git "a/create-model/create_image_classification_model.ipynb" "b/create-model/create_image_classification_model.ipynb" new file mode 100644--- /dev/null +++ "b/create-model/create_image_classification_model.ipynb" @@ -0,0 +1,871 @@ +{ + "cells": [ + { + "cell_type": "code", + "source": [ + "# Script for creating and training model, run on google colabs for fastest results" + ], + "metadata": { + "id": "zhrHDcIlNnWf" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ctKEIe4wimul" + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"TF_CPP_MIN_LOG_LEVEL\"] = \"2\"\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "from tensorflow.keras import layers\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.preprocessing.image import load_img\n", + "from tensorflow.keras.preprocessing.image import img_to_array\n", + "import PIL\n", + "import numpy as np\n", + "import cv2\n", + "import matplotlib.pyplot as plt\n", + "import random\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n", + "import pandas as pd\n", + "import numpy as np\n", + "import seaborn as sns\n", + "\n", + "img_height = 128\n", + "img_width = 128\n", + "batch_size = 32" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nx0oLdzhFknL", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7ee12f73-884f-49b9-ab9e-0247a3f5c40e" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mounted at /content/drive\n" + ] + } + ], + "source": [ + "#connect your google drive to the notebook on google colab\n", + "from google.colab import drive\n", + "drive.mount('/content/drive')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yCEMd_hkiXYW" + }, + "outputs": [], + "source": [ + "# numpy file of correct name needs to be uploaded in your google drive. change path as required\n", + "# the numpy file contains all the data for training\n", + "# use the create_training_data_array.py file to create this npy file\n", + "td_array = np.load('drive/MyDrive/lego_project/td_array_7cat.npy', allow_pickle=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nwourKnvlPZQ", + "outputId": "7b0a4f43-abcc-4a43-b72f-5bb7f93cd288" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Found GPU at: /device:GPU:0\n" + ] + } + ], + "source": [ + "# checking if GPU is enabled ingoogle collabs\n", + "device_name = tf.test.gpu_device_name()\n", + "if device_name != '/device:GPU:0':\n", + " raise SystemError('GPU device not found')\n", + "print('Found GPU at: {}'.format(device_name))" + ] + }, + { + "cell_type": "code", + "source": [ + "# functions for increasing contrast for images, using the second function at the moment as it has better results\n", + "\n", + "def increase_contrast_little(s):\n", + " npImage = s\n", + "\n", + " min=np.min(npImage) # result=144\n", + " max=np.max(npImage) # result=216\n", + "\n", + " # Make a LUT (Look-Up Table) to translate image values\n", + " LUT=np.zeros(256,dtype=np.uint8)\n", + " LUT[min:max+1]=np.linspace(start=0,stop=255,num=(max-min)+1,endpoint=True,dtype=np.uint8)\n", + " s_new = LUT[npImage]\n", + " return s_new\n", + "\n", + "def increase_contrast_more(s):\n", + " minval = np.percentile(s, 2)\n", + " maxval = np.percentile(s, 98)\n", + " npImage = np.clip(s, minval, maxval)\n", + "\n", + " npImage = npImage.astype(int)\n", + "\n", + " min=np.min(npImage) # result=144\n", + " max=np.max(npImage) # result=216\n", + "\n", + " # Make a LUT (Look-Up Table) to translate image values\n", + " LUT=np.zeros(256,dtype=np.uint8)\n", + " LUT[min:max+1]=np.linspace(start=0,stop=255,num=(max-min)+1,endpoint=True,dtype=np.uint8)\n", + " s_clipped = LUT[npImage]\n", + " return s_clipped" + ], + "metadata": { + "id": "7QnOLiRGn-da" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2ay8RzaNilMW" + }, + "outputs": [], + "source": [ + "# Convert the training data into list and randomize the order to get a fair split for testing and training data\n", + "training_data = td_array.tolist()\n", + "random.shuffle(training_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "HtO29pvqifzU" + }, + "outputs": [], + "source": [ + "# Create x and y lists for the images and its labels (i.e integers from 0 - 6) respectively\n", + "x = []\n", + "y = [] \n", + "\n", + "for piece, label in training_data:\n", + " x.append(piece)\n", + " y.append(label)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "OYIwVqaoyeuY" + }, + "outputs": [], + "source": [ + "x = np.array(list(map(increase_contrast_more, x))) #increase contrast of images\n", + "x = np.array(x).reshape(-1,128,128,1) #reshape images for the model\n", + "y = np.asarray(y)\n", + "x_train, x_test, y_train, y_test = train_test_split(x,y, test_size = 0.2) # split the data into testing and training sets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RWM2m4Jmjb1X", + "outputId": "020319ff-4223-4c12-fe2a-9a7693d741a1" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/200\n", + "191/191 - 20s - loss: 1.8599 - accuracy: 0.2182 - val_loss: 1.6822 - val_accuracy: 0.3073 - 20s/epoch - 103ms/step\n", + "Epoch 2/200\n", + "191/191 - 6s - loss: 1.6006 - accuracy: 0.3526 - val_loss: 1.4276 - val_accuracy: 0.4223 - 6s/epoch - 33ms/step\n", + "Epoch 3/200\n", + "191/191 - 6s - loss: 1.3934 - accuracy: 0.4656 - val_loss: 1.2113 - val_accuracy: 0.5281 - 6s/epoch - 31ms/step\n", + "Epoch 4/200\n", + "191/191 - 6s - loss: 1.2273 - accuracy: 0.5481 - val_loss: 1.0442 - val_accuracy: 0.6238 - 6s/epoch - 31ms/step\n", + "Epoch 5/200\n", + "191/191 - 6s - loss: 1.0878 - accuracy: 0.6027 - val_loss: 0.9726 - val_accuracy: 0.6280 - 6s/epoch - 32ms/step\n", + "Epoch 6/200\n", + "191/191 - 6s - loss: 1.0083 - accuracy: 0.6205 - val_loss: 0.8209 - val_accuracy: 0.6935 - 6s/epoch - 31ms/step\n", + "Epoch 7/200\n", + "191/191 - 6s - loss: 0.9504 - accuracy: 0.6424 - val_loss: 0.8090 - val_accuracy: 0.6935 - 6s/epoch - 31ms/step\n", + "Epoch 8/200\n", + "191/191 - 6s - loss: 0.8669 - accuracy: 0.6732 - val_loss: 0.7835 - val_accuracy: 0.7003 - 6s/epoch - 31ms/step\n", + "Epoch 9/200\n", + "191/191 - 6s - loss: 0.8141 - accuracy: 0.6829 - val_loss: 0.7033 - val_accuracy: 0.7397 - 6s/epoch - 31ms/step\n", + "Epoch 10/200\n", + "191/191 - 6s - loss: 0.7716 - accuracy: 0.7043 - val_loss: 0.7365 - val_accuracy: 0.7372 - 6s/epoch - 31ms/step\n", + "Epoch 11/200\n", + "191/191 - 6s - loss: 0.7371 - accuracy: 0.7197 - val_loss: 0.7385 - val_accuracy: 0.7322 - 6s/epoch - 31ms/step\n", + "Epoch 12/200\n", + "191/191 - 6s - loss: 0.7264 - accuracy: 0.7236 - val_loss: 0.7024 - val_accuracy: 0.7338 - 6s/epoch - 31ms/step\n", + "Epoch 13/200\n", + "191/191 - 6s - loss: 0.6738 - accuracy: 0.7514 - val_loss: 0.6785 - val_accuracy: 0.7573 - 6s/epoch - 31ms/step\n", + "Epoch 14/200\n", + "191/191 - 6s - loss: 0.6468 - accuracy: 0.7572 - val_loss: 0.6372 - val_accuracy: 0.7725 - 6s/epoch - 31ms/step\n", + "Epoch 15/200\n", + "191/191 - 7s - loss: 0.6265 - accuracy: 0.7667 - val_loss: 0.5935 - val_accuracy: 0.7876 - 7s/epoch - 36ms/step\n", + "Epoch 16/200\n", + "191/191 - 8s - loss: 0.6039 - accuracy: 0.7715 - val_loss: 0.5628 - val_accuracy: 0.8010 - 8s/epoch - 40ms/step\n", + "Epoch 17/200\n", + "191/191 - 7s - loss: 0.5862 - accuracy: 0.7810 - val_loss: 0.5561 - val_accuracy: 0.7993 - 7s/epoch - 35ms/step\n", + "Epoch 18/200\n", + "191/191 - 6s - loss: 0.5739 - accuracy: 0.7827 - val_loss: 0.5280 - val_accuracy: 0.8170 - 6s/epoch - 31ms/step\n", + "Epoch 19/200\n", + "191/191 - 6s - loss: 0.5514 - accuracy: 0.7929 - val_loss: 0.5538 - val_accuracy: 0.8111 - 6s/epoch - 31ms/step\n", + "Epoch 20/200\n", + "191/191 - 6s - loss: 0.5593 - accuracy: 0.7919 - val_loss: 0.5698 - val_accuracy: 0.7935 - 6s/epoch - 31ms/step\n", + "Epoch 21/200\n", + "191/191 - 6s - loss: 0.5432 - accuracy: 0.7980 - val_loss: 0.5751 - val_accuracy: 0.8060 - 6s/epoch - 31ms/step\n", + "Epoch 22/200\n", + "191/191 - 6s - loss: 0.5319 - accuracy: 0.8005 - val_loss: 0.6473 - val_accuracy: 0.7699 - 6s/epoch - 31ms/step\n", + "Epoch 23/200\n", + "191/191 - 6s - loss: 0.5074 - accuracy: 0.8068 - val_loss: 0.4729 - val_accuracy: 0.8296 - 6s/epoch - 32ms/step\n", + "Epoch 24/200\n", + "191/191 - 6s - loss: 0.4989 - accuracy: 0.8146 - val_loss: 0.4935 - val_accuracy: 0.8254 - 6s/epoch - 31ms/step\n", + "Epoch 25/200\n", + "191/191 - 6s - loss: 0.5042 - accuracy: 0.8066 - val_loss: 0.4527 - val_accuracy: 0.8312 - 6s/epoch - 31ms/step\n", + "Epoch 26/200\n", + "191/191 - 6s - loss: 0.4872 - accuracy: 0.8167 - val_loss: 0.5095 - val_accuracy: 0.8144 - 6s/epoch - 31ms/step\n", + "Epoch 27/200\n", + "191/191 - 6s - loss: 0.4858 - accuracy: 0.8144 - val_loss: 0.4819 - val_accuracy: 0.8312 - 6s/epoch - 31ms/step\n", + "Epoch 28/200\n", + "191/191 - 6s - loss: 0.4653 - accuracy: 0.8293 - val_loss: 0.4231 - val_accuracy: 0.8505 - 6s/epoch - 31ms/step\n", + "Epoch 29/200\n", + "191/191 - 6s - loss: 0.4643 - accuracy: 0.8280 - val_loss: 0.5192 - val_accuracy: 0.8102 - 6s/epoch - 31ms/step\n", + "Epoch 30/200\n", + "191/191 - 6s - loss: 0.4478 - accuracy: 0.8383 - val_loss: 0.4131 - val_accuracy: 0.8556 - 6s/epoch - 31ms/step\n", + "Epoch 31/200\n", + "191/191 - 6s - loss: 0.4403 - accuracy: 0.8354 - val_loss: 0.3883 - val_accuracy: 0.8665 - 6s/epoch - 33ms/step\n", + "Epoch 32/200\n", + "191/191 - 6s - loss: 0.4284 - accuracy: 0.8349 - val_loss: 0.4503 - val_accuracy: 0.8472 - 6s/epoch - 31ms/step\n", + "Epoch 33/200\n", + "191/191 - 6s - loss: 0.4293 - accuracy: 0.8438 - val_loss: 0.5021 - val_accuracy: 0.8153 - 6s/epoch - 32ms/step\n", + "Epoch 34/200\n", + "191/191 - 6s - loss: 0.4372 - accuracy: 0.8408 - val_loss: 0.3696 - val_accuracy: 0.8732 - 6s/epoch - 31ms/step\n", + "Epoch 35/200\n", + "191/191 - 6s - loss: 0.4206 - accuracy: 0.8436 - val_loss: 0.5415 - val_accuracy: 0.8010 - 6s/epoch - 31ms/step\n", + "Epoch 36/200\n", + "191/191 - 6s - loss: 0.4201 - accuracy: 0.8438 - val_loss: 0.4225 - val_accuracy: 0.8547 - 6s/epoch - 31ms/step\n", + "Epoch 37/200\n", + "191/191 - 6s - loss: 0.3999 - accuracy: 0.8530 - val_loss: 0.3635 - val_accuracy: 0.8640 - 6s/epoch - 31ms/step\n", + "Epoch 38/200\n", + "191/191 - 6s - loss: 0.3960 - accuracy: 0.8520 - val_loss: 0.3590 - val_accuracy: 0.8673 - 6s/epoch - 32ms/step\n", + "Epoch 39/200\n", + "191/191 - 6s - loss: 0.4024 - accuracy: 0.8480 - val_loss: 0.3424 - val_accuracy: 0.8858 - 6s/epoch - 31ms/step\n", + "Epoch 40/200\n", + "191/191 - 6s - loss: 0.3843 - accuracy: 0.8583 - val_loss: 0.3613 - val_accuracy: 0.8791 - 6s/epoch - 31ms/step\n", + "Epoch 41/200\n", + "191/191 - 6s - loss: 0.3800 - accuracy: 0.8633 - val_loss: 0.3503 - val_accuracy: 0.8715 - 6s/epoch - 31ms/step\n", + "Epoch 42/200\n", + "191/191 - 6s - loss: 0.3800 - accuracy: 0.8583 - val_loss: 0.4737 - val_accuracy: 0.8405 - 6s/epoch - 31ms/step\n", + "Epoch 43/200\n", + "191/191 - 6s - loss: 0.3957 - accuracy: 0.8541 - val_loss: 0.4410 - val_accuracy: 0.8421 - 6s/epoch - 31ms/step\n", + "Epoch 44/200\n", + "191/191 - 6s - loss: 0.3738 - accuracy: 0.8591 - val_loss: 0.3330 - val_accuracy: 0.8866 - 6s/epoch - 33ms/step\n", + "Epoch 45/200\n", + "191/191 - 6s - loss: 0.3742 - accuracy: 0.8643 - val_loss: 0.4078 - val_accuracy: 0.8480 - 6s/epoch - 31ms/step\n", + "Epoch 46/200\n", + "191/191 - 6s - loss: 0.3561 - accuracy: 0.8683 - val_loss: 0.3897 - val_accuracy: 0.8589 - 6s/epoch - 31ms/step\n", + "Epoch 47/200\n", + "191/191 - 6s - loss: 0.3637 - accuracy: 0.8637 - val_loss: 0.3817 - val_accuracy: 0.8707 - 6s/epoch - 31ms/step\n", + "Epoch 48/200\n", + "191/191 - 6s - loss: 0.3424 - accuracy: 0.8746 - val_loss: 0.4962 - val_accuracy: 0.8128 - 6s/epoch - 31ms/step\n", + "Epoch 49/200\n", + "191/191 - 6s - loss: 0.3498 - accuracy: 0.8709 - val_loss: 0.3322 - val_accuracy: 0.8816 - 6s/epoch - 31ms/step\n", + "Epoch 50/200\n", + "191/191 - 6s - loss: 0.3447 - accuracy: 0.8742 - val_loss: 0.4375 - val_accuracy: 0.8321 - 6s/epoch - 31ms/step\n", + "Epoch 51/200\n", + "191/191 - 6s - loss: 0.3414 - accuracy: 0.8769 - val_loss: 0.3302 - val_accuracy: 0.8783 - 6s/epoch - 31ms/step\n", + "Epoch 52/200\n", + "191/191 - 6s - loss: 0.3462 - accuracy: 0.8706 - val_loss: 0.3056 - val_accuracy: 0.8900 - 6s/epoch - 31ms/step\n", + "Epoch 53/200\n", + "191/191 - 6s - loss: 0.3306 - accuracy: 0.8803 - val_loss: 0.2843 - val_accuracy: 0.9026 - 6s/epoch - 31ms/step\n", + "Epoch 54/200\n", + "191/191 - 6s - loss: 0.3338 - accuracy: 0.8763 - val_loss: 0.3790 - val_accuracy: 0.8749 - 6s/epoch - 31ms/step\n", + "Epoch 55/200\n", + "191/191 - 6s - loss: 0.3175 - accuracy: 0.8822 - val_loss: 0.3138 - val_accuracy: 0.8833 - 6s/epoch - 31ms/step\n", + "Epoch 56/200\n", + "191/191 - 6s - loss: 0.3335 - accuracy: 0.8776 - val_loss: 0.3399 - val_accuracy: 0.8741 - 6s/epoch - 31ms/step\n", + "Epoch 57/200\n", + "191/191 - 6s - loss: 0.3299 - accuracy: 0.8830 - val_loss: 0.3066 - val_accuracy: 0.8942 - 6s/epoch - 31ms/step\n", + "Epoch 58/200\n", + "191/191 - 6s - loss: 0.3272 - accuracy: 0.8835 - val_loss: 0.3022 - val_accuracy: 0.9102 - 6s/epoch - 31ms/step\n", + "Epoch 59/200\n", + "191/191 - 6s - loss: 0.3264 - accuracy: 0.8839 - val_loss: 0.3155 - val_accuracy: 0.9018 - 6s/epoch - 31ms/step\n", + "Epoch 60/200\n", + "191/191 - 6s - loss: 0.3092 - accuracy: 0.8872 - val_loss: 0.3721 - val_accuracy: 0.8791 - 6s/epoch - 31ms/step\n", + "Epoch 61/200\n", + "191/191 - 6s - loss: 0.3040 - accuracy: 0.8929 - val_loss: 0.3416 - val_accuracy: 0.8757 - 6s/epoch - 31ms/step\n", + "Epoch 62/200\n", + "191/191 - 6s - loss: 0.3048 - accuracy: 0.8877 - val_loss: 0.4115 - val_accuracy: 0.8606 - 6s/epoch - 31ms/step\n", + "Epoch 63/200\n", + "191/191 - 6s - loss: 0.3172 - accuracy: 0.8902 - val_loss: 0.2920 - val_accuracy: 0.9043 - 6s/epoch - 31ms/step\n", + "Epoch 64/200\n", + "191/191 - 6s - loss: 0.2968 - accuracy: 0.8982 - val_loss: 0.3198 - val_accuracy: 0.8883 - 6s/epoch - 31ms/step\n", + "Epoch 65/200\n", + "191/191 - 6s - loss: 0.3086 - accuracy: 0.8879 - val_loss: 0.2756 - val_accuracy: 0.9102 - 6s/epoch - 31ms/step\n", + "Epoch 66/200\n", + "191/191 - 6s - loss: 0.2959 - accuracy: 0.8919 - val_loss: 0.3974 - val_accuracy: 0.8589 - 6s/epoch - 31ms/step\n", + "Epoch 67/200\n", + "191/191 - 6s - loss: 0.2822 - accuracy: 0.8937 - val_loss: 0.3191 - val_accuracy: 0.8942 - 6s/epoch - 31ms/step\n", + "Epoch 68/200\n", + "191/191 - 6s - loss: 0.2953 - accuracy: 0.8931 - val_loss: 0.2589 - val_accuracy: 0.9060 - 6s/epoch - 31ms/step\n", + "Epoch 69/200\n", + "191/191 - 6s - loss: 0.2937 - accuracy: 0.8933 - val_loss: 0.2640 - val_accuracy: 0.9043 - 6s/epoch - 31ms/step\n", + "Epoch 70/200\n", + "191/191 - 6s - loss: 0.3094 - accuracy: 0.8853 - val_loss: 0.2675 - val_accuracy: 0.9144 - 6s/epoch - 31ms/step\n", + "Epoch 71/200\n", + "191/191 - 6s - loss: 0.3004 - accuracy: 0.8877 - val_loss: 0.3067 - val_accuracy: 0.8917 - 6s/epoch - 31ms/step\n", + "Epoch 72/200\n", + "191/191 - 6s - loss: 0.2791 - accuracy: 0.9051 - val_loss: 0.2472 - val_accuracy: 0.9144 - 6s/epoch - 31ms/step\n", + "Epoch 73/200\n", + "191/191 - 6s - loss: 0.2752 - accuracy: 0.8990 - val_loss: 0.4041 - val_accuracy: 0.8581 - 6s/epoch - 31ms/step\n", + "Epoch 74/200\n", + "191/191 - 6s - loss: 0.2973 - accuracy: 0.8963 - val_loss: 0.2834 - val_accuracy: 0.8976 - 6s/epoch - 31ms/step\n", + "Epoch 75/200\n", + "191/191 - 6s - loss: 0.2810 - accuracy: 0.8973 - val_loss: 0.2666 - val_accuracy: 0.9093 - 6s/epoch - 31ms/step\n", + "Epoch 76/200\n", + "191/191 - 6s - loss: 0.2684 - accuracy: 0.8998 - val_loss: 0.2531 - val_accuracy: 0.9043 - 6s/epoch - 31ms/step\n", + "Epoch 77/200\n", + "191/191 - 6s - loss: 0.2770 - accuracy: 0.8992 - val_loss: 0.2799 - val_accuracy: 0.8959 - 6s/epoch - 31ms/step\n", + "Epoch 78/200\n", + "191/191 - 6s - loss: 0.2541 - accuracy: 0.9032 - val_loss: 0.2629 - val_accuracy: 0.9127 - 6s/epoch - 31ms/step\n", + "Epoch 79/200\n", + "191/191 - 6s - loss: 0.2642 - accuracy: 0.9005 - val_loss: 0.2664 - val_accuracy: 0.9018 - 6s/epoch - 31ms/step\n", + "Epoch 80/200\n", + "191/191 - 6s - loss: 0.2986 - accuracy: 0.8946 - val_loss: 0.2727 - val_accuracy: 0.9026 - 6s/epoch - 31ms/step\n", + "Epoch 81/200\n", + "191/191 - 6s - loss: 0.2539 - accuracy: 0.9087 - val_loss: 0.2865 - val_accuracy: 0.8959 - 6s/epoch - 31ms/step\n", + "Epoch 82/200\n", + "191/191 - 6s - loss: 0.2492 - accuracy: 0.9114 - val_loss: 0.3749 - val_accuracy: 0.8699 - 6s/epoch - 31ms/step\n", + "Epoch 83/200\n", + "191/191 - 6s - loss: 0.2739 - accuracy: 0.8990 - val_loss: 0.2487 - val_accuracy: 0.9076 - 6s/epoch - 31ms/step\n", + "Epoch 84/200\n", + "191/191 - 6s - loss: 0.2554 - accuracy: 0.9040 - val_loss: 0.3310 - val_accuracy: 0.8858 - 6s/epoch - 31ms/step\n", + "Epoch 85/200\n", + "191/191 - 6s - loss: 0.2707 - accuracy: 0.9040 - val_loss: 0.2776 - val_accuracy: 0.9076 - 6s/epoch - 31ms/step\n", + "Epoch 86/200\n", + "191/191 - 6s - loss: 0.2408 - accuracy: 0.9103 - val_loss: 0.2840 - val_accuracy: 0.8950 - 6s/epoch - 31ms/step\n", + "Epoch 87/200\n", + "191/191 - 6s - loss: 0.2573 - accuracy: 0.9059 - val_loss: 0.3517 - val_accuracy: 0.8766 - 6s/epoch - 31ms/step\n", + "Epoch 88/200\n", + "191/191 - 6s - loss: 0.2650 - accuracy: 0.9038 - val_loss: 0.2832 - val_accuracy: 0.8959 - 6s/epoch - 31ms/step\n", + "Epoch 89/200\n", + "191/191 - 6s - loss: 0.2542 - accuracy: 0.9076 - val_loss: 0.2672 - val_accuracy: 0.9018 - 6s/epoch - 31ms/step\n", + "Epoch 90/200\n", + "191/191 - 6s - loss: 0.2532 - accuracy: 0.9070 - val_loss: 0.2166 - val_accuracy: 0.9337 - 6s/epoch - 31ms/step\n", + "Epoch 91/200\n", + "191/191 - 6s - loss: 0.2521 - accuracy: 0.9074 - val_loss: 0.2266 - val_accuracy: 0.9219 - 6s/epoch - 31ms/step\n", + "Epoch 92/200\n", + "191/191 - 6s - loss: 0.2317 - accuracy: 0.9143 - val_loss: 0.2400 - val_accuracy: 0.9177 - 6s/epoch - 31ms/step\n", + "Epoch 93/200\n", + "191/191 - 6s - loss: 0.2578 - accuracy: 0.9059 - val_loss: 0.3567 - val_accuracy: 0.8707 - 6s/epoch - 31ms/step\n", + "Epoch 94/200\n", + "191/191 - 6s - loss: 0.2458 - accuracy: 0.9099 - val_loss: 0.2434 - val_accuracy: 0.9177 - 6s/epoch - 31ms/step\n", + "Epoch 95/200\n", + "191/191 - 6s - loss: 0.2479 - accuracy: 0.9082 - val_loss: 0.2591 - val_accuracy: 0.9160 - 6s/epoch - 31ms/step\n", + "Epoch 96/200\n", + "191/191 - 6s - loss: 0.2505 - accuracy: 0.9108 - val_loss: 0.2158 - val_accuracy: 0.9270 - 6s/epoch - 31ms/step\n", + "Epoch 97/200\n", + "191/191 - 6s - loss: 0.2330 - accuracy: 0.9175 - val_loss: 0.2503 - val_accuracy: 0.9211 - 6s/epoch - 31ms/step\n", + "Epoch 98/200\n", + "191/191 - 6s - loss: 0.2309 - accuracy: 0.9131 - val_loss: 0.2394 - val_accuracy: 0.9261 - 6s/epoch - 31ms/step\n", + "Epoch 99/200\n", + "191/191 - 6s - loss: 0.2435 - accuracy: 0.9087 - val_loss: 0.2696 - val_accuracy: 0.9127 - 6s/epoch - 31ms/step\n", + "Epoch 100/200\n", + "191/191 - 6s - loss: 0.2424 - accuracy: 0.9129 - val_loss: 0.2092 - val_accuracy: 0.9286 - 6s/epoch - 31ms/step\n", + "Epoch 101/200\n", + "191/191 - 6s - loss: 0.2403 - accuracy: 0.9152 - val_loss: 0.2266 - val_accuracy: 0.9244 - 6s/epoch - 31ms/step\n", + "Epoch 102/200\n", + "191/191 - 6s - loss: 0.2226 - accuracy: 0.9221 - val_loss: 0.2375 - val_accuracy: 0.9110 - 6s/epoch - 31ms/step\n", + "Epoch 103/200\n", + "191/191 - 6s - loss: 0.2366 - accuracy: 0.9097 - val_loss: 0.2978 - val_accuracy: 0.8959 - 6s/epoch - 31ms/step\n", + "Epoch 104/200\n", + "191/191 - 6s - loss: 0.2223 - accuracy: 0.9187 - val_loss: 0.2076 - val_accuracy: 0.9303 - 6s/epoch - 31ms/step\n", + "Epoch 105/200\n", + "191/191 - 6s - loss: 0.2376 - accuracy: 0.9164 - val_loss: 0.2654 - val_accuracy: 0.9160 - 6s/epoch - 31ms/step\n", + "Epoch 106/200\n", + "191/191 - 6s - loss: 0.2364 - accuracy: 0.9145 - val_loss: 0.3389 - val_accuracy: 0.8858 - 6s/epoch - 31ms/step\n", + "Epoch 107/200\n", + "191/191 - 6s - loss: 0.2486 - accuracy: 0.9103 - val_loss: 0.2373 - val_accuracy: 0.9169 - 6s/epoch - 31ms/step\n", + "Epoch 108/200\n", + "191/191 - 6s - loss: 0.2427 - accuracy: 0.9112 - val_loss: 0.2240 - val_accuracy: 0.9211 - 6s/epoch - 31ms/step\n", + "Epoch 109/200\n", + "191/191 - 6s - loss: 0.2281 - accuracy: 0.9217 - val_loss: 0.2506 - val_accuracy: 0.9244 - 6s/epoch - 31ms/step\n", + "Epoch 110/200\n", + "191/191 - 6s - loss: 0.2101 - accuracy: 0.9202 - val_loss: 0.2366 - val_accuracy: 0.9219 - 6s/epoch - 31ms/step\n", + "Epoch 111/200\n", + "191/191 - 6s - loss: 0.2145 - accuracy: 0.9221 - val_loss: 0.2798 - val_accuracy: 0.9110 - 6s/epoch - 31ms/step\n", + "Epoch 112/200\n", + "191/191 - 6s - loss: 0.2241 - accuracy: 0.9194 - val_loss: 0.2278 - val_accuracy: 0.9295 - 6s/epoch - 31ms/step\n", + "Epoch 113/200\n", + "191/191 - 6s - loss: 0.2322 - accuracy: 0.9185 - val_loss: 0.2088 - val_accuracy: 0.9312 - 6s/epoch - 31ms/step\n", + "Epoch 114/200\n", + "191/191 - 6s - loss: 0.2300 - accuracy: 0.9173 - val_loss: 0.2502 - val_accuracy: 0.9018 - 6s/epoch - 31ms/step\n", + "Epoch 115/200\n", + "191/191 - 6s - loss: 0.2165 - accuracy: 0.9221 - val_loss: 0.3075 - val_accuracy: 0.8967 - 6s/epoch - 31ms/step\n", + "Epoch 116/200\n", + "191/191 - 6s - loss: 0.2076 - accuracy: 0.9221 - val_loss: 0.2169 - val_accuracy: 0.9219 - 6s/epoch - 31ms/step\n", + "Epoch 117/200\n", + "191/191 - 6s - loss: 0.2257 - accuracy: 0.9160 - val_loss: 0.2281 - val_accuracy: 0.9169 - 6s/epoch - 31ms/step\n", + "Epoch 118/200\n", + "191/191 - 6s - loss: 0.1926 - accuracy: 0.9292 - val_loss: 0.2224 - val_accuracy: 0.9211 - 6s/epoch - 31ms/step\n", + "Epoch 119/200\n", + "191/191 - 6s - loss: 0.2141 - accuracy: 0.9179 - val_loss: 0.2371 - val_accuracy: 0.9152 - 6s/epoch - 31ms/step\n", + "Epoch 120/200\n", + "191/191 - 6s - loss: 0.2097 - accuracy: 0.9257 - val_loss: 0.1970 - val_accuracy: 0.9404 - 6s/epoch - 31ms/step\n", + "Epoch 121/200\n", + "191/191 - 6s - loss: 0.2153 - accuracy: 0.9252 - val_loss: 0.2457 - val_accuracy: 0.9219 - 6s/epoch - 31ms/step\n", + "Epoch 122/200\n", + "191/191 - 6s - loss: 0.2056 - accuracy: 0.9276 - val_loss: 0.2167 - val_accuracy: 0.9345 - 6s/epoch - 31ms/step\n", + "Epoch 123/200\n", + "191/191 - 6s - loss: 0.2169 - accuracy: 0.9202 - val_loss: 0.2428 - val_accuracy: 0.9118 - 6s/epoch - 31ms/step\n", + "Epoch 124/200\n", + "191/191 - 6s - loss: 0.2064 - accuracy: 0.9248 - val_loss: 0.2444 - val_accuracy: 0.9211 - 6s/epoch - 31ms/step\n", + "Epoch 125/200\n", + "191/191 - 6s - loss: 0.2067 - accuracy: 0.9265 - val_loss: 0.2628 - val_accuracy: 0.9085 - 6s/epoch - 31ms/step\n", + "Epoch 126/200\n", + "191/191 - 6s - loss: 0.2147 - accuracy: 0.9208 - val_loss: 0.2747 - val_accuracy: 0.8976 - 6s/epoch - 31ms/step\n", + "Epoch 127/200\n", + "191/191 - 6s - loss: 0.2096 - accuracy: 0.9271 - val_loss: 0.2683 - val_accuracy: 0.9102 - 6s/epoch - 31ms/step\n", + "Epoch 128/200\n", + "191/191 - 6s - loss: 0.2058 - accuracy: 0.9269 - val_loss: 0.2586 - val_accuracy: 0.9144 - 6s/epoch - 31ms/step\n", + "Epoch 129/200\n", + "191/191 - 6s - loss: 0.1876 - accuracy: 0.9328 - val_loss: 0.2282 - val_accuracy: 0.9236 - 6s/epoch - 31ms/step\n", + "Epoch 130/200\n", + "191/191 - 6s - loss: 0.2185 - accuracy: 0.9221 - val_loss: 0.2390 - val_accuracy: 0.9110 - 6s/epoch - 31ms/step\n", + "Epoch 131/200\n", + "191/191 - 6s - loss: 0.2114 - accuracy: 0.9229 - val_loss: 0.2619 - val_accuracy: 0.9152 - 6s/epoch - 31ms/step\n", + "Epoch 132/200\n", + "191/191 - 6s - loss: 0.2156 - accuracy: 0.9219 - val_loss: 0.1962 - val_accuracy: 0.9379 - 6s/epoch - 31ms/step\n", + "Epoch 133/200\n", + "191/191 - 6s - loss: 0.2193 - accuracy: 0.9255 - val_loss: 0.3152 - val_accuracy: 0.8959 - 6s/epoch - 31ms/step\n", + "Epoch 134/200\n", + "191/191 - 6s - loss: 0.2064 - accuracy: 0.9284 - val_loss: 0.2381 - val_accuracy: 0.9244 - 6s/epoch - 31ms/step\n", + "Epoch 135/200\n", + "191/191 - 6s - loss: 0.1880 - accuracy: 0.9330 - val_loss: 0.2108 - val_accuracy: 0.9270 - 6s/epoch - 31ms/step\n", + "Epoch 136/200\n", + "191/191 - 6s - loss: 0.2168 - accuracy: 0.9194 - val_loss: 0.2271 - val_accuracy: 0.9253 - 6s/epoch - 31ms/step\n", + "Epoch 137/200\n", + "191/191 - 6s - loss: 0.2146 - accuracy: 0.9229 - val_loss: 0.1961 - val_accuracy: 0.9312 - 6s/epoch - 31ms/step\n", + "Epoch 138/200\n", + "191/191 - 6s - loss: 0.1786 - accuracy: 0.9345 - val_loss: 0.2252 - val_accuracy: 0.9186 - 6s/epoch - 31ms/step\n", + "Epoch 139/200\n", + "191/191 - 6s - loss: 0.1827 - accuracy: 0.9328 - val_loss: 0.2353 - val_accuracy: 0.9211 - 6s/epoch - 31ms/step\n", + "Epoch 140/200\n", + "191/191 - 6s - loss: 0.1980 - accuracy: 0.9280 - val_loss: 0.2514 - val_accuracy: 0.9118 - 6s/epoch - 31ms/step\n", + "Epoch 141/200\n", + "191/191 - 6s - loss: 0.1916 - accuracy: 0.9318 - val_loss: 0.1860 - val_accuracy: 0.9362 - 6s/epoch - 31ms/step\n", + "Epoch 142/200\n", + "191/191 - 6s - loss: 0.1988 - accuracy: 0.9269 - val_loss: 0.1857 - val_accuracy: 0.9395 - 6s/epoch - 31ms/step\n", + "Epoch 143/200\n", + "191/191 - 6s - loss: 0.1957 - accuracy: 0.9297 - val_loss: 0.2681 - val_accuracy: 0.9102 - 6s/epoch - 31ms/step\n", + "Epoch 144/200\n", + "191/191 - 6s - loss: 0.1844 - accuracy: 0.9309 - val_loss: 0.2683 - val_accuracy: 0.9144 - 6s/epoch - 31ms/step\n", + "Epoch 145/200\n", + "191/191 - 6s - loss: 0.1841 - accuracy: 0.9318 - val_loss: 0.1959 - val_accuracy: 0.9353 - 6s/epoch - 31ms/step\n", + "Epoch 146/200\n", + "191/191 - 6s - loss: 0.1881 - accuracy: 0.9341 - val_loss: 0.2101 - val_accuracy: 0.9337 - 6s/epoch - 31ms/step\n", + "Epoch 147/200\n", + "191/191 - 6s - loss: 0.1836 - accuracy: 0.9341 - val_loss: 0.2412 - val_accuracy: 0.9177 - 6s/epoch - 31ms/step\n", + "Epoch 148/200\n", + "191/191 - 6s - loss: 0.1874 - accuracy: 0.9294 - val_loss: 0.2193 - val_accuracy: 0.9295 - 6s/epoch - 31ms/step\n", + "Epoch 149/200\n", + "191/191 - 6s - loss: 0.1786 - accuracy: 0.9362 - val_loss: 0.2538 - val_accuracy: 0.9009 - 6s/epoch - 31ms/step\n", + "Epoch 150/200\n", + "191/191 - 6s - loss: 0.1961 - accuracy: 0.9290 - val_loss: 0.2235 - val_accuracy: 0.9328 - 6s/epoch - 31ms/step\n", + "Epoch 151/200\n", + "191/191 - 6s - loss: 0.1892 - accuracy: 0.9332 - val_loss: 0.2090 - val_accuracy: 0.9261 - 6s/epoch - 31ms/step\n", + "Epoch 152/200\n", + "191/191 - 6s - loss: 0.2027 - accuracy: 0.9265 - val_loss: 0.2116 - val_accuracy: 0.9261 - 6s/epoch - 31ms/step\n", + "Epoch 153/200\n", + "191/191 - 6s - loss: 0.1881 - accuracy: 0.9326 - val_loss: 0.2713 - val_accuracy: 0.9068 - 6s/epoch - 31ms/step\n", + "Epoch 154/200\n", + "191/191 - 6s - loss: 0.1775 - accuracy: 0.9370 - val_loss: 0.1924 - val_accuracy: 0.9320 - 6s/epoch - 31ms/step\n", + "Epoch 155/200\n", + "191/191 - 6s - loss: 0.1749 - accuracy: 0.9368 - val_loss: 0.2095 - val_accuracy: 0.9244 - 6s/epoch - 31ms/step\n", + "Epoch 156/200\n", + "191/191 - 6s - loss: 0.1828 - accuracy: 0.9345 - val_loss: 0.2452 - val_accuracy: 0.9228 - 6s/epoch - 31ms/step\n", + "Epoch 157/200\n", + "191/191 - 6s - loss: 0.1848 - accuracy: 0.9292 - val_loss: 0.1927 - val_accuracy: 0.9379 - 6s/epoch - 31ms/step\n", + "Epoch 158/200\n", + "191/191 - 6s - loss: 0.1767 - accuracy: 0.9374 - val_loss: 0.2295 - val_accuracy: 0.9211 - 6s/epoch - 31ms/step\n", + "Epoch 159/200\n", + "191/191 - 6s - loss: 0.1746 - accuracy: 0.9362 - val_loss: 0.1970 - val_accuracy: 0.9370 - 6s/epoch - 31ms/step\n", + "Epoch 160/200\n", + "191/191 - 6s - loss: 0.1687 - accuracy: 0.9414 - val_loss: 0.1766 - val_accuracy: 0.9412 - 6s/epoch - 31ms/step\n", + "Epoch 161/200\n", + "191/191 - 6s - loss: 0.1820 - accuracy: 0.9339 - val_loss: 0.2452 - val_accuracy: 0.9219 - 6s/epoch - 31ms/step\n", + "Epoch 162/200\n", + "191/191 - 6s - loss: 0.1798 - accuracy: 0.9353 - val_loss: 0.1812 - val_accuracy: 0.9421 - 6s/epoch - 31ms/step\n", + "Epoch 163/200\n", + "191/191 - 6s - loss: 0.1708 - accuracy: 0.9389 - val_loss: 0.1770 - val_accuracy: 0.9412 - 6s/epoch - 31ms/step\n", + "Epoch 164/200\n", + "191/191 - 6s - loss: 0.1870 - accuracy: 0.9355 - val_loss: 0.2228 - val_accuracy: 0.9228 - 6s/epoch - 31ms/step\n", + "Epoch 165/200\n", + "191/191 - 6s - loss: 0.1870 - accuracy: 0.9309 - val_loss: 0.1930 - val_accuracy: 0.9446 - 6s/epoch - 31ms/step\n", + "Epoch 166/200\n", + "191/191 - 6s - loss: 0.1806 - accuracy: 0.9368 - val_loss: 0.2256 - val_accuracy: 0.9169 - 6s/epoch - 31ms/step\n", + "Epoch 167/200\n", + "191/191 - 6s - loss: 0.1947 - accuracy: 0.9261 - val_loss: 0.2379 - val_accuracy: 0.9270 - 6s/epoch - 31ms/step\n", + "Epoch 168/200\n", + "191/191 - 6s - loss: 0.1695 - accuracy: 0.9414 - val_loss: 0.2309 - val_accuracy: 0.9236 - 6s/epoch - 31ms/step\n", + "Epoch 169/200\n", + "191/191 - 6s - loss: 0.1889 - accuracy: 0.9351 - val_loss: 0.2041 - val_accuracy: 0.9286 - 6s/epoch - 31ms/step\n", + "Epoch 170/200\n", + "191/191 - 6s - loss: 0.1759 - accuracy: 0.9353 - val_loss: 0.3125 - val_accuracy: 0.9102 - 6s/epoch - 31ms/step\n", + "Epoch 171/200\n", + "191/191 - 6s - loss: 0.1895 - accuracy: 0.9345 - val_loss: 0.2110 - val_accuracy: 0.9219 - 6s/epoch - 31ms/step\n", + "Epoch 172/200\n", + "191/191 - 6s - loss: 0.1836 - accuracy: 0.9303 - val_loss: 0.2813 - val_accuracy: 0.9093 - 6s/epoch - 31ms/step\n", + "Epoch 173/200\n", + "191/191 - 6s - loss: 0.1841 - accuracy: 0.9305 - val_loss: 0.2233 - val_accuracy: 0.9312 - 6s/epoch - 31ms/step\n", + "Epoch 174/200\n", + "191/191 - 6s - loss: 0.1694 - accuracy: 0.9378 - val_loss: 0.2047 - val_accuracy: 0.9379 - 6s/epoch - 31ms/step\n", + "Epoch 175/200\n", + "191/191 - 6s - loss: 0.1795 - accuracy: 0.9351 - val_loss: 0.2088 - val_accuracy: 0.9337 - 6s/epoch - 31ms/step\n", + "Epoch 176/200\n", + "191/191 - 6s - loss: 0.1649 - accuracy: 0.9433 - val_loss: 0.1644 - val_accuracy: 0.9412 - 6s/epoch - 31ms/step\n", + "Epoch 177/200\n", + "191/191 - 6s - loss: 0.1683 - accuracy: 0.9416 - val_loss: 0.2966 - val_accuracy: 0.9102 - 6s/epoch - 31ms/step\n", + "Epoch 178/200\n", + "191/191 - 6s - loss: 0.1753 - accuracy: 0.9389 - val_loss: 0.2233 - val_accuracy: 0.9328 - 6s/epoch - 31ms/step\n", + "Epoch 179/200\n", + "191/191 - 6s - loss: 0.1687 - accuracy: 0.9383 - val_loss: 0.2198 - val_accuracy: 0.9228 - 6s/epoch - 31ms/step\n", + "Epoch 180/200\n", + "191/191 - 6s - loss: 0.1758 - accuracy: 0.9410 - val_loss: 0.2413 - val_accuracy: 0.9244 - 6s/epoch - 31ms/step\n", + "Epoch 181/200\n", + "191/191 - 6s - loss: 0.1720 - accuracy: 0.9423 - val_loss: 0.1799 - val_accuracy: 0.9429 - 6s/epoch - 31ms/step\n", + "Epoch 182/200\n", + "191/191 - 6s - loss: 0.1703 - accuracy: 0.9404 - val_loss: 0.1717 - val_accuracy: 0.9446 - 6s/epoch - 31ms/step\n", + "Epoch 183/200\n", + "191/191 - 6s - loss: 0.1655 - accuracy: 0.9393 - val_loss: 0.2088 - val_accuracy: 0.9295 - 6s/epoch - 31ms/step\n", + "Epoch 184/200\n", + "191/191 - 6s - loss: 0.1633 - accuracy: 0.9397 - val_loss: 0.1987 - val_accuracy: 0.9353 - 6s/epoch - 31ms/step\n", + "Epoch 185/200\n", + "191/191 - 6s - loss: 0.1640 - accuracy: 0.9410 - val_loss: 0.1858 - val_accuracy: 0.9312 - 6s/epoch - 31ms/step\n", + "Epoch 186/200\n", + "191/191 - 6s - loss: 0.1514 - accuracy: 0.9450 - val_loss: 0.1946 - val_accuracy: 0.9328 - 6s/epoch - 31ms/step\n", + "Epoch 187/200\n", + "191/191 - 6s - loss: 0.1698 - accuracy: 0.9420 - val_loss: 0.2533 - val_accuracy: 0.9144 - 6s/epoch - 31ms/step\n", + "Epoch 188/200\n", + "191/191 - 6s - loss: 0.1608 - accuracy: 0.9446 - val_loss: 0.2224 - val_accuracy: 0.9270 - 6s/epoch - 31ms/step\n", + "Epoch 189/200\n", + "191/191 - 6s - loss: 0.1664 - accuracy: 0.9410 - val_loss: 0.2499 - val_accuracy: 0.9253 - 6s/epoch - 31ms/step\n", + "Epoch 190/200\n", + "191/191 - 6s - loss: 0.1604 - accuracy: 0.9450 - val_loss: 0.2232 - val_accuracy: 0.9387 - 6s/epoch - 31ms/step\n", + "Epoch 191/200\n", + "191/191 - 6s - loss: 0.1656 - accuracy: 0.9383 - val_loss: 0.1698 - val_accuracy: 0.9471 - 6s/epoch - 31ms/step\n", + "Epoch 192/200\n", + "191/191 - 6s - loss: 0.1657 - accuracy: 0.9402 - val_loss: 0.2008 - val_accuracy: 0.9345 - 6s/epoch - 31ms/step\n", + "Epoch 193/200\n", + "191/191 - 6s - loss: 0.1574 - accuracy: 0.9420 - val_loss: 0.1686 - val_accuracy: 0.9345 - 6s/epoch - 31ms/step\n", + "Epoch 194/200\n", + "191/191 - 6s - loss: 0.1432 - accuracy: 0.9483 - val_loss: 0.1961 - val_accuracy: 0.9404 - 6s/epoch - 31ms/step\n", + "Epoch 195/200\n", + "191/191 - 6s - loss: 0.1585 - accuracy: 0.9439 - val_loss: 0.1918 - val_accuracy: 0.9387 - 6s/epoch - 31ms/step\n", + "Epoch 196/200\n", + "191/191 - 6s - loss: 0.1572 - accuracy: 0.9437 - val_loss: 0.1809 - val_accuracy: 0.9387 - 6s/epoch - 31ms/step\n", + "Epoch 197/200\n", + "191/191 - 6s - loss: 0.1722 - accuracy: 0.9385 - val_loss: 0.1984 - val_accuracy: 0.9270 - 6s/epoch - 31ms/step\n", + "Epoch 198/200\n", + "191/191 - 6s - loss: 0.1420 - accuracy: 0.9488 - val_loss: 0.1788 - val_accuracy: 0.9362 - 6s/epoch - 31ms/step\n", + "Epoch 199/200\n", + "191/191 - 6s - loss: 0.1680 - accuracy: 0.9412 - val_loss: 0.1751 - val_accuracy: 0.9412 - 6s/epoch - 31ms/step\n", + "Epoch 200/200\n", + "191/191 - 6s - loss: 0.1444 - accuracy: 0.9481 - val_loss: 0.2150 - val_accuracy: 0.9286 - 6s/epoch - 31ms/step\n" + ] + } + ], + "source": [ + "\n", + "data_augmentation = keras.Sequential([\n", + " layers.RandomFlip(\"horizontal\",\n", + " input_shape=(img_height,\n", + " img_width,\n", + " 1)),\n", + " layers.RandomRotation(0.2),\n", + " layers.RandomZoom(0.1),\n", + " ])\n", + "\n", + "model = keras.Sequential(\n", + " [\n", + " data_augmentation,\n", + " \n", + " layers.Rescaling(1./255, input_shape = (img_height,img_width,1)), #normalize the data input\n", + "\n", + " layers.Conv2D(128, 3, padding=\"same\", activation='relu'),\n", + " layers.MaxPooling2D(pool_size=(2,2)),\n", + "\n", + " layers.Conv2D(64, 3, padding=\"same\", activation='relu'), #should this be 16 or 32 units? try with more data\n", + " layers.MaxPooling2D(pool_size=(2,2)),\n", + "\n", + " layers.Conv2D(32, 3, padding=\"same\", activation='relu'),\n", + " layers.MaxPooling2D(pool_size=(2,2)),\n", + " \n", + " layers.Conv2D(16, 3, padding=\"same\", activation='relu'),\n", + " layers.MaxPooling2D(pool_size=(2,2)),\n", + " \n", + " layers.Dropout(0.1),\n", + " layers.Flatten(),\n", + " layers.Dense(10,activation = 'relu'),\n", + " layers.Dense(7,activation='softmax'), # number of output classes\n", + " # softmax activation on the last layer will output a probability distribution over the output classes. The sum \n", + " # of all the probabilities will be equal to 1\n", + " \n", + " ]\n", + ") \n", + "\n", + "\n", + "\n", + "model.compile(\n", + " optimizer=keras.optimizers.Adam(),\n", + " loss=[keras.losses.SparseCategoricalCrossentropy(from_logits=False),],\n", + " metrics=[\"accuracy\"],\n", + ")\n", + "# epochs = 25\n", + "#model_history = \n", + "\n", + "# if you don't need the training graphs, can just run model.fit(...)\n", + "# model.fit(x_train, y_train, epochs=200, verbose=2, validation_data=(x_test,y_test), batch_size=25) #i think 25/32 is the best batch size \n", + "\n", + "# run this to get graphs of the training progress\n", + "model_history = model.fit(x_train, y_train, epochs=200, verbose=2, validation_data=(x_test,y_test), batch_size=25) #i think 25/32 is the best batch size \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tTgvkT0cjkYq", + "outputId": "693a570c-b017-427d-f28a-f7861bb78be2" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[[202 2 25 0 0 2 0]\n", + " [ 6 194 0 0 1 1 4]\n", + " [ 3 0 196 1 0 0 0]\n", + " [ 0 0 0 131 0 0 0]\n", + " [ 2 0 1 1 87 0 1]\n", + " [ 1 2 0 0 0 203 0]\n", + " [ 2 3 1 2 1 0 116]]\n" + ] + } + ], + "source": [ + "# to get confusion matrix for model with test data\n", + "# By definition a confusion matrix C is such that C(i,j) is equal to the number of observations known to be in group i and predicted to be in group j\n", + "# columns are predictions, rows are actual labels\n", + "\n", + "prediction = model.predict(x_test)\n", + "classes_x=np.argmax(prediction,axis=1)\n", + "cm = confusion_matrix(y_test, classes_x)\n", + "print(cm)\n", + "#print(prediction)" + ] + }, + { + "cell_type": "code", + "source": [ + "#clearer visual representation of confusion matrix\n", + "\n", + "categories = [\"straight-liftarm\", 'pins', 'bent-liftarm', 'gears-and-disc', 'special-connector', 'axles', 'axle-connectors-stoppers']\n", + "\n", + "sns.heatmap(cm, cmap = \"Oranges\", annot = True, fmt='g')\n", + "ax= plt.subplot()\n", + "\n", + "# labels, title and ticks\n", + "ax.set_xlabel('Predicted labels');ax.set_ylabel('True labels'); \n", + "ax.set_title('Confusion Matrix'); \n", + "ax.set_xticklabels(categories, rotation = 45, ha=\"right\")\n", + "ax.set_yticklabels(categories, rotation = 0)\n", + "\n", + "plt.show()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 436 + }, + "id": "bzdGAdzMEAFn", + "outputId": "23194a9e-5471-416f-9f5a-3a330e0719aa" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:4: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n", + " after removing the cwd from sys.path.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Graphically represent model performance.\n", + "# First plot shows validation and training accuracy, second plot shows validation and training loss\n", + "epochs = 200\n", + "history_dict = model_history.history\n", + "print(history_dict.keys())\n", + "val_loss_values = history_dict['val_loss']\n", + "training_loss_values = history_dict['loss']\n", + "training_acc_values = history_dict['accuracy']\n", + "val_acc_values = history_dict['val_accuracy']\n", + "epochs_range = range(epochs) \n", + "\n", + "plt.subplot(1,2,1)\n", + "plt.plot(epochs_range, val_acc_values, 'b', label='Validation acc')\n", + "plt.plot(epochs_range, training_acc_values, 'ko', label='Training acc')\n", + "plt.title('Training accuracy')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Accuracy')\n", + "plt.legend()\n", + "\n", + "\n", + "plt.subplot(1,2,2) \n", + "plt.plot(epochs_range, training_loss_values, 'ko', label='Training loss')\n", + "plt.plot(epochs_range, val_loss_values, 'b', label='Validation loss')\n", + "plt.title('Training Loss')\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Loss')\n", + "plt.legend()\n", + "\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 312 + }, + "id": "kLWFPpR_8SG4", + "outputId": "85f09ab5-a675-415e-c90a-a85545e3a8c1" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Save the entire model \n", + "model.save('drive/MyDrive/lego_project/saved_model/final_model') \n", + "# This will create a model named final_model in the saved_model folder\n", + "\n", + "# Convert the model\n", + "converter = tf.lite.TFLiteConverter.from_saved_model('drive/MyDrive/lego_project/saved_model/final_model') # path to the SavedModel directory\n", + "tflite_model = converter.convert()\n", + "\n", + "# Save the model.\n", + "with open('drive/MyDrive/lego_project/model.tflite', 'wb') as f:\n", + " f.write(tflite_model) #save tfllite model as model.tflite\n" + ], + "metadata": { + "id": "UxhYEy5TRPfN" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# to load model\n", + "model_loaded = tf.keras.models.load_model('drive/MyDrive/lego_project/saved_model/final_model')" + ], + "metadata": { + "id": "5FjOX5eYgt0_" + }, + "execution_count": null, + "outputs": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}