{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "**Image classification using a CNN model.**\n", "\n", "In this application we will use the fashion MNIST dataset and a 2D convolution layer as the main feature extractor." ], "metadata": { "id": "0Zl5Qt8uMXoZ" } }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "4IQPaigZLUe8" }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd \n", "import tensorflow as tf\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "source": [ "**Loading the data.**\n", "\n", "This is a dataset of 60,000 28x28 grayscale images of 10 fashion categories, along with a test set of 10,000 images. \n", "\n", "The classes are:\n", "\n", "0 : T-shirt/top\n", "\n", "1 : Trouser\n", "\n", "2\t: Pullover\n", "\n", "3\t: Dress\n", "\n", "4\t: Coat\n", "\n", "5\t: Sandal\n", "\n", "6\t: Shirt\n", "\n", "7\t: Sneaker\n", "\n", "8\t: Bag\n", "\n", "9\t: Ankle boot\n" ], "metadata": { "id": "z1jXOtcdL2XF" } }, { "cell_type": "code", "source": [ "(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3B4vKAnsLZ4_", "outputId": "f6dce346-1a45-4841-8410-0f315f2cc15e" }, "execution_count": 2, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz\n", "29515/29515 [==============================] - 0s 0us/step\n", "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz\n", "26421880/26421880 [==============================] - 2s 0us/step\n", "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz\n", "5148/5148 [==============================] - 0s 0us/step\n", "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz\n", "4422102/4422102 [==============================] - 0s 0us/step\n" ] } ] }, { "cell_type": "code", "source": [ "# Let's visualize some of the images.\n", "for i in range(4):\n", " plt.imshow(x_train[i])\n", " plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "NUTZZ6nPLdIl", "outputId": "8aab2075-ba83-4213-9d0d-9f9c12a5570e" }, "execution_count": 3, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAUFElEQVR4nO3da2yc1ZkH8P8z4/ElzjiJk+CE4BIuoZDCEqhJuIlSKDREVQOli4gQCxLaoF3otl0+gGhXZb+sEFpAaNntroEsYVWoWhUERREFzCULlDQmpOS2ITeHxDi2ExPbcTz2XJ794Bdqgs/zmnnnRs7/J1kezzNn5njGf78zc+acI6oKIjr+xcrdASIqDYadyBMMO5EnGHYiTzDsRJ6oKuWNVUuN1qK+lDdJ5JUUhjCqIzJRLVLYRWQpgEcAxAE8rqr3W5evRT2WyJVRbpKIDOu0zVnL+2m8iMQB/DuAawAsBLBCRBbme31EVFxRXrMvBrBTVXer6iiAXwNYXphuEVGhRQn7PAD7xv28Pzjvc0RkpYi0i0h7GiMRbo6Ioij6u/Gq2qqqLarakkBNsW+OiByihL0TQPO4n08KziOiChQl7OsBLBCRU0SkGsCNAF4oTLeIqNDyHnpT1YyI3AngDxgbelulqlsK1jMiKqhI4+yqugbAmgL1hYiKiB+XJfIEw07kCYadyBMMO5EnGHYiTzDsRJ5g2Ik8wbATeYJhJ/IEw07kCYadyBMMO5EnGHYiT5R0KWkqA5lwVeG/iLixZ3xmo1n/5LtnOGsNT78b6bbDfjepSjhrmh6NdttRhT0uljwfMx7ZiTzBsBN5gmEn8gTDTuQJhp3IEww7kScYdiJPcJz9OCfxuFnXTMasxxbZe3Vuu32q3X7YXUsMLTbbVg3nzHri5XazHmksPWwMP+R+hdjH0Sh9kyojtsbDySM7kScYdiJPMOxEnmDYiTzBsBN5gmEn8gTDTuQJjrMf58wxWYSPs+/77nSzftNF/2vW3+491VnbWzPHbKt1ZhlV37nIrJ/xH53OWqbjI/vKQ+aMh91vYeIzZriL2azZNjsw4C4a3Y4UdhHpADAIIAsgo6otUa6PiIqnEEf2b6vqwQJcDxEVEV+zE3kiatgVwMsi8p6IrJzoAiKyUkTaRaQ9jZGIN0dE+Yr6NP5SVe0UkRMAvCIi/6eqa8dfQFVbAbQCQIM0RlvdkIjyFunIrqqdwfceAM8BsKcxEVHZ5B12EakXkeSnpwFcDWBzoTpGRIUV5Wl8E4DnZGzebxWAp1X1pYL0igoml0pFaj963hGz/sNp9pzy2ljaWXszZs9X73yt2axn/8ru296Hks5a7v2LzbYzN9tj3Q3vd5n1g5fNM+u933S/om0KWU5/xqu7nDXpc0c677Cr6m4A5+bbnohKi0NvRJ5g2Ik8wbATeYJhJ/IEw07kCdGIW/Z+GQ3SqEvkypLdnjesZY9DHt8jN1xo1q/5+Rtm/azaj836YK7WWRvVaB/gfHT7t8z60O5pzlpsNGTL5JBytsleClrT9nF0xgb37163vNtsK4/NdtY+aHsER/r2Tdh7HtmJPMGwE3mCYSfyBMNO5AmGncgTDDuRJxh2Ik9wnL0ShGwPHEnI43v2e/b/+x/MsKewhokbaxsPabXZ9nC2PtJt92bcU1zTIWP8j++wp8AeMcbwASCWsR/Tq779vrN2feN6s+0Dp53jrK3TNgxoH8fZiXzGsBN5gmEn8gTDTuQJhp3IEww7kScYdiJPcMvmSlDCzzoca8eRE8z6oYapZv1Axt7SeWbcvdxzMjZstp2fsPcL7c26x9EBIJ5wL1U9qnGz7T9/4/dmPXVWwqwnxF6K+mJjHYC/3vo3Ztt67DbrLjyyE3mCYSfyBMNO5AmGncgTDDuRJxh2Ik8w7ESe4Di752bX2Nse14p7y2UAqJaMWf84PcNZ2zH8dbPthwP2ZwCWNm0x62ljLN2aZw+Ej5OfmPjErKfUHoe37tVLmuxx9I1m1S30yC4iq0SkR0Q2jzuvUUReEZEdwXf3I0pEFWEyT+OfBLD0mPPuAdCmqgsAtAU/E1EFCw27qq4F0HfM2csBrA5OrwZwbYH7RUQFlu9r9iZV7QpOHwDQ5LqgiKwEsBIAajElz5sjoqgivxuvYytWOt/tUNVWVW1R1ZYEaqLeHBHlKd+wd4vIXAAIvvcUrktEVAz5hv0FALcEp28B8HxhukNExRL6ml1EngFwOYBZIrIfwC8A3A/gNyJyG4C9AG4oZiePeyHrxkvcnnutGfdYd3yGPSr6rembzHpvtsGsH87a78NMjx911gYz7r3bAaBv2L7uM2u6zPqGo/OdtdnV9ji51W8A6BidZdYX1Bww6w90u/dPaK499v3wz8tceZmzpuv+6KyFhl1VVzhK3O2B6CuEH5cl8gTDTuQJhp3IEww7kScYdiJPcIprJQhZSlqq7IfJGnrbd9tZZtsrpthLJr+TmmfWZ1cNmnVrmuncmn6zbbIpZdbDhv0aq9zTdwezdWbbKbERsx72e59fbS+D/dNXz3fWkmcfMts2JIxjtDGKyyM7kScYdiJPMOxEnmDYiTzBsBN5gmEn8gTDTuQJjrNXAElUm/Vcyh5vtszaNGrWD2btJY+nx+ypntUhSy5bWyNf3LjHbNsbMha+YfgUs56Mu7eEnh2zx8mbE/ZY96ZUs1lfM3S6Wb/te686a8+0XmW2rX7pHWdN1P148chO5AmGncgTDDuRJxh2Ik8w7ESeYNiJPMGwE3niqzXObiy5LFX2eLHEQ/6vxex6LmXMb87ZY81hNG2PhUfxyH89atb3Zaab9QNpux625HLWmGD97vA0s21tzN4uenbVgFkfyNnj9JbBnL3MtTVPHwjv+90zdzhrz/Z/x2ybLx7ZiTzBsBN5gmEn8gTDTuQJhp3IEww7kScYdiJPVNQ4e5T10cPGqtUe9iyr4eWLzfq+a+1x/JvO+5OzdiCTNNu+b2xrDADTjDnhAFAfsr56St2ff/h41N5OOmys2loXHgBOMMbhs2of5zrTdt/ChH3+YH/GWNP++/Zc++lP5dWl8CO7iKwSkR4R2TzuvPtEpFNENgZfy/K7eSIqlck8jX8SwNIJzn9YVRcFX2sK2y0iKrTQsKvqWgB9JegLERVRlDfo7hSRD4Kn+c4XOCKyUkTaRaQ9Dfv1HREVT75h/yWA0wAsAtAF4EHXBVW1VVVbVLUlgZo8b46Iosor7KrarapZVc0BeAyA/XYyEZVdXmEXkbnjfrwOwGbXZYmoMoSOs4vIMwAuBzBLRPYD+AWAy0VkEQAF0AHg9kJ0xhpHj6pq7hyznj6lyaz3neXeC/zoHGNTbACLlm0z67c2/bdZ7802mPWEGPuzp2eabc+b0mHWX+tfaNYPVk0169Y4/cX17jndAHA4Z++/fmLVJ2b97p0/dNaapthj2Y+fbA8wpTVn1ren7Zes/Tn3fPh/WPi62fY5zDbrLqFhV9UVE5z9RF63RkRlw4/LEnmCYSfyBMNO5AmGncgTDDuRJypqiuvINReY9RN+tttZW9Sw32y7sO4ts57K2UtRW9Mttw7PM9sezdlbMu8YtYcF+zP2EFRc3MNAPaP2FNcH99jLFrct/k+z/vOPJ5oj9RexOnXWDmXtYbvrp9pLRQP2Y3b719Y6a6dW95htXxyaa9Y/DpkC25ToN+vzE73O2g+SH5pt8x1645GdyBMMO5EnGHYiTzDsRJ5g2Ik8wbATeYJhJ/JEacfZxV4uesm/rDebX5nc4qwdVXtKYdg4eti4qWValb1s8Ejavpt70vYU1jBn1Bxw1q5r2Gi2XfvoErN+aepHZn3XFfb03LZh91TO3oz9e9+45wqzvuGjZrN+4fw9zto5yU6zbdhnG5LxlFm3ph0DwFDO/ff6bsr+/EG+eGQn8gTDTuQJhp3IEww7kScYdiJPMOxEnmDYiTwhqu75xoVWN6dZT7v5H5311jv+zWz/dN+Fzlpzrb0d3cnVB836zLi9/a8lGbPHXL+esMdcXxw6yay/cfhMs/7NZIezlhB7u+fLp+w067f+9C6znqm1l9EemO8+nmTq7b+9hnMPmfUfnf6aWa82fvfDWXscPex+C9uSOYy1BkEyZm+T/eCy65y1P3Y8if7hrgkfFB7ZiTzBsBN5gmEn8gTDTuQJhp3IEww7kScYdiJPlHQ+eywNTOl2jy++OLDIbH9qnXut7YNpe330Pxw5x6yfVGdv/2ttPXy6MZ8cADamppv1l3q/YdZPrLPXT+9OT3PWDqXrzbZHjXnVAPDEww+Z9Qe77XXnr2vc4KydW22Pox/O2ceirSHr7Q/map21lNrrG/SHjMMnjb8HAEirHa24seXz9Jg9hj9wjnsb7my3+3ZDj+wi0iwir4vIVhHZIiI/Ds5vFJFXRGRH8D3/1R+IqOgm8zQ+A+AuVV0I4EIAd4jIQgD3AGhT1QUA2oKfiahChYZdVbtUdUNwehDANgDzACwHsDq42GoA1xark0QU3Zd6g05E5gM4D8A6AE2q2hWUDgBocrRZKSLtItKeGRmK0FUiimLSYReRqQB+B+Anqvq5d4x0bDbNhLMaVLVVVVtUtaWqxn6ziIiKZ1JhF5EExoL+K1V9Nji7W0TmBvW5AOxtMYmorEKH3kREADwBYJuqjh+HeQHALQDuD74/H3Zd8dEckvtGnPWc2tMlXzvonurZVDtotl2U3GfWtx+1h3E2DZ/orG2o+prZti7u3u4ZAKZV21Nk66vc9xkAzEq4f/dTauz/wdY0UABYn7J/t7+b/YZZ/yjjHqT5/dAZZtutR933OQDMCFnCe9OAu/3RjL2N9kjWjkYqYw/lTquxH9MLGvc6a9thbxfde64xbfhtd7vJjLNfAuBmAJtE5NNFyO/FWMh/IyK3AdgL4IZJXBcRlUlo2FX1LQCuQ+6Vhe0OERULPy5L5AmGncgTDDuRJxh2Ik8w7ESeKO2WzUeGEXvzfWf5ty9fYjb/p+W/ddbeDFlu+cUD9rjowKg91XP2FPdHfRuMcW4AaEzYHxMO2/K5NmT7308y7k8mjsTsqZxZ50DLmAMj7umzAPB2boFZT+fcWzaPGDUg/PMJfaOzzPqJdf3O2mDGPf0VADoGG836wX57W+XUFDtab2VPc9aWznFvTQ4AdT3uxyxm/KnwyE7kCYadyBMMO5EnGHYiTzDsRJ5g2Ik8wbATeaKkWzY3SKMukfwnyvXf5N6y+dS/3262XTx9j1nfMGDP2/7IGHdNhyx5nIi5lw0GgCmJUbNeGzLeXB13z0mPTbyA0GdyIePs9XG7b2Fz7Ruq3PO6k3F7znfM2NZ4MuLG7/6n/vmRrjsZ8ntn1P6buGjaLmdt1Z6LzbbTlrm32V6nbRjQPm7ZTOQzhp3IEww7kScYdiJPMOxEnmDYiTzBsBN5ovTj7PGr3RfI2WuYRzF0/RKzvuTe9XY96R4XPbO622ybgD1eXBsynlwfs8fCU8ZjGPbf/K3hZrOeDbmG1z45y6ynjfHm7qMNZtuE8fmBybD2IRjOhGzZPGzPd4/H7Nyk3rDn2s/c6v7sRM0a+2/RwnF2ImLYiXzBsBN5gmEn8gTDTuQJhp3IEww7kSdCx9lFpBnAUwCaACiAVlV9RETuA/C3AHqDi96rqmus64o6n71SyQX2mvTDc+rMes0he2704Ml2+4Zd7nXpYyP2mvO5P28z6/TVYo2zT2aTiAyAu1R1g4gkAbwnIq8EtYdV9V8L1VEiKp7J7M/eBaArOD0oItsAzCt2x4iosL7Ua3YRmQ/gPADrgrPuFJEPRGSViMxwtFkpIu0i0p6G/XSViIpn0mEXkakAfgfgJ6o6AOCXAE4DsAhjR/4HJ2qnqq2q2qKqLQnY+6kRUfFMKuwiksBY0H+lqs8CgKp2q2pWVXMAHgOwuHjdJKKoQsMuIgLgCQDbVPWhcefPHXex6wBsLnz3iKhQJvNu/CUAbgawSUQ2BufdC2CFiCzC2HBcB4Dbi9LDrwBdv8ms25MlwzW8k3/baIsx0/FkMu/GvwVMuLi4OaZORJWFn6Aj8gTDTuQJhp3IEww7kScYdiJPMOxEnmDYiTzBsBN5gmEn8gTDTuQJhp3IEww7kScYdiJPMOxEnijpls0i0gtg77izZgE4WLIOfDmV2rdK7RfAvuWrkH07WVVnT1Qoadi/cOMi7araUrYOGCq1b5XaL4B9y1ep+san8USeYNiJPFHusLeW+fYtldq3Su0XwL7lqyR9K+trdiIqnXIf2YmoRBh2Ik+UJewislREtovIThG5pxx9cBGRDhHZJCIbRaS9zH1ZJSI9IrJ53HmNIvKKiOwIvk+4x16Z+nafiHQG991GEVlWpr41i8jrIrJVRLaIyI+D88t63xn9Ksn9VvLX7CISB/AhgKsA7AewHsAKVd1a0o44iEgHgBZVLfsHMETkMgBHADylqmcH5z0AoE9V7w/+Uc5Q1bsrpG/3AThS7m28g92K5o7fZhzAtQBuRRnvO6NfN6AE91s5juyLAexU1d2qOgrg1wCWl6EfFU9V1wLoO+bs5QBWB6dXY+yPpeQcfasIqtqlqhuC04MAPt1mvKz3ndGvkihH2OcB2Dfu5/2orP3eFcDLIvKeiKwsd2cm0KSqXcHpAwCaytmZCYRu411Kx2wzXjH3XT7bn0fFN+i+6FJVPR/ANQDuCJ6uViQdew1WSWOnk9rGu1Qm2Gb8M+W87/Ld/jyqcoS9E0DzuJ9PCs6rCKraGXzvAfAcKm8r6u5Pd9ANvveUuT+fqaRtvCfaZhwVcN+Vc/vzcoR9PYAFInKKiFQDuBHAC2XoxxeISH3wxglEpB7A1ai8rahfAHBLcPoWAM+XsS+fUynbeLu2GUeZ77uyb3+uqiX/ArAMY+/I7wLws3L0wdGvUwH8OfjaUu6+AXgGY0/r0hh7b+M2ADMBtAHYAeBVAI0V1Lf/AbAJwAcYC9bcMvXtUow9Rf8AwMbga1m57zujXyW53/hxWSJP8A06Ik8w7ESeYNiJPMGwE3mCYSfyBMNO5AmGncgT/w8K8iUImXY9pQAAAABJRU5ErkJggg==\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "# Counting the examples for each class.\n", "pd.DataFrame(y_train, columns=['labels'])['labels'].value_counts()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "UvwfLLNWLfq-", "outputId": "6c6814e5-12c1-4626-e858-ef5ff29adfb4" }, "execution_count": 4, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "9 6000\n", "0 6000\n", "3 6000\n", "2 6000\n", "7 6000\n", "5 6000\n", "1 6000\n", "6 6000\n", "4 6000\n", "8 6000\n", "Name: labels, dtype: int64" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "markdown", "source": [ "From the table above we can see that each class has 6000 examples." ], "metadata": { "id": "IAmZv8tDL9aH" } }, { "cell_type": "markdown", "source": [ "**Fitting the model.**" ], "metadata": { "id": "lOvtZCXBL-4b" } }, { "cell_type": "code", "source": [ "# Defining the model\n", "\n", "# Defining the input.\n", "inp = tf.keras.layers.Input(shape=(28,28,1))\n", "# Rescaling the images.\n", "resc = tf.keras.layers.Rescaling(1./255)(inp)\n", "# Extracting the features.\n", "conv = tf.keras.layers.Conv2D(filters=32, kernel_size=(4,4), activation='relu', input_shape=(28,28,1))(resc)\n", "pool = tf.keras.layers.MaxPool2D(pool_size=(2,2))(conv)\n", "flat = tf.keras.layers.Flatten()(pool)\n", "# Interpreting the extracted features.\n", "dense_1 = tf.keras.layers.Dense(units=100, activation='relu')(flat)\n", "dense_2 = tf.keras.layers.Dense(units=50, activation='relu')(dense_1)\n", "# Defining the output.\n", "output = tf.keras.layers.Dense(units=10, activation='softmax')(dense_2)\n", "\n", "model = tf.keras.Model(inputs=inp, outputs=output)\n", "\n", "# Compiling the model.\n", "model.compile(optimizer='adam',\n", " loss='sparse_categorical_crossentropy',\n", " metrics='accuracy')\n", "\n" ], "metadata": { "id": "z85NJMueLjVg" }, "execution_count": 5, "outputs": [] }, { "cell_type": "code", "source": [ "model.fit(x_train, y_train,\n", " epochs=10, \n", " validation_data=(x_test, y_test))\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xKvtcozNLpL2", "outputId": "e7021809-9a1c-4170-8f3b-d6f3f06a6dec" }, "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/10\n", "1875/1875 [==============================] - 40s 21ms/step - loss: 0.4222 - accuracy: 0.8478 - val_loss: 0.3559 - val_accuracy: 0.8673\n", "Epoch 2/10\n", "1875/1875 [==============================] - 40s 21ms/step - loss: 0.2816 - accuracy: 0.8971 - val_loss: 0.2929 - val_accuracy: 0.8941\n", "Epoch 3/10\n", "1875/1875 [==============================] - 40s 21ms/step - loss: 0.2357 - accuracy: 0.9118 - val_loss: 0.2699 - val_accuracy: 0.9023\n", "Epoch 4/10\n", "1875/1875 [==============================] - 38s 20ms/step - loss: 0.2060 - accuracy: 0.9232 - val_loss: 0.2621 - val_accuracy: 0.9069\n", "Epoch 5/10\n", "1875/1875 [==============================] - 41s 22ms/step - loss: 0.1796 - accuracy: 0.9322 - val_loss: 0.2640 - val_accuracy: 0.9077\n", "Epoch 6/10\n", "1875/1875 [==============================] - 41s 22ms/step - loss: 0.1579 - accuracy: 0.9408 - val_loss: 0.2684 - val_accuracy: 0.9110\n", "Epoch 7/10\n", "1875/1875 [==============================] - 41s 22ms/step - loss: 0.1360 - accuracy: 0.9485 - val_loss: 0.2778 - val_accuracy: 0.9109\n", "Epoch 8/10\n", "1875/1875 [==============================] - 39s 21ms/step - loss: 0.1172 - accuracy: 0.9563 - val_loss: 0.2969 - val_accuracy: 0.9132\n", "Epoch 9/10\n", "1875/1875 [==============================] - 39s 21ms/step - loss: 0.1027 - accuracy: 0.9618 - val_loss: 0.3161 - val_accuracy: 0.9081\n", "Epoch 10/10\n", "1875/1875 [==============================] - 36s 19ms/step - loss: 0.0913 - accuracy: 0.9659 - val_loss: 0.3572 - val_accuracy: 0.9086\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "markdown", "source": [ "We can see from the different metrics that our model did a great job distinguishing the different categories in our dataset. \n" ], "metadata": { "id": "tBEl1FryMLv-" } }, { "cell_type": "code", "source": [], "metadata": { "id": "CUmvLifOMM72" }, "execution_count": null, "outputs": [] } ] }