mirror of
https://git.gfz-potsdam.de/naaice/model-training.git
synced 2025-12-15 20:48:21 +01:00
1046 lines
99 KiB
Plaintext
1046 lines
99 KiB
Plaintext
{
|
||
"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": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"2025-01-14 17:26:34.798886: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
||
"2025-01-14 17:26:34.825591: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
||
"To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Running Keras in version 3.6.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import keras\n",
|
||
"print(\"Running Keras in version {}\".format(keras.__version__))\n",
|
||
"\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"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Define parameters"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"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 = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
|
||
"loss = keras.losses.Huber()\n",
|
||
"\n",
|
||
"sample_fraction = 0.8"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Setup the model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"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,664</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\">12</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,548</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,664\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;34m12\u001b[0m) │ \u001b[38;5;34m1,548\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\">19,724</span> (77.05 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m19,724\u001b[0m (77.05 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\">19,724</span> (77.05 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m19,724\u001b[0m (77.05 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": [
|
||
"model = keras.Sequential(\n",
|
||
" [\n",
|
||
" keras.Input(shape = (12,), dtype = \"float32\"),\n",
|
||
" keras.layers.Dense(units = 128, activation = \"relu\", dtype = \"float32\"),\n",
|
||
" keras.layers.Dense(units = 128, activation = \"relu\", dtype = \"float32\"),\n",
|
||
" keras.layers.Dense(units = 12, dtype = \"float32\")\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"model.compile(optimizer=optimizer, loss = loss)\n",
|
||
"model.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Define some functions and helper classes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"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\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 55,
|
||
"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": 49,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"data_file = h5py.File(\"Barite_50_Data_training.h5\")\n",
|
||
"\n",
|
||
"design = data_file[\"design\"]\n",
|
||
"results = data_file[\"result\"]\n",
|
||
"\n",
|
||
"df_design = pd.DataFrame(np.array(design[\"data\"]).transpose(), columns = design[\"names\"].asstr())\n",
|
||
"df_results = pd.DataFrame(np.array(results[\"data\"]).transpose(), columns = results[\"names\"].asstr())\n",
|
||
"\n",
|
||
"data_file.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Classify each cell with kmeans"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/home/signer/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/base.py:1473: 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"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# widget with slider for the index\n",
|
||
"\n",
|
||
"class_label = np.array([])\n",
|
||
"i = 1000\n",
|
||
"for i in range(0,1001):\n",
|
||
" field = np.array(df_design['Barite'][(i*2500):(i*2500+2500)]).reshape(50,50)\n",
|
||
" kmeans = KMeans(n_clusters=2, random_state=0).fit(field.reshape(-1,1))\n",
|
||
" class_label = np.append(class_label.astype(int), kmeans.labels_)\n",
|
||
"\n",
|
||
"\n",
|
||
"class_label = pd.DataFrame(class_label, columns = [\"Class\"])\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.image.AxesImage at 0x7b603017f510>"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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J8c6nRzrdKyv2wF9yRsTAEgjQgCkGfMRqlar8eijj0a1Ws2eyphmnU6OdTo51unkWKfTN+bemADA+WPM74QAOHeJEABpRAiANCIEQJoxH6GnnnoqZsyYERdeeGHMnj07/vSnP2VPKdXWrVvjtttui+bm5qhUKvHSSy8NO19KibVr10Zzc3NMmjQpFi5cGHv27MmZbJKOjo647rrroq6uLi677LK444474r333ht2jXWK2LRpU8yaNav2Qct58+bFq6++WjtvjY6vo6MjKpVKtLW11cas1akb0xH6/e9/H21tbfHII4/Ezp0744YbbojFixfH+++/nz21NAcPHoxrrrkmNm7ceNzz69evjw0bNsTGjRuju7s7mpqaYtGiRbXv5DsfdHV1xfLly+Ott96Kzs7OOHLkSLS2tsbBgwdr11iniGnTpsW6deti+/btsX379rjpppvi9ttvrz15WqNjdXd3x9NPPx2zZs0aNm6tTkMZw374wx+W++67b9jY9773vfLQQw8lzWhsiYjy4osv1m5//vnnpampqaxbt6429umnn5aGhobyq1/9KmGGY0NfX1+JiNLV1VVKsU4ncskll5Rf//rX1ug4BgcHS0tLS+ns7CwLFiwoK1euLKX483S6xuxO6PDhw7Fjx45obW0dNt7a2hrbtm1LmtXYtnfv3ujt7R22ZtVqNRYsWHBer1l/f39EREyZMiUirNPxHD16NDZv3hwHDx6MefPmWaPjWL58edx6661xyy23DBu3VqdnzH2B6Zc+/PDDOHr0aDQ2Ng4bb2xsjN7e3qRZjW1frsvx1mzfvn0ZU0pXSolVq1bF9ddfHzNnzowI6/RVu3fvjnnz5sWnn34aF198cbz44otx9dVX1548rdEXNm/eHG+//XZ0d3cfc86fp9MzZiP0pUqlMux2KeWYMYazZv+0YsWKeOedd+LPf/7zMeesU8RVV10Vu3btio8++ij+8Ic/xNKlS6Orq6t23hpF9PT0xMqVK2PLli1x4YUX/tvrrNWpGbO/jrv00kvjggsuOGbX09fXd8z/cfCFpqamiAhr9r8eeOCBeOWVV+KNN94Y9teDWKd/mjhxYlx55ZUxZ86c6OjoiGuuuSaefPJJa/QVO3bsiL6+vpg9e3aMHz8+xo8fH11dXfGLX/wixo8fX1sPa3VqxmyEJk6cGLNnz47Ozs5h452dnTF//vykWY1tM2bMiKampmFrdvjw4ejq6jqv1qyUEitWrIgXXnghXn/99ZgxY8aw89bp3yulxNDQkDX6iptvvjl2794du3btqh1z5syJu+66K3bt2hVXXHGFtTodee+J+HqbN28uEyZMKL/5zW/Ku+++W9ra2spFF11U/vrXv2ZPLc3g4GDZuXNn2blzZ4mIsmHDhrJz586yb9++Ukop69atKw0NDeWFF14ou3fvLj/5yU/K1KlTy8DAQPLMvzn3339/aWhoKG+++WbZv39/7fjkk09q11inUtasWVO2bt1a9u7dW955553y8MMPl3HjxpUtW7aUUqzRiXz13XGlWKvTMaYjVEopv/zlL8vll19eJk6cWK699tra22zPV2+88UaJiGOOpUuXllK+eLvoo48+Wpqamkq1Wi033nhj2b17d+6kv2HHW5+IKM8++2ztGutUyj333FP7b+s73/lOufnmm2sBKsUanci/RshanTp/lQMAacbsa0IAnPtECIA0IgRAGhECII0IAZBGhABII0IApBEhANKIEABpRAiANCIEQBoRAiDN/wf760AGi+dbEwAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"i = 1000\n",
|
||
"plt.imshow(class_label[(i*2500):(i*2500+2500)].reshape(50,50)) "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 52,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Class column already exists\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"if(\"Class\" in df_design.columns):\n",
|
||
" print(\"Class column already exists\")\n",
|
||
"else:\n",
|
||
" df_design = pd.concat([df_design, class_label], axis=1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"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>H_0_</th>\n",
|
||
" <th>O_0_</th>\n",
|
||
" <th>Ba</th>\n",
|
||
" <th>Cl</th>\n",
|
||
" <th>S_2_</th>\n",
|
||
" <th>S_6_</th>\n",
|
||
" <th>Sr</th>\n",
|
||
" <th>Barite</th>\n",
|
||
" <th>Celestite</th>\n",
|
||
" <th>Class</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.508192</td>\n",
|
||
" <td>-7.779554e-09</td>\n",
|
||
" <td>2.697041e-26</td>\n",
|
||
" <td>2.210590e-15</td>\n",
|
||
" <td>2.041069e-02</td>\n",
|
||
" <td>4.082138e-02</td>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>0.000494</td>\n",
|
||
" <td>0.000494</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.508427</td>\n",
|
||
" <td>-4.736083e-09</td>\n",
|
||
" <td>1.446346e-26</td>\n",
|
||
" <td>2.473481e-15</td>\n",
|
||
" <td>1.094567e-02</td>\n",
|
||
" <td>2.189133e-02</td>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>0.000553</td>\n",
|
||
" <td>0.000553</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.508691</td>\n",
|
||
" <td>-1.311169e-09</td>\n",
|
||
" <td>3.889826e-28</td>\n",
|
||
" <td>2.769320e-15</td>\n",
|
||
" <td>2.943745e-04</td>\n",
|
||
" <td>5.887491e-04</td>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>0.000619</td>\n",
|
||
" <td>0.000619</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.508698</td>\n",
|
||
" <td>-1.220023e-09</td>\n",
|
||
" <td>1.442658e-29</td>\n",
|
||
" <td>2.777193e-15</td>\n",
|
||
" <td>1.091776e-05</td>\n",
|
||
" <td>2.183551e-05</td>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>0.000620</td>\n",
|
||
" <td>0.000620</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.508699</td>\n",
|
||
" <td>-1.216643e-09</td>\n",
|
||
" <td>5.350528e-31</td>\n",
|
||
" <td>2.777485e-15</td>\n",
|
||
" <td>4.049176e-07</td>\n",
|
||
" <td>8.098352e-07</td>\n",
|
||
" <td>0.000000e+00</td>\n",
|
||
" <td>0.000620</td>\n",
|
||
" <td>0.000620</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000000</td>\n",
|
||
" <td>0</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",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2502495</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.507488</td>\n",
|
||
" <td>3.573728e-09</td>\n",
|
||
" <td>5.424062e-145</td>\n",
|
||
" <td>1.375204e-10</td>\n",
|
||
" <td>9.953520e-07</td>\n",
|
||
" <td>2.266555e-03</td>\n",
|
||
" <td>5.509534e-149</td>\n",
|
||
" <td>0.000318</td>\n",
|
||
" <td>0.001450</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000014</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2502496</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.507501</td>\n",
|
||
" <td>3.494007e-09</td>\n",
|
||
" <td>2.011675e-146</td>\n",
|
||
" <td>1.377139e-10</td>\n",
|
||
" <td>9.817216e-07</td>\n",
|
||
" <td>2.217997e-03</td>\n",
|
||
" <td>2.043375e-150</td>\n",
|
||
" <td>0.000321</td>\n",
|
||
" <td>0.001429</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000010</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2502497</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.507512</td>\n",
|
||
" <td>3.429764e-09</td>\n",
|
||
" <td>7.460897e-148</td>\n",
|
||
" <td>1.377819e-10</td>\n",
|
||
" <td>9.706451e-07</td>\n",
|
||
" <td>2.179066e-03</td>\n",
|
||
" <td>7.578467e-152</td>\n",
|
||
" <td>0.000324</td>\n",
|
||
" <td>0.001412</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000006</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2502498</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.507520</td>\n",
|
||
" <td>3.381745e-09</td>\n",
|
||
" <td>2.767237e-149</td>\n",
|
||
" <td>1.371144e-10</td>\n",
|
||
" <td>9.621074e-07</td>\n",
|
||
" <td>2.149820e-03</td>\n",
|
||
" <td>2.810844e-153</td>\n",
|
||
" <td>0.000326</td>\n",
|
||
" <td>0.001400</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000004</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2502499</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.507525</td>\n",
|
||
" <td>3.348864e-09</td>\n",
|
||
" <td>5.321610e-151</td>\n",
|
||
" <td>1.376026e-10</td>\n",
|
||
" <td>9.564401e-07</td>\n",
|
||
" <td>2.129912e-03</td>\n",
|
||
" <td>5.405468e-155</td>\n",
|
||
" <td>0.000327</td>\n",
|
||
" <td>0.001391</td>\n",
|
||
" <td>0.001</td>\n",
|
||
" <td>1.000001</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>2502500 rows × 13 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" H O Charge H_0_ O_0_ \\\n",
|
||
"0 111.012434 55.508192 -7.779554e-09 2.697041e-26 2.210590e-15 \n",
|
||
"1 111.012434 55.508427 -4.736083e-09 1.446346e-26 2.473481e-15 \n",
|
||
"2 111.012434 55.508691 -1.311169e-09 3.889826e-28 2.769320e-15 \n",
|
||
"3 111.012434 55.508698 -1.220023e-09 1.442658e-29 2.777193e-15 \n",
|
||
"4 111.012434 55.508699 -1.216643e-09 5.350528e-31 2.777485e-15 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"2502495 111.012434 55.507488 3.573728e-09 5.424062e-145 1.375204e-10 \n",
|
||
"2502496 111.012434 55.507501 3.494007e-09 2.011675e-146 1.377139e-10 \n",
|
||
"2502497 111.012434 55.507512 3.429764e-09 7.460897e-148 1.377819e-10 \n",
|
||
"2502498 111.012434 55.507520 3.381745e-09 2.767237e-149 1.371144e-10 \n",
|
||
"2502499 111.012434 55.507525 3.348864e-09 5.321610e-151 1.376026e-10 \n",
|
||
"\n",
|
||
" Ba Cl S_2_ S_6_ Sr \\\n",
|
||
"0 2.041069e-02 4.082138e-02 0.000000e+00 0.000494 0.000494 \n",
|
||
"1 1.094567e-02 2.189133e-02 0.000000e+00 0.000553 0.000553 \n",
|
||
"2 2.943745e-04 5.887491e-04 0.000000e+00 0.000619 0.000619 \n",
|
||
"3 1.091776e-05 2.183551e-05 0.000000e+00 0.000620 0.000620 \n",
|
||
"4 4.049176e-07 8.098352e-07 0.000000e+00 0.000620 0.000620 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"2502495 9.953520e-07 2.266555e-03 5.509534e-149 0.000318 0.001450 \n",
|
||
"2502496 9.817216e-07 2.217997e-03 2.043375e-150 0.000321 0.001429 \n",
|
||
"2502497 9.706451e-07 2.179066e-03 7.578467e-152 0.000324 0.001412 \n",
|
||
"2502498 9.621074e-07 2.149820e-03 2.810844e-153 0.000326 0.001400 \n",
|
||
"2502499 9.564401e-07 2.129912e-03 5.405468e-155 0.000327 0.001391 \n",
|
||
"\n",
|
||
" Barite Celestite Class \n",
|
||
"0 0.001 1.000000 0 \n",
|
||
"1 0.001 1.000000 0 \n",
|
||
"2 0.001 1.000000 0 \n",
|
||
"3 0.001 1.000000 0 \n",
|
||
"4 0.001 1.000000 0 \n",
|
||
"... ... ... ... \n",
|
||
"2502495 0.001 1.000014 0 \n",
|
||
"2502496 0.001 1.000010 0 \n",
|
||
"2502497 0.001 1.000006 0 \n",
|
||
"2502498 0.001 1.000004 0 \n",
|
||
"2502499 0.001 1.000001 0 \n",
|
||
"\n",
|
||
"[2502500 rows x 13 columns]"
|
||
]
|
||
},
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"df_design"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Define Scaling and Normalization Functions"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 58,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def log_scale(df_design, df_result, func_dict):\n",
|
||
" \n",
|
||
" df_design = df_design.copy()\n",
|
||
" df_result = df_result.copy()\n",
|
||
" \n",
|
||
" for key in df_design.keys():\n",
|
||
" if key != \"Class\":\n",
|
||
" df_design[key] = np.vectorize(func_dict[key])(df_design[key])\n",
|
||
" df_result[key] = np.vectorize(func_dict[key])(df_result[key])\n",
|
||
" \n",
|
||
" return df_result, df_design\n",
|
||
"\n",
|
||
"# Get minimum and maximum values for each column\n",
|
||
"def get_min_max(df_design, df_result):\n",
|
||
" \n",
|
||
" min_vals_des = df_design.min()\n",
|
||
" max_vals_des = df_design.max()\n",
|
||
" \n",
|
||
" min_vals_res = df_result.min()\n",
|
||
" max_vals_res = df_result.max()\n",
|
||
"\n",
|
||
" # minimum of input and output data to get global minimum/maximum\n",
|
||
" data_min = np.minimum(min_vals_des, min_vals_res).to_dict()\n",
|
||
" data_max = np.maximum(max_vals_des, max_vals_res).to_dict()\n",
|
||
"\n",
|
||
" return data_min, data_max\n",
|
||
"\n",
|
||
"\n",
|
||
"df_design_log, df_results_log = log_scale(df_design, df_results, func_dict_in)\n",
|
||
"data_min_log, data_max_log = get_min_max(df_design_log, df_results_log)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def preprocess(data, func_dict, data_min, data_max):\n",
|
||
" data = data.copy()\n",
|
||
" for key in data.keys():\n",
|
||
" if key != \"Class\":\n",
|
||
" data[key] = (data[key] - data_min[key]) / (data_max[key] - data_min[key])\n",
|
||
"\n",
|
||
" return data\n",
|
||
"\n",
|
||
"def postprocess(data, func_dict, data_min, data_max):\n",
|
||
" data = data.copy()\n",
|
||
" for key in data.keys():\n",
|
||
" if key != \"Class\":\n",
|
||
" data[key] = data[key] * (data_max[key] - data_min[key]) + data_min[key]\n",
|
||
" data[key] = np.vectorize(func_dict[key])(data[key])\n",
|
||
" return data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Preprocess the data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pp_design = preprocess(df_design_log, func_dict_in, data_min_log, data_max_log)\n",
|
||
"pp_results = preprocess(df_results_log, func_dict_in, data_min_log, data_max_log)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Sample the data"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"X_train, X_test, y_train, y_test = sk.train_test_split(pp_design, pp_results, test_size = 0.2)\n",
|
||
"X_train, X_val, y_train, y_val = sk.train_test_split(X_train, y_train, test_size = 0.1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Custom Loss function"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def custom_loss_H20(df_design_log, df_result_log, data_min_log, data_max_log, func_dict_out, postprocess):\n",
|
||
" df_result = postprocess(df_result_log, func_dict_out, data_min_log, data_max_log) \n",
|
||
" return keras.losses.Huber + np.sum(((df_result['H'] / df_result['O']) - 2)**2)\n",
|
||
"\n",
|
||
"def loss_wrapper(data_min_log, data_max_log, func_dict_out, postprocess):\n",
|
||
" def loss(df_design_log, df_result_log):\n",
|
||
" return custom_loss_H20(df_design_log, df_result_log, data_min_log, data_max_log, func_dict_out, postprocess)\n",
|
||
" return loss"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Train the model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 1/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 0.0015 - val_loss: 1.2993e-06\n",
|
||
"Epoch 2/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.3182e-06 - val_loss: 1.1714e-06\n",
|
||
"Epoch 3/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.4322e-06 - val_loss: 1.4424e-06\n",
|
||
"Epoch 4/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.1811e-06 - val_loss: 1.1027e-06\n",
|
||
"Epoch 5/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 1.0509e-06 - val_loss: 1.1202e-06\n",
|
||
"Epoch 6/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.9101e-07 - val_loss: 1.0344e-06\n",
|
||
"Epoch 7/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 8.5978e-07 - val_loss: 1.0202e-06\n",
|
||
"Epoch 8/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.6363e-07 - val_loss: 1.5508e-06\n",
|
||
"Epoch 9/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 8.2612e-07 - val_loss: 1.0281e-06\n",
|
||
"Epoch 10/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.8237e-07 - val_loss: 9.6918e-07\n",
|
||
"Epoch 11/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.8727e-07 - val_loss: 9.8902e-07\n",
|
||
"Epoch 12/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.2731e-07 - val_loss: 9.4628e-07\n",
|
||
"Epoch 13/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 6.2018e-07 - val_loss: 1.0144e-06\n",
|
||
"Epoch 14/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.0086e-07 - val_loss: 9.9860e-07\n",
|
||
"Epoch 15/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.6483e-07 - val_loss: 9.5001e-07\n",
|
||
"Epoch 16/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.8847e-07 - val_loss: 9.4421e-07\n",
|
||
"Epoch 17/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.6030e-07 - val_loss: 9.3255e-07\n",
|
||
"Epoch 18/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.4765e-07 - val_loss: 9.2782e-07\n",
|
||
"Epoch 19/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 7.0107e-07 - val_loss: 9.2918e-07\n",
|
||
"Epoch 20/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 5.7916e-07 - val_loss: 9.3070e-07\n",
|
||
"Epoch 21/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.1965e-07 - val_loss: 9.3583e-07\n",
|
||
"Epoch 22/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.1729e-07 - val_loss: 9.2800e-07\n",
|
||
"Epoch 23/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 5.8376e-07 - val_loss: 9.2606e-07\n",
|
||
"Epoch 24/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.1949e-07 - val_loss: 9.2550e-07\n",
|
||
"Epoch 25/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.0228e-07 - val_loss: 9.2386e-07\n",
|
||
"Epoch 26/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.4762e-07 - val_loss: 9.2222e-07\n",
|
||
"Epoch 27/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.3545e-07 - val_loss: 9.2336e-07\n",
|
||
"Epoch 28/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.1678e-07 - val_loss: 9.2510e-07\n",
|
||
"Epoch 29/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.2552e-07 - val_loss: 9.2267e-07\n",
|
||
"Epoch 30/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.7044e-07 - val_loss: 9.2244e-07\n",
|
||
"Epoch 31/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.4412e-07 - val_loss: 9.2193e-07\n",
|
||
"Epoch 32/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.9198e-07 - val_loss: 9.2181e-07\n",
|
||
"Epoch 33/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 8.8825e-07 - val_loss: 9.2173e-07\n",
|
||
"Epoch 34/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.1502e-07 - val_loss: 9.2309e-07\n",
|
||
"Epoch 35/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.5551e-07 - val_loss: 9.2157e-07\n",
|
||
"Epoch 36/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.3050e-07 - val_loss: 9.2172e-07\n",
|
||
"Epoch 37/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.8292e-07 - val_loss: 9.2127e-07\n",
|
||
"Epoch 38/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 5.7185e-07 - val_loss: 9.2111e-07\n",
|
||
"Epoch 39/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.1807e-07 - val_loss: 9.2119e-07\n",
|
||
"Epoch 40/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 5.7785e-07 - val_loss: 9.2112e-07\n",
|
||
"Epoch 41/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.6563e-07 - val_loss: 9.2108e-07\n",
|
||
"Epoch 42/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.1370e-07 - val_loss: 9.2109e-07\n",
|
||
"Epoch 43/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.2470e-07 - val_loss: 9.2105e-07\n",
|
||
"Epoch 44/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 7.2408e-07 - val_loss: 9.2102e-07\n",
|
||
"Epoch 45/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 2ms/step - loss: 6.6530e-07 - val_loss: 9.2098e-07\n",
|
||
"Epoch 46/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.7502e-07 - val_loss: 9.2098e-07\n",
|
||
"Epoch 47/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.3829e-07 - val_loss: 9.2094e-07\n",
|
||
"Epoch 48/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 5.8739e-07 - val_loss: 9.2096e-07\n",
|
||
"Epoch 49/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 7.0502e-07 - val_loss: 9.2095e-07\n",
|
||
"Epoch 50/50\n",
|
||
"\u001b[1m3520/3520\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 2ms/step - loss: 6.5994e-07 - val_loss: 9.2094e-07\n",
|
||
"Training took 317.1207675933838 seconds\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# measure time\n",
|
||
"start = time.time()\n",
|
||
"\n",
|
||
"history = model.fit(X_train, \n",
|
||
" y_train, \n",
|
||
" batch_size = batch_size, \n",
|
||
" epochs = epochs, \n",
|
||
" validation_data = (X_val, y_val)\n",
|
||
")\n",
|
||
"\n",
|
||
"end = time.time()\n",
|
||
"\n",
|
||
"print(\"Training took {} seconds\".format(end - start))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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evnll32vU2vzzJs3Tw6HQ1OnTvVdo96hNWfOHDkcDr9HUlKS73Wz6k3QCkNr167V1KlTNXPmTG3btk2DBg3SqFGjtH//fruHdtY7fvy4LrvsMi1atKjF13/2s5/p8ccf16JFi/TOO+8oKSlJw4cP932nJYKzadMm3XXXXXrzzTdVWlqq06dPKycnR8ePH/e1oeah07NnTz322GN699139e677+pb3/qWxowZ4/tlQ63N8c4772j58uW69NJL/a5T79C7+OKLVVlZ6Xvs3LnT95pp9TYQdq644gojPz/f71rfvn2N6dOn2zSi8CTJWL9+ve95Y2OjkZSUZDz22GO+a6dOnTLi4+ONZcuW2TDC8HPo0CFDkrFp0ybDMKi5Fbp162b8+te/ptYmOXr0qNGnTx+jtLTUGDJkiDFlyhTDMPhv2wyFhYXGZZdd1uJrZtabGa0wU19fr61btyonJ8fvek5OjrZs2WLTqCJDRUWFqqqq/Grvdrs1ZMgQah8iNTU1kqTu3btLouZmamhoUFFRkY4fP67s7GxqbZK77rpL1157ra655hq/69TbHHv37lVKSorS0tI0ceJEffjhh5LMrTdfKh1mqqur1dDQoMTERL/riYmJqqqqsmlUkcFb35Zqv2/fPjuGFFYMw1BBQYGuvvpqpaenS6LmZti5c6eys7N16tQpfeUrX9H69evVr18/3y8bah06RUVFKi8v1zvvvNPsNf7bDr2srCytWrVKX//61/V///d/+ulPf6qBAwdq165dptaboBWmHA6H33PDMJpdgzmovTnuvvtu/eMf/9DmzZubvUbNQ+cb3/iGtm/friNHjmjdunW65ZZbtGnTJt/r1Do0Dhw4oClTpqikpESxsbGttqPeoTNq1Cjfny+55BJlZ2erd+/eevbZZ3XllVdKMqfeLB2GmYSEBEVHRzebvTp06FCzpI7Q8n56hdqH3j333KMNGzbotddeU8+ePX3XqXnouVwufe1rX1NmZqbmzZunyy67TE8++SS1DrGtW7fq0KFDysjIUExMjGJiYrRp0yYtXLhQMTExvppSb/N07txZl1xyifbu3Wvqf98ErTDjcrmUkZGh0tJSv+ulpaUaOHCgTaOKDGlpaUpKSvKrfX19vTZt2kTt28kwDN199916/vnn9de//lVpaWl+r1Nz8xmGobq6OmodYsOGDdPOnTu1fft23yMzM1M333yztm/frgsvvJB6m6yurk7vv/++kpOTzf3v+0ttpUeHVFRUZDidTmPFihXG7t27jalTpxqdO3c2/v3vf9s9tLPe0aNHjW3bthnbtm0zJBmPP/64sW3bNmPfvn2GYRjGY489ZsTHxxvPP/+8sXPnTuO73/2ukZycbNTW1to88rPTnXfeacTHxxuvv/66UVlZ6XucOHHC14aah86MGTOMv/3tb0ZFRYXxj3/8w3jooYeMqKgoo6SkxDAMam22z3/q0DCod6jdd999xuuvv258+OGHxptvvmlcd911RpcuXXy/G82qN0ErTC1evNjo1auX4XK5jAEDBvg+Do8v57XXXjMkNXvccssthmE0fUS4sLDQSEpKMtxutzF48GBj586d9g76LNZSrSUZzzzzjK8NNQ+dH/7wh77/f+Pcc881hg0b5gtZhkGtzfbFoEW9Q2vChAlGcnKy4XQ6jZSUFOOmm24ydu3a5XvdrHo7DMMwvtycGAAAAFrCHi0AAACTELQAAABMQtACAAAwCUELAADAJAQtAAAAkxC0AAAATELQAgAAMAlBCwAAwCQELQDoYBwOh1544QW7hwEgBAhaAPA5t956qxwOR7PHyJEj7R4agLNQjN0DAICOZuTIkXrmmWf8rrndbptGA+BsxowWAHyB2+1WUlKS36Nbt26Smpb1li5dqlGjRqlTp05KS0vTH/7wB7/379y5U9/61rfUqVMn9ejRQz/60Y907Ngxvza/+c1vdPHFF8vtdis5OVl333233+vV1dW68cYbFRcXpz59+mjDhg3m/tAATEHQAoAgzZ49W2PHjtWOHTv0ve99T9/97nf1/vvvS5JOnDihkSNHqlu3bnrnnXf0hz/8QRs3bvQLUkuXLtVdd92lH/3oR9q5c6c2bNigr33ta359zJ07V+PHj9c//vEPjR49WjfffLMOHz5s6c8JIAQMAIDPLbfcYkRHRxudO3f2ezz88MOGYRiGJCM/P9/vPVlZWcadd95pGIZhLF++3OjWrZtx7Ngx3+t//vOfjaioKKOqqsowDMNISUkxZs6c2eoYJBmzZs3yPT927JjhcDiMl19+OWQ/JwBrsEcLAL7gf/7nf7R06VK/a927d/f9OTs72++17Oxsbd++XZL0/vvv67LLLlPnzp19r1911VVqbGzUnj175HA49PHHH2vYsGFtjuHSSy/1/blz587q0qWLDh061N4fCYBNCFoA8AWdO3dutpR3Jg6HQ5JkGIbvzy216dSpU0D3czqdzd7b2NgY1JgA2I89WgAQpDfffLPZ8759+0qS+vXrp+3bt+v48eO+1//+978rKipKX//619WlSxddcMEFevXVVy0dMwB7MKMFAF9QV1enqqoqv2sxMTFKSEiQJP3hD39QZmamrr76aq1evVpvv/22VqxYIUm6+eabVVhYqFtuuUVz5szRf/7zH91zzz3Kzc1VYmKiJGnOnDnKz8/Xeeedp1GjRuno0aP6+9//rnvuucfaHxSA6QhaAPAFr7zyipKTk/2ufeMb39A///lPSU2fCCwqKtLkyZOVlJSk1atXq1+/fpKkuLg4/eUvf9GUKVP0zW9+U3FxcRo7dqwef/xx371uueUWnTp1Sk888YTuv/9+JSQkaNy4cdb9gAAs4zAMw7B7EABwtnA4HFq/fr1uuOEGu4cC4CzAHi0AAACTELQAAABMwh4tAAgCuy0ABIMZLQAAAJMQtAAAAExC0AIAADAJQQsAAMAkBC0AAACTELQAAABMQtACAAAwCUELAADAJP8fkFI4TkCPdWEAAAAASUVORK5CYII=",
|
||
"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": 15,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHACAYAAACmt7JlAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASxFJREFUeJzt3XtclGX+//H3AMMABiioHDwgHZUoQ03DctNK0lrKdjtspllZrdm2uez221xrlWqz+m6ubRZl6Zod/drZXSvpW3nIyjxQmq6dSEwhRBRQDg5w//7AmUROA9wzNwyv5+PhY5t77rnnw0fL917XdV+3zTAMQwAAAH4swOoCAAAAvI3AAwAA/B6BBwAA+D0CDwAA8HsEHgAA4PcIPAAAwO8ReAAAgN8j8AAAAL9H4AEAAH6PwAMAAPxelw48a9asUXp6uuLj42Wz2fTmm296/Tv37NmjSZMmKTo6WmFhYTrrrLO0adMmr38vAABdWZcOPIcPH9bgwYO1YMECn3zfgQMHdO6558put+udd97R9u3b9eijj6p79+4++X4AALoqGw8PrWOz2fTGG29owoQJ7mNHjhzRPffcoxdffFEHDx5UcnKyHn74YY0ePbpN33H33Xfr448/1tq1a80pGgAAeKRLj/C05MYbb9THH3+sV155RV9++aWuuuoqjRs3Tt98802brvf2229r2LBhuuqqq9S7d2+lpKTomWeeMblqAABwPEZ4jjp+hOe7777TKaecoh9//FHx8fHu8y666CINHz5cDz74YKu/IyQkRJKUkZGhq666Shs2bNCMGTP09NNP6/rrrzfl5wAAAA0FWV1AR7V582YZhqFTTz213vGqqipFR0dLkn744QclJiY2e53bb7/dvUaotrZWw4YNc4ellJQUffXVV8rKyiLwAADgRQSeJtTW1iowMFCbNm1SYGBgvfdOOOEESVKfPn20Y8eOZq/To0cP9z/HxcUpKSmp3vuDBg3Sa6+9ZlLVAACgMQSeJqSkpKimpkaFhYUaNWpUo+fY7XYNHDjQ42uee+652rlzZ71jX3/9tRISEtpVKwAAaF6XDjyHDh3St99+636dm5urnJwcRUVF6dRTT9V1112n66+/Xo8++qhSUlJUVFSkDz74QGeccYYuueSSVn/fH/7wB40cOVIPPvigrr76am3YsEELFy7UwoULzfyxAADA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l3uz7i4hPMSu6G7BkqRdjPIAANBmHo/w3H///br00kubfN/hcGj06NEaPXq0HnjgAeXm5ppSYFfXPzpM+w8fUV5xuZL7RFpdDgAAnZLHIzyusFNdXa3nnntOBQUFTZ7bs2dPnX322e2vDko4uo6HER4AANqu1XdpBQUF6bbbblNVFY878IX+0UdvTS/m1nQAANqqTbeljxgxwv2IB3gXIzwAALRfm25Lnz59ujIyMrR7924NHTpU3bp1q/f+mWeeaUpxOGYvHgIPAABt1qbAc80110iSfv/737uP2Ww2GYYhm82mmpoac6qD+h8NPPklFTpSXavgIPaKBACgtdoUeLgDy3d6neBQWHCgyo/U6McD5Tqx1wlWlwQAQKfTpsDDpoK+Y7PZ1D8qTP8tKNOuYgIPAABt0eb5keeff17nnnuu4uPjtWvXLknS/Pnz9dZbb5lWHOrwiAkAANqnTYEnKytLGRkZuuSSS3Tw4EH3mp3u3btr/vz5ZtYHsXAZAID2alPgefzxx/XMM89o1qxZCgwMdB8fNmyYtm7dalpxqMNePAAAtE+bAk9ubq5SUlIaHHc4HDp8mL+UzcZePAAAtE+bAk9iYmKjGw++8847SkpKam9NOI5rSiuvuFy1tYbF1QAA0Pm06S6tu+66S7fffrsqKytlGIY2bNigl19+WXPnztWzzz5rdo1dXnz3UAUG2FRVXavCsirFRoZYXRIAAJ1KmwLPjTfeqOrqav2///f/VF5erokTJ6pPnz567LHH9Jvf/MbsGrs8e2CA+nQPVV5xuXbtP0zgAQCgldoUeCTplltu0S233KKioiLV1taqd+/eZtaF4yREh9UFnuJyjTgx2upyAADoVNoceCSpsLBQO3fulM1mk81mU69evcyqC8dhLx4AANquTYuWS0tLNXnyZMXHx+v888/XL37xC8XHx2vSpEkqKSkxu0bomL14igk8AAC0VpsCz80336zPPvtM//nPf3Tw4EGVlJTo3//+tzZu3KhbbrnF7BohqX/U0b149nPbPwAArdWmKa3//Oc/eu+993Teeee5j1188cV65plnNG7cONOKw88Y4QEAoO3aNMITHR2tyMjIBscjIyPVo0ePdheFhlyB52C5UyUVTourAQCgc2lT4LnnnnuUkZGh/Px897GCggLddddduvfee00rDj8LCw5Sr3CHJBYuAwDQ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5x33+/TcN+bOnSubzaYZM2a4j9F7882ZM0c2m63er9jYWPf7ZvWcwGOCZcuWacaMGZo1a5a2bNmiUaNGafz48crLy7O6NL9y+PBhDR48WAsWLGj0/UceeUTz5s3TggUL9Pnnnys2NlZjx45VWVmZjyv1H6tXr9btt9+uTz/9VNnZ2aqurlZaWpoOHz7sPoe+m69v37566KGHtHHjRm3cuFEXXHCBLr/8cvd/5Om5933++edauHChzjzzzHrH6b13nH766crPz3f/2rp1q/s903repgdSoJ7hw4cb06ZNq3ds4MCBxt13321RRf5PkvHGG2+4X9fW1hqxsbHGQw895D5WWVlpREZGGk899ZQFFfqnwsJCQ5L7mXf03Xd69OhhPPvss/TcB8rKyoxTTjnFyM7ONs4//3zjzjvvNAyDP+/eMnv2bGPw4MGNvmdmzxnhaacjR45o06ZNSktLq3c8LS1N69evt6iqric3N1cFBQX1fh8cDofOP/98fh9MVFJSIkmKioqSRN99oaamRq+88ooOHz6s1NRUeu4Dt99+uy699FJddNFF9Y7Te+/55ptvFB8fr8TERP3mN7/R999/L8ncnne5Z2mZraioSDU1NYqJial3PCYmRgUFBRZV1fW4et3Y78OuXbusKMnvGIahjIwMnXfeeUpOTpZE371p69atSk1NVWVlpU444QS98cYbSkpKcv9Hnp57xyuvvKLNmzfr888/b/Aef969Y8SIEVq6dKlOPfVU/fTTT3rggQc0cuRIffXVV6b2nMBjkuOfvG4YhulPY0fL+H3wnt/97nf68ssvtW7dugbv0XfznXbaacrJydHBgwf12muvacqUKVq9erX7fXpuvt27d+vOO+/UqlWrFBIS0uR59N5c48ePd//zGWecodTUVJ100kl67rnndM4550gyp+dMabVTz549FRgY2GA0p7CwsEEihfe4VvTz++Add9xxh95++219+OGH6tu3r/s4ffee4OBgnXzyyRo2bJjmzp2rwYMH67HHHqPnXrRp0yYVFhZq6NChCgoKUlBQkFavXq1//vOfCgoKcveX3ntXt27ddMYZZ+ibb74x9c87gaedgoODNXToUGVnZ9c7np2drZEjR1pUVdeTmJio2NjYer8PR44c0erVq/l9aAfDMPS73/1Or7/+uj744AMlJibWe5+++45hGKqqqqLnXnThhRdq69atysnJcf8aNmyYrrvuOuXk5OjEE0+k9z5QVVWlHTt2KC4uztw/721YUI3jvPLKK4bdbjcWLVpkbN++3ZgxY4bRrVs344cffrC6NL9SVlZmbNmyxdiyZYshyZg3b56xZcsWY9euXYZhGMZDDz1kREZGGq+//rqxdetW49prrzXi4uKM0tJSiyvvvG677TYjMjLS+Oijj4z8/Hz3r/Lycvc59N18M2fONNasWWPk5uYaX375pfGXv/zFCAgIMFatWmUYBj33pWPv0jIMeu8Nf/zjH42PPvrI+P77741PP/3U+OUvf2mEh4e7/w41q+cEHpM88cQTRkJCghEcHGwMGTLEfdsuzPPhhx8akhr8mjJlimEYdbcvzp4924iNjTUcDofxi1/8wti6dau1RXdyjfVbkvGvf/3LfQ59N99NN93k/u9Jr169jAsvvNAddgyDnvvS8YGH3pvvmmuuMeLi4gy73W7Ex8cbv/rVr4yvvvrK/b5ZPedp6QAAwO+xhgcAAPg9Ag8AAPB7BB4AAOD3CDwAAMDvEXgAAIDfI/AAAAC/R+ABAAB+j8ADAAD8HoEHAFT3NOY333zT6jIAeAmBB4DlbrjhBtlstga/xo0bZ3VpAPxEkNUFAIAkjRs3Tv/617/qHXM4HBZVA8DfMMIDoENwOByKjY2t96tHjx6S6qabsrKyNH78eIWGhioxMVHLly+v9/mtW7fqggsuUGhoqKKjo3Xrrbfq0KFD9c5ZvHixTj/9dDkcDsXFxel3v/tdvfeLiop0xRVXKCwsTKeccorefvtt7/7QAHyGwAOgU7j33nv161//Wl988YUmTZqka6+9Vjt27JAklZeXa9y4cerRo4c+//xzLV++XO+//369QJOVlaXbb79dt956q7Zu3aq3335bJ598cr3vyMzM1NVXX60vv/xSl1xyia677joVFxf79OcE4CXmPeAdANpmypQpRmBgoNGtW7d6v+677z7DMAxDkjFt2rR6nxkxYoRx2223GYZhGAsXLjR69OhhHDp0yP3+f/7zHyMgIMAoKCgwDMMw4uPjjVmzZjVZgyTjnnvucb8+dOiQYbPZjHfeece0nxOAdVjDA6BDGDNmjLKysuodi4qKcv9zampqvfdSU1OVk5MjSdqxY4cGDx6sbt26ud8/99xzVVtbq507d8pms2nv3r268MILm63hzDPPdP9zt27dFB4ersLCwrb+SAA6EAIPgA6hW7duDaaYWmKz2SRJhmG4/7mxc0JDQz26nt1ub/DZ2traVtUEoGNiDQ+ATuHTTz9t8HrgwIGSpKSkJOXk5Ojw4cPu9z/++GMFBATo1FNPVXh4uAYMGKD/+7//82nNADoORngAdAhVVVUqKCiodywoKEg9e/aUJC1fvlzDhg3TeeedpxdffFEbNmzQokWLJEnXXXedZs+erSlTpmjOnDnat2+f7rjjDk2ePFkxMTGSpDlz5mjatGnq3bu3xo8fr7KyMn388ce64447fPuDArAEgQdAh/Duu+8qLi6u3rHTTjtN//3vfyXV3UH1yiuvaPr06YqNjdWLL76opKQkSVJYWJjee+893XnnnTr77LMVFhamX//615o3b577WlOmTFFlZaX+8Y9/6E9/+pN69uypK6+80nc/IABL2QzDMKwuAgCaY7PZ9MYbb2jChAlWlwKgk2INDwAA8HsEHgAA4PdYwwOgw2PmHUB7McIDAAD8HoEHAAD4PQIPAADwewQeAADg9wg8AADA7xF4AACA3yPwAAAAv0fgAQAAfo/AAwAA/N7/B7nuwASCdJaqAAAAAElFTkSuQmCC",
|
||
"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": 20,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m15641/15641\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 337us/step - loss: 7.0854e-07\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"6.561523377968115e-07"
|
||
]
|
||
},
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"model.evaluate(X_test, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"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": "training",
|
||
"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.11.11"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|