model-training/POET_Training.ipynb
2025-02-17 00:11:36 +01:00

2017 lines
258 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## General Information"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook is used to train a simple neural network model to predict the chemistry in the barite benchmark (50x50 grid). The training data is stored in the repository using **git large file storage** and can be downloaded after the installation of git lfs using the `git lfs pull` command.\n",
"\n",
"It is then recommended to create a Python environment using miniconda. The necessary dependencies are contained in `environment.yml` and can be installed using `conda env create -f environment.yml`.\n",
"\n",
"The data set is divided into a design and result part and consists of the iterations of a reference simulation. The design part of the data set contains the chemical concentrations at time $t$ and the result part at time $t+1$, which are to be learned by the model."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup Libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Running Keras in version 3.8.0\n"
]
}
],
"source": [
"import keras\n",
"from keras.layers import Dense, Dropout, Input,BatchNormalization\n",
"import tensorflow as tf\n",
"import h5py\n",
"import numpy as np\n",
"import pandas as pd\n",
"import time\n",
"import sklearn.model_selection as sk\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.pipeline import Pipeline, make_pipeline\n",
"from sklearn.preprocessing import StandardScaler, MinMaxScaler\n",
"from imblearn.over_sampling import SMOTE\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"from imblearn.over_sampling import RandomOverSampler\n",
"from collections import Counter\n",
"import os\n",
"from preprocessing import *\n",
"from sklearn import set_config\n",
"from importlib import reload\n",
"set_config(transform_output = \"pandas\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define parameters"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"dtype = \"float32\"\n",
"activation = \"relu\"\n",
"\n",
"lr = 0.001\n",
"batch_size = 512\n",
"epochs = 50 # default 400 epochs\n",
"\n",
"lr_schedule = keras.optimizers.schedules.ExponentialDecay(\n",
" initial_learning_rate=lr,\n",
" decay_steps=2000,\n",
" decay_rate=0.9,\n",
" staircase=True\n",
")\n",
"\n",
"optimizer_simple = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
"optimizer_large = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
"optimizer_paper = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
"\n",
"\n",
"loss = keras.losses.Huber()\n",
"\n",
"sample_fraction = 0.8"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup the model"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,280</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,512</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">9</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,161</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"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",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,280\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9\u001b[0m) │ \u001b[38;5;34m1,161\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">18,953</span> (74.04 KB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m18,953\u001b[0m (74.04 KB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">18,953</span> (74.04 KB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m18,953\u001b[0m (74.04 KB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# small model\n",
"model_simple = keras.Sequential(\n",
" [\n",
" keras.Input(shape = (9,), dtype = \"float32\"),\n",
" keras.layers.Dense(units = 128, activation = \"linear\", dtype = \"float32\"),\n",
" # Dropout(0.2),\n",
" keras.layers.Dense(units = 128, activation = \"elu\", dtype = \"float32\"),\n",
" keras.layers.Dense(units = 9, dtype = \"float32\")\n",
" ]\n",
")\n",
"\n",
"model_simple.compile(optimizer=optimizer_simple, loss = loss)\n",
"model_simple.summary()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_1\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_1\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">5,120</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">525,312</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">524,800</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">9</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">4,617</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"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",
"│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m5,120\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_4 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_5 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m524,800\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_6 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9\u001b[0m) │ \u001b[38;5;34m4,617\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">1,059,849</span> (4.04 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,059,849\u001b[0m (4.04 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">1,059,849</span> (4.04 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,059,849\u001b[0m (4.04 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# large model\n",
"model_large = keras.Sequential(\n",
" [keras.layers.Input(shape=(9,), dtype=dtype),\n",
" keras.layers.Dense(512, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(1024, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(512, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(9, dtype=dtype)\n",
" ])\n",
"\n",
"model_large.compile(optimizer=optimizer_large, loss = loss)\n",
"model_large.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_2\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_2\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense_7 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,664</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_8 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">33,024</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_9 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">131,584</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_10 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">131,328</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_11 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">3,084</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\n"
],
"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",
"│ dense_7 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_8 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m33,024\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_9 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_10 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m131,328\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_11 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m3,084\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">300,684</span> (1.15 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m300,684\u001b[0m (1.15 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">300,684</span> (1.15 MB)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m300,684\u001b[0m (1.15 MB)\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# model from paper\n",
"# (see https://doi.org/10.1007/s11242-022-01779-3 model for the complex chemistry)\n",
"model_paper = keras.Sequential(\n",
" [keras.layers.Input(shape=(12,), dtype=dtype),\n",
" keras.layers.Dense(128, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(256, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(512, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(256, activation='relu', dtype=dtype),\n",
" keras.layers.Dense(12, dtype=dtype)\n",
" ])\n",
"\n",
"model_paper.compile(optimizer=optimizer_paper, loss = loss)\n",
"model_paper.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define transformer functions"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def Safelog(val):\n",
" # get range of vector\n",
" if val > 0:\n",
" return np.log10(val)\n",
" elif val < 0:\n",
" return -np.log10(-val)\n",
" else:\n",
" return 0\n",
"\n",
"def Safeexp(val):\n",
" if val > 0:\n",
" return -10 ** -val\n",
" elif val < 0:\n",
" return 10 ** val\n",
" else:\n",
" return 0"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# ? Why does the charge is using another logarithm than the other species\n",
"\n",
"func_dict_in = {\n",
" \"H\" : np.log1p,\n",
" \"O\" : np.log1p,\n",
" \"Charge\" : Safelog,\n",
" \"H_0_\" : np.log1p,\n",
" \"O_0_\" : np.log1p,\n",
" \"Ba\" : np.log1p,\n",
" \"Cl\" : np.log1p,\n",
" \"S_2_\" : np.log1p,\n",
" \"S_6_\" : np.log1p,\n",
" \"Sr\" : np.log1p,\n",
" \"Barite\" : np.log1p,\n",
" \"Celestite\" : np.log1p,\n",
"}\n",
"\n",
"func_dict_out = {\n",
" \"H\" : np.expm1,\n",
" \"O\" : np.expm1,\n",
" \"Charge\" : Safeexp,\n",
" \"H_0_\" : np.expm1,\n",
" \"O_0_\" : np.expm1,\n",
" \"Ba\" : np.expm1,\n",
" \"Cl\" : np.expm1,\n",
" \"S_2_\" : np.expm1,\n",
" \"S_6_\" : np.expm1,\n",
" \"Sr\" : np.expm1,\n",
" \"Barite\" : np.expm1,\n",
" \"Celestite\" : np.expm1,\n",
"}\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Read data from `.h5` file and convert it to a `pandas.DataFrame`"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# os.chdir('/mnt/beegfs/home/signer/projects/model-training')\n",
"data_file = h5py.File(\"barite_50_4_corner.h5\")\n",
"\n",
"design = data_file[\"design\"]\n",
"results = data_file[\"result\"]\n",
"\n",
"df_design = pd.DataFrame(np.array(design[\"data\"]).transpose(), columns = np.array(design[\"names\"].asstr()))\n",
"df_results = pd.DataFrame(np.array(results[\"data\"]).transpose(), columns = np.array(results[\"names\"].asstr()))\n",
"\n",
"data_file.close()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"species_columns = ['H', 'O', 'Charge', 'Ba', 'Cl', 'S', 'Sr', 'Barite', 'Celestite']"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/hannessigner/miniforge3/envs/ai/lib/python3.12/site-packages/sklearn/base.py:1474: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (2). Possibly due to duplicate points in X.\n",
" return fit_method(estimator, *args, **kwargs)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Amount class 0 before: 0.9521309523809524\n",
"Amount class 1 before: 0.04786904761904762\n"
]
}
],
"source": [
"preprocess = preprocessing(func_dict_in=func_dict_in, func_dict_out=func_dict_out)\n",
"X, y = preprocess.cluster(df_design[species_columns], df_results[species_columns])\n",
"# X, y = preprocess.funcTranform(X, y)\n",
"\n",
"X_train, X_test, y_train, y_test = preprocess.split(X, y, ratio = 0.2)\n",
"X_train, y_train = preprocess.balancer(X_train, y_train, strategy = \"off\")\n",
"preprocess.scale_fit(X_train, y_train, scaling = \"individual\")\n",
"X_train, X_test, y_train, y_test = preprocess.scale_transform(X_train, X_test, y_train, y_test)\n",
"X_train, X_val, y_train, y_val = preprocess.split(X_train, y_train, ratio = 0.1)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.contour.QuadContourSet at 0x377eb5910>"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"timestep=250\n",
"plt.imshow(np.array(X[\"Barite\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower')\n",
"plt.contour(np.array(X[\"Class\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower', colors='red')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preprocess Data\n",
"\n",
"The data are preprocessed in the following way:\n",
"\n",
"1. Label data points in the `design` dataset with `reactive` and `non-reactive` labels using kmeans clustering\n",
"2. Transform `design` and `results` data set into log-scaled data.\n",
"3. Split data into training and test sets.\n",
"4. Learn scaler on training data for `design` and `results` together (option `global`) or individual (option `individual`).\n",
"5. Transform training and test data.\n",
"6. Split training data into training and validation dataset."
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/hannessigner/miniforge3/envs/ai/lib/python3.12/site-packages/sklearn/base.py:1474: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (2). Possibly due to duplicate points in X.\n",
" return fit_method(estimator, *args, **kwargs)\n"
]
},
{
"ename": "KeyError",
"evalue": "'S'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[53], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y \u001b[38;5;241m=\u001b[39m \u001b[43mpreprocessing_training\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf_design\u001b[49m\u001b[43m[\u001b[49m\u001b[43mspecies_columns\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdf_results\u001b[49m\u001b[43m[\u001b[49m\u001b[43mspecies_columns\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunc_dict_in\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunc_dict_out\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43moff\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mglobal\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.1\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/Documents/Work/model-training/preprocessing.py:161\u001b[0m, in \u001b[0;36mpreprocessing_training\u001b[0;34m(df_design, df_targets, func_dict_in, func_dict_out, sampling, scaling, test_size)\u001b[0m\n\u001b[1;32m 158\u001b[0m df_design \u001b[38;5;241m=\u001b[39m clustering(df_design)\n\u001b[1;32m 159\u001b[0m df_targets \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat([df_targets, df_design[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m'\u001b[39m]], axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m--> 161\u001b[0m df_design_log \u001b[38;5;241m=\u001b[39m \u001b[43mFuncTransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc_dict_in\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunc_dict_out\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf_design\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 162\u001b[0m df_results_log \u001b[38;5;241m=\u001b[39m FuncTransform(func_dict_in, func_dict_out)\u001b[38;5;241m.\u001b[39mfit_transform(df_targets)\n\u001b[1;32m 164\u001b[0m X_train, X_test, y_train, y_test \u001b[38;5;241m=\u001b[39m sk\u001b[38;5;241m.\u001b[39mtrain_test_split(df_design_log, df_results_log, test_size \u001b[38;5;241m=\u001b[39m test_size, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m)\n",
"File \u001b[0;32m~/Documents/Work/model-training/preprocessing.py:63\u001b[0m, in \u001b[0;36mFuncTransform.fit_transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mfit_transform\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X)\n\u001b[0;32m---> 63\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/Documents/Work/model-training/preprocessing.py:58\u001b[0m, in \u001b[0;36mFuncTransform.transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m X\u001b[38;5;241m.\u001b[39mkeys(): \n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m key:\n\u001b[0;32m---> 58\u001b[0m X[key] \u001b[38;5;241m=\u001b[39m X[key]\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunc_transform\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m X\n",
"\u001b[0;31mKeyError\u001b[0m: 'S'"
]
}
],
"source": [
"X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y = preprocessing_training(df_design[species_columns], df_results[species_columns], func_dict_in, func_dict_out, \"off\", 'global', 0.1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([5.88371754e-02, 2.38285692e-01, 1.25266821e-01, 4.02648011e-05,\n",
" 5.71730222e-02, 2.38302374e-01, 9.25432038e-02, 3.77910581e-07,\n",
" 9.99694424e-01])"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train.iloc[12, :-1].values"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1.11012434e+02, 5.55068087e+01, 3.55966726e-08, 3.89751302e-06,\n",
" 1.12795836e-02, 1.47982437e-04, 5.78389634e-03, 9.99927111e-04,\n",
" 1.00047941e+00]])"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"preprocess.scaler_X.inverse_transform(tf.keras.backend.constant(X_train.iloc[12, :-1].values.reshape(1, -1)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Custom Loss function"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"column_dict = {\"Ba\": X.columns.get_loc(\"Ba\"), \"Barite\":X.columns.get_loc(\"Barite\"), \"Sr\":X.columns.get_loc(\"Sr\"), \"Celestite\":X.columns.get_loc(\"Celestite\"), \"H\":X.columns.get_loc(\"H\"), \"H\":X.columns.get_loc(\"H\"), \"O\":X.columns.get_loc(\"O\")}"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def custom_loss(preprocess, column_dict, h1, h2, h3, h4):\n",
" # extract the scaling parameters\n",
" scale_X = tf.convert_to_tensor(preprocess.scaler_X.scale_, dtype=tf.float32)\n",
" min_X = tf.convert_to_tensor(preprocess.scaler_X.min_, dtype=tf.float32)\n",
" scale_y = tf.convert_to_tensor(preprocess.scaler_y.scale_, dtype=tf.float32)\n",
" min_y = tf.convert_to_tensor(preprocess.scaler_y.min_, dtype=tf.float32)\n",
"\n",
" def loss(results, predicted):\n",
" # inverse min/max scaling\n",
" predicted_inverse = predicted * scale_X + min_X\n",
" results_inverse = results * scale_y + min_y\n",
"\n",
" # mass balance\n",
" dBa = tf.keras.backend.abs(\n",
" (predicted_inverse[:, column_dict[\"Ba\"]] + predicted_inverse[:, column_dict[\"Barite\"]]) -\n",
" (results_inverse[:, column_dict[\"Ba\"]] + results_inverse[:, column_dict[\"Barite\"]])\n",
" )\n",
" dSr = tf.keras.backend.abs(\n",
" (predicted_inverse[:, column_dict[\"Sr\"]] + predicted_inverse[:, column_dict[\"Celestite\"]]) -\n",
" (results_inverse[:, column_dict[\"Sr\"]] + results_inverse[:, column_dict[\"Celestite\"]])\n",
" )\n",
" \n",
" # H/O ratio has to be 2\n",
" h2o_ratio = tf.keras.backend.abs(\n",
" (predicted_inverse[:, column_dict[\"H\"]] / predicted_inverse[:, column_dict[\"O\"]]) - 2\n",
" )\n",
"\n",
" # huber loss\n",
" huber_loss = tf.keras.losses.Huber()(results, predicted)\n",
" \n",
" # total loss\n",
" total_loss = h1 * huber_loss + h2 * dBa**2 + h3 * dSr**2 + h4 * h2o_ratio**2\n",
"\n",
" return total_loss\n",
"\n",
" return loss"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"model_simple.compile(optimizer=optimizer_simple, loss=custom_loss(preprocess, column_dict, 1, 1, 1, 1))#custom_loss(preprocess, column_dict))\n",
"# model_large.compile(optimizer=optimizer_large, loss=custom_loss(preprocess, column_dict))#custom_loss(preprocess, column_dict))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train the model"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# measure time\n",
"def model_training(model):\n",
" start = time.time()\n",
" callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n",
" history = model.fit(X_train.loc[:, X_train.columns != \"Class\"], \n",
" y_train.loc[:, y_train.columns != \"Class\"], \n",
" batch_size=batch_size, \n",
" epochs=50, \n",
" validation_data=(X_val.loc[:, X_val.columns != \"Class\"], y_val.loc[:, y_val.columns != \"Class\"]),\n",
" callbacks=[callback])\n",
" \n",
"\n",
" end = time.time()\n",
"\n",
" print(\"Training took {} seconds\".format(end - start))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.6440 - val_loss: 0.5460\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.2363 - val_loss: 0.1153\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.1663 - val_loss: 0.1348\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.1211 - val_loss: 0.1081\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0994 - val_loss: 0.0932\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0824 - val_loss: 0.0344\n",
"Epoch 7/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0787 - val_loss: 0.0577\n",
"Epoch 8/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0704 - val_loss: 0.0882\n",
"Epoch 9/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0672 - val_loss: 0.0456\n",
"Epoch 10/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0543 - val_loss: 0.0487\n",
"Epoch 11/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 0.0548 - val_loss: 0.0402\n",
"Epoch 12/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0484 - val_loss: 0.0576\n",
"Epoch 13/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0487 - val_loss: 0.0234\n",
"Epoch 14/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0499 - val_loss: 0.0357\n",
"Epoch 15/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0406 - val_loss: 0.0262\n",
"Epoch 16/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0388 - val_loss: 0.0258\n",
"Epoch 17/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0312 - val_loss: 0.0369\n",
"Epoch 18/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0340 - val_loss: 0.0571\n",
"Epoch 19/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 0.0349 - val_loss: 0.0306\n",
"Epoch 20/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0276 - val_loss: 0.0579\n",
"Epoch 21/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0255 - val_loss: 0.0264\n",
"Epoch 22/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 0.0233 - val_loss: 0.0334\n",
"Epoch 23/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0232 - val_loss: 0.0155\n",
"Epoch 24/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0230 - val_loss: 0.0194\n",
"Epoch 25/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0232 - val_loss: 0.0099\n",
"Epoch 26/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0195 - val_loss: 0.0136\n",
"Epoch 27/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0199 - val_loss: 0.0166\n",
"Epoch 28/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0185 - val_loss: 0.0133\n",
"Epoch 29/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0174 - val_loss: 0.0094\n",
"Epoch 30/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0170 - val_loss: 0.0148\n",
"Epoch 31/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0141 - val_loss: 0.0132\n",
"Epoch 32/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0161 - val_loss: 0.0078\n",
"Epoch 33/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0158 - val_loss: 0.0279\n",
"Epoch 34/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0152 - val_loss: 0.0106\n",
"Epoch 35/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0132 - val_loss: 0.0190\n",
"Epoch 36/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0140 - val_loss: 0.0184\n",
"Epoch 37/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0116 - val_loss: 0.0092\n",
"Epoch 38/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0106 - val_loss: 0.0178\n",
"Epoch 39/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0113 - val_loss: 0.0113\n",
"Epoch 40/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0094 - val_loss: 0.0090\n",
"Epoch 41/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0093 - val_loss: 0.0097\n",
"Epoch 42/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0092 - val_loss: 0.0081\n",
"Epoch 43/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0085 - val_loss: 0.0093\n",
"Epoch 44/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0083 - val_loss: 0.0082\n",
"Epoch 45/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0091 - val_loss: 0.0135\n",
"Epoch 46/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0081 - val_loss: 0.0065\n",
"Epoch 47/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0076 - val_loss: 0.0100\n",
"Epoch 48/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0091 - val_loss: 0.0064\n",
"Epoch 49/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 0.0079 - val_loss: 0.0070\n",
"Training took 79.01837086677551 seconds\n"
]
}
],
"source": [
"model_training(model_simple)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test Mass Balance"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def mass_balance(model, X, preprocess):\n",
" \n",
" # predict the chemistry\n",
" columns = X.iloc[:, X.columns != \"Class\"].columns\n",
" prediction = pd.DataFrame(model.predict(X[columns]), columns=columns)\n",
" # backtransform min/max\n",
" X = pd.DataFrame(preprocess.scaler_X.inverse_transform(X.iloc[:, X.columns != \"Class\"]), columns=columns)\n",
" prediction = pd.DataFrame(preprocess.scaler_y.inverse_transform(prediction), columns=columns)\n",
" \n",
" # backtransform log\n",
" if(preprocess.state['log'] == True):\n",
" X, prediction = preprocess.funcInverse(X, prediction)\n",
" \n",
" # calculate mass balance\n",
" dBa = np.abs((prediction[\"Ba\"] + prediction[\"Barite\"]) - (X[\"Ba\"] + X[\"Barite\"]))\n",
" dSr = np.abs((prediction[\"Sr\"] + prediction[\"Celestite\"]) - (X[\"Sr\"] + X[\"Celestite\"]))\n",
" \n",
" return dBa + dSr"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 311us/step\n"
]
}
],
"source": [
"mass_balance_results = mass_balance(model_simple, X_test, preprocess)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(mass_balance_results[mass_balance_results < 1e-2]) / len(mass_balance_results)"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Series([], dtype: float64)"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mass_balance_results[mass_balance_results < 1e-5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optimizing with Optuna"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"import optuna\n",
"\n",
"def create_model(model, preprocess, h1, h2, h3, h4):\n",
" \n",
" model.compile(optimizer=optimizer_simple, loss=custom_loss(preprocess, column_dict, h1, h2, h3, h4))\n",
" \n",
" return model\n",
"\n",
"\n",
"def objective(trial, preprocess, X_train, y_train, X_val, y_val, X_test, y_test):\n",
" h1 = trial.suggest_float(\"h1\", 0.1, 100)\n",
" h2 = trial.suggest_float(\"h2\", 0.1, 100)\n",
" h3 = trial.suggest_float(\"h3\", 0.1, 100)\n",
" h4 = trial.suggest_float(\"h4\", 0.1, 100)\n",
" \n",
" model = create_model(model_simple, preprocess, h1, h2, h3, h4)\n",
" \n",
" callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n",
" history = model.fit(X_train.loc[:, X_train.columns != \"Class\"], \n",
" y_train.loc[:, y_train.columns != \"Class\"], \n",
" batch_size=batch_size, \n",
" epochs=50, \n",
" validation_data=(X_val.loc[:, X_val.columns != \"Class\"], y_val.loc[:, y_val.columns != \"Class\"]),\n",
" callbacks=[callback])\n",
" \n",
" mass_balance_results = mass_balance(model, X_test, preprocess)\n",
" \n",
" loss = len(mass_balance_results[mass_balance_results < 1e-5]) / len(mass_balance_results)\n",
"\n",
" return loss"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[I 2025-02-17 00:06:24,572] A new study created in memory with name: no-name-585ded5e-6499-4f70-9577-49339316366a\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12377019392.0000 - val_loss: 43404600.0000\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 36439708.0000 - val_loss: 19609912.0000\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 15841922.0000 - val_loss: 7256873.5000\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 5500834.0000 - val_loss: 1881962.5000\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1413300.5000 - val_loss: 617048.8125\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 496590.9375 - val_loss: 194345.2812\n",
"Epoch 7/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 139668.2969 - val_loss: 31873.9043\n",
"Epoch 8/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 21170.1543 - val_loss: 4920.2520\n",
"Epoch 9/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 4156.0869 - val_loss: 3427.2729\n",
"Epoch 10/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3414.1331 - val_loss: 3416.1082\n",
"Epoch 11/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3416.9729 - val_loss: 3429.7239\n",
"Epoch 12/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3412.4482 - val_loss: 3435.3306\n",
"Epoch 13/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3425.5073 - val_loss: 3403.7925\n",
"Epoch 14/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 3425.9592 - val_loss: 3423.5193\n",
"\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 296us/step\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[I 2025-02-17 00:06:49,285] Trial 0 finished with value: 0.0 and parameters: {'h1': 72.40785703177082, 'h2': 25.825548427085515, 'h3': 61.927211067692724, 'h4': 19.232336897801325}. Best is trial 0 with value: 0.0.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2791.0564 - val_loss: 2618.3965\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2622.5496 - val_loss: 2616.2480\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2620.7339 - val_loss: 2631.9077\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2650.9636 - val_loss: 2814.0315\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2722.9919 - val_loss: 2598.4248\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2778.1111 - val_loss: 2559.9062\n",
"\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 291us/step\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[I 2025-02-17 00:07:00,296] Trial 1 finished with value: 0.0 and parameters: {'h1': 55.156241799815355, 'h2': 78.4033434954878, 'h3': 95.18824024469184, 'h4': 14.82240562501995}. Best is trial 0 with value: 0.0.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 7852.1719 - val_loss: 2412.7383\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2426.0986 - val_loss: 2597.7363\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2473.9902 - val_loss: 2277.7488\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2471.1829 - val_loss: 2443.7427\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2402.8818 - val_loss: 2218.1780\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2367.2834 - val_loss: 2218.3396\n",
"Epoch 7/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2340.9314 - val_loss: 2119.3755\n",
"Epoch 8/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 2219.4814 - val_loss: 2298.2070\n",
"Epoch 9/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2155.6299 - val_loss: 2612.8733\n",
"Epoch 10/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2100.1267 - val_loss: 2046.4711\n",
"Epoch 11/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 2001.3557 - val_loss: 2211.9299\n",
"Epoch 12/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1971.5155 - val_loss: 1997.1703\n",
"Epoch 13/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1947.2655 - val_loss: 1892.0009\n",
"Epoch 14/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1915.1980 - val_loss: 1860.9949\n",
"Epoch 15/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1882.3663 - val_loss: 1861.6248\n",
"Epoch 16/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1869.7008 - val_loss: 1896.9276\n",
"Epoch 17/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1883.5923 - val_loss: 1915.4973\n",
"Epoch 18/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1871.5115 - val_loss: 1837.4102\n",
"Epoch 19/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1877.5151 - val_loss: 1879.3440\n",
"Epoch 20/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1862.3589 - val_loss: 1957.3567\n",
"Epoch 21/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1845.3960 - val_loss: 1814.5060\n",
"Epoch 22/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1835.3391 - val_loss: 1809.6317\n",
"Epoch 23/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1838.9376 - val_loss: 1833.8245\n",
"Epoch 24/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1831.4557 - val_loss: 1886.3599\n",
"Epoch 25/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1833.6478 - val_loss: 1800.0344\n",
"Epoch 26/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1833.5480 - val_loss: 1797.0282\n",
"Epoch 27/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1819.1056 - val_loss: 1794.1648\n",
"Epoch 28/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1812.3524 - val_loss: 1881.1871\n",
"Epoch 29/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1805.2583 - val_loss: 1802.8263\n",
"Epoch 30/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1808.2974 - val_loss: 1777.7633\n",
"Epoch 31/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1792.2367 - val_loss: 1791.2937\n",
"Epoch 32/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1789.2295 - val_loss: 1778.8715\n",
"Epoch 33/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1772.3083 - val_loss: 1778.3553\n",
"Epoch 34/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1781.2627 - val_loss: 1760.8132\n",
"Epoch 35/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1783.0363 - val_loss: 1763.7234\n",
"Epoch 36/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1765.7679 - val_loss: 1752.7267\n",
"Epoch 37/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1761.1954 - val_loss: 1762.8220\n",
"Epoch 38/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1762.9722 - val_loss: 1747.1544\n",
"Epoch 39/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1753.7981 - val_loss: 1763.1051\n",
"Epoch 40/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1752.4087 - val_loss: 1739.5280\n",
"Epoch 41/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1748.3682 - val_loss: 1728.5411\n",
"Epoch 42/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1739.5088 - val_loss: 1729.1458\n",
"Epoch 43/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1736.5480 - val_loss: 1724.7151\n",
"Epoch 44/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1740.2578 - val_loss: 1734.8917\n",
"Epoch 45/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1730.3800 - val_loss: 1736.1029\n",
"Epoch 46/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1714.5963 - val_loss: 1715.0453\n",
"Epoch 47/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1717.4546 - val_loss: 1771.3018\n",
"Epoch 48/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1712.6161 - val_loss: 1711.4847\n",
"Epoch 49/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 1702.8785 - val_loss: 1712.8119\n",
"Epoch 50/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1711.1716 - val_loss: 1700.8627\n",
"\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 296us/step\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[I 2025-02-17 00:08:19,362] Trial 2 finished with value: 0.0 and parameters: {'h1': 32.18807766864932, 'h2': 32.38115474529778, 'h3': 82.71542742505292, 'h4': 21.39993663591346}. Best is trial 0 with value: 0.0.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1814.5203 - val_loss: 1661.1248\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1621.0743 - val_loss: 1503.6709\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1466.0696 - val_loss: 1357.3704\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1319.6273 - val_loss: 1204.6761\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1164.8816 - val_loss: 1049.8190\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 1012.0715 - val_loss: 900.6155\n",
"Epoch 7/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 866.8824 - val_loss: 782.1039\n",
"Epoch 8/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 765.9833 - val_loss: 752.7275\n",
"Epoch 9/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.8401 - val_loss: 751.8625\n",
"Epoch 10/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.4477 - val_loss: 755.2651\n",
"Epoch 11/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.4553 - val_loss: 750.9076\n",
"Epoch 12/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 752.6575 - val_loss: 751.2373\n",
"Epoch 13/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 2ms/step - loss: 751.5120 - val_loss: 750.2513\n",
"Epoch 14/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 750.1327 - val_loss: 749.1887\n",
"Epoch 15/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 750.2402 - val_loss: 748.8613\n",
"Epoch 16/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 751.2623 - val_loss: 748.6445\n",
"Epoch 17/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 750.6178 - val_loss: 748.5185\n",
"Epoch 18/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 749.1051 - val_loss: 748.1081\n",
"Epoch 19/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 749.3755 - val_loss: 747.6932\n",
"Epoch 20/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 748.1135 - val_loss: 747.2830\n",
"Epoch 21/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.3423 - val_loss: 747.2092\n",
"Epoch 22/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.1829 - val_loss: 747.7263\n",
"Epoch 23/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.6171 - val_loss: 746.8931\n",
"Epoch 24/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.1934 - val_loss: 746.4072\n",
"Epoch 25/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.4377 - val_loss: 746.0536\n",
"Epoch 26/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 747.3806 - val_loss: 745.7092\n",
"Epoch 27/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.1663 - val_loss: 745.9564\n",
"Epoch 28/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.9430 - val_loss: 745.2064\n",
"Epoch 29/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.6080 - val_loss: 745.0362\n",
"Epoch 30/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.1031 - val_loss: 745.5790\n",
"Epoch 31/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.9517 - val_loss: 746.2484\n",
"Epoch 32/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.3198 - val_loss: 744.7700\n",
"Epoch 33/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 746.6561 - val_loss: 744.3752\n",
"Epoch 34/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.4594 - val_loss: 744.5372\n",
"Epoch 35/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.4088 - val_loss: 744.5147\n",
"Epoch 36/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 745.0701 - val_loss: 743.8632\n",
"Epoch 37/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.1857 - val_loss: 744.3721\n",
"Epoch 38/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.1999 - val_loss: 743.6331\n",
"Epoch 39/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.2258 - val_loss: 743.9576\n",
"Epoch 40/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.8534 - val_loss: 743.3392\n",
"Epoch 41/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 744.1964 - val_loss: 743.3118\n",
"Epoch 42/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.2463 - val_loss: 744.1565\n",
"Epoch 43/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.7304 - val_loss: 742.9604\n",
"Epoch 44/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 742.8326 - val_loss: 743.0219\n",
"Epoch 45/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.7935 - val_loss: 742.7424\n",
"Epoch 46/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 742.9843 - val_loss: 742.6505\n",
"Epoch 47/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 741.9490 - val_loss: 742.4158\n",
"Epoch 48/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 741.9554 - val_loss: 742.6078\n",
"Epoch 49/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.1502 - val_loss: 742.2740\n",
"Epoch 50/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 743.5102 - val_loss: 742.0992\n",
"\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 290us/step\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[I 2025-02-17 00:09:41,637] Trial 3 finished with value: 0.0 and parameters: {'h1': 51.147323536824445, 'h2': 56.78563118722674, 'h3': 31.302312703064025, 'h4': 0.2323539329544047}. Best is trial 0 with value: 0.0.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 27736.6758 - val_loss: 25335.9141\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 24856.6797 - val_loss: 23624.0430\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 23591.7324 - val_loss: 22455.3379\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 22087.6445 - val_loss: 21249.2285\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 21055.1582 - val_loss: 20346.3613\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 20397.3496 - val_loss: 19634.5000\n",
"Epoch 7/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 19168.5645 - val_loss: 18746.1426\n",
"Epoch 8/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 18433.6738 - val_loss: 18086.1094\n",
"Epoch 9/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 17888.7070 - val_loss: 17506.1172\n",
"Epoch 10/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 17398.0664 - val_loss: 16952.9180\n",
"Epoch 11/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 16835.0117 - val_loss: 16448.4297\n",
"Epoch 12/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 16369.1172 - val_loss: 15983.9541\n",
"Epoch 13/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 15914.9648 - val_loss: 15574.0117\n",
"Epoch 14/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 15417.1514 - val_loss: 15182.9922\n",
"Epoch 15/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14972.8398 - val_loss: 14841.6963\n",
"Epoch 16/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14821.4219 - val_loss: 14586.0078\n",
"Epoch 17/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14475.7656 - val_loss: 14208.0049\n",
"Epoch 18/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14218.5225 - val_loss: 13965.6191\n",
"Epoch 19/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 14080.0352 - val_loss: 13686.0967\n",
"Epoch 20/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13640.7412 - val_loss: 13432.9609\n",
"Epoch 21/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13297.7139 - val_loss: 13222.0645\n",
"Epoch 22/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13205.2559 - val_loss: 13020.1660\n",
"Epoch 23/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 13046.4668 - val_loss: 12839.4688\n",
"Epoch 24/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12915.7373 - val_loss: 12695.6348\n",
"Epoch 25/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12565.1816 - val_loss: 12489.5596\n",
"Epoch 26/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12385.2871 - val_loss: 12334.8535\n",
"Epoch 27/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12441.1230 - val_loss: 12193.6494\n",
"Epoch 28/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12110.5723 - val_loss: 12051.1250\n",
"Epoch 29/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 12140.8193 - val_loss: 11922.8623\n",
"Epoch 30/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11870.8330 - val_loss: 11813.3994\n",
"Epoch 31/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11781.4502 - val_loss: 11694.6562\n",
"Epoch 32/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11774.9316 - val_loss: 11599.8086\n",
"Epoch 33/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11517.6182 - val_loss: 11493.0459\n",
"Epoch 34/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11443.8252 - val_loss: 11402.4766\n",
"Epoch 35/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11502.7910 - val_loss: 11311.7754\n",
"Epoch 36/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11410.6387 - val_loss: 11226.0420\n",
"Epoch 37/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11144.2510 - val_loss: 11152.2734\n",
"Epoch 38/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10994.5703 - val_loss: 11074.9717\n",
"Epoch 39/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11061.8809 - val_loss: 11009.4912\n",
"Epoch 40/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10965.7441 - val_loss: 10939.0264\n",
"Epoch 41/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 11017.5010 - val_loss: 10882.1914\n",
"Epoch 42/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10908.1650 - val_loss: 10822.1357\n",
"Epoch 43/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10795.5361 - val_loss: 10765.4912\n",
"Epoch 44/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10588.0283 - val_loss: 10712.4141\n",
"Epoch 45/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10675.9863 - val_loss: 10659.5850\n",
"Epoch 46/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10741.0137 - val_loss: 10615.9727\n",
"Epoch 47/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10552.5371 - val_loss: 10568.0938\n",
"Epoch 48/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10671.9209 - val_loss: 10526.0469\n",
"Epoch 49/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10479.7158 - val_loss: 10484.8340\n",
"Epoch 50/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 10387.6152 - val_loss: 10451.1416\n",
"\u001b[1m3938/3938\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 313us/step\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[I 2025-02-17 00:11:09,995] Trial 4 finished with value: 0.0 and parameters: {'h1': 61.30953008699103, 'h2': 93.9200835460014, 'h3': 57.8376987539652, 'h4': 82.3346527788174}. Best is trial 0 with value: 0.0.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8271.6963 - val_loss: 8311.1768\n",
"Epoch 2/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8371.5420 - val_loss: 8275.3896\n",
"Epoch 3/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8377.3896 - val_loss: 8246.3291\n",
"Epoch 4/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8375.9121 - val_loss: 8216.7363\n",
"Epoch 5/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8269.5869 - val_loss: 8189.8159\n",
"Epoch 6/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8172.8184 - val_loss: 8167.1416\n",
"Epoch 7/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8084.1265 - val_loss: 8137.8125\n",
"Epoch 8/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8089.8613 - val_loss: 8119.4287\n",
"Epoch 9/50\n",
"\u001b[1m886/886\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2ms/step - loss: 8135.9199 - val_loss: 8094.7837\n",
"Epoch 10/50\n",
"\u001b[1m610/886\u001b[0m \u001b[32m━━━━━━━━━━━━━\u001b[0m\u001b[37m━━━━━━━\u001b[0m \u001b[1m0s\u001b[0m 2ms/step - loss: 8253.8984"
]
}
],
"source": [
"study = optuna.create_study(direction=\"maximize\")\n",
"study.optimize(lambda trial: objective(trial, preprocess, X_train, y_train, X_val, y_val, X_test, y_test), n_trials=100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Percentage of cells that pass the mass balance condition\n",
"\n",
"small_modell_20_epochs = 0.0031088911088911087\n",
"\n",
"large_modell_20_epochs = 0.022793206793206792"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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EREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDbjkWLVqE4OBgqNVqtGnTBnv27Cm3/OrVq9GiRQvY29vDx8cHo0aNQnp6ehXVloiIiIgABlyT1q5di4kTJ2LKlCmIj49H586d0a9fPyQmJhotv3fvXkRERGDMmDE4ceIEfvzxR8TFxeG5556r4poTERERPdwYcE2YN28exowZg+eeew4hISGYP38+AgICsHjxYqPlDx48iKCgIEyYMAHBwcHo1KkTXnjhBRw+fLiKa05ERET0cGPANaKoqAhHjhxBeHi4wfDw8HDs37/f6DhhYWG4dOkSYmJiIITA1atX8dNPP2HAgAFVUWUiIiIiuokB14i0tDRotVp4eXkZDPfy8kJKSorRccLCwrB69WoMGzYMSqUS3t7ecHFxwaeffmpyPoWFhcjOzjZ4EBEREdH9YcAth0KhMHgthCgzTO/kyZOYMGECpk6diiNHjmDz5s24cOECoqKiTE4/Ojoazs7O0iMgIKBS609ERET0MFIIIYSlK1HdFBUVwd7eHj/++CMef/xxafgrr7yCo0ePYteuXWXGGTFiBAoKCvDjjz9Kw/bu3YvOnTvjypUr8PHxKTNOYWEhCgsLpdfZ2dkICAhAVlYWnJycKvlTERER0YOQnZ0NZ2dn7r+rER7BNUKpVKJNmzaIjY01GB4bG4uwsDCj4+Tn58PKyrA5ra2tAZQe+TVGpVLBycnJ4EFERERE94cB14RJkybhq6++wvLly3Hq1Cm8+uqrSExMlLocTJ48GREREVL5QYMGYd26dVi8eDHOnz+Pffv2YcKECXjkkUfg6+trqY9BRERE9NCxsXQFqqthw4YhPT0dM2fORHJyMpo2bYqYmBgEBgYCAJKTkw2uiRsZGYmcnBx89tlneO211+Di4oIePXpg9uzZlvoI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cPnyZXzzzTewsrJC06ZNDcb39PSEWq0uM5yIiIiIHiwGXBOGDRuG9PR0zJw5E8nJyWjatCliYmIQGBgIAEhOTr7rNXGJiIiIqOrxOrjVCK+jR0REVPNw/139sA8uEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgNuORYtWoTg4GCo1Wq0adMGe/bsMVl23bp16N27Nzw8PODk5IQOHTrgjz/+qMLaEhERERHAgGvS2rVrMXHiREyZMgXx8fHo3Lkz+vXrh8TERKPld+/ejd69eyMmJgZHjhxB9+7dMWjQIMTHx1dxzYmIiIgebgohhLB0Jaqjdu3aoXXr1li8eLE0LCQkBIMHD0Z0dLRZ02jSpAmGDRuGqVOnmlU+Ozsbzs7OyMrKgpOT0z3Vm4iIiKoW99/VD4/gGlFUVIQjR44gPDzcYHh4eDj2799v1jR0Oh1ycnLg6upqskxhYSGys7MNHkRERER0fxhwjUhLS4NWq4WXl5fBcC8vL6SkpJg1jY8//hh5eXkYOnSoyTLR0dFwdnaWHgEBAfdVbyIiIiJiwC2XQqEweC2EKDPMmDVr1mD69OlYu3YtPD09TZabPHkysrKypEdSUtJ915mIiIjoYWdj6QpUR+7u7rC2ti5ztDY1NbXMUd07rV27FmPGjMGPP/6IXr16lVtWpVJBpVLdd32JiIiI6BYewTVCqVSiTZs2iI2NNRgeGxuLsLAwk+OtWbMGkZGR+O677zBgwIAHXU0iIiIiMoJHcE2YNGkSRowYgdDQUHTo0AFffPEFEhMTERUVBaC0e8Hly5fxzTffACgNtxEREViwYAHat28vHf21s7ODs7OzxT4HERER0cOGAdeEYcOGIT09HTNnzkRycjKaNm2KmJgYBAYGAgCSk5MNrom7dOlSlJSU4KWXXsJLL70kDR85ciRWrlxZ1dUnIiIiemjxOrjVCK+jR0REVPNw/139sA8uEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgMuEREREckKAy4RERERyQoDLhERERHJCgNuORYtWoTg4GCo1Wq0adMGe/bsKbf8rl270KZNG6jVatSpUwdLliypopoSERERkR4Drglr167FxIkTMWXKFMTHx6Nz587o168fEhMTjZa/cOEC+vfvj86dOyM+Ph5vv/02JkyYgJ9//rmKa05ERET0cFMIIYSlK1EdtWvXDq1bt8bixYulYSEhIRg8eDCio6PLlP/f//6HDRs24NSpU9KwqKgoHDt2DAcOHDBrntnZ2XB2dkbWlStwcnIqW8DaGlCrb73OyzM9MSsrwM7u3srm5wOmFguFArC3v7eyN24AOp3pemg091a2oADQaiunrL19ab0BoLAQKCmpnLJ2dqXtDABFRUBxceWUVatLl4uKli0uLi1vikoF2NhUvGxJSWlbmKJUAra2FS+r1ZZ+d6bY2paWr2hZna50WauMsjY2pW0BlK4T+fmVU7Yi6z23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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"species = \"Ba\"\n",
"iterations = 250\n",
"cell_offset = 11\n",
"y_design = []\n",
"y_results = []\n",
"y_differences = []\n",
"\n",
"# if(preprocess.state['log'] == True):\n",
"# df_design_transformed, df_results_transformed = preprocess.funcTranform(df_design[species_columns], df_results[species_columns])\n",
"\n",
"df_design_transformed_scaled = preprocess.scaler_X.transform(df_design[species_columns])\n",
"df_results_transformed_scaled = preprocess.scaler_y.transform(df_results[species_columns])\n",
"\n",
"for i in range(0,iterations):\n",
" idx = i*50*50 + cell_offset-1\n",
" y_design.append(df_design_transformed_scaled.iloc[idx, :])\n",
" y_results.append(df_results_transformed_scaled.iloc[idx,:])\n",
" \n",
"y_design = pd.DataFrame(y_design)\n",
"y_results = pd.DataFrame(y_results)\n",
"\n",
"prediction = model_simple.predict(y_design.iloc[:, y_design.columns != \"Class\"])\n",
"prediction = pd.DataFrame(prediction, columns = y_results.columns)\n",
"\n",
"# y_results_back, prediction = preprocess.funcInverse(y_results, prediction)\n",
"\n",
"y_results_back = pd.DataFrame(preprocess.scaler_y.inverse_transform(y_results), columns = species_columns)\n",
"prediction_back = pd.DataFrame(preprocess.scaler_X.inverse_transform(prediction), columns = species_columns)\n",
"\n",
"\n",
"plt.plot(np.arange(0,iterations), y_results_back[species], label = \"Results\")\n",
"plt.plot(np.arange(0,iterations), prediction_back[species], label = \"Prediction\")\n",
"plt.legend()\n",
"plt.xlabel('Iteration')\n",
"plt.ylabel(species)\n",
"plt.title(species+' Concentration over Iterations in cell ' + str(cell_offset))\n",
"plt.legend()\n",
"plt.show()\n",
"\n",
"\n",
"mass_balance = np.abs((prediction_back[\"Ba\"] + prediction_back[\"Barite\"]) - (y_results_back[\"Ba\"] + y_results_back[\"Barite\"])) \\\n",
" + np.abs((prediction_back[\"Sr\"] + prediction_back[\"Celestite\"]) - (y_results_back[\"Sr\"] + y_results_back[\"Celestite\"]))\n",
"plt.plot(np.arange(0,iterations), mass_balance, label = \"Results\")\n",
"plt.xlabel('Iteration')\n",
"plt.ylabel(species)\n",
"plt.title(species+' Absolute Differences between predictions and true values Iterations in cell ' + str(cell_offset))\n",
"plt.axhline(y=1e-5, color='r', linestyle='--', label='Threshold 1e-5')\n",
"plt.legend()\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>H</th>\n",
" <th>O</th>\n",
" <th>Charge</th>\n",
" <th>Ba</th>\n",
" <th>Cl</th>\n",
" <th>S_6_</th>\n",
" <th>Sr</th>\n",
" <th>Barite</th>\n",
" <th>Celestite</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>111.012434</td>\n",
" <td>55.510420</td>\n",
" <td>-5.285676e-07</td>\n",
" <td>4.536952e-07</td>\n",
" <td>0.000022</td>\n",
" <td>1.050707e-03</td>\n",
" <td>0.000625</td>\n",
" <td>0.001010</td>\n",
" <td>1.717461</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>111.012434</td>\n",
" <td>55.507697</td>\n",
" <td>-5.292985e-07</td>\n",
" <td>1.091671e-06</td>\n",
" <td>0.002399</td>\n",
" <td>3.700427e-04</td>\n",
" <td>0.001488</td>\n",
" <td>0.001738</td>\n",
" <td>1.716139</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>111.012434</td>\n",
" <td>55.506335</td>\n",
" <td>-5.311407e-07</td>\n",
" <td>6.816584e-05</td>\n",
" <td>0.008922</td>\n",
" <td>2.946349e-05</td>\n",
" <td>0.004445</td>\n",
" <td>0.004898</td>\n",
" <td>1.708478</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>111.012434</td>\n",
" <td>55.506229</td>\n",
" <td>-5.326179e-07</td>\n",
" <td>1.435037e-03</td>\n",
" <td>0.017414</td>\n",
" <td>3.035681e-06</td>\n",
" <td>0.007281</td>\n",
" <td>0.008778</td>\n",
" <td>1.698481</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>111.012434</td>\n",
" <td>55.506224</td>\n",
" <td>-5.354202e-07</td>\n",
" <td>3.264876e-03</td>\n",
" <td>0.026235</td>\n",
" <td>1.872898e-06</td>\n",
" <td>0.009764</td>\n",
" <td>0.012641</td>\n",
" <td>1.688408</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>995</th>\n",
" <td>111.012434</td>\n",
" <td>55.506217</td>\n",
" <td>-5.369526e-07</td>\n",
" <td>6.381593e-02</td>\n",
" <td>0.223770</td>\n",
" <td>1.220403e-07</td>\n",
" <td>0.032096</td>\n",
" <td>1.714723</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>996</th>\n",
" <td>111.012434</td>\n",
" <td>55.506217</td>\n",
" <td>-5.370535e-07</td>\n",
" <td>6.386712e-02</td>\n",
" <td>0.223789</td>\n",
" <td>1.220029e-07</td>\n",
" <td>0.032055</td>\n",
" <td>1.714723</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>997</th>\n",
" <td>111.012434</td>\n",
" <td>55.506217</td>\n",
" <td>-5.371457e-07</td>\n",
" <td>6.391481e-02</td>\n",
" <td>0.223807</td>\n",
" <td>1.219644e-07</td>\n",
" <td>0.032017</td>\n",
" <td>1.714723</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>998</th>\n",
" <td>111.012434</td>\n",
" <td>55.506217</td>\n",
" <td>-5.372196e-07</td>\n",
" <td>6.395922e-02</td>\n",
" <td>0.223826</td>\n",
" <td>1.219672e-07</td>\n",
" <td>0.031982</td>\n",
" <td>1.714723</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>999</th>\n",
" <td>111.012434</td>\n",
" <td>55.506217</td>\n",
" <td>-5.372770e-07</td>\n",
" <td>6.400057e-02</td>\n",
" <td>0.223844</td>\n",
" <td>1.220142e-07</td>\n",
" <td>0.031950</td>\n",
" <td>1.714723</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1000 rows × 9 columns</p>\n",
"</div>"
],
"text/plain": [
" H O Charge Ba Cl \\\n",
"0 111.012434 55.510420 -5.285676e-07 4.536952e-07 0.000022 \n",
"1 111.012434 55.507697 -5.292985e-07 1.091671e-06 0.002399 \n",
"2 111.012434 55.506335 -5.311407e-07 6.816584e-05 0.008922 \n",
"3 111.012434 55.506229 -5.326179e-07 1.435037e-03 0.017414 \n",
"4 111.012434 55.506224 -5.354202e-07 3.264876e-03 0.026235 \n",
".. ... ... ... ... ... \n",
"995 111.012434 55.506217 -5.369526e-07 6.381593e-02 0.223770 \n",
"996 111.012434 55.506217 -5.370535e-07 6.386712e-02 0.223789 \n",
"997 111.012434 55.506217 -5.371457e-07 6.391481e-02 0.223807 \n",
"998 111.012434 55.506217 -5.372196e-07 6.395922e-02 0.223826 \n",
"999 111.012434 55.506217 -5.372770e-07 6.400057e-02 0.223844 \n",
"\n",
" S_6_ Sr Barite Celestite \n",
"0 1.050707e-03 0.000625 0.001010 1.717461 \n",
"1 3.700427e-04 0.001488 0.001738 1.716139 \n",
"2 2.946349e-05 0.004445 0.004898 1.708478 \n",
"3 3.035681e-06 0.007281 0.008778 1.698481 \n",
"4 1.872898e-06 0.009764 0.012641 1.688408 \n",
".. ... ... ... ... \n",
"995 1.220403e-07 0.032096 1.714723 0.000000 \n",
"996 1.220029e-07 0.032055 1.714723 0.000000 \n",
"997 1.219644e-07 0.032017 1.714723 0.000000 \n",
"998 1.219672e-07 0.031982 1.714723 0.000000 \n",
"999 1.220142e-07 0.031950 1.714723 0.000000 \n",
"\n",
"[1000 rows x 9 columns]"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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16+fU5t3797dbNlgPq+S9NFHHzn1taioSJJ05513trhfMJzXU6dOacCAAVqwYIHL93/729/qhRde0IIFC/TRRx8pOTlZw4cPdzx/05Xi4mJlZ2crJydHu3btUk5OjsaPH69t27b5qxtuaamv1dXV2rFjh2bOnKkdO3Zo9erV+uKLL3Tbbbe1Wm+XLl2cznNZWZliYmL80QWPtHZuJWnkyJFO7S4sLGyxzmA8t5KanJ9XXnlFJpNJY8eObbHejnpu/cZAh3PdddcZkyZNctrWp08fY+rUqS7LP/XUU0afPn2ctj388MPG4MGD/dZGfzl8+LAhydi0aVOzZd59911DknHs2LH2a5gPzJo1yxgwYIDb5UPpvBqGYTz++ONG7969DZvN5vL9YD2vkow1a9Y4XttsNiM5OdmYN2+eY1tNTY0RHx9vLFmypNl6xo8fb4wcOdJp24gRI4y77rrL52321vl9deXDDz80JBlff/11s2VeffVVIz4+3reN8wNX/b3//vuNMWPGeFRPqJzbMWPGGDfffHOLZYLl3PoSI1IdTF1dnbZv366srCyn7VlZWdq6davLfYqLi5uUHzFihD7++GNZrVa/tdUfKisrJUkXXnhhq2WvvvpqpaSk6JZbbtG7777r76b5xP79+5Wamqq0tDTddddd+vLLL5stG0rnta6uTn/5y1/04IMPtvoA72A8r+cqLS1VeXm507mzWCwaNmxYs/+GpebPd0v7dESVlZUymUxKSEhosdzJkyfVq1cvXXzxxfrxj3+skpKS9mmgD7z33nvq3r27rrjiCk2cOFGHDx9usXwonNv/+7//0zvvvKOHHnqo1bLBfG69QZDqYCoqKtTQ0KCkpCSn7UlJSSovL3e5T3l5ucvy9fX1qqio8Ftbfc0wDOXl5emGG25Q//79my2XkpKipUuXatWqVVq9erWuvPJK3XLLLfrXv/7Vjq313KBBg/T6669r/fr1eumll1ReXq4hQ4boyJEjLsuHynmVpLVr1+r48eN64IEHmi0TrOf1fPZ/p578G7bv5+k+HU1NTY2mTp2qe+65p8UH2vbp00fLli3TunXrtHz5csXExOj666/X/v3727G13hk1apTeeOMN/fOf/9Tvf/97ffTRR7r55ptVW1vb7D6hcG5fe+01xcXF6Y477mixXDCfW29FBboBcO38v9oNw2jxL3lX5V1t78geffRRffLJJ9qyZUuL5a688kpdeeWVjteZmZk6ePCgnn/+ed14443+bqbXRo0a5fj+qquuUmZmpnr37q3XXntNeXl5LvcJhfMqSQUFBRo1apRSU1ObLROs57U5nv4b9nafjsJqtequu+6SzWbTokWLWiw7ePBgpwna119/va655hr96U9/0osvvujvprZJdna24/v+/ftr4MCB6tWrl955550WQ0Ywn1tJeuWVV/TTn/601blOwXxuvcWIVAfTrVs3RUZGNvlL5fDhw03+orFLTk52WT4qKkpdu3b1W1t96Ze//KXWrVund999VxdffLHH+w8ePDjo/uLp3LmzrrrqqmbbHQrnVZK+/vprbdy4URMmTPB432A8r/Y7MT35N2zfz9N9Ogqr1arx48ertLRURUVFLY5GuRIREaFrr7026M611DiS2qtXrxbbHsznVpI2b96sffv2efVvOJjPrbsIUh1MdHS0MjIyHHc42RUVFWnIkCEu98nMzGxSfsOGDRo4cKDMZrPf2uoLhmHo0Ucf1erVq/XPf/5TaWlpXtVTUlKilJQUH7fOv2pra7V3795m2x3M5/Vcr776qrp3764f/ehHHu8bjOc1LS1NycnJTueurq5OmzZtavbfsNT8+W5pn47AHqL279+vjRs3ehXyDcPQzp07g+5cS9KRI0d08ODBFtserOfWrqCgQBkZGRowYIDH+wbzuXVboGa5o3krVqwwzGazUVBQYOzZs8eYPHmy0blzZ+Orr74yDMMwpk6dauTk5DjKf/nll0ZsbKwxZcoUY8+ePUZBQYFhNpuNt956K1BdcNsjjzxixMfHG++9955RVlbm+KqurnaUOb+/f/jDH4w1a9YYX3zxhfHpp58aU6dONSQZq1atCkQX3PbEE08Y7733nvHll18aH3zwgfHjH//YiIuLC8nzatfQ0GD07NnTePrpp5u8F8zn9cSJE0ZJSYlRUlJiSDJeeOEFo6SkxHGn2rx584z4+Hhj9erVxu7du427777bSElJMaqqqhx15OTkON2J+/777xuRkZHGvHnzjL179xrz5s0zoqKijA8++KDd+3eulvpqtVqN2267zbj44ouNnTt3Ov0brq2tddRxfl9nz55t/OMf/zD+/e9/GyUlJcbPfvYzIyoqyti2bVsguuikpf6eOHHCeOKJJ4ytW7capaWlxrvvvmtkZmYa3/ve90Lu3NpVVlYasbGxxuLFi13WEUzn1l8IUh3UwoULjV69ehnR0dHGNddc47QcwP33328MGzbMqfx7771nXH311UZ0dLRxySWXNPtD39FIcvn16quvOsqc39/58+cbvXv3NmJiYozExETjhhtuMN555532b7yHsrOzjZSUFMNsNhupqanGHXfcYXz22WeO90PpvNqtX7/ekGTs27evyXvBfF7tSzWc/3X//fcbhtG4BMKsWbOM5ORkw2KxGDfeeKOxe/dupzqGDRvmKG/35ptvGldeeaVhNpuNPn36dIgQ2VJfS0tLm/03/O677zrqOL+vkydPNnr27GlER0cbF110kZGVlWVs3bq1/TvnQkv9ra6uNrKysoyLLrrIMJvNRs+ePY3777/fOHDggFMdoXBu7f785z8bnTp1Mo4fP+6yjmA6t/5iMowzs1cBAADgEeZIAQAAeIkgBQAA4CWCFAAAgJcIUgAAAF4iSAEAAHiJIAUAAOAlghQAAICXCFIAAABeIkgBQDsymUxau3ZtoJsBwEcIUgDCxgMPPCCTydTka+TIkYFuGoAgFRXoBgBAexo5cqReffVVp20WiyVArQEQ7BiRAhBWLBaLkpOTnb4SExMlNV52W7x4sUaNGqVOnTopLS1Nb775ptP+u3fv1s0336xOnTqpa9eu+vnPf66TJ086lXnllVfUr18/WSwWpaSk6NFHH3V6v6KiQj/5yU8UGxuryy+/XOvWrfNvpwH4DUEKAM4xc+ZMjR07Vrt27dK9996ru+++W3v37pUkVVdXa+TIkUpMTNRHH32kN998Uxs3bnQKSosXL9YvfvEL/fznP9fu3bu1bt06XXbZZU7HmDNnjsaPH69PPvlEo0eP1k9/+lMdPXq0XfsJwEcMAAgT999/vxEZGWl07tzZ6evZZ581DMMwJBmTJk1y2mfQoEHGI488YhiGYSxdutRITEw0Tp486Xj/nXfeMSIiIozy8nLDMAwjNTXVmD59erNtkGTMmDHD8frkyZOGyWQy/v73v/usnwDaD3OkAISVH/7wh1q8eLHTtgsvvNDxfWZmptN7mZmZ2rlzpyRp7969GjBggDp37ux4//rrr5fNZtO+fftkMpl06NAh3XLLLS224fvf/77j+86dOysuLk6HDx/2tksAAoggBSCsdO7cucmlttaYTCZJkmEYju9dlenUqZNb9ZnN5ib72mw2j9oEoGNgjhQAnOODDz5o8rpPnz6SpPT0dO3cuVOnTp1yvP/+++8rIiJCV1xxheLi4nTJJZfo//2//9eubQYQOIxIAQgrtbW1Ki8vd9oWFRWlbt26SZLefPNNDRw4UDfccIPeeOMNffjhhyooKJAk/fSnP9WsWbN0//33a/bs2fruu+/0y1/+Ujk5OUpKSpIkzZ49W5MmTVL37t01atQonThxQu+//75++ctftm9HAbQLghSAsPKPf/xDKSkpTtuuvPJKff7555Ia76hbsWKFcnNzlZycrDfeeEPp6emSpNjYWK1fv16PP/64rr32WsXGxmrs2LF64YUXHHXdf//9qqmp0R/+8Af96le/Urdu3TRu3Lj26yCAdmUyDMMIdCMAoCMwmUxas2aNbr/99kA3BUCQYI4UAACAlwhSAAAAXmKOFACcwUwHAJ5iRAoAAMBLBCkAAAAvEaQAAAC8RJACAADwEkEKAADASwQpAAAALxGkAAAAvESQAgAA8NL/D3qRss4b1+VXAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(history.history[\"loss\"], \"o-\", label = \"Training Loss\")\n",
"plt.xlabel(\"Epoch\")\n",
"# plt.yscale('log')\n",
"plt.ylabel(\"Loss (Huber)\")\n",
"plt.grid('on')\n",
"\n",
"plt.savefig(\"loss_all.png\", dpi=300)\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(history.history[\"loss\"][1:], \"o-\", label = \"Training Loss\")\n",
"plt.xlabel(\"Epoch\")\n",
"# plt.yscale('log')\n",
"plt.ylabel(\"Loss (Huber)\")\n",
"plt.grid('on')\n",
"plt.savefig(\"loss_1_to_end.png\", dpi=300)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test the model"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m15641/15641\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 351us/step - loss: 5.1847e-07\n"
]
},
{
"data": {
"text/plain": [
"3.571243496480747e-07"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test on all test data\n",
"model_simple.evaluate(X_test.loc[:, X_test.columns != \"Class\"], y_test.loc[:, y_test.columns != \"Class\"])"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m15452/15452\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 385us/step - loss: 5.2313e-07\n"
]
},
{
"data": {
"text/plain": [
"3.601293485644419e-07"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test on non-reactive data\n",
"model_simple.evaluate(X_test[X_test['Class'] == 0].iloc[:,X_test.columns != \"Class\"], y_test[X_test['Class'] == 0].iloc[:, y_test.columns != \"Class\"])"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m94/94\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4ms/step - loss: 4.0710e-05\n"
]
}
],
"source": [
"mass_balance = mass_balance(model_simple, X_test, scaler_X, func_dict_in, func_dict_out)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[1m189/189\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 393us/step - loss: 1.2226e-07\n"
]
},
{
"data": {
"text/plain": [
"1.1114495634956256e-07"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test on reactive data\n",
"model_simple.evaluate(X_test[X_test['Class'] == 1].iloc[:,:-1], y_test[X_test['Class'] == 1].iloc[:, :-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Save the model"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [],
"source": [
"# Save the model\n",
"model.save(\"Barite_50_Model_additional_species.keras\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "ai",
"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.12.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}