{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "-UbmiVOrY4nG" }, "source": [ "#MODEL TRAINING" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "P9mxUB3aY6aB" }, "outputs": [], "source": [ "import pickle\n", "import numpy as np\n", "import tensorflow as tf\n", "import keras" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "De0uG17naSnH" }, "outputs": [], "source": [ "#Loading the data from pickle file:\n", "with open('images.p','rb') as f:\n", " x = pickle.load(f)\n", "with open('labels.p','rb') as f:\n", " y = pickle.load(f)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ocPW78hra7po", "outputId": "e1deda61-4271-465a-e1f0-5440a7637c74" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Images: (16082, 48, 48)\n", "Labels: (16082,)\n" ] } ], "source": [ "print(\"Images: \",x.shape)\n", "print(\"Labels: \",y.shape)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "r3H-dwisbW1U" }, "outputs": [], "source": [ "#Label encoding output\n", "from sklearn.preprocessing import LabelEncoder\n", "le = LabelEncoder()\n", "y = le.fit_transform(y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xz9pXqhQb3cz", "outputId": "0f489cd0-e726-438d-e5fc-932ceb502ada" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([0, 0, 0, ..., 4, 4, 4])" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "y" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "l-0sTzUwb4ty" }, "outputs": [], "source": [ "# Standardizing the images for CNN Model:\n", "x = x/255\n", "x = x.reshape(-1,48,48,1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "pwpKEUdVMx3z" }, "outputs": [], "source": [ "# using one-hot encoding to output column\n", "from keras.utils import to_categorical\n", "y = to_categorical(y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "gb_sHsDgNThj" }, "outputs": [], "source": [ "# Splitting, training and testing datas\n", "from sklearn.model_selection import train_test_split\n", "xtrain, xtest, ytrain, ytest = train_test_split(x,y,test_size=0.1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6bd6RjU2NzQY", "outputId": "4de3a15c-e6e0-497d-85f8-25aa758720b9" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Xtrain: (14473, 48, 48, 1)\n", "Xtest: (1609, 48, 48, 1)\n", "Ytrain: (14473, 5)\n", "Ytest: (1609, 5)\n" ] } ], "source": [ "print(\"Xtrain: \", xtrain.shape)\n", "print(\"Xtest: \", xtest.shape)\n", "print(\"Ytrain: \", ytrain.shape)\n", "print(\"Ytest: \", ytest.shape)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YTvFdOMFOFw6" }, "outputs": [], "source": [ "# CNN Model Training\n", "from keras.models import Sequential\n", "from keras.optimizers import Adam\n", "from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9z_tdS9aPa85", "outputId": "8a0fc7f0-b8ee-4618-fb36-f9284c02b93c" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/keras/src/layers/convolutional/base_conv.py:113: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n", " super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n" ] } ], "source": [ "model = Sequential()\n", "\n", "# 1st Convolutional Layer:\n", "model.add(Conv2D(45, (3,3), activation='relu', input_shape=(48,48,1)))\n", "model.add(MaxPooling2D(pool_size=(2,2)))\n", "\n", "# 2nd Convolutional Layer:\n", "model.add(Conv2D(64, (3,3), activation='relu'))\n", "model.add(MaxPooling2D(pool_size=(2,2)))\n", "\n", "# 3rd Convolutional Layer:\n", "model.add(Conv2D(128, (3,3), activation='relu'))\n", "model.add(MaxPooling2D(pool_size=(2,2)))\n", "\n", "# Adding flatten layer: converts 2D to 1D\n", "model.add(Flatten())\n", "\n", "# Hidden Layer\n", "model.add(Dense(256, activation='relu'))\n", "\n", "# Output Layer\n", "model.add(Dense(5, activation='softmax'))\n", "model.compile(Adam(learning_rate=0.001), loss= 'categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 435 }, "id": "tF6iuGvFSHxH", "outputId": "0dec5c91-6e9d-4b5d-db42-a120e7edd465" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ], "text/html": [ "
Model: \"sequential\"\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", "│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m46\u001b[0m, \u001b[38;5;34m46\u001b[0m, \u001b[38;5;34m45\u001b[0m) │ \u001b[38;5;34m450\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m23\u001b[0m, \u001b[38;5;34m23\u001b[0m, \u001b[38;5;34m45\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m21\u001b[0m, \u001b[38;5;34m21\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m25,984\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m73,856\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2048\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m524,544\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m) │ \u001b[38;5;34m1,285\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ], "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
              "┃ Layer (type)                     Output Shape                  Param # ┃\n",
              "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
              "│ conv2d (Conv2D)                 │ (None, 46, 46, 45)     │           450 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ max_pooling2d (MaxPooling2D)    │ (None, 23, 23, 45)     │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ conv2d_1 (Conv2D)               │ (None, 21, 21, 64)     │        25,984 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ max_pooling2d_1 (MaxPooling2D)  │ (None, 10, 10, 64)     │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ conv2d_2 (Conv2D)               │ (None, 8, 8, 128)      │        73,856 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ max_pooling2d_2 (MaxPooling2D)  │ (None, 4, 4, 128)      │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ flatten (Flatten)               │ (None, 2048)           │             0 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense (Dense)                   │ (None, 256)            │       524,544 │\n",
              "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
              "│ dense_1 (Dense)                 │ (None, 5)              │         1,285 │\n",
              "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m626,119\u001b[0m (2.39 MB)\n" ], "text/html": [ "
 Total params: 626,119 (2.39 MB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m626,119\u001b[0m (2.39 MB)\n" ], "text/html": [ "
 Trainable params: 626,119 (2.39 MB)\n",
              "
\n" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ], "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
              "
\n" ] }, "metadata": {} } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xk6RG0TCSKLh", "outputId": "dfb2d5ff-0328-4f68-9408-c9805c4f8f42" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Epoch 1/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m65s\u001b[0m 139ms/step - accuracy: 0.2955 - loss: 1.5343 - val_accuracy: 0.4910 - val_loss: 1.2713\n", "Epoch 2/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m80s\u001b[0m 135ms/step - accuracy: 0.5104 - loss: 1.1988 - val_accuracy: 0.5712 - val_loss: 1.0940\n", "Epoch 3/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m81s\u001b[0m 133ms/step - accuracy: 0.5894 - loss: 1.0380 - val_accuracy: 0.5855 - val_loss: 1.0413\n", "Epoch 4/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m60s\u001b[0m 133ms/step - accuracy: 0.6276 - loss: 0.9492 - val_accuracy: 0.6041 - val_loss: 1.0269\n", "Epoch 5/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m83s\u001b[0m 135ms/step - accuracy: 0.6702 - loss: 0.8558 - val_accuracy: 0.6140 - val_loss: 0.9967\n", "Epoch 6/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 135ms/step - accuracy: 0.7116 - loss: 0.7578 - val_accuracy: 0.6109 - val_loss: 1.0013\n", "Epoch 7/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m60s\u001b[0m 133ms/step - accuracy: 0.7470 - loss: 0.6766 - val_accuracy: 0.6221 - val_loss: 1.0187\n", "Epoch 8/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 135ms/step - accuracy: 0.7817 - loss: 0.5893 - val_accuracy: 0.6116 - val_loss: 1.0794\n", "Epoch 9/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 137ms/step - accuracy: 0.8095 - loss: 0.5134 - val_accuracy: 0.6271 - val_loss: 1.1883\n", "Epoch 10/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 135ms/step - accuracy: 0.8536 - loss: 0.4024 - val_accuracy: 0.6172 - val_loss: 1.2258\n", "Epoch 11/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m81s\u001b[0m 133ms/step - accuracy: 0.8920 - loss: 0.3159 - val_accuracy: 0.6122 - val_loss: 1.3291\n", "Epoch 12/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m63s\u001b[0m 138ms/step - accuracy: 0.9156 - loss: 0.2422 - val_accuracy: 0.6022 - val_loss: 1.5368\n", "Epoch 13/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 137ms/step - accuracy: 0.9357 - loss: 0.1949 - val_accuracy: 0.5979 - val_loss: 1.7381\n", "Epoch 14/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m62s\u001b[0m 136ms/step - accuracy: 0.9596 - loss: 0.1256 - val_accuracy: 0.6265 - val_loss: 1.8758\n", "Epoch 15/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m80s\u001b[0m 133ms/step - accuracy: 0.9655 - loss: 0.1065 - val_accuracy: 0.6097 - val_loss: 2.0449\n", "Epoch 16/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m85s\u001b[0m 139ms/step - accuracy: 0.9659 - loss: 0.1077 - val_accuracy: 0.6215 - val_loss: 2.2283\n", "Epoch 17/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m81s\u001b[0m 136ms/step - accuracy: 0.9791 - loss: 0.0665 - val_accuracy: 0.5898 - val_loss: 2.4029\n", "Epoch 18/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m61s\u001b[0m 135ms/step - accuracy: 0.9751 - loss: 0.0755 - val_accuracy: 0.6277 - val_loss: 2.4831\n", "Epoch 19/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m83s\u001b[0m 139ms/step - accuracy: 0.9835 - loss: 0.0548 - val_accuracy: 0.6066 - val_loss: 2.5477\n", "Epoch 20/20\n", "\u001b[1m453/453\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m80s\u001b[0m 135ms/step - accuracy: 0.9792 - loss: 0.0634 - val_accuracy: 0.6134 - val_loss: 2.7209\n" ] } ], "source": [ "history = model.fit(xtrain, ytrain, epochs=20, validation_data=(xtest, ytest))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "dUGGIyMMSxeP", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "1616b37c-016e-42de-8e8f-1aa89983461e" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Model Saved\n" ] } ], "source": [ "# to save the model for deployment\n", "# h5 -> h5 models represent HDF5 format\n", "# It stores model's optimizers state, model architecture, training configuration, weights\n", "model.save('emotion_detection_model.h5')\n", "print(\"Model Saved\")" ] }, { "cell_type": "code", "source": [], "metadata": { "id": "IL-mOkAsjJmz" }, "execution_count": null, "outputs": [] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }