diff --git "a/contraceptive/lct_gan/mlu-eval.ipynb" "b/contraceptive/lct_gan/mlu-eval.ipynb" new file mode 100644--- /dev/null +++ "b/contraceptive/lct_gan/mlu-eval.ipynb" @@ -0,0 +1,2274 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "982e76f5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.686730Z", + "iopub.status.busy": "2024-03-22T19:40:14.686341Z", + "iopub.status.idle": "2024-03-22T19:40:14.721946Z", + "shell.execute_reply": "2024-03-22T19:40:14.721015Z" + }, + "papermill": { + "duration": 0.052769, + "end_time": "2024-03-22T19:40:14.724162", + "exception": false, + "start_time": "2024-03-22T19:40:14.671393", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import joblib\n", + "\n", + "#joblib.parallel_backend(\"threading\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "675f0b41", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.752739Z", + "iopub.status.busy": "2024-03-22T19:40:14.752339Z", + "iopub.status.idle": "2024-03-22T19:40:14.760219Z", + "shell.execute_reply": "2024-03-22T19:40:14.759294Z" + }, + "papermill": { + "duration": 0.025385, + "end_time": "2024-03-22T19:40:14.762717", + "exception": false, + "start_time": "2024-03-22T19:40:14.737332", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n%cd /kaggle/working\\n#!git clone https://github.com/R-N/ml-utility-loss --depth=1 --single-branch --branch=main\\n%cd ml-utility-loss\\n!git pull\\n#!pip install .\\n!pip install . --no-deps --force-reinstall --upgrade\\n#'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "%cd /kaggle/working\n", + "#!git clone https://github.com/R-N/ml-utility-loss --depth=1 --single-branch --branch=main\n", + "%cd ml-utility-loss\n", + "!git pull\n", + "#!pip install .\n", + "!pip install . --no-deps --force-reinstall --upgrade\n", + "#\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5ae30f5c", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.788860Z", + "iopub.status.busy": "2024-03-22T19:40:14.788607Z", + "iopub.status.idle": "2024-03-22T19:40:14.792716Z", + "shell.execute_reply": "2024-03-22T19:40:14.791871Z" + }, + "papermill": { + "duration": 0.019374, + "end_time": "2024-03-22T19:40:14.794678", + "exception": false, + "start_time": "2024-03-22T19:40:14.775304", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.rcParams['figure.figsize'] = [3,3]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9f42c810", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.820786Z", + "iopub.status.busy": "2024-03-22T19:40:14.820487Z", + "iopub.status.idle": "2024-03-22T19:40:14.825085Z", + "shell.execute_reply": "2024-03-22T19:40:14.824184Z" + }, + "executionInfo": { + "elapsed": 678, + "status": "ok", + "timestamp": 1696841022168, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "ns5hFcVL2yvs", + "papermill": { + "duration": 0.019954, + "end_time": "2024-03-22T19:40:14.827258", + "exception": false, + "start_time": "2024-03-22T19:40:14.807304", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "datasets = [\n", + " \"insurance\",\n", + " \"treatment\",\n", + " \"contraceptive\"\n", + "]\n", + "\n", + "study_dir = \"./\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "85d0c8ce", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.853649Z", + "iopub.status.busy": "2024-03-22T19:40:14.853326Z", + "iopub.status.idle": "2024-03-22T19:40:14.859023Z", + "shell.execute_reply": "2024-03-22T19:40:14.858209Z" + }, + "papermill": { + "duration": 0.021566, + "end_time": "2024-03-22T19:40:14.860965", + "exception": false, + "start_time": "2024-03-22T19:40:14.839399", + "status": "completed" + }, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "#Parameters\n", + "import os\n", + "\n", + "path_prefix = \"../../../../\"\n", + "\n", + "dataset_dir = os.path.join(path_prefix, \"ml-utility-loss/datasets\")\n", + "dataset_name = \"treatment\"\n", + "model_name=\"ml_utility_2\"\n", + "models = [\"tvae\", \"realtabformer\", \"lct_gan\", \"tab_ddpm_concat\"]\n", + "single_model = \"lct_gan\"\n", + "random_seed = 42\n", + "gp = True\n", + "gp_multiply = True\n", + "folder = \"eval\"\n", + "debug = False\n", + "path = None\n", + "param_index = 0\n", + "allow_same_prediction = True\n", + "log_wandb = False" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "dbf0f552", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.884790Z", + "iopub.status.busy": "2024-03-22T19:40:14.884530Z", + "iopub.status.idle": "2024-03-22T19:40:14.889911Z", + "shell.execute_reply": "2024-03-22T19:40:14.888448Z" + }, + "papermill": { + "duration": 0.019283, + "end_time": "2024-03-22T19:40:14.891787", + "exception": false, + "start_time": "2024-03-22T19:40:14.872504", + "status": "completed" + }, + "tags": [ + "injected-parameters" + ] + }, + "outputs": [], + "source": [ + "# Parameters\n", + "dataset = \"contraceptive\"\n", + "dataset_name = \"contraceptive\"\n", + "single_model = \"lct_gan\"\n", + "gp = True\n", + "gp_multiply = True\n", + "random_seed = 1\n", + "debug = False\n", + "folder = \"eval\"\n", + "path_prefix = \"../../../../\"\n", + "path = \"eval/contraceptive/lct_gan/1\"\n", + "param_index = 0\n", + "allow_same_prediction = True\n", + "log_wandb = False\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd7c02d6", + "metadata": { + "papermill": { + "duration": 0.011443, + "end_time": "2024-03-22T19:40:14.914601", + "exception": false, + "start_time": "2024-03-22T19:40:14.903158", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5f45b1d0", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.938314Z", + "iopub.status.busy": "2024-03-22T19:40:14.938007Z", + "iopub.status.idle": "2024-03-22T19:40:14.947168Z", + "shell.execute_reply": "2024-03-22T19:40:14.946392Z" + }, + "executionInfo": { + "elapsed": 7, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "UdvXYv3c3LXy", + "papermill": { + "duration": 0.023214, + "end_time": "2024-03-22T19:40:14.949039", + "exception": false, + "start_time": "2024-03-22T19:40:14.925825", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/working\n", + "/kaggle/working/eval/contraceptive/lct_gan/1\n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "import os\n", + "\n", + "%cd /kaggle/working/\n", + "\n", + "if path is None:\n", + " path = os.path.join(folder, dataset_name, single_model, random_seed)\n", + "Path(path).mkdir(parents=True, exist_ok=True)\n", + "\n", + "%cd {path}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f85bf540", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:14.974444Z", + "iopub.status.busy": "2024-03-22T19:40:14.974141Z", + "iopub.status.idle": "2024-03-22T19:40:17.011622Z", + "shell.execute_reply": "2024-03-22T19:40:17.010604Z" + }, + "papermill": { + "duration": 2.052564, + "end_time": "2024-03-22T19:40:17.013629", + "exception": false, + "start_time": "2024-03-22T19:40:14.961065", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set seed to \n" + ] + } + ], + "source": [ + "from ml_utility_loss.util import seed\n", + "if single_model:\n", + " model_name=f\"{model_name}_{single_model}\"\n", + "if random_seed is not None:\n", + " seed(random_seed)\n", + " print(\"Set seed to\", seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8489feae", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:17.038360Z", + "iopub.status.busy": "2024-03-22T19:40:17.037936Z", + "iopub.status.idle": "2024-03-22T19:40:17.050479Z", + "shell.execute_reply": "2024-03-22T19:40:17.049537Z" + }, + "papermill": { + "duration": 0.027111, + "end_time": "2024-03-22T19:40:17.052563", + "exception": false, + "start_time": "2024-03-22T19:40:17.025452", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import json\n", + "import os\n", + "\n", + "df = pd.read_csv(os.path.join(dataset_dir, f\"{dataset_name}.csv\"))\n", + "with open(os.path.join(dataset_dir, f\"{dataset_name}.json\")) as f:\n", + " info = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "debcc684", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:17.077482Z", + "iopub.status.busy": "2024-03-22T19:40:17.077181Z", + "iopub.status.idle": "2024-03-22T19:40:17.084578Z", + "shell.execute_reply": "2024-03-22T19:40:17.083643Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "Vrl2QkoV3o_8", + "papermill": { + "duration": 0.022091, + "end_time": "2024-03-22T19:40:17.086602", + "exception": false, + "start_time": "2024-03-22T19:40:17.064511", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "task = info[\"task\"]\n", + "target = info[\"target\"]\n", + "cat_features = info[\"cat_features\"]\n", + "mixed_features = info[\"mixed_features\"]\n", + "longtail_features = info[\"longtail_features\"]\n", + "integer_features = info[\"integer_features\"]\n", + "\n", + "test = df.sample(frac=0.2, random_state=42)\n", + "train = df[~df.index.isin(test.index)]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7538184a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:17.112737Z", + "iopub.status.busy": "2024-03-22T19:40:17.112453Z", + "iopub.status.idle": "2024-03-22T19:40:17.206554Z", + "shell.execute_reply": "2024-03-22T19:40:17.205788Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "TilUuFk9vqMb", + "papermill": { + "duration": 0.110426, + "end_time": "2024-03-22T19:40:17.209013", + "exception": false, + "start_time": "2024-03-22T19:40:17.098587", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import ml_utility_loss.synthesizers.tab_ddpm.params as TAB_DDPM_PARAMS\n", + "import ml_utility_loss.synthesizers.lct_gan.params as LCT_GAN_PARAMS\n", + "import ml_utility_loss.synthesizers.realtabformer.params as RTF_PARAMS\n", + "from ml_utility_loss.synthesizers.realtabformer.params.default import GPT2_PARAMS, REALTABFORMER_PARAMS\n", + "from ml_utility_loss.util import filter_dict_2, filter_dict\n", + "\n", + "tab_ddpm_params = getattr(TAB_DDPM_PARAMS, dataset_name).BEST\n", + "lct_gan_params = getattr(LCT_GAN_PARAMS, dataset_name).BEST\n", + "lct_ae_params = filter_dict_2(lct_gan_params, LCT_GAN_PARAMS.default.AE_PARAMS)\n", + "rtf_params = getattr(RTF_PARAMS, dataset_name).BEST\n", + "rtf_params = filter_dict(rtf_params, REALTABFORMER_PARAMS)\n", + "\n", + "lct_ae_embedding_size=lct_gan_params[\"embedding_size\"]\n", + "tab_ddpm_normalization=\"quantile\"\n", + "tab_ddpm_cat_encoding=tab_ddpm_params[\"cat_encoding\"]\n", + "#tab_ddpm_cat_encoding=\"one-hot\"\n", + "tab_ddpm_y_policy=\"default\"\n", + "tab_ddpm_is_y_cond=True" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cca61838", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:17.236406Z", + "iopub.status.busy": "2024-03-22T19:40:17.236082Z", + "iopub.status.idle": "2024-03-22T19:40:21.821006Z", + "shell.execute_reply": "2024-03-22T19:40:21.820265Z" + }, + "executionInfo": { + "elapsed": 3113, + "status": "ok", + "timestamp": 1696841025277, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "7Abt8nStvr9Z", + "papermill": { + "duration": 4.601926, + "end_time": "2024-03-22T19:40:21.823508", + "exception": false, + "start_time": "2024-03-22T19:40:17.221582", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-22 19:40:19.417436: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2024-03-22 19:40:19.417493: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2024-03-22 19:40:19.419102: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.pipeline import load_lct_ae\n", + "\n", + "lct_ae = load_lct_ae(\n", + " dataset_name=dataset_name,\n", + " model_dir=os.path.join(path_prefix, \"ml-utility-loss/models\"),\n", + " model_name=\"lct_ae\",\n", + " df_name=\"df\",\n", + ")\n", + "lct_ae = None" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "6f83b7b6", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:21.853178Z", + "iopub.status.busy": "2024-03-22T19:40:21.852629Z", + "iopub.status.idle": "2024-03-22T19:40:21.858956Z", + "shell.execute_reply": "2024-03-22T19:40:21.857989Z" + }, + "papermill": { + "duration": 0.022425, + "end_time": "2024-03-22T19:40:21.861204", + "exception": false, + "start_time": "2024-03-22T19:40:21.838779", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from ml_utility_loss.loss_learning.estimator.pipeline import load_rtf_embed\n", + "\n", + "rtf_embed = load_rtf_embed(\n", + " dataset_name=dataset_name,\n", + " model_dir=os.path.join(path_prefix, \"ml-utility-loss/models\"),\n", + " model_name=\"realtabformer\",\n", + " df_name=\"df\",\n", + " ckpt_type=\"best-disc-model\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0026de74", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:21.886820Z", + "iopub.status.busy": "2024-03-22T19:40:21.885986Z", + "iopub.status.idle": "2024-03-22T19:40:30.509485Z", + "shell.execute_reply": "2024-03-22T19:40:30.508402Z" + }, + "executionInfo": { + "elapsed": 20137, + "status": "ok", + "timestamp": 1696841045408, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "tbaguWxAvtPi", + "papermill": { + "duration": 8.639029, + "end_time": "2024-03-22T19:40:30.512044", + "exception": false, + "start_time": "2024-03-22T19:40:21.873015", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n", + " .fit(X)\n", + "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n", + " .fit(X)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:274: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.10/site-packages/sklearn/mixture/_base.py:119: ConvergenceWarning: Number of distinct clusters (4) found smaller than n_clusters (10). Possibly due to duplicate points in X.\n", + " .fit(X)\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.preprocessing import DataPreprocessor\n", + "\n", + "preprocessor = DataPreprocessor(\n", + " task,\n", + " target=target,\n", + " cat_features=cat_features,\n", + " mixed_features=mixed_features,\n", + " longtail_features=longtail_features,\n", + " integer_features=integer_features,\n", + " lct_ae_embedding_size=lct_ae_embedding_size,\n", + " lct_ae_params=lct_ae_params,\n", + " lct_ae=lct_ae,\n", + " tab_ddpm_normalization=tab_ddpm_normalization,\n", + " tab_ddpm_cat_encoding=tab_ddpm_cat_encoding,\n", + " tab_ddpm_y_policy=tab_ddpm_y_policy,\n", + " tab_ddpm_is_y_cond=tab_ddpm_is_y_cond,\n", + " realtabformer_embedding=rtf_embed,\n", + " realtabformer_params=rtf_params,\n", + ")\n", + "preprocessor.fit(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "a9c9b110", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "execution": { + "iopub.execute_input": "2024-03-22T19:40:30.541861Z", + "iopub.status.busy": "2024-03-22T19:40:30.541424Z", + "iopub.status.idle": "2024-03-22T19:40:30.549638Z", + "shell.execute_reply": "2024-03-22T19:40:30.548702Z" + }, + "executionInfo": { + "elapsed": 13, + "status": "ok", + "timestamp": 1696841045411, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "OxUH_GBEv2qK", + "outputId": "76464c90-3baf-4bdc-a955-6f4fddc16b9c", + "papermill": { + "duration": 0.025563, + "end_time": "2024-03-22T19:40:30.551664", + "exception": false, + "start_time": "2024-03-22T19:40:30.526101", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tvae': 46,\n", + " 'realtabformer': (24, 72, Embedding(72, 672), True),\n", + " 'lct_gan': 40,\n", + " 'tab_ddpm_concat': 10}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preprocessor.adapter_sizes" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3cb9ed90", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:30.578204Z", + "iopub.status.busy": "2024-03-22T19:40:30.577937Z", + "iopub.status.idle": "2024-03-22T19:40:30.582780Z", + "shell.execute_reply": "2024-03-22T19:40:30.581947Z" + }, + "papermill": { + "duration": 0.020255, + "end_time": "2024-03-22T19:40:30.584737", + "exception": false, + "start_time": "2024-03-22T19:40:30.564482", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from ml_utility_loss.loss_learning.estimator.pipeline import load_dataset_3_factory\n", + "\n", + "datasetsn = load_dataset_3_factory(\n", + " dataset_dir=os.path.join(path_prefix, \"ml-utility-loss/\"),\n", + " dataset_name=dataset_name,\n", + " preprocessor=preprocessor,\n", + " cache_dir=path_prefix,\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ad1eb833", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:30.610675Z", + "iopub.status.busy": "2024-03-22T19:40:30.610118Z", + "iopub.status.idle": "2024-03-22T19:40:31.126454Z", + "shell.execute_reply": "2024-03-22T19:40:31.125416Z" + }, + "papermill": { + "duration": 0.531769, + "end_time": "2024-03-22T19:40:31.128570", + "exception": false, + "start_time": "2024-03-22T19:40:30.596801", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/aug_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/bs_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "../../../../ml-utility-loss/synthetics/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "1050\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.pipeline import load_dataset_4\n", + "\n", + "test_set = load_dataset_4(\n", + " dataset_dir=os.path.join(path_prefix, \"ml-utility-loss/\"),\n", + " dataset_name=dataset_name,\n", + " preprocessor=preprocessor,\n", + " model=single_model,\n", + " cache_dir=path_prefix,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "14ff8b40", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:31.157774Z", + "iopub.status.busy": "2024-03-22T19:40:31.157137Z", + "iopub.status.idle": "2024-03-22T19:40:31.488158Z", + "shell.execute_reply": "2024-03-22T19:40:31.487052Z" + }, + "executionInfo": { + "elapsed": 588, + "status": "ok", + "timestamp": 1696841049215, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "NgahtU1q9uLO", + "papermill": { + "duration": 0.348027, + "end_time": "2024-03-22T19:40:31.490454", + "exception": false, + "start_time": "2024-03-22T19:40:31.142427", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Body': 'twin_encoder',\n", + " 'loss_balancer_meta': True,\n", + " 'loss_balancer_log': False,\n", + " 'loss_balancer_lbtw': False,\n", + " 'pma_skip_small': False,\n", + " 'isab_skip_small': False,\n", + " 'layer_norm': False,\n", + " 'pma_layer_norm': False,\n", + " 'attn_residual': True,\n", + " 'tf_n_layers_dec': False,\n", + " 'tf_isab_rank': 0,\n", + " 'tf_layer_norm': False,\n", + " 'tf_pma_start': -1,\n", + " 'head_n_seeds': 0,\n", + " 'tf_pma_low': 16,\n", + " 'dropout': 0,\n", + " 'combine_mode': 'diff_left',\n", + " 'tf_isab_mode': 'separate',\n", + " 'grad_loss_fn': torch.Tensor>,\n", + " 'single_model': True,\n", + " 'bias': True,\n", + " 'bias_final': True,\n", + " 'pma_ffn_mode': 'none',\n", + " 'patience': 10,\n", + " 'inds_init_mode': 'fixnorm',\n", + " 'grad_clip': 0.73,\n", + " 'gradient_penalty_mode': {'gradient_penalty': True,\n", + " 'forward_once': False,\n", + " 'calc_grad_m': False,\n", + " 'avg_non_role_model_m': False,\n", + " 'inverse_avg_non_role_model_m': False},\n", + " 'synth_data': 2,\n", + " 'bias_lr_mul': 1.0,\n", + " 'bias_weight_decay': 0.05,\n", + " 'head_activation': torch.nn.modules.activation.Softsign,\n", + " 'loss_balancer_beta': 0.67,\n", + " 'loss_balancer_r': 0.943,\n", + " 'tf_activation': torch.nn.modules.activation.Tanh,\n", + " 'dataset_size': 2048,\n", + " 'batch_size': 4,\n", + " 'epochs': 100,\n", + " 'lr_mul': 0.09,\n", + " 'n_warmup_steps': 100,\n", + " 'Optim': functools.partial(, amsgrad=True),\n", + " 'fixed_role_model': 'lct_gan',\n", + " 'd_model': 256,\n", + " 'attn_activation': torch.nn.modules.activation.PReLU,\n", + " 'tf_d_inner': 512,\n", + " 'tf_n_layers_enc': 3,\n", + " 'tf_n_head': 32,\n", + " 'tf_activation_final': ml_utility_loss.activations.LeakyHardtanh,\n", + " 'ada_d_hid': 1024,\n", + " 'ada_n_layers': 9,\n", + " 'ada_activation': torch.nn.modules.activation.Softsign,\n", + " 'ada_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'head_d_hid': 256,\n", + " 'head_n_layers': 9,\n", + " 'head_n_head': 32,\n", + " 'head_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'models': ['lct_gan'],\n", + " 'max_seconds': 3600,\n", + " 'tf_lora': False,\n", + " 'tf_num_inds': 128,\n", + " 'ada_n_seeds': 0,\n", + " 'gradient_penalty_kwargs': {'mag_loss': True,\n", + " 'mse_mag': True,\n", + " 'mag_corr': False,\n", + " 'seq_mag': False,\n", + " 'cos_loss': False,\n", + " 'mag_corr_kwargs': {'only_sign': False},\n", + " 'cos_loss_kwargs': {'only_sign': True, 'cos_matrix': False},\n", + " 'mse_mag_kwargs': {'target': 0.65, 'multiply': True, 'forgive_over': True}}}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n", + "from ml_utility_loss.tuning import map_parameters\n", + "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n", + "import wandb\n", + "\n", + "#\"\"\"\n", + "param_space = {\n", + " **getattr(PARAMS, dataset_name).PARAM_SPACE,\n", + "}\n", + "params = {\n", + " **getattr(PARAMS, dataset_name).BESTS[param_index],\n", + "}\n", + "if gp:\n", + " params[\"gradient_penalty_mode\"] = \"ALL\"\n", + " params[\"mse_mag\"] = True\n", + " if gp_multiply:\n", + " params[\"mse_mag_multiply\"] = True\n", + " #params[\"mse_mag_target\"] = 1.0\n", + " else:\n", + " params[\"mse_mag_multiply\"] = False\n", + " #params[\"mse_mag_target\"] = 0.1\n", + "else:\n", + " params[\"gradient_penalty_mode\"] = \"NONE\"\n", + " params[\"mse_mag\"] = False\n", + "params[\"single_model\"] = False\n", + "if models:\n", + " params[\"models\"] = models\n", + "if single_model:\n", + " params[\"fixed_role_model\"] = single_model\n", + " params[\"single_model\"] = True\n", + " params[\"models\"] = [single_model]\n", + "if params[\"fixed_role_model\"] == \"realtabformer\" and dataset_name == \"treatment\":\n", + " params[\"batch_size\"] = 2\n", + "params[\"max_seconds\"] = 3600\n", + "params[\"patience\"] = 10\n", + "params[\"epochs\"] = 100\n", + "if debug:\n", + " params[\"epochs\"] = 2\n", + "with open(\"params.json\", \"w\") as f:\n", + " json.dump(params, f)\n", + "params = map_parameters(params, param_space=param_space)\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a48bd9e9", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:31.519124Z", + "iopub.status.busy": "2024-03-22T19:40:31.518699Z", + "iopub.status.idle": "2024-03-22T19:40:31.627077Z", + "shell.execute_reply": "2024-03-22T19:40:31.626131Z" + }, + "papermill": { + "duration": 0.125528, + "end_time": "2024-03-22T19:40:31.629325", + "exception": false, + "start_time": "2024-03-22T19:40:31.503797", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_train/lct_gan/all inf False\n", + "split df ratio is 0\n", + "../../../../ml-utility-loss/aug_train/contraceptive [400, 0]\n", + "Caching in ../../../../contraceptive/_cache_aug_val/lct_gan/all inf False\n", + "split df ratio is 1\n", + "../../../../ml-utility-loss/aug_val/contraceptive [0, 200]\n", + "Caching in ../../../../contraceptive/_cache_bs_train/lct_gan/all inf False\n", + "split df ratio is 0\n", + "../../../../ml-utility-loss/bs_train/contraceptive [100, 0]\n", + "Caching in ../../../../contraceptive/_cache_bs_val/lct_gan/all inf False\n", + "split df ratio is 1\n", + "../../../../ml-utility-loss/bs_val/contraceptive [0, 50]\n", + "Caching in ../../../../contraceptive/_cache_synth/lct_gan/all inf False\n", + "Splitting without random!\n", + "Split with reverse index!\n", + "../../../../ml-utility-loss/synthetics/contraceptive [400, 200]\n", + "[900, 450]\n", + "[900, 450]\n" + ] + } + ], + "source": [ + "train_set, val_set = datasetsn(model=params[\"fixed_role_model\"], synth_data=params[\"synth_data\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "2fcb1418", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "execution": { + "iopub.execute_input": "2024-03-22T19:40:31.658594Z", + "iopub.status.busy": "2024-03-22T19:40:31.658305Z", + "iopub.status.idle": "2024-03-22T19:40:32.106194Z", + "shell.execute_reply": "2024-03-22T19:40:32.105218Z" + }, + "executionInfo": { + "elapsed": 396850, + "status": "error", + "timestamp": 1696841446059, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "_bt1MQc5kpSk", + "outputId": "01c1d3e5-ac64-461d-835a-b76f4a66e6d6", + "papermill": { + "duration": 0.464659, + "end_time": "2024-03-22T19:40:32.108592", + "exception": false, + "start_time": "2024-03-22T19:40:31.643933", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating model of type \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[*] Embedding False True\n", + "['lct_gan'] 1\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.model.pipeline import remove_non_model_params\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import create_model\n", + "from ml_utility_loss.util import filter_dict, clear_memory\n", + "\n", + "clear_memory()\n", + "\n", + "params2 = remove_non_model_params(params)\n", + "adapters = filter_dict(preprocessor.adapter_sizes, params[\"models\"])\n", + "\n", + "model = create_model(\n", + " adapters=adapters,\n", + " #Body=\"twin_encoder\",\n", + " **params2,\n", + ")\n", + "#cf.apply_weight_standardization(model, n_last_layers_ignore=0)\n", + "print(model.models, len(model.adapters))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "938f94fc", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:32.140112Z", + "iopub.status.busy": "2024-03-22T19:40:32.139297Z", + "iopub.status.idle": "2024-03-22T19:40:32.144553Z", + "shell.execute_reply": "2024-03-22T19:40:32.143580Z" + }, + "papermill": { + "duration": 0.023298, + "end_time": "2024-03-22T19:40:32.146774", + "exception": false, + "start_time": "2024-03-22T19:40:32.123476", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "study_name=f\"{model_name}_{dataset_name}\"" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "12fb613e", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:32.174755Z", + "iopub.status.busy": "2024-03-22T19:40:32.174472Z", + "iopub.status.idle": "2024-03-22T19:40:32.181541Z", + "shell.execute_reply": "2024-03-22T19:40:32.180624Z" + }, + "papermill": { + "duration": 0.023501, + "end_time": "2024-03-22T19:40:32.183627", + "exception": false, + "start_time": "2024-03-22T19:40:32.160126", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "11889160" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def count_parameters(model):\n", + " return sum(p.numel() for p in model.parameters() if p.requires_grad)\n", + "\n", + "count_parameters(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "bd386e57", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:32.211912Z", + "iopub.status.busy": "2024-03-22T19:40:32.211585Z", + "iopub.status.idle": "2024-03-22T19:40:32.297306Z", + "shell.execute_reply": "2024-03-22T19:40:32.296393Z" + }, + "papermill": { + "duration": 0.102372, + "end_time": "2024-03-22T19:40:32.299408", + "exception": false, + "start_time": "2024-03-22T19:40:32.197036", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "========================================================================================================================\n", + "Layer (type:depth-idx) Output Shape Param #\n", + "========================================================================================================================\n", + "MLUtilitySingle [2, 1179, 40] --\n", + "├─Adapter: 1-1 [2, 1179, 40] --\n", + "│ └─Sequential: 2-1 [2, 1179, 256] --\n", + "│ │ └─FeedForward: 3-1 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-1 [2, 1179, 1024] 41,984\n", + "│ │ │ └─Softsign: 4-2 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-2 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-3 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-4 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-3 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-5 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-6 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-4 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-7 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-8 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-5 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-9 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-10 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-6 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-11 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-12 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-7 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-13 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-14 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-8 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-15 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-16 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-9 [2, 1179, 256] --\n", + "│ │ │ └─Linear: 4-17 [2, 1179, 256] 262,400\n", + "│ │ │ └─LeakyHardsigmoid: 4-18 [2, 1179, 256] --\n", + "├─Adapter: 1-2 [2, 294, 40] (recursive)\n", + "│ └─Sequential: 2-2 [2, 294, 256] (recursive)\n", + "│ │ └─FeedForward: 3-10 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-19 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-20 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-11 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-21 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-22 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-12 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-23 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-24 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-13 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-25 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-26 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-14 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-27 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-28 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-15 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-29 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-30 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-16 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-31 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-32 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-17 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-33 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-34 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-18 [2, 294, 256] (recursive)\n", + "│ │ │ └─Linear: 4-35 [2, 294, 256] (recursive)\n", + "│ │ │ └─LeakyHardsigmoid: 4-36 [2, 294, 256] --\n", + "├─TwinEncoder: 1-3 [2, 4096] --\n", + "│ └─Encoder: 2-3 [2, 16, 256] --\n", + "│ │ └─ModuleList: 3-20 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-37 [2, 1179, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-1 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-1 [2, 128, 256] 32,768\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-2 [2, 128, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-1 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-2 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-3 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-4 [2, 32, 128, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-1 [2, 32, 128, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-5 [2, 128, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-6 [2, 128, 256] 1\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-3 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-7 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-8 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-9 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-10 [2, 32, 1179, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-2 [2, 32, 1179, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-11 [2, 1179, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-12 [2, 1179, 256] 1\n", + "│ │ │ │ └─DoubleFeedForward: 5-2 [2, 1179, 256] --\n", + "│ │ │ │ │ └─Linear: 6-4 [2, 1179, 512] 131,584\n", + "│ │ │ │ │ └─Tanh: 6-5 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-6 [2, 1179, 256] 131,328\n", + "│ │ │ └─EncoderLayer: 4-38 [2, 1179, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-3 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-7 [2, 128, 256] 32,768\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-8 [2, 128, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-13 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-14 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-15 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-16 [2, 32, 128, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-3 [2, 32, 128, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-17 [2, 128, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-18 [2, 128, 256] 1\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-9 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-19 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-20 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-21 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-22 [2, 32, 1179, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-4 [2, 32, 1179, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-23 [2, 1179, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-24 [2, 1179, 256] 1\n", + "│ │ │ │ └─DoubleFeedForward: 5-4 [2, 1179, 256] --\n", + "│ │ │ │ │ └─Linear: 6-10 [2, 1179, 512] 131,584\n", + "│ │ │ │ │ └─Tanh: 6-11 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-12 [2, 1179, 256] 131,328\n", + "│ │ │ └─EncoderLayer: 4-39 [2, 16, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-5 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-13 [2, 128, 256] 32,768\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-14 [2, 128, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-25 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-26 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-27 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-28 [2, 32, 128, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-5 [2, 32, 128, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-29 [2, 128, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-30 [2, 128, 256] 1\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-15 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-31 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-32 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-33 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-34 [2, 32, 1179, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-6 [2, 32, 1179, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-35 [2, 1179, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-36 [2, 1179, 256] 1\n", + "│ │ │ │ └─DoubleFeedForward: 5-6 [2, 1179, 256] --\n", + "│ │ │ │ │ └─Linear: 6-16 [2, 1179, 512] 131,584\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-17 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-18 [2, 1179, 256] 131,328\n", + "│ │ │ │ └─PoolingByMultiheadAttention: 5-7 [2, 16, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-19 [2, 16, 256] 4,096\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-20 [2, 16, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-37 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-38 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-39 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-40 [2, 32, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-7 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-41 [2, 16, 256] 65,792\n", + "│ │ │ │ │ │ └─PReLU: 7-42 [2, 16, 256] 1\n", + "│ └─Encoder: 2-4 [2, 16, 256] (recursive)\n", + "│ │ └─ModuleList: 3-20 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-40 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-8 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-21 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-22 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-43 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-44 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-45 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-46 [2, 32, 128, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-8 [2, 32, 128, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-47 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-48 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-23 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-49 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-50 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-51 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-52 [2, 32, 294, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-9 [2, 32, 294, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-53 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-54 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─DoubleFeedForward: 5-9 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-24 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─Tanh: 6-25 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-26 [2, 294, 256] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-41 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-10 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-27 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-28 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-55 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-56 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-57 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-58 [2, 32, 128, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-10 [2, 32, 128, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-59 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-60 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-29 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-61 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-62 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-63 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-64 [2, 32, 294, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-11 [2, 32, 294, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-65 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-66 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─DoubleFeedForward: 5-11 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-30 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─Tanh: 6-31 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-32 [2, 294, 256] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-42 [2, 16, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-12 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-33 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-34 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-67 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-68 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-69 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-70 [2, 32, 128, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-12 [2, 32, 128, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-71 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-72 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-35 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-73 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-74 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-75 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-76 [2, 32, 294, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-13 [2, 32, 294, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-77 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-78 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─DoubleFeedForward: 5-13 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-36 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-37 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-38 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─PoolingByMultiheadAttention: 5-14 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-39 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-40 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-79 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-80 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-81 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-82 [2, 32, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-14 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-83 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─PReLU: 7-84 [2, 16, 256] (recursive)\n", + "├─Head: 1-4 [2] --\n", + "│ └─Sequential: 2-5 [2, 1] --\n", + "│ │ └─FeedForward: 3-21 [2, 256] --\n", + "│ │ │ └─Linear: 4-43 [2, 256] 1,048,832\n", + "│ │ │ └─Softsign: 4-44 [2, 256] --\n", + "│ │ └─FeedForward: 3-22 [2, 256] --\n", + "│ │ │ └─Linear: 4-45 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-46 [2, 256] --\n", + "│ │ └─FeedForward: 3-23 [2, 256] --\n", + "│ │ │ └─Linear: 4-47 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-48 [2, 256] --\n", + "│ │ └─FeedForward: 3-24 [2, 256] --\n", + "│ │ │ └─Linear: 4-49 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-50 [2, 256] --\n", + "│ │ └─FeedForward: 3-25 [2, 256] --\n", + "│ │ │ └─Linear: 4-51 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-52 [2, 256] --\n", + "│ │ └─FeedForward: 3-26 [2, 256] --\n", + "│ │ │ └─Linear: 4-53 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-54 [2, 256] --\n", + "│ │ └─FeedForward: 3-27 [2, 256] --\n", + "│ │ │ └─Linear: 4-55 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-56 [2, 256] --\n", + "│ │ └─FeedForward: 3-28 [2, 256] --\n", + "│ │ │ └─Linear: 4-57 [2, 256] 65,792\n", + "│ │ │ └─Softsign: 4-58 [2, 256] --\n", + "│ │ └─FeedForward: 3-29 [2, 1] --\n", + "│ │ │ └─Linear: 4-59 [2, 1] 257\n", + "│ │ │ └─LeakyHardsigmoid: 4-60 [2, 1] --\n", + "========================================================================================================================\n", + "Total params: 11,889,160\n", + "Trainable params: 11,889,160\n", + "Non-trainable params: 0\n", + "Total mult-adds (M): 44.13\n", + "========================================================================================================================\n", + "Input size (MB): 0.47\n", + "Forward/backward pass size (MB): 375.40\n", + "Params size (MB): 47.56\n", + "Estimated Total Size (MB): 423.43\n", + "========================================================================================================================" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from torchinfo import summary\n", + "\n", + "role_model = params[\"fixed_role_model\"]\n", + "s = train_set[0][role_model]\n", + "summary(model[role_model], input_size=((2, *s[0].shape), (2, *s[1].shape)), depth=9) # 8 max" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "0f42c4d1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T19:40:32.330193Z", + "iopub.status.busy": "2024-03-22T19:40:32.329920Z", + "iopub.status.idle": "2024-03-22T20:47:39.843051Z", + "shell.execute_reply": "2024-03-22T20:47:39.841995Z" + }, + "papermill": { + "duration": 4027.546289, + "end_time": "2024-03-22T20:47:39.860643", + "exception": false, + "start_time": "2024-03-22T19:40:32.314354", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 datasets [900, 450, 1050]\n", + "Creating model of type \n", + "[*] Embedding False True\n", + "g_loss_mul 0.1\n", + "Epoch 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.017401078423782666, 'avg_role_model_std_loss': 1.0339260609464513, 'avg_role_model_mean_pred_loss': 0.0010806548900643828, 'avg_role_model_g_mag_loss': 0.16402181821875275, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.01764664788174236, 'n_size': 900, 'n_batch': 225, 'duration': 261.55655670166016, 'duration_batch': 1.1624735853407118, 'duration_size': 0.29061839633517794, 'avg_pred_std': 0.1123641776252124}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.016450096456747915, 'avg_role_model_std_loss': 1.6555652437911634, 'avg_role_model_mean_pred_loss': 0.0006544369515005302, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.016450096456747915, 'n_size': 450, 'n_batch': 113, 'duration': 90.59106540679932, 'duration_batch': 0.8016908443079586, 'duration_size': 0.20131347868177626, 'avg_pred_std': 0.10719071906595697}\n", + "Epoch 1\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.007544516106006793, 'avg_role_model_std_loss': 0.805866371501884, 'avg_role_model_mean_pred_loss': 0.00011455891246516556, 'avg_role_model_g_mag_loss': 0.05731394776852944, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.007670205862442446, 'n_size': 900, 'n_batch': 225, 'duration': 262.5022921562195, 'duration_batch': 1.1666768540276422, 'duration_size': 0.29166921350691055, 'avg_pred_std': 0.08921317261954148}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.004202535958288031, 'avg_role_model_std_loss': 0.7761073129848487, 'avg_role_model_mean_pred_loss': 4.496906836265167e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.004202535958288031, 'n_size': 450, 'n_batch': 113, 'duration': 90.03428149223328, 'duration_batch': 0.796763553028613, 'duration_size': 0.20007618109385172, 'avg_pred_std': 0.058546484567521685}\n", + "Epoch 2\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.006512888989463035, 'avg_role_model_std_loss': 0.7518540992810281, 'avg_role_model_mean_pred_loss': 0.0001415838299930615, 'avg_role_model_g_mag_loss': 0.049427424324288344, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0066497801841857536, 'n_size': 900, 'n_batch': 225, 'duration': 262.3658037185669, 'duration_batch': 1.1660702387491861, 'duration_size': 0.29151755968729653, 'avg_pred_std': 0.09130782820491327}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0055336219292237525, 'avg_role_model_std_loss': 1.1570013584530916, 'avg_role_model_mean_pred_loss': 6.174433674384281e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0055336219292237525, 'n_size': 450, 'n_batch': 113, 'duration': 89.11512207984924, 'duration_batch': 0.788629398936719, 'duration_size': 0.1980336046218872, 'avg_pred_std': 0.04651118999973467}\n", + "Epoch 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.006024511704712899, 'avg_role_model_std_loss': 0.4761890591268285, 'avg_role_model_mean_pred_loss': 0.0002143375033454278, 'avg_role_model_g_mag_loss': 0.06465743926004507, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0061261716642830935, 'n_size': 900, 'n_batch': 225, 'duration': 260.4550771713257, 'duration_batch': 1.1575781207614475, 'duration_size': 0.2893945301903619, 'avg_pred_std': 0.09767564491679272}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.004724722134932462, 'avg_role_model_std_loss': 0.7707038955945308, 'avg_role_model_mean_pred_loss': 5.621562246012167e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.004724722134932462, 'n_size': 450, 'n_batch': 113, 'duration': 87.9228572845459, 'duration_batch': 0.7780783830490787, 'duration_size': 0.19538412729899088, 'avg_pred_std': 0.056170098961586444}\n", + "Epoch 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.005286015553380518, 'avg_role_model_std_loss': 0.3363608939476823, 'avg_role_model_mean_pred_loss': 7.321617665753689e-05, 'avg_role_model_g_mag_loss': 0.045423433695816334, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.005374089340039063, 'n_size': 900, 'n_batch': 225, 'duration': 260.1741499900818, 'duration_batch': 1.1563295555114745, 'duration_size': 0.28908238887786863, 'avg_pred_std': 0.09759037269486322}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.007981064757849607, 'avg_role_model_std_loss': 1.2652324522273108, 'avg_role_model_mean_pred_loss': 9.855836417115466e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.007981064757849607, 'n_size': 450, 'n_batch': 113, 'duration': 88.88254165649414, 'duration_batch': 0.7865711651017181, 'duration_size': 0.19751675923665366, 'avg_pred_std': 0.04572650106969924}\n", + "Epoch 5\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.00576256091059703, 'avg_role_model_std_loss': 0.5418789782114618, 'avg_role_model_mean_pred_loss': 7.038583156805957e-05, 'avg_role_model_g_mag_loss': 0.02929313911823556, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.005917770875255681, 'n_size': 900, 'n_batch': 225, 'duration': 262.8189432621002, 'duration_batch': 1.168084192276001, 'duration_size': 0.29202104806900026, 'avg_pred_std': 0.09744484349257417}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0038669909037222774, 'avg_role_model_std_loss': 1.1829836725373764, 'avg_role_model_mean_pred_loss': 2.4478697872928952e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0038669909037222774, 'n_size': 450, 'n_batch': 113, 'duration': 90.46491193771362, 'duration_batch': 0.8005744419266693, 'duration_size': 0.20103313763936362, 'avg_pred_std': 0.047730479976656824}\n", + "Epoch 6\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0038541355246626253, 'avg_role_model_std_loss': 0.3181302580921152, 'avg_role_model_mean_pred_loss': 2.260195795584597e-05, 'avg_role_model_g_mag_loss': 0.02967498921504658, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.003917783604055229, 'n_size': 900, 'n_batch': 225, 'duration': 261.9046974182129, 'duration_batch': 1.1640208774142795, 'duration_size': 0.2910052193535699, 'avg_pred_std': 0.10003261071940263}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0038603629919493365, 'avg_role_model_std_loss': 1.908042863952322, 'avg_role_model_mean_pred_loss': 1.606306340802302e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0038603629919493365, 'n_size': 450, 'n_batch': 113, 'duration': 90.71723699569702, 'duration_batch': 0.8028074070415666, 'duration_size': 0.20159385999043783, 'avg_pred_std': 0.05183640702017706}\n", + "Epoch 7\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.003702066924338902, 'avg_role_model_std_loss': 0.2994743646377197, 'avg_role_model_mean_pred_loss': 2.3150445486223394e-05, 'avg_role_model_g_mag_loss': 0.018106737517001523, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0037678834933709974, 'n_size': 900, 'n_batch': 225, 'duration': 260.3814172744751, 'duration_batch': 1.1572507434421115, 'duration_size': 0.2893126858605279, 'avg_pred_std': 0.10073738541454076}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0028049794745553906, 'avg_role_model_std_loss': 1.4249755061280251, 'avg_role_model_mean_pred_loss': 1.3086192913582816e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0028049794745553906, 'n_size': 450, 'n_batch': 113, 'duration': 90.54383492469788, 'duration_batch': 0.8012728754398042, 'duration_size': 0.20120852205488418, 'avg_pred_std': 0.054640445479117665}\n", + "Epoch 8\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0033579401259905555, 'avg_role_model_std_loss': 0.3882562007228762, 'avg_role_model_mean_pred_loss': 1.8571260889600453e-05, 'avg_role_model_g_mag_loss': 0.031065790198707772, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0034128941754655293, 'n_size': 900, 'n_batch': 225, 'duration': 261.0693860054016, 'duration_batch': 1.1603083822462295, 'duration_size': 0.29007709556155736, 'avg_pred_std': 0.10073215851146314}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.004292678962616871, 'avg_role_model_std_loss': 2.506649698973513, 'avg_role_model_mean_pred_loss': 4.666494623541402e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.004292678962616871, 'n_size': 450, 'n_batch': 113, 'duration': 89.04813385009766, 'duration_batch': 0.788036582744227, 'duration_size': 0.1978847418891059, 'avg_pred_std': 0.05573896699857}\n", + "Epoch 9\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0032293959062533557, 'avg_role_model_std_loss': 0.4635296431291696, 'avg_role_model_mean_pred_loss': 1.8672718882848967e-05, 'avg_role_model_g_mag_loss': 0.023970585422034167, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.003291322695731651, 'n_size': 900, 'n_batch': 225, 'duration': 260.9506549835205, 'duration_batch': 1.1597806888156468, 'duration_size': 0.2899451722039117, 'avg_pred_std': 0.10359380051907566}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.002744582254672423, 'avg_role_model_std_loss': 2.2099234429464625, 'avg_role_model_mean_pred_loss': 2.5944116722460305e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002744582254672423, 'n_size': 450, 'n_batch': 113, 'duration': 89.43556237220764, 'duration_batch': 0.7914651537363508, 'duration_size': 0.19874569416046142, 'avg_pred_std': 0.05300469076635926}\n", + "Epoch 10\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0026384538486470574, 'avg_role_model_std_loss': 0.23855205940207644, 'avg_role_model_mean_pred_loss': 1.205315517315884e-05, 'avg_role_model_g_mag_loss': 0.024326985160069953, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0026762135176815922, 'n_size': 900, 'n_batch': 225, 'duration': 263.52970361709595, 'duration_batch': 1.1712431271870931, 'duration_size': 0.2928107817967733, 'avg_pred_std': 0.10776877377182245}\n", + "Time out: 3785.1640882492065/3600\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Eval loss {'role_model': 'lct_gan', 'n_size': 1050, 'n_batch': 263, 'role_model_metrics': {'avg_loss': 0.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'pred_duration': 4.068113565444946, 'grad_duration': 12.533695220947266, 'total_duration': 16.601808786392212, 'pred_std': 0.1082986444234848, 'std_loss': 0.0010494085727259517, 'mean_pred_loss': 9.070246051123831e-06, 'pred_rmse': 0.05325468257069588, 'pred_mae': 0.04161286726593971, 'pred_mape': 0.12254984676837921, 'grad_rmse': 0.1400071233510971, 'grad_mae': 0.03379097580909729, 'grad_mape': 0.8471567034721375}, 'non_role_model_metrics': {'avg_loss': 0, 'avg_g_mag_loss': 0, 'avg_g_cos_loss': 0, 'avg_pred_duration': 0, 'avg_grad_duration': 0, 'avg_total_duration': 0, 'avg_pred_std': 0, 'avg_std_loss': 0, 'avg_mean_pred_loss': 0}, 'avg_metrics': {'avg_loss': 0.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'avg_pred_duration': 4.068113565444946, 'avg_grad_duration': 12.533695220947266, 'avg_total_duration': 16.601808786392212, 'avg_pred_std': 0.1082986444234848, 'avg_std_loss': 0.0010494085727259517, 'avg_mean_pred_loss': 9.070246051123831e-06}, 'min_metrics': {'avg_loss': 0.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'pred_duration': 4.068113565444946, 'grad_duration': 12.533695220947266, 'total_duration': 16.601808786392212, 'pred_std': 0.1082986444234848, 'std_loss': 0.0010494085727259517, 'mean_pred_loss': 9.070246051123831e-06, 'pred_rmse': 0.05325468257069588, 'pred_mae': 0.04161286726593971, 'pred_mape': 0.12254984676837921, 'grad_rmse': 0.1400071233510971, 'grad_mae': 0.03379097580909729, 'grad_mape': 0.8471567034721375}, 'model_metrics': {'lct_gan': {'avg_loss': 0.002836061065248768, 'avg_g_mag_loss': 0.04869947255703835, 'avg_g_cos_loss': 0.010633710139164967, 'pred_duration': 4.068113565444946, 'grad_duration': 12.533695220947266, 'total_duration': 16.601808786392212, 'pred_std': 0.1082986444234848, 'std_loss': 0.0010494085727259517, 'mean_pred_loss': 9.070246051123831e-06, 'pred_rmse': 0.05325468257069588, 'pred_mae': 0.04161286726593971, 'pred_mape': 0.12254984676837921, 'grad_rmse': 0.1400071233510971, 'grad_mae': 0.03379097580909729, 'grad_mape': 0.8471567034721375}}}\n" + ] + } + ], + "source": [ + "import torch\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import train, train_2\n", + "from ml_utility_loss.loss_learning.estimator.process_simple import train_epoch, eval as _eval\n", + "from ml_utility_loss.params import GradientPenaltyMode\n", + "from ml_utility_loss.util import clear_memory\n", + "import time\n", + "#torch.autograd.set_detect_anomaly(True)\n", + "\n", + "del model\n", + "clear_memory()\n", + "\n", + "#opt = params[\"Optim\"](model.parameters())\n", + "loss = train_2(\n", + " [train_set, val_set, test_set],\n", + " preprocessor=preprocessor,\n", + " #whole_model=model,\n", + " #optim=opt,\n", + " log_dir=\"logs\",\n", + " checkpoint_dir=\"checkpoints\",\n", + " verbose=True,\n", + " allow_same_prediction=allow_same_prediction,\n", + " wandb=wandb if log_wandb else None,\n", + " study_name=study_name,\n", + " **params\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9b514a07", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:47:39.896618Z", + "iopub.status.busy": "2024-03-22T20:47:39.896258Z", + "iopub.status.idle": "2024-03-22T20:47:39.900756Z", + "shell.execute_reply": "2024-03-22T20:47:39.899964Z" + }, + "papermill": { + "duration": 0.024824, + "end_time": "2024-03-22T20:47:39.902718", + "exception": false, + "start_time": "2024-03-22T20:47:39.877894", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "model = loss[\"whole_model\"]\n", + "opt = loss[\"optim\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "331a49e1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:47:39.935797Z", + "iopub.status.busy": "2024-03-22T20:47:39.934952Z", + "iopub.status.idle": "2024-03-22T20:47:40.035705Z", + "shell.execute_reply": "2024-03-22T20:47:40.034557Z" + }, + "papermill": { + "duration": 0.119826, + "end_time": "2024-03-22T20:47:40.038220", + "exception": false, + "start_time": "2024-03-22T20:47:39.918394", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import torch\n", + "from copy import deepcopy\n", + "\n", + "torch.save(deepcopy(model.state_dict()), \"model.pt\")\n", + "#torch.save(deepcopy(opt.state_dict()), \"optim.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "123b4b17", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:47:40.073678Z", + "iopub.status.busy": "2024-03-22T20:47:40.073343Z", + "iopub.status.idle": "2024-03-22T20:47:40.372089Z", + "shell.execute_reply": "2024-03-22T20:47:40.371184Z" + }, + "papermill": { + "duration": 0.319285, + "end_time": "2024-03-22T20:47:40.374396", + "exception": false, + "start_time": "2024-03-22T20:47:40.055111", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "history = loss[\"history\"]\n", + "history.to_csv(\"history.csv\")\n", + "history[[\"avg_loss_train\", \"avg_loss_test\"]].plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "2586ba0a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:47:40.411928Z", + "iopub.status.busy": "2024-03-22T20:47:40.411581Z", + "iopub.status.idle": "2024-03-22T20:51:46.581079Z", + "shell.execute_reply": "2024-03-22T20:51:46.579998Z" + }, + "papermill": { + "duration": 246.190558, + "end_time": "2024-03-22T20:51:46.583679", + "exception": false, + "start_time": "2024-03-22T20:47:40.393121", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import eval\n", + "#eval_loss = loss[\"eval_loss\"]\n", + "\n", + "batch_size = params[\"batch_size_low\"] if \"batch_size_low\" in params else params[\"batch_size\"]\n", + "\n", + "eval_loss = eval(\n", + " test_set, model,\n", + " batch_size=batch_size,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "187137f6", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:51:46.621064Z", + "iopub.status.busy": "2024-03-22T20:51:46.620162Z", + "iopub.status.idle": "2024-03-22T20:51:46.642273Z", + "shell.execute_reply": "2024-03-22T20:51:46.641271Z" + }, + "papermill": { + "duration": 0.042627, + "end_time": "2024-03-22T20:51:46.644305", + "exception": false, + "start_time": "2024-03-22T20:51:46.601678", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
avg_g_cos_lossavg_g_mag_lossavg_lossgrad_durationgrad_maegrad_mapegrad_rmsemean_pred_losspred_durationpred_maepred_mapepred_rmsepred_stdstd_losstotal_duration
lct_gan0.0053470.0809710.00283612.4673010.0337910.8471570.1400070.0000094.1098430.0416130.122550.0532550.1082990.00104916.577143
\n", + "
" + ], + "text/plain": [ + " avg_g_cos_loss avg_g_mag_loss avg_loss grad_duration grad_mae \\\n", + "lct_gan 0.005347 0.080971 0.002836 12.467301 0.033791 \n", + "\n", + " grad_mape grad_rmse mean_pred_loss pred_duration pred_mae \\\n", + "lct_gan 0.847157 0.140007 0.000009 4.109843 0.041613 \n", + "\n", + " pred_mape pred_rmse pred_std std_loss total_duration \n", + "lct_gan 0.12255 0.053255 0.108299 0.001049 16.577143 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "metrics = pd.DataFrame(eval_loss[\"model_metrics\"]).T\n", + "metrics.to_csv(\"eval.csv\")\n", + "metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "123d305b", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:51:46.679178Z", + "iopub.status.busy": "2024-03-22T20:51:46.678852Z", + "iopub.status.idle": "2024-03-22T20:51:47.043914Z", + "shell.execute_reply": "2024-03-22T20:51:47.043067Z" + }, + "papermill": { + "duration": 0.384847, + "end_time": "2024-03-22T20:51:47.046035", + "exception": false, + "start_time": "2024-03-22T20:51:46.661188", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from ml_utility_loss.util import clear_memory\n", + "clear_memory()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a3eecc2a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:51:47.083119Z", + "iopub.status.busy": "2024-03-22T20:51:47.082278Z", + "iopub.status.idle": "2024-03-22T20:55:57.990842Z", + "shell.execute_reply": "2024-03-22T20:55:57.989788Z" + }, + "papermill": { + "duration": 250.930339, + "end_time": "2024-03-22T20:55:57.993924", + "exception": false, + "start_time": "2024-03-22T20:51:47.063585", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n", + "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n", + "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/all inf False\n" + ] + } + ], + "source": [ + "#\"\"\"\n", + "from ml_utility_loss.loss_learning.estimator.process import pred, pred_2\n", + "from ml_utility_loss.util import stack_samples\n", + "\n", + "#samples = test_set[list(range(len(test_set)))]\n", + "#y = {m: pred(model[m], s) for m, s in samples.items()}\n", + "y = pred_2(model, test_set, batch_size=batch_size)\n", + "#\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "6ab51db8", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:55:58.031362Z", + "iopub.status.busy": "2024-03-22T20:55:58.031011Z", + "iopub.status.idle": "2024-03-22T20:55:58.057419Z", + "shell.execute_reply": "2024-03-22T20:55:58.056562Z" + }, + "papermill": { + "duration": 0.047546, + "end_time": "2024-03-22T20:55:58.059612", + "exception": false, + "start_time": "2024-03-22T20:55:58.012066", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "from ml_utility_loss.util import transpose_dict\n", + "\n", + "os.makedirs(\"pred\", exist_ok=True)\n", + "y2 = transpose_dict(y)\n", + "for k, v in y2.items():\n", + " df = pd.DataFrame(v)\n", + " df.to_csv(f\"pred/{k}.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d81a30f1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:55:58.094102Z", + "iopub.status.busy": "2024-03-22T20:55:58.093810Z", + "iopub.status.idle": "2024-03-22T20:55:58.099460Z", + "shell.execute_reply": "2024-03-22T20:55:58.098484Z" + }, + "papermill": { + "duration": 0.0258, + "end_time": "2024-03-22T20:55:58.101597", + "exception": false, + "start_time": "2024-03-22T20:55:58.075797", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'lct_gan': 0.3770567048447473}\n" + ] + } + ], + "source": [ + "print({k: sum(v[\"pred\"])/len(v[\"pred\"]) for k, v in y.items()})" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3b3ff322", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:55:58.139403Z", + "iopub.status.busy": "2024-03-22T20:55:58.138694Z", + "iopub.status.idle": "2024-03-22T20:55:58.530094Z", + "shell.execute_reply": "2024-03-22T20:55:58.529245Z" + }, + "papermill": { + "duration": 0.412474, + "end_time": "2024-03-22T20:55:58.532159", + "exception": false, + "start_time": "2024-03-22T20:55:58.119685", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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R1FRETQaTYyiHVzUajXkcjmqq6vhdru77WWWjM40deJorRnleXqMG2IUOxziJ2oi6ujowPXXX485c+Zg69atyM7OxtmzZ7vtYdUf9Fe8f1Lp59dhc+PzY43w8QyX2u3I0SuRY0j+5JoKRE1Ezz//PIqKilBRURE81nUbGUJi6WidGT7+8mITh2pMuHlsnogRkQBR/9z97W9/w7XXXos77rgDOTk5mDx5Mt54441ez3e5XLBYLCEfhITrXLMVADCpOA0AUNVqow0WBwhRE9GFCxewceNGlJWVYdu2bfjZz36GRx99NLgtzZXWr18Po9EY/KAJr/1XUlISXBM6lTHGMK00A2MKDPheaSay9EqMyNHB46NENBCIWjXjeR7XXnstfv/73wMAJk+ejGPHjuG//uu/sGzZsm7nr127FqtXrw5+HZhQR8jVcByHcUOMwQbqe783VOSISFeilojy8/MxZsyYkGOjR4/GpUuXejxfqVQGJ7jSRNfL3G632CEQ0i+iJqLrr78ep0+fDjl25syZ4B7o8eL28r1+eH182Od6wjg3GrNnz8YjjzyCRx55BEajEVlZWfjNb34TbM8oKSnBc889h/vuuw8GgwEPPfQQAOBf//oXZs6cCbVajaKiIjz66KOw2WzB6zY3N2Px4sVQq9UoLS3FO++8E1V8yehiqw2NZmfI++vjGTpslMQHAlGrZr/85S9x3XXX4fe//z1+9KMf4ZtvvsFf/vIX/OUvf4nr6/75i3O9PleapcXSyUOCX/9l9/le2xEK09W449rLVcNNe6rgcIdOJfnl90dGFeNbb72FBx54AN988w2+/fZbPPTQQyguLsaDDz4IAHjxxRfx1FNP4emnnwYAnD9/HvPnz8dvf/tbbNq0CS0tLcFkFuiVXL58Oerr6/HFF19ALpfj0UcfRXNzc1TxJZsdJ5pgdXlx59QiFKSpYbZ78NbXFyGVcPj57OE02FVkoiaiqVOn4uOPP8batWvx7LPPorS0FK+++iruueceMcMaEIqKivDKK6+A4ziUl5fj6NGjeOWVV4KJ6KabbsKvfvWr4PkrV67EPffcg8cffxwAUFZWhj/84Q+YNWsWNm7ciEuXLmHr1q345ptvMHXqVADAm2++idGjRyf83hLN6fHB6vICADJ1wlQVrVIKnjH4vAx2tw9apehjewc10X/6t956K2699daE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from ml_utility_loss.loss_learning.visualization import plot_pred_density_2\n", + "\n", + "_ = plot_pred_density_2(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "e79e4b0f", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:55:58.568796Z", + "iopub.status.busy": "2024-03-22T20:55:58.568507Z", + "iopub.status.idle": "2024-03-22T20:55:58.924783Z", + "shell.execute_reply": "2024-03-22T20:55:58.923874Z" + }, + "papermill": { + "duration": 0.377324, + "end_time": "2024-03-22T20:55:58.927085", + "exception": false, + "start_time": "2024-03-22T20:55:58.549761", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASIAAAEmCAYAAADGL52gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABC+UlEQVR4nO2deXxU5b3/32f2ZDIzWcgKCQk7yC5Ccakg1AWqWNuqtVUQly723mv5cV/K7S2KvizYqhVbX7a1AnrVUm3VrooUBSxFRRAU2UMSAiRkX2Zfzvn9cTJDhiSQZWZOMnner9cwM+c8c873cDKf+T7P832+X0lRFAWBQCDQEJ3WBggEAoEQIoFAoDlCiAQCgeYIIRIIBJojhEggEGiOECKBQKA5QogEAoHmCCESCASaY9DagL4gyzKnT5/GZrMhSZLW5ggEgnNQFIXW1lYKCgrQ6br2ewa0EJ0+fZrCwkKtzRAIBBegsrKSYcOGdbl/QAuRzWYD1Iu02+0aWyMQCM6lpaWFwsLCyHe1Kwa0EIW7Y3a7XQiRQNCPudDQiRisFggEmiOESCAQaI4QIoFAoDkDeoyoOyiKQjAYJBQKaW3KoMZoNKLX67U2Q9BPSWoh8vv9VFVV4Xa7tTZl0CNJEsOGDSMtLU1rUwT9kKQVIlmWKSsrQ6/XU1BQgMlkEkGPGqEoCrW1tZw8eZLRo0cLz0jQAc2F6NSpUzzwwAO8/fbbuN1uRo0axfr165kxY0afjuv3+5FlmcLCQlJTU2NkraC3ZGdnU15eTiAQ0FSIjpxp5fOTzYzNszFxqEMzOwTRaCpEjY2NXHbZZcydO5e3336b7Oxsjh49SkZGRszOcb6wckHi6A/eaKPLzzv7qwnJCica3OTYzOTYLVqbJUBjIXr88ccpLCxk/fr1kW0lJSUaWiRIZj4/1UxIPlsrYm9lE1dflKehRYIwmroLf/nLX5gxYwbf/OY3ycnJYdq0aTz//PNdtvf5fLS0tEQ9BILucqzGCcDUonQAyupciCI2/QNNhej48eM899xzjB49mk2bNvH973+f//zP/+TFF1/stP3q1atxOByRR7IueJ0zZw7333+/1mYkFYqiMLMkkwkFdr5UksUQm5lROWkEQkKI+gOaCpEsy0yfPp2f/vSnTJs2jXvvvZd77rmHX//61522X7FiBc3NzZFHZWVlgi3uX2zduhVJkmhqatLalH6PJElMHOrgmovySDHpuf1Lw5k3PheTQYwh9gc0vQv5+flMmDAhatv48eM5ceJEp+3NZnNkgatY6CoQJA+aCtFll13G4cOHo7YdOXKE4cOHx/W8/qDc5SMYkrvdNtCNtn3F5/PxwAMPUFhYiNlsZtSoUbzwwguUl5czd+5cADIyMpAkiSVLllzweK2trXz729/GarWSn5/PL37xiw5dwf/7v/9jxowZ2Gw28vLyuO2226ipqYnsD3tiW7ZsYcaMGaSmpnLppZd2uJf9ifI6F9XN3qj7G5IVGl1+Da0ShNF01uxHP/oRl156KT/96U+5+eab+fjjj/ntb3/Lb3/727ie99n3j3W5r2SIlRunDY28/+320i7HEYZlpPDNGWfHqdbtKMPjj15K8qOvjOmTrXfccQc7d+7kmWeeYcqUKZSVlVFXV0dhYSF/+tOf+PrXv87hw4ex2+2kpKRc8HjLli1jx44d/OUvfyE3N5eVK1eyZ88epk6dGmkTCAR49NFHGTt2LDU1NSxbtowlS5bwj3/8I+pYP/7xj3nyySfJzs7me9/7HkuXLmXHjh19ut54sfnAGZy+ILdcUkhBegrN7gAv7ixHr5P4wZyR/SK8YDCjqRBdcsklvPnmm6xYsYJHHnmEkpISnn76ab797W9raVa/4ciRI7z22mts3ryZ+fPnAzBixIjI/szMTABycnJIT0+/4PFaW1t58cUXefXVV5k3bx4A69evp6CgIKrd0qVLI69HjBjBM888wyWXXILT6YxaovHYY49x5ZVXAvDggw+ycOFCvF4vFkv/is3xBkI4fUEAstJMAFjNemRFIRRUcPtDWM2ax/YOajT/3//qV7/KV7/61YSe8765o7rcpzvnh/HeL4/ssu25P6JLL4ttDNTevXvR6/WRL3tfOX78OIFAgJkzZ0a2ORwOxo4dG9Vu9+7dPPzww+zbt4/GxkZkWe3OnDhxImpMb/LkyZHX+fn5ANTU1FBUVBQTe2NFndMHgD3FiNmgRnUb9DpsFiMtngBNnoAQIo0ZlFMGJoOuy4dBr+t2W2M32vaF7nS1Yo3L5eKaa67BbrfzyiuvsGvXLt58801AXTbTHqPRGHkd7tqERas/0eQOAJCRaozanp6ivhfjRNozKIVooDBp0iRkWWbbtm2d7jeZ1G5Gd1OcjBgxAqPRyK5duyLbmpubOXLkSOT9oUOHqK+vZ82aNVxxxRWMGzcuaqB6INLiUYXIkRItRBlW9X1z236Bdggh6scUFxezePFili5dyltvvUVZWRlbt27ltddeA2D48OFIksTf/vY3amtrcTqd5z2ezWZj8eLF/Pd//zfvv/8+X3zxBXfddRc6nS7i0RQVFWEymfjlL3/J8ePH+ctf/sKjjz4a92uNJ81dCJEjRRXysMck0A4hRP2c5557jm984xv84Ac/YNy4cdxzzz24XC4Ahg4dyqpVq3jwwQfJzc3lhz/84QWP99RTTzF79my++tWvMn/+fC677DLGjx8fGWDOzs5mw4YNvP7660yYMIE1a9bwxBNPxPUa402LVxUaewchMkbtF2iHpAzgxTYtLS04HA6am5s7BDd6vV7KysooKSnpd7M4/QmXy8XQoUN58sknueuuu+J2Hi3vR2WDm3qXnxHZVuyWs2LU4PKzq7yBLKuJGcWZCbVpsHC+72h7xFTBIOPTTz/l0KFDzJw5k+bmZh555BEAFi1apLFl8aMwM5XCzI45qTKtJq4Rq+/7BUKIkohzp9fP5cCBAwA88cQTHD58GJPJxMUXX8wHH3zAkCFDEmWmQNABIURJREFBAXv37j3v/qKiInbv3p04ozSm2R2gusVLRqqx0yRowZCMyxfCbNRhMYoUtlohhCiJMBgMjBrVdbDmYOREg5t/HjzDiGwri6YO7bD/zU9PcbLRw4JJ+YzNO39ZZEH8ELNmgqQmvLTDaur8N9dmUbe3ipkzTRFCJEhqwkKUZulciNLM6ixaa1s7gTYIIRIkNa6wEHWxliwsUE6vECItEUIkSGoiXbOuhMisDlC7/UKItEQIkSCpuZBHlNI2duTyiZLkWiKESJC0BEMy7rZEdV0JkdWkekSegBAiLRFC1A/pb1U8+ps93UWSJK6fUsBV43KwGDv/U081GbiowM7UwnRkecCudhrwiDiiJMXv90fShAxW9DqJUTlp521jMuhEkcV+wODyiBQFgv7EP3qwrnjJkiVs27aNtWvXIkkSkiRRWlrKXXfdRUlJCSkpKYwdO5a1a9d2+NyNN97IY489RkFBQSTr4r///W+mTp2KxWJhxowZvPXWW0iSFBWBvX//fq677jrS0tLIzc3l9ttvp66urkt7ysvL+3wrBIL2DC6PKBSAD55M/Hmv+H9g6J53snbtWo4cOcLEiRMjC1IzMjIYNmwYr7/+OllZWfz73//m3nvvJT8/n5tvvjny2S1btmC329m8eTOgrny+/vrrWbBgAa+++ioVFRUdulhNTU1cddVV3H333fziF7/A4/HwwAMPcPPNN/Pee+91ak92dnYM/lPiT02Ll0Z3gCFpJrLSzF22C4Rk3GKZh6YMLiEaADgcDkwmE6mpqeTlne0yrFq1KvK6pKSEnTt38tprr0UJkdVq5Xe/+12kS/brX/8aSZJ4/vnnsVgsTJgwgVOnTnHPPfdEPvOrX/2KadOm8dOf/jSybd26dRQWFnLkyBHGjBnTqT0DgUPVreyuaGRaUTpzxuZ02e7t/dWU1jiZNz6HycPSE2egIMLgEiK9UfVOtDhvH3n22WdZt24dJ06cwOPx4Pf7o0oAgZpatv240OHDh5k8eXJU/p/2ifMB9u3bx/vvvx9VnSNMaWkpY8b0rRySloRjg7qaMQsTnjkTU/jaMbiESJK63UXqT2zcuJHly5fz5JNPMnv2bGw2Gz//+c/56KOPotpZrdYeH9vpdHL99dfz+OOPd9gXrswxUAlP3aeYzt/dCu8XQY3aMbiEaIBgMpmiEuLv2LGDSy+9lB/84AeRbaWlpRc8ztixY3n55Zfx+XyYzeoYSfvE+QDTp0/nT3/6E8XFxRgMnf85nGvPQCEsRKldLHgNE14Q6/YPvGtMFjSdNXv44YcjMzHhx7hx47Q0qV9QXFzMRx99RHl5OXV1dYwePZpPPvmETZs2ceTIEX7yk590EJTOuO2225BlmXvvvZeDBw+yadOmSP7pcLL8++67j4aGBr71rW+xa9cuSktL2bRpE3feeWdEfM61pz+WDOqMcNVd6wU8IqtY5qE5mk/fX3TRRVRVVUUe//rXv7Q2SXOWL1+OXq9nwoQJZGdnc80113DTTTdxyy23MGvWLOrr66O8o66w2+389a9/Ze/evUydOpUf//jHrFy5EiAyblRQUMCOHTsIhUJcffXVTJo0ifvvv5/09HR0Ol2n9pw4cSJ+Fx8jFEXpQddMLPPQGs27ZgaDYcDNxsSbMWPGsHPnzqht69evZ/369VHbVq9eHXm9YcOGTo916aWXsm/fvsj7V155BaPRGFWNdfTo0bzxxhs9sqe/4wvKyG3xWykXmJIP7/cGhRBpheZCdPToUQoKCrBYLMyePZvVq1f3u5LFA5mXXnqJESNGMHToUPbt2xeJEdKiimwiMejU5R3eQKhD9d5zSTXpmTjUQYpRj6IokW6rIHFoKkSzZs1iw4YNjB07lqqqKlatWsUVV1zB/v37sdk6pu30+Xz4fL7I+5aWlkSaOyCprq5m5cqVVFdXk5+fzze/+U0ee+wxrc2KOwa97oLLO8JYjHq+MiE3zhYJzke/qmvW1NTE8OHDeeqppzqtsfXwww9HBfaFEXXN+j/ifgxOulvXTPPB6vakp6czZswYjh071un+FStW0NzcHHlUVlYm2ELBQKG21cfh6lZqW30Xbgz4giGa3QF8YpxIE/qVEDmdTkpLS7sMpDObzdjt9qjHhehHDt+gJtH34ViNk398XsVnJ5u61f7Pn55m3Y4yTtS742uYoFM0FaLly5ezbds2ysvL+fe//83XvvY19Ho93/rWt/p8bKNRXVbhdos/rP6A3+8HQK9PzKJST0CNCbrQ1H0Yi0iQpimaDlafPHmSb33rW9TX15Odnc3ll1/Ohx9+GJPV3Xq9nvT0dGpqagBITU0VsyEaIcsytbW1pKamdhm9HWu6G1UdxmJQf5M9IrpaEzQVoo0bN8b1+OH4pLAYCbRDp9NRVFSUsB+Ds0LUPY8oRXhEmqJ5HFE8kSSJ/Px8cnJyCAREAT0tMZlMkUjtRBD2bC4UzBgmEtQYGBjLV5KNpBaiMHq9PmFjE4L+QU89IktEiIRHpAX9atZMIIgFIVmJCEp3x4hE10xbBoVHJBh83DC1ALcv1GX1jnPJSDUxaaiDDGvfk9gJeo4QIkHSoddJjMzuYnmHokBTBfickDUKjGqUd6bVxHyxzEMzhBAJBg+KAsf+CSc/Ud9b7DD9DjB3XNcoSCxijEiQdDS4/ByqbqGmxRu9o+6IKkKSBMYU8LbAoX9EdoeXeYREocWEI4RIkHSU1bl4+/Nqdlc0nt0oy1D6vvq66EuqJ6TTQ8NxaD4JwPod5azbUUaDy6+B1YMbIUSCpMPTWWbGhuPgaVTHhIpmQ2om5F6k7ju9V20vpvA1QwiRIOkI556Omrqv2qs+500CQ1uxxbzJ6nPdYQgFhBBpiBAiQdLhCZwTzBj0qR4RQN6Usw0dw8DiUMuCNxzH3DbVL6KrE48QIkHS0SFpfkMZyCG1O5bWbkG1JMGQ0ZE2FpG7WjOEEAmSjg7LO+qPqs9ZIzs2zihWnxvLxTIPDRFCJEgqFEXBEx4jMhrU2KFwtyxrdMcPpBeBpANPI1bZCYiumRaIgEZB0nHdpHw8/pBaONFdD3436A3qmNC5GMxgy4WWKgp0DUwaOoyhGcld4aQ/IoRIkFRI0jnLO5raikHah6pxQ51hK1CFSGqkYMLF8TdS0AHRNRMkN81tBRYchV23sReoz62n42+PoFOEEAmSiia3n4NVLVQ3ty3vaIua7rRbFqZNiJTWarw+P80ekUQv0QghEiQVJxs9vLO/mo/K6sHTpK4nk3Rq16wrUjLAaMHn8/PS5l28/GFFwuwVqAghEiQV7vYpYlur1I1pOWAwdf0hSYK0XAx6idRAA/6gTDAkZs4SiRAiQVIRtbwjLES2zuvkRWHNRq+TsAYbAPAFhRAlEiFEgqQiasFr6xl1o60bCc+sQ5CQsIeaABHUmGiEEAmSikhUtVEHzmp1Y7c8ohy1aViIhEeUUIQQCZKKcNcsTXFCwKvGDlm7UbDTOgSAFMWDIeQVHlGC6TdCtGbNGiRJ4v7779faFMEAJuIR+WvVDdbsrgMZ22Mwg8URGbAWQpRY+kVk9a5du/jNb37D5MmTtTZFMMD5yoRc3P4QNldbXmpbXvc/nJZDeko1kzP8pKeeZ5ZNEHM094icTiff/va3ef7558nIyNDaHMEAZ0R2GhOHOjB52jyinghRahb5jhQuyYGh6WK9WSLRXIjuu+8+Fi5cyPz58y/Y1ufz0dLSEvUQCDrFVac+d2d8KExqpvrsaYi9PYLzomnXbOPGjezZs4ddu3Z1q/3q1atZtWpVnK0SDFRavAFONXpwGEMU+FrVjalDun+AlEwUFILOOgL+YLerxAr6jmYeUWVlJf/1X//FK6+8gsVi6dZnVqxYQXNzc+RRWVkZZysFA4mqJi/v7K9mz8Fj6gZzWqSAYrdIzaS21ccnhyp49/OT8TFS0CmaSf7u3bupqalh+vTpkW2hUIjt27fzq1/9Cp/Ph14fPdthNpsxm82JNlUwQHC1Td075GZ1Q0+6ZQDGVPQmC+BCdjfF1DbB+dFMiObNm8fnn38ete3OO+9k3LhxPPDAAx1ESCC4EOGoantYiHrSLQOQJHTWLKBejBMlGM2EyGazMXHixKhtVquVrKysDtsFgu4QjiGyhppAD1izenwMg1UdsJY8jRdoKYglms+aCQSxIrLgNdCkbuipRwQY0tTP6L0NKIooPZ0o+tW0wNatW7U2QTCA8fhD6GU/lpATMEWWbfQEY5rqRZkDzfiCcqSyhyC+CI9IkDS4/CFSAo0Y9VLbjFnPgxINaVnoJUgJNuMT1TwSRr/yiASCvjBvXA7BU6dJqdP3qlsGQEomQ2xmQEan+AFjLE0UdIEQIkHSUDzECk1eaND1qlsGgNHCiLwstUy14gasMbVR0Dm96podP3481nYIBLHBXa8+p/Z8xixCSrr67G3uszmC7tErIRo1ahRz587l5Zdfxuv1xtomgaDHOH1BDla10FTXlh62tx4RoJgdBGUZv6s+RtYJLkSvhGjPnj1MnjyZZcuWkZeXx3e/+10+/vjjWNsmEHSb6mYv735WSeXpNiHq7RgRsKcWdpU3cvyEqHOWKHolRFOnTmXt2rWcPn2adevWUVVVxeWXX87EiRN56qmnqK2tjbWdAsF58bSfMTNZwZTa62PpUhwAyJ6mGFknuBB9mr43GAzcdNNNvP766zz++OMcO3aM5cuXU1hYyB133EFVVVWs7BQIzovbHyQ10IhR34eB6jb01ra8WF4RXZ0o+iREn3zyCT/4wQ/Iz8/nqaeeYvny5ZSWlrJ582ZOnz7NokWLYmWnQHBe3IEQKcEmVYj60C0D0EcGq1tARFcnhF5N3z/11FOsX7+ew4cPs2DBAl566SUWLFiATqfqWklJCRs2bKC4uDiWtgoEXeL2tXXNUqVerTFrj7HNI1ICXgh4+tTNE3SPXgnRc889x9KlS1myZAn5+Z2XasnJyeGFF17ok3ECQXdx+4Nkh7tmffSILGYLfn0qQdmnTuELIYo7vRKizZs3U1RUFPGAwiiKQmVlJUVFRZhMJhYvXhwTIwWCC+HzeTEHWzHq7T3PQ3QOFqMOn8FGMOgFbxPYu1EXTdAnejVGNHLkSOrq6jpsb2hooKSkpM9GCQQ9Ze4wPSOzraSk2frswVjNBrKycshMM4mgxgTRK4+oq/QITqez22lfBYJYMtTsApsFbDl9PpbVbODiscVQcRrEFH5C6JEQLVu2DABJkli5ciWpqWd/eUKhEB999BFTp06NqYECQbeIVO3o2/hQBLHMI6H0SIg+/fRTQPWIPv/8c0yms0XoTCYTU6ZMYfny5bG1UCC4AE5fkMZTlTi8Aex9HKgOo5jthGQZyd2IyEgUf3okRO+//z6g5pZeu3Ytdrs9LkYJBD3hTIuXyrIysvQeJsXII9q4v5Xi8kYmDAWHooAkxeS4gs7p1RjR+vXrY22HQNBrXB4P5qATo8kQs66Z3uJAQSIYDIDfCWZbTI4r6JxuC9FNN93Ehg0bsNvt3HTTTedt+8Ybb/TZMIGgu/iaawEFvdkKxtjE/JhNBvwGK8GQoo4TCSGKK90WIofDgdTmnjocjrgZJBD0lFCrushalzYkZl0oi1GPT28jKDerQuQYFpPjCjqn20LUvjsmumaC/kTIVYsO0Kf1LZCxPRajnmaDjaDcKGbOEkCvAho9Hg9utzvyvqKigqeffpp33303ZoYJBN1FcapT90ZbDIXI0BZdHe6aCeJKr4Ro0aJFvPTSSwA0NTUxc+ZMnnzySRYtWsRzzz0XUwMFggshuVUhMqfnxuyYatcsjaAshCgR9DpD4xVXXAHAH//4R/Ly8qioqOCll17imWee6fZxnnvuOSZPnozdbsdutzN79mzefvvt3pgkGKyEAlyUITMy24otKy9mh820mijIy8NmMQghSgC9mr53u93YbOoswrvvvstNN92ETqfjS1/6EhUVFd0+zrBhw1izZg2jR49GURRefPFFFi1axKeffspFF13UG9MEgw13PekpRjDaICV2cW2FmakUTh0NH6aczUskYoniRq+T57/11ltUVlayadMmrr76agBqamp6FOR4/fXXs2DBAkaPHs2YMWN47LHHSEtL48MPP+yNWYLBSGRpR3bshcJsB0kHclCNJRLEjV4J0cqVK1m+fDnFxcXMmjWL2bNnA6p3NG3atF4ZEgqF2LhxIy6XK3I8geBCtNZXUdPqpYHYR/krkkTA2FbXTHTP4kqvumbf+MY3uPzyy6mqqmLKlCmR7fPmzeNrX/taj471+eefM3v2bLxeL2lpabz55ptMmDCh07Y+nw+fzxd539LS0hvzBUlEY+1pTtW68NuMXBnD4/qCIZ7bWsr4ah/zCxT0IpYorvS60mteXh55edGDgzNnzuzxccaOHcvevXtpbm7mj3/8I4sXL2bbtm2ditHq1atZtWpVb00WJCEhpxrMqE/re/qP9pj0OiQkfAYbIdmrCpEgbvRKiFwuF2vWrGHLli3U1NQgy3LU/p5UgjWZTIwaNQqAiy++mF27drF27Vp+85vfdGi7YsWKSCoSUD2iwsLC3lyCIBkI+pHdaqUNkz22QiRJUiRTYyB0BpMQorjSKyG6++672bZtG7fffjv5+fmRpR+xQJblqO5Xe8xmM2azOWbnEgxw3HX4gzIBXQp2W+zHiCKxRCKoMe70Sojefvtt/v73v3PZZZf16eQrVqzguuuuo6ioiNbWVl599VW2bt3Kpk2b+nRcwSDBVYcvKOMxZWC3GGN+eItRh9NgIyTLQojiTK+EKCMjg8zMzD6fvKamJlKI0eFwMHnyZDZt2sRXvvKVPh9bkPworlr8wRBuc4YaeBhjLEY99YY0ggFFxBLFmV7dvUcffZSVK1fy4osvRqWL7Smi3JCgLwRaaggp4DFmkGaOvRCZDXr8eisBH2djiUQ6kLjQq7v35JNPUlpaSm5uLsXFxRiN0W7xnj17YmKcQHA+9J56xufbGDJqDAZ9n4oWd0q+w0JITsd0xgH4RF6iONIrIbrxxhtjbIZA0EOCPvT+VtJTTKTHqYTVlMJ0phSmw6c50FQp8hLFkV4J0UMPPRRrOwSCnuGsUZ/NaWBMie+5LA6gUgxYx5Fe+7NNTU387ne/Y8WKFTQ0NABql+zUqVMxM04g6BJnDc2eACeDdhpc/ridRpYV/Ma27pgQorjRK4/os88+Y/78+TgcDsrLy7nnnnvIzMzkjTfe4MSJE5FcRQJB3HCeoabVyz6XgZI6J5nWvs/insuJejdvfHqS0bKXhUaEEMWRXnlEy5YtY8mSJRw9ejSqsuuCBQvYvn17zIwTCLrEeQZfUMZlysIWhxgiALNRh6JAK2Lha7zplRDt2rWL7373ux22Dx06lOrq6j4bJRCcFzkErlp8ARmXMSsuwYwAFoNaWtEZEaK2WCJBzOmVEJnN5k5Xvh85coTs7NjlDRYIOsVdTygUxKPo8RnsOFLi5xEBOEkhpCDyEsWRXgnRDTfcwCOPPEIgEADUBYInTpzggQce4Otf/3pMDRQIOuA8gy8QwmXMwmzSYzHGPoYIwGzQIUmgSHqCxjR1o1eknokHvbqDTz75JE6nk+zsbDweD1deeSWjRo3CZrPx2GOPxdpGQYJ5+cMK/nngDCG5n3ZDnGfwBmTcpizSU0wxXXTdHnUFvto98xvEzFk86dWsmcPhYPPmzezYsYN9+/bhdDqZPn068+fPj7V9Ag3wBkJ8fqoZnQ6uGhe7yhgxw1mDNxjCZRxCRpy6ZWEsBh0efwifIQ0bCCGKEz0WIlmW2bBhA2+88Qbl5eVIkkRJSQl5eXkoihK3XydB4vjymGz+/lkV+yqbmZDvIM9hufCHEoWiQGsV2WlmrhwzEaMjI66nG55lJdsWQq9PBydCiOJEj7pmiqJwww03cPfdd3Pq1CkmTZrERRddREVFBUuWLOlxmlhB/2FnaT2nmjwoisKYXBvj89X8Ph+V1Wts2Tm46yHox2gyUThseNxFcu64HBZOzicjs20SRghRXOiRR7Rhwwa2b9/Oli1bmDt3btS+9957jxtvvJGXXnqJO+64I6ZGCuJLbauPD4/Xs6u8gXu/PAKLUc/MkkwOVbdwvNZFk9tPeqpJazNVWtoi9235oIvPIHWnWBzqsxCiuNCjO/n73/+e//mf/+kgQgBXXXUVDz74IK+88krMjBMkhmM16pR08RBrZHA202pieJaa4uXA6X40U9RyGkVR+MKZxoHTLQkZUJdlhYCxLQOkt1nEEsWBHgnRZ599xrXXXtvl/uuuu459+/b12ShBYqlscANQkmWN2n5RgeoFHKhqQekvX76W0/iCMp80pLDl4Bl0cR6S3F3RyDPvHeX9co+aFE0Ogt8V35MOQnrUNWtoaCA3t+tZlNzcXBobG/tslCBx+IIhqpq9ABRlRie5GzHEypVjsxmZndY/JiGCfnDV4gmEcJqySbfGb+o+jEmvLvPwBFFzEXlb2vISpcX1vIONHnlEoVAIg6Fr7dLr9QSDwT4bJUgcVU1eZEXBkWLEkRo9FW7Q65helBG3yOUe01oFioKTFPyGNLKs8R+3SjGpXxFvICTGieJIjzwiRVFYsmRJl5U0uqq+Iei/nGlRvaH8/jRF3xVNJwCoN6ilgzITIkTqV8TtD0GayEsUL3okRIsXL75gGzFjNrCoc6q5fHLDQiSHoPxf0FoN2WMhfwqHzrRyuLqV2SOyyLFrKFhtQnRGUocHEuIRtQ3ee4RHFFd6JETr16+Plx0CjVgwKY/ZI7MwG9p66Qf/CjUH1dcNxyHo5VhTEcdrXQxJM2snRKGgOmOGwkmGAAnyiNqEyBeQCZns6EEIURxIYCCGoD8iSRKZVhNWswHqS1URknSQe5HaoGw7Y9JUr+l4rYYrz1tOgRzEp0ulBTs6SUpIbJPFqItUEPKK9WZxI/Y1WAQDl5O71OehF8OoeRD0Qn0pxe7P0EnjqXP6tQtubKoAwDykmKUlI2jxBtDHe+4eVahHZqeh10ko5rZB+3AsUX+YSUwShBANYr443cyJejdj8myMTAtAQ5n65Rp2sfpcfDnUl2KqP8Rw21jKWiRKa11cPFwDIao/BoCUOQJHascZvnhy/ZQC9YUcio4lElP4MUPTrtnq1au55JJLsNls5OTkcOONN3L48GEtTRpUVDa4OVTdSr3TD7Vt/+/pwyGlbSGpvUAtnyOHGK9TB4pLteieeVug9YwqAlkjE3/+MDr92bpmonsWUzQVom3btnHffffx4YcfsnnzZgKBAFdffTUul4hcTQThGbOsNFPE4yB7THSjvIkAFAWOA3C6yYPHH0qYjcBZ2+wFbCl18uHx+oTbIMsKwZAsZs7ihKZds3feeSfq/YYNG8jJyWH37t18+ctf1siqwYEsKzS2leHJMoWg+aS6I/McjyN7HBzdTIqvgUKzEzk1G7c/SIpJnzhj24TIlz6Sz0pVAZhamJ6w0287UsunJxqZVZLFbFHjLC70qzGi5mb15mZmdl4axufzRQVNdpY3W9A9mj0BgrKCUS/h8Ferg6+pWZCSHt3QmAKZI6DuKF8b5kI/YnpiDfW71LEroM5cBHiwpxgji3MTgVEnqcs8AkHhEcWJfjN9L8sy999/P5dddhkTJ07stM3q1atxOByRR2FhYYKtTB7qXaqgZ1rNSGFvKL2L/88howHQNxxLhGnRnDkAigz2fKqD6uBwjq3zyP54Efb+PH7RNYsX/UaI7rvvPvbv38/GjRu7bLNixQqam5sjj8rKygRamFzUt40PZVpNZ7tlXdV1zxypDhS3VoOvFY8/RIs3EH8jFQWqP1Nf506KLEfRTIhEdHXc6Bddsx/+8If87W9/Y/v27Qwb1sWXAbWMUVfr3AQ9wxuU0UkSWSkS1J9RN3YlROY0NRFZy2kO7v+UTY15TCxwMH9CnPNZN1WoNe71BsgZz+kytWZeviPOte7PIbLMw39O10zEEsUMTT0iRVH44Q9/yJtvvsl7771HSUmJluYMKq4ck80PrxrFFIdHjY8xp4ElvesPtHXPsn0VKAocr3PGP0dR5cfqc95kWmQjrd4gOklKeA7tqPVmZrvISxQHNBWi++67j5dffplXX30Vm81GdXU11dXVeDweLc0aNOh1EiZPrfrGln/+X/esUQBk+quw6EK4fCGq27pKcaGxXF1yIkkw7BKa3QGMeolsmxmTIbF/tu3HiBRJJ2KJ4oCmQvTcc8/R3NzMnDlzyM/Pjzz+8Ic/aGnW4MLZ1i1Lu0A3y5oNFjs6JcSEFDX5XWlNnDyCUBCOblZfF0yH1EwKM1P5/pxRXD8lPz7nPA8pRj1FmamMzk1TU9OKcaKYo+kYUb9JPzrIqGn18t7BGvIcFuY41XEXbHnn/5AkqV7RqT2M0FezhyEcr3Ny+eghsTVOUeDYZnDVqaEDxZdHdul1ErY41bk/Hwa9jq9f3G78TMQSxZx+M2smSBwNLj9VzV5qm1zgaisXdCGPCCLBjnmBU+hQZ97CQZExQZahdAuc3qsK34QbwJTa/36whEcUc4QQDUKa3OrUe46+RY3RMaacHfc4HxnDQW/AGHAyyqom3D9ypjU2RjlrYM+LUNmWAWDUV9RASuBojZP1O8rYVd4Qm3P1kpBY5hE3+sX0vSCxhIUoiyZ1gy2ve9PQeiOkF0P9MaanNVBUVMLo3D6uQJdDULEDKnaqomgww5hrzuZDAirq3TS5A2q6Vo3YfOAMX5xu5stjspluE0IUa4QQDUKaPWp3KiPU5mF0p1sWJmsE1B8jP3iK/GFX9c0QdwMc+LMaKAnqgtvRV0d5Z4qiUFGvDoqfW2UkkRj16jIPty8E2SKWKNYIIRqEhD0iW7AH40NhskYB76oZE/1uMPVSHFpOw76NEPSB0QJjrlUX2J7zpW5yB2j1BtHrJIamJzaQsT1Ws/pVcfmDYM4QeYlijBgjGmR4AyG1i6PIpAbaPKILzZi1x+KAtGxQFEL1peytbOL1TyrxB+XuH8NZA/t+r4qQvQBm3AU54zv1LMrbvKF8hyXh8UPtSW2LJXL7gyIvURwQQjTI8PhDOFKMZOndGJSQunzifBHVndE2e6ZrKGXviUZONno4UNXNTAh+N+z/k1osMb0QpnwLLPYum5fWqkI0Iltbr8PaVlbI5Wsbpwr/n3lEQdFYIIRokJFhNbH08hK+M7Gtm5M6BHQ9/DNoi7KWGsuYMkwVkb0nGrs3zX70XfA0qelGJn4dDF2nnfUGQpxqVKPsR2Zbu2yXCFLN7TwigNS2VDUebWfykgUhRIMUnbtOfZGW0/MP24eqU/4BLxNSmzAZdDS6A5TXu8//uUiVEAkm3Kge4zwEZYVJw+wUD0nVJmF/O6ztCi3KsgIpbULkFkIUC4QQDVZcNeqzNbvnn9Xp1OKLgLn+EBcVqF7RJ+UNXXtFQT8c2aS+HnYJ2C+8VCPNbOCqcbl8bVrXGRkSRXiZx7g8G0FZOesRueu1NSxJEEI0yPjz3lO8tquSlroqdUNvhAjOxvnUHmL6MLXczslGD5UNXSxYLv9AHdi1OKD4it6dU0N0OomvXzyMayfmq4PmqVnqDk+DOoUv6BNCiAYZ1c1eqhpa0fma1A29FSJHoTrIHPRjd5YzaZgaW7PzeF1Hr6j1DJz8RH095przjguFqWr2UNng7n/LO8JYHGohylAQfDGKLh/ECCEaRPiC6tR9SqARi0FSY4B6GwMjSZDbltL31G4uKc6kZIiVy0dnI7WfhpdlOPK2GjWdM67b5YA+Ot7AH3ef5JOK/jUrFZIVAiFZncIP5/cW3bM+I4RoENHcFsiYSRMGna733lCYodPVL2TzSdJ8tdw4bWjHoMOTu6ClSl26MWp+tw7r9gepaBv4HqXxtH173jt0hme2HGVvZZO6oX33TNAnhBANIpo8qhBl69q6EtZezJi1x2xTo6EByrZFjZV4AyF1Rqlsu7ph1LzuLawFDlW3IisKeQ4LGVZtZ8vaY9KrU/hOX9sUfrgQpbt/eW0DESFEg4jw0o5MpUndYI1BLqHiy1WvqKEM6o4gywo7jtWxfvsRnHteU5dBZJZA3uRuHU5RFPafUqOVJ+R3HeioBda2WCKn95xYItE16zNCiAYRTW51satdblI39CaG6FxSM9XpeIBDf0NqOUljUwMjqv7B8bIyZKMVxl7X7YWhJxs91Dv9mAw6xuV3z4NKFOGkbGc9IhHUGCuEEA0iTAYdGcYAVryqMKTGKLti8RVqBZCgH+nTl7m66XWygtW0BHV8kjbnbP6ebhAefxmfb8NsSGA12W5gs6hBja3hUkrhMSJvszp7Jug1QogGEXPG5rBkipUhaWZ1rVQ3ptG7hd4Ak2+GvIkgSZj0OoqKR/FFzg38u85CeV33clsHQ3KkXtrkYemxsS2GhIXI7Q+puatNVvX/UFHEmrM+ItKADDacbVU7YjE+1B6DGcZfD6OvATlIjimVkQfO8PmpZv6xv4rbZhZdcJmGQa/jtplFVLd4VbHsZ6QY9eh1EiFZwekL4kgxql5ly2lw16lZCQS9QnhEgw1XmxDFYnyoMwymSI6iOWOzyXdY8AVk/vpZlepFXABJkhJeQLG7SJLE6Jw0xrcfRA+HQDhrtDEqSRBCNEg4VtPK89uPc/BYW/36vsYQdQODXsdXpxRgsxiYXpSOXtf5gHUgJLOrvKFnOY004rpJ+Vw7MU/1huDs/2NY4AW9QnTNBgmN7gBOrx+9px6slr7HEHWTNLOBO2YXRyU1UxQlEn0tywrvfnGGI2daOXrGybdmFkZHZvd3wt0xV522dgxwNPWItm/fzvXXX09BQQGSJPHWW29paU5S0+QOkBJsJkUvq0nwwzEwCaC9CDl9QV7+sIJ/l9ax/1Qzf9x9kiNnWtFJEleMHjIgRCgkK2rAJpz1iLxNaoYBQa/QVIhcLhdTpkzh2Wef1dKMQUGT24/VX4fFqFdzVGv0hf/oeD11Tj8fHW9g84EznGryYNRLfHVKPoUaJsfvLvtPNfPMlqO8e6CtQq7Jqo6JKYoIbOwDmnbNrrvuOq677jotTRg0NHsCZPrrsNh1PctRHWPmjs1haEYKpTUufMEQ2TYzUwrTsWtQwbU3pJjOia4G1SvyV6jjRN3IsyToiBgjGgQEQjKt3iCF/losBn3PqnbEGJ1OYlyenXF5/Wv5RncJxxKF450AVYgaK8SAdR8YUELk8/nw+XyR9y0t3UzYPshpcgdAUXCEGjDo0zT1iAY64dkyjz+ELxhSo7/DMVlCiHrNgJq+X716NQ6HI/IoLCzU2qQBgaIojEjzk25SkHTG2C3tGISYDfpI96y5LZtBZAZSxBL1mgElRCtWrKC5uTnyqKys1NqkAUGO3cKikXq1O5SW3fOqHYIo0tu8onB+J9Jy1MF/v0tka+wlA6prZjabMZv7X+j/gKDllPpsH6qtHUmAI8VIVbP3rEekN6oLYF11avnsbuZdEpxFUyFyOp0cC0f6AmVlZezdu5fMzEyKioo0tCy5CIZkDM1t3qMQoj5TmJmKJElktk/aZstvE6IqGDJaO+MGKJoK0SeffMLcuXMj75ctWwbA4sWL2bBhg0ZWJReyrPDb9w8x69RhJg21Y3JoX5pnoDNxqIOJQ89JbWLLh+rP1UIBgh6jqRDNmTOn/1ZpSBJavAHMnjMEQyEMqY7zlncW9AFbW0hEa5Ua3DgAIsT7E2LUMslpcPmx+aqxGPXohDcUM0KyQr3Tp1Z9hbZodZ0YsO4lQoiSnAaXH4evilSTXq1FJugziqLw/AfHeWlnBY1t6XfRG8HalrGxtVo74wYoQoiSnIZWZ8QjIrNEa3OSAkmSIoGNDa52C11tBepzy0kNrBrYCCFKcry1ZUiKjMWWebb8jaDPhGfM6tsLUbjr2yyEqKcIIUpiQrKCUl8GQGruaDGAGkOGpLUJkbOdEKW3dX1bqyEU6ORTgq4QQpTEBIIhxhuqcaQYSc0XsS2xJNOqBtY2uM6ufcSSrpbwlkNqHmtBtxFClMRYPGcYk64wYVgWUuYIrc1JKsJds0Z34GwubkkS3bNeIoQomak9qD4PGa3O6ghiht1iwGTQEZKVSOFK4OzMpBCiHjGg1poJekAoiOvEPlJQ0GWP19qapEOSJKYMS8eolzAb2xWCTG9bmtR8Qi26qBdfse4g/peSFLnmEF9UVOPTpTJpVhHpWhuUhFw+upN0KtZsdZzI54TmShEy0U1E1ywZURScx3cSkhXq7BNwpIqMBQlDkiA8HtdwXFtbBhBCiJKR+lLcdSeRJQO6oVMHRGWMgYiiKLR4Axw90xpdPFIIUY8RQpRsyCEo24rTG6DadhE5WSIbYzx5+cMK/vZZFfXOdtP4GcWqZ+SqA0+jZrYNJIQQJRuVH4OzlsaAgdO2KRSkW7S2KGmRJIk8u/r/e6rJc3aHMeXsoHXNIQ0sG3gIIUomWk5D+Qd4AyEOpc1ENqSQ5xBCFE/CtdgqGz3RO3LaZiprDiTYooGJEKJkwdcKX7wJcogz5uHUpY6mIN2iVpkQxI3CDFWITja6z6YEARgyVk0L4qwBlyi8eCGEECUDAQ/s2wjeFkjNJH3a1/jy2GwmD0vX2rKkJ8dmxmzU4QvInGn1nt1hSj07dV/9mTbGDSCEEA10gj747DV1YNScBpNvxmFP4+LhmYzNE0nc441OJ1HU1j0rrXFF78yfqj5X7VODGwVdIoRoIBPwwL7fq2NDRgtMvlWk+tCAMbmq4JfWOqN3ZI1SU/MGPGKs6AIIIRqo+F2w91VoqTorQmnZfHS8ngOnW/AHZa0tHDQUZ1n5yoRcbp5xTgZMnQ4KpqmvT3wIsrgnXSGEaCDia1VFyFkDJitM/TbY82n1BvjweAObvqiOrs0uiCsmg46JQx2RCrBRDL1Ync5314uxovMghGig4aqDT19uGxOyqSKUppY83lfZjKwoDMtIYUiaWNahBYqiREdZG8ww/FL1dfkHajdN0AEhRAOJxnLY8xJ4mtSxoGnfjiRsd/mC7DvZBMC0IjFOpAVldS5e/fgEHxytjd5RMB1SM9WFsEc3q+WGBFEIIRoIKIo6xrDvD+osmWMoTL89amD6g6O1+IMyeQ4LI7OtGho7eNFJUNPiY19lMzXtp/L1Bhi3UF32ceYL9V4KougXQvTss89SXFyMxWJh1qxZfPzxx1qb1H9w1aszY6XvgyJD7gSYcps6NtTG/lPNHKxqRZJgzthsschVI4ZnWRmZk4asKPz9syo8/tDZnY5hMGq++vr4VijfITyjdmguRH/4wx9YtmwZDz30EHv27GHKlClcc8011NTUaG2atjhr4fDbsOt30Fih/qqOvQ7G3xCVbMsbCPHB0ToAZo/IIt+RopXFAuAr43OxWQw0uQO8vruS2tZ2i2GHzYDhs9XXZdvVIFRRohoASdG45vOsWbO45JJL+NWvfgWALMsUFhbyH//xHzz44IPn/WxLSwsOh4Pm5mbs9gFaSlmWIehRp+NdtWoFiIbj6mB0mCGjYeRVKCkZ+IIyzZ4AKSY9doua/vVko5tjNU6uHCO8of5Ag8vPG3tO0uoNopMkJhc6mDs252yDU3vg2BaQ24Ic7QVq6hB7gdrdNttAZ0iKqivd/Y5qmqHR7/eze/duVqxYEdmm0+mYP38+O3fu7NDe5/Ph8539hWlpaeneiRrKoHRL565w1Dbl/Ns72dbqC3C4quXsJ8NtFPWfoRkpFLQtPHX5gnxxurndIWT0cgAJBUWBPIeFoemqR+MNKnzQlMEZ+0ScDQUo9Y2E5HoCIfX4XxqRxeyR6kD1sIxUhrWteRJoT6bVxK0zi3j/UA3Hapz4Amfjh4Ihmd8etZMamk9R0y4y3MeRlCbggJpTLdWkLqTV6QlKRvaeakVBB5KEIukACQUJJMiymhiVnQaArMCuigYAJg11kGpMwBrDybeoAZsxQFMhqqurIxQKkZubG7U9NzeXQ4c6pk9YvXo1q1at6vmJgj61qxMPvAEC7q4FUfaGIKXtDzEQJORzR+0PjyIEdWbcKflQUALpRXjMQ9m/q81tbz/WAKSY9MhifKFfk2Y2cP2UAmpavITa3atWbxBfQMaHlUb7HIypl5DhPYHDe5qUQCOpStsPrRwC+fx/W4piglR1UFxSFORWVYhw+sGUgK+2ErsAzQGVs3rFihUsW7Ys8r6lpYXCwm7Uc08vhCm3qq+j3F2p623d3G4MyhS1+tXd7baHu0g2iwEsaukZU0hmhNuP1P68hhQwWECnJ9VsALN6S2whmdtnW9qfFYNOR6pZj1Gv+dCeoJvk2KPTsNgsBpZcWkxAlgmGlLYflLERR9pq0oMFCPrQBbwUjXaqXrYiA0rbawVQsBh10FbWCKCoWBUlg80M+gR060yxm53VVIiGDBmCXq/nzJnoAbszZ86Ql5fXob3ZbMZs7kWgnskatyTmFmBoZvfaGoFcR/faGvQ6EZSYhBj0OjLaiUfXDc3oLHaG2nIu3Bb1d7C7f4f9EU1/Wk0mExdffDFbtmyJbJNlmS1btjB79mwNLRMIBIlE867ZsmXLWLx4MTNmzGDmzJk8/fTTuFwu7rzzTq1NEwgECUJzIbrllluora1l5cqVVFdXM3XqVN55550OA9gCgSB50TyOqC8kRRyRQJDEdPc7KqZfBAKB5gghEggEmiOESCAQaI7mg9V9ITy81e2lHgKBIKGEv5sXGooe0ELU2toK0L3oaoFAoBmtra04HF1H8w7oWTNZljl9+jQ2m61frjoPL0GprKxMylm9ZL6+ZL42SNz1KYpCa2srBQUF6HRdjwQNaI9Ip9MxbNgwrc24IHa7PSn/mMMk8/Ul87VBYq7vfJ5QGDFYLRAINEcIkUAg0BwhRHHEbDbz0EMP9S5jwAAgma8vma8N+t/1DejBaoFAkBwIj0ggEGiOECKBQKA5QogEAoHmCCESCASaI4Soh/S0Ku3rr7/OuHHjsFgsTJo0iX/84x9R+xVFYeXKleTn55OSksL8+fM5evRoPC+hS3pybc8//zxXXHEFGRkZZGRkMH/+/A7tlyxZgiRJUY9rr7023pfRJT25vg0bNnSw3WKJToQ/UO/dnDlzOlybJEksXLgw0ibh904RdJuNGzcqJpNJWbdunfLFF18o99xzj5Kenq6cOXOm0/Y7duxQ9Hq98rOf/Uw5cOCA8r//+7+K0WhUPv/880ibNWvWKA6HQ3nrrbeUffv2KTfccINSUlKieDyeRF2Woig9v7bbbrtNefbZZ5VPP/1UOXjwoLJkyRLF4XAoJ0+ejLRZvHixcu211ypVVVWRR0NDQ6IuKYqeXt/69esVu90eZXt1dXVUm4F67+rr66Oua//+/Yper1fWr18faZPoeyeEqAfMnDlTue+++yLvQ6GQUlBQoKxevbrT9jfffLOycOHCqG2zZs1Svvvd7yqKoiiyLCt5eXnKz3/+88j+pqYmxWw2K7///e/jcAVd09NrO5dgMKjYbDblxRdfjGxbvHixsmjRolib2it6en3r169XHA5Hl8dLpnv3i1/8QrHZbIrT6YxsS/S9E12zbhKuSjt//vzItvNVpQXYuXNnVHuAa665JtK+rKyM6urqqDYOh4NZs2Z1ecx40JtrOxe3200gECAzM7qmzdatW8nJyWHs2LF8//vfp76+Pqa2d4feXp/T6WT48OEUFhayaNEivvjii8i+ZLp3L7zwArfeeitWa3SdskTeOyFE3eR8VWmrq6s7/Ux1dfV524efe3LMeNCbazuXBx54gIKCgqgvxLXXXstLL73Eli1bePzxx9m2bRvXXXcdoVDoPEeKPb25vrFjx7Ju3Tr+/Oc/8/LLLyPLMpdeeiknT54Ekufeffzxx+zfv5+77747anui792AXn0v6B+sWbOGjRs3snXr1qgB3VtvvTXyetKkSUyePJmRI0eydetW5s2bp4Wp3Wb27NlRtfUuvfRSxo8fz29+8xseffRRDS2LLS+88AKTJk1i5syZUdsTfe+ER9RNelqVFiAvL++87cPPPTlmPOjNtYV54oknWLNmDe+++y6TJ08+b9sRI0YwZMgQjh071mebe0Jfri+M0Whk2rRpEduT4d65XC42btzIXXfddcHzxPveCSHqJr2pSjt79uyo9gCbN2+OtC8pKSEvLy+qTUtLCx999FFCK932tuLuz372Mx599FHeeecdZsyYccHznDx5kvr6evLz82Nid3eJRUXhUCjE559/HrF9oN87UENLfD4f3/nOdy54nrjfu4QNiycBGzduVMxms7JhwwblwIEDyr333qukp6dHpnVvv/125cEHH4y037Fjh2IwGJQnnnhCOXjwoPLQQw91On2fnp6u/PnPf1Y+++wzZdGiRZpNAffk2tasWaOYTCblj3/8Y9QUb2trq6IoitLa2qosX75c2blzp1JWVqb885//VKZPn66MHj1a8Xq9Cb223lzfqlWrlE2bNimlpaXK7t27lVtvvVWxWCzKF198EWkzUO9dmMsvv1y55ZZbOmzX4t4JIeohv/zlL5WioiLFZDIpM2fOVD788MPIviuvvFJZvHhxVPvXXntNGTNmjGIymZSLLrpI+fvf/x61X5Zl5Sc/+YmSm5urmM1mZd68ecrhw4cTcSkd6Mm1DR8+XAE6PB566CFFURTF7XYrV199tZKdna0YjUZl+PDhyj333NMhFieR9OT67r///kjb3NxcZcGCBcqePXuijjdQ752iKMqhQ4cUQHn33Xc7HEuLeyfSgAgEAs0RY0QCgUBzhBAJBALNEUIkEAg0RwiRQCDQHCFEAoFAc4QQCQQCzRFCJBAINEcIkWBAsWHDBtLT0yPvH374YaZOnRp5v2TJEm688caE2yXoG0KIBJ0SThX6ve99r8O+++67D0mSWLJkSVT7WAtAcXExTz/9dNS2W265hSNHjnT5mbVr17Jhw4bI+zlz5nD//ffH1C5B7BFCJOiSwsJCNm7ciMfjiWzzer28+uqrFBUVaWJTSkoKOTk5Xe53OBxRHpNgYCCESNAl06dPp7CwkDfeeCOy7Y033qCoqIhp06b16dideSo33nhjxMuaM2cOFRUV/OhHP4okb4eOXbNzae+ZLVmyhG3btrF27drIMcrKyhg1ahRPPPFE1Of27t2LJEkJT1EiUBFCJDgvS5cuZf369ZH369at484774z7ed944w2GDRvGI488QlVVFVVVVT0+xtq1a5k9ezb33HNP5BhFRUUdrglg/fr1fPnLX2bUqFGxugRBDxBCJDgv3/nOd/jXv/5FRUUFFRUV7Nixo1v5a/pKZmYmer0em81GXl5er5KNORwOTCYTqampkWPo9XqWLFnC4cOHIyV3AoEAr776KkuXLo31ZQi6iUgVKzgv2dnZLFy4kA0bNqAoCgsXLmTIkCFam9UnCgoKWLhwIevWrWPmzJn89a9/xefz8c1vflNr0wYtwiMSXJClS5eyYcMGXnzxxZh5DTqdjnMz0AQCgZgcuzvcfffdkYH49evXc8stt5Campqw8wuiEUIkuCDXXnstfr+fQCDANddcE5NjZmdnR437hEIh9u/fH9XGZDL1uWpEV8dYsGABVquV5557jnfeeUd0yzRGdM0EF0Sv13Pw4MHI665obm5m7969UduysrIoLCzs0Paqq65i2bJl/P3vf2fkyJE89dRTNDU1RbUpLi5m+/bt3HrrrZjN5l51CYuLi/noo48oLy8nLS2NzMxMdDpdZKxoxYoVjB49OqF5pgUdER6RoFvY7Xbsdvt522zdupVp06ZFPVatWtVp26VLl7J48WLuuOMOrrzySkaMGMHcuXOj2jzyyCOUl5czcuRIsrOze2X38uXL0ev1TJgwgezsbE6cOBHZd9ddd+H3+xMyCyg4PyJVrGDQ8sEHHzBv3jwqKys7FCgUJBYhRIJBh8/no7a2lsWLF5OXl8crr7yitUmDHtE1Eww6fv/73zN8+HCampr42c9+prU5AoRHJBAI+gHCIxIIBJojhEggEGiOECKBQKA5QogEAoHmCCESCASaI4RIIBBojhAigUCgOUKIBAKB5gghEggEmvP/Aaq811wy81CFAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from ml_utility_loss.loss_learning.visualization import plot_density_3\n", + "\n", + "_ = plot_density_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "745adde1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:55:58.966193Z", + "iopub.status.busy": "2024-03-22T20:55:58.965464Z", + "iopub.status.idle": "2024-03-22T20:55:59.192408Z", + "shell.execute_reply": "2024-03-22T20:55:59.191390Z" + }, + "papermill": { + "duration": 0.248328, + "end_time": "2024-03-22T20:55:59.194679", + "exception": false, + "start_time": "2024-03-22T20:55:58.946351", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from ml_utility_loss.loss_learning.visualization import plot_box_3\n", + "\n", + "_ = plot_box_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "eabe1bab", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-22T20:55:59.232725Z", + "iopub.status.busy": "2024-03-22T20:55:59.232388Z", + "iopub.status.idle": "2024-03-22T20:55:59.521439Z", + "shell.execute_reply": "2024-03-22T20:55:59.520399Z" + }, + "papermill": { + "duration": 0.310375, + "end_time": "2024-03-22T20:55:59.523531", + "exception": false, + "start_time": "2024-03-22T20:55:59.213156", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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zc3NMFESo7HoBnvSqfBu89q2bRsWLVqkskajra0tFi5ciG3btvE614kTJ/DEE08gICAADMNg79697R5z7NgxDBkyBEKhEL1790Z8fDzPK+g86OYvsWa8k1dDQwMyMzNbbc/MzIRcLud1rpqaGoSHh+Orr77Sav+cnBxMnDgRY8eORWpqKhYsWICXX34Zf/75J6/37Yy0HfZDBS9iKXj3sJ81axbmzJmDGzduIDIyEgBw/vx5rF69GrNmzeJ1rgkTJmDChAla779582b06NEDa9euBQD069cPp06dwrp16xATE8PrvQkhlo138lqzZg38/Pywdu1abmocf39/vPvuu3jnnXf0HqCys2fPIjo6WmVbTEwMFixYoPEYsVgMsVjMPa+srDRUeFaB2ryIpeBdbbSxscF7772HgoIClJeXo7y8HAUFBXjvvfdU2sEMoaioCL6+virbfH19UVlZibq6OrXHxMXFqdwtFYlEBo3RnFCTF7FmHeqk6ubmZvZ3GJcsWYKKigrukZeXZ+qQTEL7EhUVvYhl0GlWiV9++QW7du1Cbm4uJBKJymvJycl6CUwdPz8/FBcXq2wrLi6Gm5sbHB0d1R4jFAohFAoNFhMhxDR4l7y+/PJLzJo1C76+vkhJSUFkZCS6dOmCmzdv8mp810VUVBQSExNVtiUkJCAqKsqg72upOltXiU52uZ0e7+T19ddfY8uWLdiwYQMEAgHee+89JCQk4M0330RFBb9pSKqrq5GamorU1FQAiq4QqampyM3NBaCo8ilPLT137lzcvHkT7733HjIzM/H1119j165dePvtt/leRqdDlUFibXgnr9zcXIwcORIA4OjoiKqqKgDAtGnT8OOPP/I618WLFxEREYGIiAgAinnDIiIisGzZMgBAYWEhl8gAoEePHvj999+RkJCA8PBwrF27Flu3bqVuEgQAJejOhnebl5+fH8rKyhAcHIygoCCcO3cO4eHhyMnJ4T3/+ZgxY9o8Rl3v+TFjxrQ5p5gpVdRJIbC1gaPAsHddtafDwGzKAMRC8C55Pfzww9i/fz8ARYfVt99+G+PGjcPkyZPVrufYWVSLGzD686N4+uvTpg5FSefKRNTm1bnwLnlt2bKFGwY0b948dOnSBWfOnMGTTz6J1157Te8BWor0ggqU10pRXisFy7JmN6usooTbfkxU8iKWglfyamhowKef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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#\"\"\"\n", + "from ml_utility_loss.loss_learning.visualization import plot_grad, plot_grad_2, plot_grad_3\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#plot_grad_2(y, model.models)\n", + "for m in model.models:\n", + " ym = y[m]\n", + " fig, ax = plt.subplots()\n", + " plot_grad_3(ym[\"error\"], ym[\"grad\"], name=f\"{m}_grad\", fig=fig, ax=ax)\n", + "#\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "54c0e9f3", + "metadata": { + "papermill": { + "duration": 0.018137, + "end_time": "2024-03-22T20:55:59.560151", + "exception": false, + "start_time": "2024-03-22T20:55:59.542014", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "celltoolbar": "Tags", + "colab": { + "authorship_tag": "ABX9TyOOVfelovKP9fLGU7SvvRie", + "gpuType": "T4", + "mount_file_id": "17POSGAvge8y9DW9WGs2jLkibaRjToayg", + "provenance": [] + }, + "kaggle": { + "accelerator": "gpu", + "dataSources": [], + "dockerImageVersionId": 30648, + "isGpuEnabled": true, + "isInternetEnabled": true, + "language": "python", + "sourceType": "notebook" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + }, + "papermill": { + "default_parameters": {}, + "duration": 4549.120128, + "end_time": "2024-03-22T20:56:02.301034", + "environment_variables": {}, + "exception": null, + "input_path": "eval/contraceptive/lct_gan/1/mlu-eval.ipynb", + "output_path": "eval/contraceptive/lct_gan/1/mlu-eval.ipynb", + "parameters": { + "allow_same_prediction": true, + "dataset": "contraceptive", + "dataset_name": "contraceptive", + "debug": false, + "folder": "eval", + "gp": true, + "gp_multiply": true, + "log_wandb": false, + "param_index": 0, + "path": "eval/contraceptive/lct_gan/1", + "path_prefix": "../../../../", + "random_seed": 1, + "single_model": "lct_gan" + }, + "start_time": "2024-03-22T19:40:13.180906", + "version": "2.5.0" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file