{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Data visualization\n", "import numpy as np\n", "import pandas as pd \n", "\n", "# Keras\n", "from keras.models import Sequential\n", "from keras.layers import Dense\n", "from keras.layers import Dropout\n", "from keras.optimizers import Adam\n", "from keras.utils.np_utils import to_categorical\n", "from keras.callbacks import EarlyStopping\n", "import keras_tuner as kt\n", "\n", "# Train-Test\n", "from sklearn.model_selection import train_test_split\n", "# Classification Report\n", "from sklearn.metrics import confusion_matrix, precision_recall_fscore_support\n", "\n", "import pickle\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Set up important landmarks and functions" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Determine important landmarks for lunge\n", "IMPORTANT_LMS = [\n", " \"NOSE\",\n", " \"LEFT_SHOULDER\",\n", " \"RIGHT_SHOULDER\",\n", " \"LEFT_HIP\",\n", " \"RIGHT_HIP\",\n", " \"LEFT_KNEE\",\n", " \"RIGHT_KNEE\",\n", " \"LEFT_ANKLE\",\n", " \"RIGHT_ANKLE\",\n", " \"LEFT_HEEL\",\n", " \"RIGHT_HEEL\",\n", " \"LEFT_FOOT_INDEX\",\n", " \"RIGHT_FOOT_INDEX\",\n", "]\n", "\n", "# Generate all columns of the data frame\n", "\n", "HEADERS = [\"label\"] # Label column\n", "\n", "for lm in IMPORTANT_LMS:\n", " HEADERS += [f\"{lm.lower()}_x\", f\"{lm.lower()}_y\", f\"{lm.lower()}_z\", f\"{lm.lower()}_v\"]\n", "\n", "TRAIN_SET_PATH = \"./err.train.csv\"\n", "TEST_SET_PATH = \"./err.test.csv\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def describe_dataset(dataset_path: str):\n", " '''\n", " Describe dataset\n", " '''\n", "\n", " data = pd.read_csv(dataset_path)\n", " print(f\"Headers: {list(data.columns.values)}\")\n", " print(f'Number of rows: {data.shape[0]} \\nNumber of columns: {data.shape[1]}\\n')\n", " print(f\"Labels: \\n{data['label'].value_counts()}\\n\")\n", " print(f\"Missing values: {data.isnull().values.any()}\\n\")\n", " \n", " duplicate = data[data.duplicated()]\n", " print(f\"Duplicate Rows : {len(duplicate.sum(axis=1))}\")\n", "\n", " return data\n", "\n", "\n", "# Remove duplicate rows (optional)\n", "def remove_duplicate_rows(dataset_path: str):\n", " '''\n", " Remove duplicated data from the dataset then save it to another files\n", " '''\n", " \n", " df = pd.read_csv(dataset_path)\n", " df.drop_duplicates(keep=\"first\", inplace=True)\n", " df.to_csv(f\"cleaned_dataset.csv\", sep=',', encoding='utf-8', index=False)\n", "\n", "\n", "def round_up_metric_results(results) -> list:\n", " '''Round up metrics results such as precision score, recall score, ...'''\n", " return list(map(lambda el: round(el, 3), results))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Describe and process data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Headers: ['label', 'nose_x', 'nose_y', 'nose_z', 'nose_v', 'left_shoulder_x', 'left_shoulder_y', 'left_shoulder_z', 'left_shoulder_v', 'right_shoulder_x', 'right_shoulder_y', 'right_shoulder_z', 'right_shoulder_v', 'left_hip_x', 'left_hip_y', 'left_hip_z', 'left_hip_v', 'right_hip_x', 'right_hip_y', 'right_hip_z', 'right_hip_v', 'left_knee_x', 'left_knee_y', 'left_knee_z', 'left_knee_v', 'right_knee_x', 'right_knee_y', 'right_knee_z', 'right_knee_v', 'left_ankle_x', 'left_ankle_y', 'left_ankle_z', 'left_ankle_v', 'right_ankle_x', 'right_ankle_y', 'right_ankle_z', 'right_ankle_v', 'left_heel_x', 'left_heel_y', 'left_heel_z', 'left_heel_v', 'right_heel_x', 'right_heel_y', 'right_heel_z', 'right_heel_v', 'left_foot_index_x', 'left_foot_index_y', 'left_foot_index_z', 'left_foot_index_v', 'right_foot_index_x', 'right_foot_index_y', 'right_foot_index_z', 'right_foot_index_v']\n", "Number of rows: 17907 \n", "Number of columns: 53\n", "\n", "Labels: \n", "L 9114\n", "C 8793\n", "Name: label, dtype: int64\n", "\n", "Missing values: False\n", "\n", "Duplicate Rows : 0\n" ] } ], "source": [ "# load dataset\n", "df = describe_dataset(TRAIN_SET_PATH)\n", "\n", "# Categorizing label\n", "df.loc[df[\"label\"] == \"L\", \"label\"] = 0\n", "df.loc[df[\"label\"] == \"C\", \"label\"] = 1" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Standard Scaling of features\n", "with open(\"./model/input_scaler.pkl\", \"rb\") as f2:\n", " input_scaler = pickle.load(f2)\n", "\n", "x = df.drop(\"label\", axis = 1)\n", "x = pd.DataFrame(input_scaler.transform(x))\n", "\n", "y = df[\"label\"]\n", "\n", "# # Converting prediction to categorical\n", "y_cat = to_categorical(y)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "x_train, x_test, y_train, y_test = train_test_split(x.values, y_cat, test_size=0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Train model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1. Set up" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "stop_early = EarlyStopping(monitor='loss', patience=3)\n", "\n", "# Final Results\n", "final_models = {}" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def describe_model(model):\n", " '''\n", " Describe Model architecture\n", " '''\n", " print(f\"Describe models architecture\")\n", " for i, layer in enumerate(model.layers):\n", " number_of_units = layer.units if hasattr(layer, 'units') else 0\n", "\n", " if hasattr(layer, \"activation\"):\n", " print(f\"Layer-{i + 1}: {number_of_units} units, func: \", layer.activation)\n", " else:\n", " print(f\"Layer-{i + 1}: {number_of_units} units, func: None\")\n", " \n", "\n", "def get_best_model(tuner):\n", " '''\n", " Describe and return the best model found from keras tuner\n", " '''\n", " best_hps = tuner.get_best_hyperparameters(num_trials=1)[0]\n", " best_model = tuner.hypermodel.build(best_hps)\n", "\n", " describe_model(best_model)\n", "\n", " for h_param in [\"learning_rate\"]:\n", " print(f\"{h_param}: {tuner.get_best_hyperparameters()[0].get(h_param)}\")\n", " \n", " return best_model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2. Model with 3 layers " ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "def model_builder(hp):\n", " model = Sequential()\n", " model.add(Dense(52, input_dim = 52, activation = \"relu\"))\n", "\n", " hp_activation = hp.Choice('activation', values=['relu', 'tanh'])\n", " hp_layer_1 = hp.Int('layer_1', min_value=32, max_value=512, step=32)\n", " hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])\n", "\n", " model.add(Dense(units=hp_layer_1, activation=hp_activation))\n", " model.add(Dense(2, activation='softmax'))\n", "\n", " model.compile(optimizer=Adam(learning_rate=hp_learning_rate), loss=\"categorical_crossentropy\", metrics = [\"accuracy\"])\n", " \n", " return model" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Reloading Oracle from existing project keras_tuner_dir/keras_tuner_demo/oracle.json\n" ] } ], "source": [ "tuner = kt.Hyperband(\n", " model_builder,\n", " objective='accuracy',\n", " max_epochs=10,\n", " directory='keras_tuner_dir',\n", " project_name='keras_tuner_demo'\n", ")" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 30 Complete [00h 00m 38s]\n", "accuracy: 0.9995812177658081\n", "\n", "Best accuracy So Far: 1.0000001192092896\n", "Total elapsed time: 00h 08m 17s\n", "INFO:tensorflow:Oracle triggered exit\n" ] } ], "source": [ "tuner.search(x_train, y_train, epochs=10, callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 192 units, func: \n", "Layer-3: 2 units, func: \n", "learning_rate: 0.001\n", "Epoch 1/100\n", " 12/1433 [..............................] - ETA: 13s - loss: 0.5386 - accuracy: 0.7000" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 10:49:54.623575: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1429/1433 [============================>.] - ETA: 0s - loss: 0.0323 - accuracy: 0.9883" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 10:50:06.095468: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - 14s 9ms/step - loss: 0.0322 - accuracy: 0.9883 - val_loss: 0.0022 - val_accuracy: 0.9992\n", "Epoch 2/100\n", "1433/1433 [==============================] - 14s 10ms/step - loss: 0.0048 - accuracy: 0.9984 - val_loss: 0.0103 - val_accuracy: 0.9964\n", "Epoch 3/100\n", "1433/1433 [==============================] - 14s 10ms/step - loss: 0.0044 - accuracy: 0.9986 - val_loss: 0.0018 - val_accuracy: 0.9994\n", "Epoch 4/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0024 - accuracy: 0.9992 - val_loss: 8.9034e-04 - val_accuracy: 0.9997\n", "Epoch 5/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0026 - accuracy: 0.9991 - val_loss: 6.6072e-04 - val_accuracy: 0.9997\n", "Epoch 6/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0016 - accuracy: 0.9995 - val_loss: 0.0011 - val_accuracy: 0.9997\n", "Epoch 7/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0029 - accuracy: 0.9994 - val_loss: 0.0013 - val_accuracy: 0.9997\n", "Epoch 8/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0012 - accuracy: 0.9996 - val_loss: 6.2126e-04 - val_accuracy: 0.9997\n", "Epoch 9/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0014 - accuracy: 0.9995 - val_loss: 3.3005e-04 - val_accuracy: 0.9997\n", "Epoch 10/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0020 - accuracy: 0.9993 - val_loss: 3.4855e-04 - val_accuracy: 0.9997\n", "Epoch 11/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 4.9058e-04 - accuracy: 0.9999 - val_loss: 7.0838e-04 - val_accuracy: 0.9997\n", "Epoch 12/100\n", "1433/1433 [==============================] - 14s 10ms/step - loss: 3.1028e-05 - accuracy: 1.0000 - val_loss: 9.7843e-05 - val_accuracy: 1.0000\n", "Epoch 13/100\n", "1433/1433 [==============================] - 14s 10ms/step - loss: 0.0023 - accuracy: 0.9994 - val_loss: 0.0037 - val_accuracy: 0.9986\n", "Epoch 14/100\n", "1433/1433 [==============================] - 14s 10ms/step - loss: 6.7057e-04 - accuracy: 0.9998 - val_loss: 4.5239e-04 - val_accuracy: 0.9997\n", "Epoch 15/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 3.3223e-05 - accuracy: 1.0000 - val_loss: 3.2696e-04 - val_accuracy: 0.9997\n", "Epoch 16/100\n", "1433/1433 [==============================] - 13s 9ms/step - loss: 0.0035 - accuracy: 0.9992 - val_loss: 1.6425e-04 - val_accuracy: 1.0000\n", "Epoch 17/100\n", "1433/1433 [==============================] - 14s 10ms/step - loss: 0.0015 - accuracy: 0.9995 - val_loss: 0.0011 - val_accuracy: 0.9997\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = get_best_model(tuner)\n", "model.fit(x_train, y_train, epochs=100, batch_size=10, validation_data=(x_test, y_test), callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [], "source": [ "final_models[\"3_layers\"] = model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3. Model with 5 layers" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [], "source": [ "def model_builder_5(hp):\n", " model = Sequential()\n", " model.add(Dense(52, input_dim = 52, activation = \"relu\"))\n", "\n", " hp_activation = hp.Choice('activation', values=['relu', 'tanh'])\n", " hp_layer_1 = hp.Int('layer_1', min_value=32, max_value=512, step=32)\n", " hp_layer_2 = hp.Int('layer_2', min_value=32, max_value=512, step=32)\n", " hp_layer_3 = hp.Int('layer_3', min_value=32, max_value=512, step=32)\n", " hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])\n", "\n", " model.add(Dense(units=hp_layer_1, activation=hp_activation))\n", " model.add(Dense(units=hp_layer_2, activation=hp_activation))\n", " model.add(Dense(units=hp_layer_3, activation=hp_activation))\n", " model.add(Dense(2, activation='softmax'))\n", "\n", " model.compile(optimizer=Adam(learning_rate=hp_learning_rate), loss=\"categorical_crossentropy\", metrics = [\"accuracy\"])\n", " \n", " return model" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 30 Complete [00h 00m 44s]\n", "accuracy: 0.9998604655265808\n", "\n", "Best accuracy So Far: 1.0000001192092896\n", "Total elapsed time: 00h 08m 57s\n", "INFO:tensorflow:Oracle triggered exit\n" ] } ], "source": [ "tuner = kt.Hyperband(\n", " model_builder_5,\n", " objective='accuracy',\n", " max_epochs=10,\n", " directory='keras_tuner_dir',\n", " project_name='keras_tuner_demo_2'\n", ")\n", "tuner.search(x_train, y_train, epochs=10, callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 480 units, func: \n", "Layer-3: 480 units, func: \n", "Layer-4: 192 units, func: \n", "Layer-5: 2 units, func: \n", "learning_rate: 0.0001\n", "Epoch 1/100\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 11:11:48.332514: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - ETA: 0s - loss: 0.0428 - accuracy: 0.9872" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 11:12:02.217934: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0428 - accuracy: 0.9872 - val_loss: 0.0248 - val_accuracy: 0.9913\n", "Epoch 2/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0055 - accuracy: 0.9986 - val_loss: 0.0016 - val_accuracy: 0.9992\n", "Epoch 3/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0052 - accuracy: 0.9988 - val_loss: 0.0036 - val_accuracy: 0.9992\n", "Epoch 4/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0024 - accuracy: 0.9994 - val_loss: 0.0017 - val_accuracy: 0.9997\n", "Epoch 5/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0048 - accuracy: 0.9982 - val_loss: 0.0019 - val_accuracy: 0.9994\n", "Epoch 6/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0018 - accuracy: 0.9994 - val_loss: 8.5989e-04 - val_accuracy: 0.9997\n", "Epoch 7/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0023 - accuracy: 0.9994 - val_loss: 4.7530e-04 - val_accuracy: 0.9997\n", "Epoch 8/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0022 - accuracy: 0.9991 - val_loss: 3.3401e-04 - val_accuracy: 0.9997\n", "Epoch 9/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0018 - accuracy: 0.9993 - val_loss: 3.5316e-04 - val_accuracy: 0.9997\n", "Epoch 10/100\n", "1433/1433 [==============================] - 18s 13ms/step - loss: 0.0010 - accuracy: 0.9997 - val_loss: 5.9313e-04 - val_accuracy: 0.9997\n", "Epoch 11/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 0.0017 - accuracy: 0.9995 - val_loss: 5.0026e-04 - val_accuracy: 0.9997\n", "Epoch 12/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0016 - accuracy: 0.9994 - val_loss: 2.7773e-04 - val_accuracy: 0.9997\n", "Epoch 13/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 3.9777e-04 - accuracy: 0.9999 - val_loss: 2.6341e-04 - val_accuracy: 0.9997\n", "Epoch 14/100\n", "1433/1433 [==============================] - 18s 12ms/step - loss: 0.0021 - accuracy: 0.9997 - val_loss: 3.1135e-04 - val_accuracy: 1.0000\n", "Epoch 15/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 2.4923e-04 - accuracy: 0.9999 - val_loss: 3.7806e-04 - val_accuracy: 0.9997\n", "Epoch 16/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 4.5137e-04 - accuracy: 0.9999 - val_loss: 1.0070e-04 - val_accuracy: 1.0000\n", "Epoch 17/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 8.3379e-06 - accuracy: 1.0000 - val_loss: 6.9653e-04 - val_accuracy: 0.9997\n", "Epoch 18/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0018 - accuracy: 0.9994 - val_loss: 1.4246e-04 - val_accuracy: 1.0000\n", "Epoch 19/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 2.8542e-05 - accuracy: 1.0000 - val_loss: 1.0260e-04 - val_accuracy: 1.0000\n", "Epoch 20/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0016 - accuracy: 0.9994 - val_loss: 2.7252e-04 - val_accuracy: 1.0000\n", "Epoch 21/100\n", "1433/1433 [==============================] - 16s 11ms/step - loss: 3.2176e-05 - accuracy: 1.0000 - val_loss: 1.3285e-04 - val_accuracy: 1.0000\n", "Epoch 22/100\n", "1433/1433 [==============================] - 18s 12ms/step - loss: 1.2290e-05 - accuracy: 1.0000 - val_loss: 1.1766e-04 - val_accuracy: 1.0000\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_5 = get_best_model(tuner)\n", "model_5.fit(x_train, y_train, epochs=100, batch_size=10, validation_data=(x_test, y_test), callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [], "source": [ "final_models[\"5_layers\"] = model_5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.4. Model with 7 layers along with Dropout layers" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "def model_builder_dropout_5(hp):\n", " model = Sequential()\n", " model.add(Dense(52, input_dim = 52, activation = \"relu\"))\n", "\n", " hp_activation = hp.Choice('activation', values=['relu', 'tanh'])\n", " hp_layer_1 = hp.Int('layer_1', min_value=32, max_value=512, step=32)\n", " hp_layer_2 = hp.Int('layer_2', min_value=32, max_value=512, step=32)\n", " hp_layer_3 = hp.Int('layer_3', min_value=32, max_value=512, step=32)\n", " hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])\n", "\n", " model.add(Dense(units=hp_layer_1, activation=hp_activation))\n", " model.add(Dropout(0.5))\n", " model.add(Dense(units=hp_layer_2, activation=hp_activation))\n", " model.add(Dropout(0.5))\n", " model.add(Dense(units=hp_layer_3, activation=hp_activation))\n", " model.add(Dense(2, activation='softmax'))\n", "\n", " model.compile(optimizer=Adam(learning_rate=hp_learning_rate), loss=\"categorical_crossentropy\", metrics = [\"accuracy\"])\n", " \n", " return model" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 30 Complete [00h 00m 53s]\n", "accuracy: 0.9993019700050354\n", "\n", "Best accuracy So Far: 0.9997208118438721\n", "Total elapsed time: 00h 11m 19s\n", "INFO:tensorflow:Oracle triggered exit\n" ] } ], "source": [ "tuner = kt.Hyperband(\n", " model_builder_dropout_5,\n", " objective='accuracy',\n", " max_epochs=10,\n", " directory='keras_tuner_dir',\n", " project_name='keras_tuner_demo_3'\n", ")\n", "tuner.search(x_train, y_train, epochs=10, callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 288 units, func: \n", "Layer-3: 0 units, func: None\n", "Layer-4: 224 units, func: \n", "Layer-5: 0 units, func: None\n", "Layer-6: 320 units, func: \n", "Layer-7: 2 units, func: \n", "learning_rate: 0.001\n", "Epoch 1/100\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 11:34:38.687622: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - ETA: 0s - loss: 0.0443 - accuracy: 0.9823" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 11:34:54.587049: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - 19s 13ms/step - loss: 0.0443 - accuracy: 0.9823 - val_loss: 0.0023 - val_accuracy: 0.9994\n", "Epoch 2/100\n", "1433/1433 [==============================] - 18s 12ms/step - loss: 0.0090 - accuracy: 0.9976 - val_loss: 0.0046 - val_accuracy: 0.9975\n", "Epoch 3/100\n", "1433/1433 [==============================] - 18s 13ms/step - loss: 0.0048 - accuracy: 0.9988 - val_loss: 0.0011 - val_accuracy: 0.9994\n", "Epoch 4/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0073 - accuracy: 0.9983 - val_loss: 0.0015 - val_accuracy: 0.9994\n", "Epoch 5/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0041 - accuracy: 0.9987 - val_loss: 8.3813e-04 - val_accuracy: 0.9997\n", "Epoch 6/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0053 - accuracy: 0.9987 - val_loss: 0.0047 - val_accuracy: 0.9986\n", "Epoch 7/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0044 - accuracy: 0.9984 - val_loss: 9.9630e-04 - val_accuracy: 0.9997\n", "Epoch 8/100\n", "1433/1433 [==============================] - 18s 13ms/step - loss: 0.0025 - accuracy: 0.9994 - val_loss: 0.0013 - val_accuracy: 0.9994\n", "Epoch 9/100\n", "1433/1433 [==============================] - 18s 13ms/step - loss: 0.0025 - accuracy: 0.9993 - val_loss: 0.0074 - val_accuracy: 0.9989\n", "Epoch 10/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0019 - accuracy: 0.9998 - val_loss: 0.0018 - val_accuracy: 0.9997\n", "Epoch 11/100\n", "1433/1433 [==============================] - 18s 12ms/step - loss: 0.0038 - accuracy: 0.9994 - val_loss: 3.8607e-04 - val_accuracy: 0.9997\n", "Epoch 12/100\n", "1433/1433 [==============================] - 17s 12ms/step - loss: 0.0031 - accuracy: 0.9992 - val_loss: 0.0011 - val_accuracy: 0.9994\n", "Epoch 13/100\n", "1433/1433 [==============================] - 18s 12ms/step - loss: 0.0048 - accuracy: 0.9990 - val_loss: 1.1490e-04 - val_accuracy: 1.0000\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_5_with_dropout = get_best_model(tuner)\n", "model_5_with_dropout.fit(x_train, y_train, epochs=100, batch_size=10, validation_data=(x_test, y_test), callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['7_layers_with_dropout', '5_layers', '3_layers'])" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_models[\"7_layers_with_dropout\"] = model_5_with_dropout" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.5. Model with 7 layers" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [], "source": [ "def model_builder_7(hp):\n", " model = Sequential()\n", " model.add(Dense(52, input_dim = 52, activation = \"relu\"))\n", "\n", " hp_activation = hp.Choice('activation', values=['relu', 'tanh'])\n", " hp_layer_1 = hp.Int('layer_1', min_value=32, max_value=512, step=32)\n", " hp_layer_2 = hp.Int('layer_2', min_value=32, max_value=512, step=32)\n", " hp_layer_3 = hp.Int('layer_3', min_value=32, max_value=512, step=32)\n", " hp_layer_4 = hp.Int('layer_4', min_value=32, max_value=512, step=32)\n", " hp_layer_5 = hp.Int('layer_5', min_value=32, max_value=512, step=32)\n", " hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])\n", "\n", " model.add(Dense(units=hp_layer_1, activation=hp_activation))\n", " model.add(Dense(units=hp_layer_2, activation=hp_activation))\n", " model.add(Dense(units=hp_layer_3, activation=hp_activation))\n", " model.add(Dense(units=hp_layer_4, activation=hp_activation))\n", " model.add(Dense(units=hp_layer_5, activation=hp_activation))\n", " model.add(Dense(2, activation='softmax'))\n", "\n", " model.compile(optimizer=Adam(learning_rate=hp_learning_rate), loss=\"categorical_crossentropy\", metrics = [\"accuracy\"])\n", " \n", " return model" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 30 Complete [00h 00m 52s]\n", "accuracy: 0.9996510148048401\n", "\n", "Best accuracy So Far: 1.0000001192092896\n", "Total elapsed time: 00h 12m 14s\n", "INFO:tensorflow:Oracle triggered exit\n" ] } ], "source": [ "tuner = kt.Hyperband(\n", " model_builder_7,\n", " objective='accuracy',\n", " max_epochs=10,\n", " directory='keras_tuner_dir',\n", " project_name='keras_tuner_demo_4'\n", ")\n", "tuner.search(x_train, y_train, epochs=10, callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 32 units, func: \n", "Layer-3: 416 units, func: \n", "Layer-4: 192 units, func: \n", "Layer-5: 224 units, func: \n", "Layer-6: 416 units, func: \n", "Layer-7: 2 units, func: \n", "learning_rate: 0.0001\n", "Epoch 1/100\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 13:44:16.853169: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - ETA: 0s - loss: 0.0618 - accuracy: 0.9774" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2022-11-22 13:44:35.283222: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1433/1433 [==============================] - 22s 15ms/step - loss: 0.0618 - accuracy: 0.9774 - val_loss: 0.0034 - val_accuracy: 0.9986\n", "Epoch 2/100\n", "1433/1433 [==============================] - 22s 15ms/step - loss: 0.0059 - accuracy: 0.9985 - val_loss: 0.0092 - val_accuracy: 0.9969\n", "Epoch 3/100\n", "1433/1433 [==============================] - 22s 15ms/step - loss: 0.0052 - accuracy: 0.9984 - val_loss: 0.0018 - val_accuracy: 0.9997\n", "Epoch 4/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0028 - accuracy: 0.9993 - val_loss: 0.0017 - val_accuracy: 0.9992\n", "Epoch 5/100\n", "1433/1433 [==============================] - 21s 14ms/step - loss: 0.0031 - accuracy: 0.9992 - val_loss: 3.8267e-04 - val_accuracy: 1.0000\n", "Epoch 6/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0030 - accuracy: 0.9994 - val_loss: 2.8054e-04 - val_accuracy: 1.0000\n", "Epoch 7/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0022 - accuracy: 0.9995 - val_loss: 0.0038 - val_accuracy: 0.9983\n", "Epoch 8/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0013 - accuracy: 0.9995 - val_loss: 1.5269e-04 - val_accuracy: 1.0000\n", "Epoch 9/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0014 - accuracy: 0.9998 - val_loss: 4.1306e-04 - val_accuracy: 0.9997\n", "Epoch 10/100\n", "1433/1433 [==============================] - 21s 14ms/step - loss: 2.9369e-04 - accuracy: 0.9999 - val_loss: 1.3631e-05 - val_accuracy: 1.0000\n", "Epoch 11/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 1.4331e-05 - accuracy: 1.0000 - val_loss: 6.5710e-06 - val_accuracy: 1.0000\n", "Epoch 12/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0015 - accuracy: 0.9995 - val_loss: 1.8750e-04 - val_accuracy: 1.0000\n", "Epoch 13/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 3.1710e-04 - accuracy: 0.9998 - val_loss: 4.7737e-05 - val_accuracy: 1.0000\n", "Epoch 14/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 1.3424e-05 - accuracy: 1.0000 - val_loss: 1.4000e-05 - val_accuracy: 1.0000\n", "Epoch 15/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 3.3917e-06 - accuracy: 1.0000 - val_loss: 1.4799e-05 - val_accuracy: 1.0000\n", "Epoch 16/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 1.1946e-06 - accuracy: 1.0000 - val_loss: 7.0157e-06 - val_accuracy: 1.0000\n", "Epoch 17/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 6.1554e-07 - accuracy: 1.0000 - val_loss: 2.0066e-05 - val_accuracy: 1.0000\n", "Epoch 18/100\n", "1433/1433 [==============================] - 21s 14ms/step - loss: 2.6470e-07 - accuracy: 1.0000 - val_loss: 5.7550e-05 - val_accuracy: 1.0000\n", "Epoch 19/100\n", "1433/1433 [==============================] - 21s 14ms/step - loss: 1.2669e-07 - accuracy: 1.0000 - val_loss: 4.0596e-06 - val_accuracy: 1.0000\n", "Epoch 20/100\n", "1433/1433 [==============================] - 22s 16ms/step - loss: 6.8169e-08 - accuracy: 1.0000 - val_loss: 1.9726e-05 - val_accuracy: 1.0000\n", "Epoch 21/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 4.3585e-08 - accuracy: 1.0000 - val_loss: 9.4645e-05 - val_accuracy: 1.0000\n", "Epoch 22/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 0.0042 - accuracy: 0.9994 - val_loss: 0.0031 - val_accuracy: 0.9992\n", "Epoch 23/100\n", "1433/1433 [==============================] - 21s 14ms/step - loss: 0.0024 - accuracy: 0.9994 - val_loss: 2.0752e-05 - val_accuracy: 1.0000\n", "Epoch 24/100\n", "1433/1433 [==============================] - 21s 15ms/step - loss: 1.0676e-04 - accuracy: 0.9999 - val_loss: 1.2278e-05 - val_accuracy: 1.0000\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_7 = get_best_model(tuner)\n", "model_7.fit(x_train, y_train, epochs=100, batch_size=10, validation_data=(x_test, y_test), callbacks=[stop_early])" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [], "source": [ "final_models[\"7_layers\"] = model_7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.6. Final Models Description" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7_layers_with_dropout: Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 288 units, func: \n", "Layer-3: 0 units, func: None\n", "Layer-4: 224 units, func: \n", "Layer-5: 0 units, func: None\n", "Layer-6: 320 units, func: \n", "Layer-7: 2 units, func: \n", "\n", "5_layers: Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 480 units, func: \n", "Layer-3: 480 units, func: \n", "Layer-4: 192 units, func: \n", "Layer-5: 2 units, func: \n", "\n", "3_layers: Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 192 units, func: \n", "Layer-3: 2 units, func: \n", "\n", "7_layers: Describe models architecture\n", "Layer-1: 52 units, func: \n", "Layer-2: 32 units, func: \n", "Layer-3: 416 units, func: \n", "Layer-4: 192 units, func: \n", "Layer-5: 224 units, func: \n", "Layer-6: 416 units, func: \n", "Layer-7: 2 units, func: \n", "\n" ] } ], "source": [ "for name, model in final_models.items():\n", " print(f\"{name}: \", end=\"\")\n", " describe_model(model)\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Model Evaluation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1. Train set" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelPrecision ScoreRecall ScoreF1 scoreConfusion Matrix
07_layers_with_dropout[1.0, 0.999][0.999, 1.0][1.0, 1.0][[1805, 1], [0, 1776]]
13_layers[1.0, 0.999][0.999, 1.0][1.0, 1.0][[1805, 1], [0, 1776]]
27_layers[1.0, 1.0][1.0, 1.0][1.0, 1.0][[1806, 0], [0, 1776]]
35_layers[1.0, 0.994][0.994, 1.0][0.997, 0.997][[1795, 11], [0, 1776]]
\n", "
" ], "text/plain": [ " Model Precision Score Recall Score F1 score \\\n", "0 7_layers_with_dropout [1.0, 0.999] [0.999, 1.0] [1.0, 1.0] \n", "1 3_layers [1.0, 0.999] [0.999, 1.0] [1.0, 1.0] \n", "2 7_layers [1.0, 1.0] [1.0, 1.0] [1.0, 1.0] \n", "3 5_layers [1.0, 0.994] [0.994, 1.0] [0.997, 0.997] \n", "\n", " Confusion Matrix \n", "0 [[1805, 1], [0, 1776]] \n", "1 [[1805, 1], [0, 1776]] \n", "2 [[1806, 0], [0, 1776]] \n", "3 [[1795, 11], [0, 1776]] " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_set_results = []\n", "\n", "for name, model in final_models.items():\n", " # Evaluate model\n", " predict_x = model.predict(x_test, verbose=False) \n", " y_pred_class = np.argmax(predict_x, axis=1)\n", " y_test_class = np.argmax(y_test, axis=1)\n", "\n", " cm = confusion_matrix(y_test_class, y_pred_class, labels=[0, 1])\n", " (p_score, r_score, f_score, _) = precision_recall_fscore_support(y_test_class, y_pred_class, labels=[0, 1])\n", " \n", " train_set_results.append(( name, round_up_metric_results(p_score), round_up_metric_results(r_score), round_up_metric_results(f_score), cm ))\n", "\n", "train_set_results.sort(key=lambda k: sum(k[3]), reverse=True)\n", "pd.DataFrame(train_set_results, columns=[\"Model\", \"Precision Score\", \"Recall Score\", \"F1 score\", \"Confusion Matrix\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2. Test set evaluation" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "test_df = pd.read_csv(TEST_SET_PATH)\n", "\n", "# Categorizing label\n", "test_df.loc[test_df[\"label\"] == \"L\", \"label\"] = 0\n", "test_df.loc[test_df[\"label\"] == \"C\", \"label\"] = 1" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# Standard Scaling of features\n", "test_x = test_df.drop(\"label\", axis = 1)\n", "test_x = pd.DataFrame(input_scaler.transform(test_x))\n", "\n", "test_y = test_df[\"label\"]\n", "\n", "# # Converting prediction to categorical\n", "test_y_cat = to_categorical(test_y)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2022-11-25 15:46:42.537983: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n", "2022-11-25 15:46:42.694947: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n", "2022-11-25 15:46:42.853052: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n", "2022-11-25 15:46:42.974234: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelPrecision ScoreRecall ScoreF1 scoreConfusion Matrix
03_layers[0.998, 0.873][0.859, 0.998][0.923, 0.932][[482, 79], [1, 545]]
17_layers_with_dropout[0.995, 0.786][0.736, 0.996][0.846, 0.879][[413, 148], [2, 544]]
25_layers[0.963, 0.755][0.693, 0.973][0.806, 0.85][[389, 172], [15, 531]]
37_layers[0.984, 0.687][0.561, 0.991][0.715, 0.812][[315, 246], [5, 541]]
\n", "
" ], "text/plain": [ " Model Precision Score Recall Score F1 score \\\n", "0 3_layers [0.998, 0.873] [0.859, 0.998] [0.923, 0.932] \n", "1 7_layers_with_dropout [0.995, 0.786] [0.736, 0.996] [0.846, 0.879] \n", "2 5_layers [0.963, 0.755] [0.693, 0.973] [0.806, 0.85] \n", "3 7_layers [0.984, 0.687] [0.561, 0.991] [0.715, 0.812] \n", "\n", " Confusion Matrix \n", "0 [[482, 79], [1, 545]] \n", "1 [[413, 148], [2, 544]] \n", "2 [[389, 172], [15, 531]] \n", "3 [[315, 246], [5, 541]] " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_set_results = []\n", "\n", "for name, model in final_models.items():\n", " # Evaluate model\n", " predict_x = model.predict(test_x, verbose=False) \n", " y_pred_class = np.argmax(predict_x, axis=1)\n", " y_test_class = np.argmax(test_y_cat, axis=1)\n", "\n", " cm = confusion_matrix(y_test_class, y_pred_class, labels=[0, 1])\n", " (p_score, r_score, f_score, _) = precision_recall_fscore_support(y_test_class, y_pred_class, labels=[0, 1])\n", " \n", " test_set_results.append(( name, round_up_metric_results(p_score), round_up_metric_results(r_score), round_up_metric_results(f_score), cm ))\n", "\n", "test_set_results.sort(key=lambda k: sum(k[3]), reverse=True)\n", "pd.DataFrame(test_set_results, columns=[\"Model\", \"Precision Score\", \"Recall Score\", \"F1 score\", \"Confusion Matrix\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Dump Model" ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: ram://4444bb6e-de2c-4bed-806c-db9d955522ad/assets\n" ] } ], "source": [ "# Dump the best model to a pickle file\n", "with open(\"./model/dp/err_lunge_dp.pkl\", \"wb\") as f:\n", " pickle.dump(final_models[\"3_layers\"], f)" ] }, { "cell_type": "code", "execution_count": 174, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:tensorflow:Assets written to: ram://0f5761b9-5d62-4bf6-8de5-34355293f17a/assets\n", "INFO:tensorflow:Assets written to: ram://ac2add31-fb1f-4baa-b925-718896fea315/assets\n", "INFO:tensorflow:Assets written to: ram://20b6d7c9-7ddf-42a1-aaba-c31e12762a10/assets\n", "INFO:tensorflow:Assets written to: ram://ee8c66ec-0ee3-4a5c-bc03-f12225018c47/assets\n" ] } ], "source": [ "with open(\"./model/dp/all_models.pkl\", \"wb\") as f:\n", " pickle.dump(final_models, f)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.13 (conda)", "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.8.13" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "9260f401923fb5c4108c543a7d176de9733d378b3752e49535ad7c43c2271b65" } } }, "nbformat": 4, "nbformat_minor": 2 }