{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8d79b30e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Keras version:  2.11.0\n",
      "\n",
      "TensorFlow version:  2.11.0\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense,Dropout,BatchNormalization\n",
    "from tensorflow.keras import regularizers\n",
    "from tensorflow.keras.optimizers import Adam, RMSprop, SGD\n",
    "\n",
    "print('Keras version: ',keras.__version__)\n",
    "print()\n",
    "print('TensorFlow version: ',tf.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "65762078",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 28709 images belonging to 7 classes.\n",
      "Found 7178 images belonging to 7 classes.\n"
     ]
    }
   ],
   "source": [
    "train_dir = './dataset/train'\n",
    "test_dir = './dataset/test'\n",
    "\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img\n",
    "train_datagen = ImageDataGenerator(rescale=1./255,\n",
    "                                   zoom_range=0.3,\n",
    "                                   horizontal_flip=True)\n",
    "\n",
    "training_set = train_datagen.flow_from_directory(train_dir,\n",
    "                                                batch_size=64,\n",
    "                                                target_size=(48,48),\n",
    "                                                shuffle=True,\n",
    "                                                color_mode='grayscale',\n",
    "                                                class_mode='categorical')\n",
    "\n",
    "validation_datagen = ImageDataGenerator(rescale=1./255)\n",
    "validation_set = validation_datagen.flow_from_directory(test_dir,\n",
    "                                                batch_size=64,\n",
    "                                                target_size=(48,48),\n",
    "                                                shuffle=True,\n",
    "                                                color_mode='grayscale',\n",
    "                                                class_mode='categorical')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "90f718a2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " conv2d (Conv2D)             (None, 46, 46, 32)        320       \n",
      "                                                                 \n",
      " max_pooling2d (MaxPooling2D  (None, 23, 23, 32)       0         \n",
      " )                                                               \n",
      "                                                                 \n",
      " flatten (Flatten)           (None, 16928)             0         \n",
      "                                                                 \n",
      " dense (Dense)               (None, 7)                 118503    \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 118,823\n",
      "Trainable params: 118,823\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Sequential([\n",
    "    Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48,1)),\n",
    "    MaxPooling2D(pool_size=(2, 2)),\n",
    "    Flatten(),\n",
    "    Dense(7, activation='softmax')\n",
    "])\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "29ad3559",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer=Adam(learning_rate=0.0001), \n",
    "                  loss='categorical_crossentropy', \n",
    "                  metrics=['accuracy'])\n",
    "    \n",
    "#model.compile(optimizer=keras.optimizers.SGD(lr=0.001),\n",
    "#              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
    "#              metrics=['accuracy'])\n",
    "\n",
    "#model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "de9144a8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'.\\\\my_newlogs2\\\\run_2023_06_26_10_07_27'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "root_logdir = os.path.join(os.curdir,\"my_newlogs2\")\n",
    "def get_run_logdir():\n",
    "    import time\n",
    "    run_id=time.strftime(\"run_%Y_%m_%d_%H_%M_%S\")\n",
    "    return os.path.join(root_logdir,run_id)\n",
    "logdir=get_run_logdir()\n",
    "logdir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f8cafcab",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.7415 - accuracy: 0.2939\n",
      "Epoch 1: val_loss improved from inf to 1.70110, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 120s 267ms/step - loss: 1.7412 - accuracy: 0.2942 - val_loss: 1.7011 - val_accuracy: 0.3429\n",
      "Epoch 2/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.7026 - accuracy: 0.3263\n",
      "Epoch 2: val_loss improved from 1.70110 to 1.66384, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.7026 - accuracy: 0.3263 - val_loss: 1.6638 - val_accuracy: 0.3474\n",
      "Epoch 3/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.6831 - accuracy: 0.3383\n",
      "Epoch 3: val_loss improved from 1.66384 to 1.64151, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6830 - accuracy: 0.3383 - val_loss: 1.6415 - val_accuracy: 0.3777\n",
      "Epoch 4/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6678 - accuracy: 0.3471\n",
      "Epoch 4: val_loss improved from 1.64151 to 1.62339, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6678 - accuracy: 0.3471 - val_loss: 1.6234 - val_accuracy: 0.3825\n",
      "Epoch 5/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6568 - accuracy: 0.3525\n",
      "Epoch 5: val_loss improved from 1.62339 to 1.60721, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6568 - accuracy: 0.3525 - val_loss: 1.6072 - val_accuracy: 0.3903\n",
      "Epoch 6/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6500 - accuracy: 0.3559\n",
      "Epoch 6: val_loss improved from 1.60721 to 1.59755, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6500 - accuracy: 0.3559 - val_loss: 1.5975 - val_accuracy: 0.3956\n",
      "Epoch 7/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6409 - accuracy: 0.3618\n",
      "Epoch 7: val_loss improved from 1.59755 to 1.58358, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6409 - accuracy: 0.3618 - val_loss: 1.5836 - val_accuracy: 0.3972\n",
      "Epoch 8/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.6310 - accuracy: 0.3665\n",
      "Epoch 8: val_loss improved from 1.58358 to 1.58129, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6307 - accuracy: 0.3668 - val_loss: 1.5813 - val_accuracy: 0.3969\n",
      "Epoch 9/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6254 - accuracy: 0.3732\n",
      "Epoch 9: val_loss improved from 1.58129 to 1.57940, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6254 - accuracy: 0.3732 - val_loss: 1.5794 - val_accuracy: 0.3887\n",
      "Epoch 10/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6204 - accuracy: 0.3720\n",
      "Epoch 10: val_loss improved from 1.57940 to 1.56132, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6204 - accuracy: 0.3720 - val_loss: 1.5613 - val_accuracy: 0.4047\n",
      "Epoch 11/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6158 - accuracy: 0.3741\n",
      "Epoch 11: val_loss improved from 1.56132 to 1.56044, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6158 - accuracy: 0.3741 - val_loss: 1.5604 - val_accuracy: 0.4023\n",
      "Epoch 12/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6096 - accuracy: 0.3781\n",
      "Epoch 12: val_loss did not improve from 1.56044\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6096 - accuracy: 0.3781 - val_loss: 1.5620 - val_accuracy: 0.3963\n",
      "Epoch 13/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.6053 - accuracy: 0.3791\n",
      "Epoch 13: val_loss improved from 1.56044 to 1.55298, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.6053 - accuracy: 0.3791 - val_loss: 1.5530 - val_accuracy: 0.4078\n",
      "Epoch 14/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5994 - accuracy: 0.3834\n",
      "Epoch 14: val_loss improved from 1.55298 to 1.54623, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5994 - accuracy: 0.3834 - val_loss: 1.5462 - val_accuracy: 0.4067\n",
      "Epoch 15/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5938 - accuracy: 0.3873\n",
      "Epoch 15: val_loss improved from 1.54623 to 1.53655, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5939 - accuracy: 0.3873 - val_loss: 1.5365 - val_accuracy: 0.4134\n",
      "Epoch 16/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5891 - accuracy: 0.3879\n",
      "Epoch 16: val_loss improved from 1.53655 to 1.53343, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 33ms/step - loss: 1.5891 - accuracy: 0.3879 - val_loss: 1.5334 - val_accuracy: 0.4150\n",
      "Epoch 17/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5876 - accuracy: 0.3889\n",
      "Epoch 17: val_loss improved from 1.53343 to 1.52756, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5876 - accuracy: 0.3889 - val_loss: 1.5276 - val_accuracy: 0.4177\n",
      "Epoch 18/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5830 - accuracy: 0.3912\n",
      "Epoch 18: val_loss improved from 1.52756 to 1.52376, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5830 - accuracy: 0.3912 - val_loss: 1.5238 - val_accuracy: 0.4245\n",
      "Epoch 19/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5776 - accuracy: 0.3946\n",
      "Epoch 19: val_loss improved from 1.52376 to 1.51741, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5776 - accuracy: 0.3946 - val_loss: 1.5174 - val_accuracy: 0.4196\n",
      "Epoch 20/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5746 - accuracy: 0.3986\n",
      "Epoch 20: val_loss improved from 1.51741 to 1.51505, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 16s 35ms/step - loss: 1.5745 - accuracy: 0.3986 - val_loss: 1.5150 - val_accuracy: 0.4198\n",
      "Epoch 21/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5693 - accuracy: 0.3988\n",
      "Epoch 21: val_loss improved from 1.51505 to 1.50966, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5693 - accuracy: 0.3988 - val_loss: 1.5097 - val_accuracy: 0.4290\n",
      "Epoch 22/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5662 - accuracy: 0.4002\n",
      "Epoch 22: val_loss did not improve from 1.50966\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5662 - accuracy: 0.4002 - val_loss: 1.5136 - val_accuracy: 0.4291\n",
      "Epoch 23/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5634 - accuracy: 0.3998\n",
      "Epoch 23: val_loss improved from 1.50966 to 1.50627, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 35ms/step - loss: 1.5634 - accuracy: 0.3998 - val_loss: 1.5063 - val_accuracy: 0.4269\n",
      "Epoch 24/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5603 - accuracy: 0.4011\n",
      "Epoch 24: val_loss improved from 1.50627 to 1.50109, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 16s 36ms/step - loss: 1.5603 - accuracy: 0.4011 - val_loss: 1.5011 - val_accuracy: 0.4287\n",
      "Epoch 25/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5542 - accuracy: 0.4067\n",
      "Epoch 25: val_loss did not improve from 1.50109\n",
      "448/448 [==============================] - 17s 37ms/step - loss: 1.5541 - accuracy: 0.4067 - val_loss: 1.5013 - val_accuracy: 0.4301\n",
      "Epoch 26/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5513 - accuracy: 0.4073\n",
      "Epoch 26: val_loss improved from 1.50109 to 1.49592, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 17s 37ms/step - loss: 1.5511 - accuracy: 0.4074 - val_loss: 1.4959 - val_accuracy: 0.4333\n",
      "Epoch 27/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5491 - accuracy: 0.4070\n",
      "Epoch 27: val_loss improved from 1.49592 to 1.49306, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 16s 35ms/step - loss: 1.5491 - accuracy: 0.4070 - val_loss: 1.4931 - val_accuracy: 0.4339\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 28/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5493 - accuracy: 0.4077\n",
      "Epoch 28: val_loss improved from 1.49306 to 1.48481, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 79s 177ms/step - loss: 1.5493 - accuracy: 0.4077 - val_loss: 1.4848 - val_accuracy: 0.4361\n",
      "Epoch 29/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5430 - accuracy: 0.4110\n",
      "Epoch 29: val_loss did not improve from 1.48481\n",
      "448/448 [==============================] - 178s 397ms/step - loss: 1.5430 - accuracy: 0.4110 - val_loss: 1.4871 - val_accuracy: 0.4388\n",
      "Epoch 30/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5422 - accuracy: 0.4110\n",
      "Epoch 30: val_loss improved from 1.48481 to 1.48256, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5422 - accuracy: 0.4110 - val_loss: 1.4826 - val_accuracy: 0.4403\n",
      "Epoch 31/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5388 - accuracy: 0.4134\n",
      "Epoch 31: val_loss did not improve from 1.48256\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5388 - accuracy: 0.4134 - val_loss: 1.4952 - val_accuracy: 0.4275\n",
      "Epoch 32/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5375 - accuracy: 0.4115\n",
      "Epoch 32: val_loss improved from 1.48256 to 1.48134, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5375 - accuracy: 0.4115 - val_loss: 1.4813 - val_accuracy: 0.4400\n",
      "Epoch 33/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5355 - accuracy: 0.4154\n",
      "Epoch 33: val_loss improved from 1.48134 to 1.47437, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5355 - accuracy: 0.4154 - val_loss: 1.4744 - val_accuracy: 0.4375\n",
      "Epoch 34/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5284 - accuracy: 0.4162\n",
      "Epoch 34: val_loss did not improve from 1.47437\n",
      "448/448 [==============================] - 15s 33ms/step - loss: 1.5284 - accuracy: 0.4162 - val_loss: 1.4764 - val_accuracy: 0.4395\n",
      "Epoch 35/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5272 - accuracy: 0.4190\n",
      "Epoch 35: val_loss improved from 1.47437 to 1.47064, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5270 - accuracy: 0.4190 - val_loss: 1.4706 - val_accuracy: 0.4403\n",
      "Epoch 36/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5250 - accuracy: 0.4202\n",
      "Epoch 36: val_loss improved from 1.47064 to 1.46772, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 33ms/step - loss: 1.5250 - accuracy: 0.4202 - val_loss: 1.4677 - val_accuracy: 0.4400\n",
      "Epoch 37/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5228 - accuracy: 0.4188\n",
      "Epoch 37: val_loss did not improve from 1.46772\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5228 - accuracy: 0.4188 - val_loss: 1.4832 - val_accuracy: 0.4355\n",
      "Epoch 38/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5202 - accuracy: 0.4203\n",
      "Epoch 38: val_loss improved from 1.46772 to 1.46648, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 16s 35ms/step - loss: 1.5202 - accuracy: 0.4203 - val_loss: 1.4665 - val_accuracy: 0.4445\n",
      "Epoch 39/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5192 - accuracy: 0.4216\n",
      "Epoch 39: val_loss did not improve from 1.46648\n",
      "448/448 [==============================] - 15s 35ms/step - loss: 1.5192 - accuracy: 0.4216 - val_loss: 1.4740 - val_accuracy: 0.4367\n",
      "Epoch 40/60\n",
      "447/448 [============================>.] - ETA: 0s - loss: 1.5178 - accuracy: 0.4205\n",
      "Epoch 40: val_loss improved from 1.46648 to 1.46323, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5182 - accuracy: 0.4204 - val_loss: 1.4632 - val_accuracy: 0.4461\n",
      "Epoch 41/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5120 - accuracy: 0.4257\n",
      "Epoch 41: val_loss did not improve from 1.46323\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5120 - accuracy: 0.4257 - val_loss: 1.4697 - val_accuracy: 0.4414\n",
      "Epoch 42/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5094 - accuracy: 0.4258\n",
      "Epoch 42: val_loss improved from 1.46323 to 1.45724, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5094 - accuracy: 0.4258 - val_loss: 1.4572 - val_accuracy: 0.4509\n",
      "Epoch 43/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5114 - accuracy: 0.4263\n",
      "Epoch 43: val_loss did not improve from 1.45724\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5114 - accuracy: 0.4263 - val_loss: 1.4612 - val_accuracy: 0.4442\n",
      "Epoch 44/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5049 - accuracy: 0.4291\n",
      "Epoch 44: val_loss improved from 1.45724 to 1.45213, saving model to MLP_model.h5\n",
      "448/448 [==============================] - 15s 33ms/step - loss: 1.5049 - accuracy: 0.4291 - val_loss: 1.4521 - val_accuracy: 0.4491\n",
      "Epoch 45/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5067 - accuracy: 0.4252\n",
      "Epoch 45: val_loss did not improve from 1.45213\n",
      "448/448 [==============================] - 15s 33ms/step - loss: 1.5067 - accuracy: 0.4252 - val_loss: 1.4593 - val_accuracy: 0.4473\n",
      "Epoch 46/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5044 - accuracy: 0.4282\n",
      "Epoch 46: val_loss did not improve from 1.45213\n",
      "448/448 [==============================] - 15s 34ms/step - loss: 1.5044 - accuracy: 0.4282 - val_loss: 1.4532 - val_accuracy: 0.4503\n",
      "Epoch 47/60\n",
      "448/448 [==============================] - ETA: 0s - loss: 1.5017 - accuracy: 0.4320\n",
      "Epoch 47: val_loss did not improve from 1.45213\n",
      "Restoring model weights from the end of the best epoch: 44.\n",
      "448/448 [==============================] - 15s 33ms/step - loss: 1.5017 - accuracy: 0.4320 - val_loss: 1.4536 - val_accuracy: 0.4475\n",
      "Epoch 47: early stopping\n"
     ]
    }
   ],
   "source": [
    "#create a tensorboard callback function that makes use of folder logger\n",
    "tensorboard_cb=keras.callbacks.TensorBoard(logdir)\n",
    "\n",
    "#create checkpoint callback that saves every epoch\n",
    "checkpoint_cb = keras.callbacks.ModelCheckpoint(\"MLP_model.h5\",\n",
    "    save_best_only=True, verbose=1,mode='min', moniter='val_loss')\n",
    "\n",
    "#create early stopping callback\n",
    "\n",
    "early_stopping_cb = keras.callbacks.EarlyStopping(monitor='val_loss', \n",
    "                          min_delta=0, \n",
    "                          patience=3, \n",
    "                          verbose=1,\n",
    "                          restore_best_weights=True)\n",
    "\n",
    "steps_per_epoch = training_set.n // training_set.batch_size\n",
    "validation_steps = validation_set.n // validation_set.batch_size\n",
    "\n",
    "history = model.fit(x=training_set,\n",
    "                 validation_data=validation_set,\n",
    "                 epochs= 60,\n",
    "                 callbacks=[tensorboard_cb,\n",
    "            checkpoint_cb, early_stopping_cb],\n",
    "                 steps_per_epoch=steps_per_epoch,\n",
    "                 validation_steps=validation_steps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6b52c7cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_history(history):\n",
    "    acc = history.history[\"accuracy\"]\n",
    "    loss = history.history[\"loss\"]\n",
    "    val_loss = history.history[\"val_loss\"]\n",
    "    val_accuracy = history.history[\"val_accuracy\"]\n",
    "    \n",
    "    x = range(1, len(acc) + 1)\n",
    "    \n",
    "    plt.figure(figsize=(12,5))\n",
    "    plt.subplot(1, 2, 1)\n",
    "    plt.plot(x, acc, \"b\", label=\"traning_acc\")\n",
    "    plt.plot(x, val_accuracy, \"r\", label=\"traning_acc\")\n",
    "    plt.title(\"Accuracy\")\n",
    "    \n",
    "    plt.subplot(1, 2, 2)\n",
    "    plt.plot(x, loss, \"b\", label=\"traning_acc\")\n",
    "    plt.plot(x, val_loss, \"r\", label=\"traning_acc\")\n",
    "    plt.title(\"Loss\")\n",
    "    \n",
    "plot_history(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aec6b30a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
