diff --git "a/treatment/lct_gan/mlu-eval-load.ipynb" "b/treatment/lct_gan/mlu-eval-load.ipynb" new file mode 100644--- /dev/null +++ "b/treatment/lct_gan/mlu-eval-load.ipynb" @@ -0,0 +1,1982 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "982e76f5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:45:58.199314Z", + "iopub.status.busy": "2024-03-26T12:45:58.198943Z", + "iopub.status.idle": "2024-03-26T12:45:58.235333Z", + "shell.execute_reply": "2024-03-26T12:45:58.234417Z" + }, + "papermill": { + "duration": 0.050549, + "end_time": "2024-03-26T12:45:58.237366", + "exception": false, + "start_time": "2024-03-26T12:45:58.186817", + "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-26T12:45:58.260770Z", + "iopub.status.busy": "2024-03-26T12:45:58.260400Z", + "iopub.status.idle": "2024-03-26T12:45:58.267822Z", + "shell.execute_reply": "2024-03-26T12:45:58.266705Z" + }, + "papermill": { + "duration": 0.021256, + "end_time": "2024-03-26T12:45:58.269760", + "exception": false, + "start_time": "2024-03-26T12:45:58.248504", + "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-26T12:45:58.292414Z", + "iopub.status.busy": "2024-03-26T12:45:58.291641Z", + "iopub.status.idle": "2024-03-26T12:45:58.295974Z", + "shell.execute_reply": "2024-03-26T12:45:58.295109Z" + }, + "papermill": { + "duration": 0.017503, + "end_time": "2024-03-26T12:45:58.297981", + "exception": false, + "start_time": "2024-03-26T12:45:58.280478", + "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-26T12:45:58.319450Z", + "iopub.status.busy": "2024-03-26T12:45:58.319173Z", + "iopub.status.idle": "2024-03-26T12:45:58.323349Z", + "shell.execute_reply": "2024-03-26T12:45:58.322388Z" + }, + "executionInfo": { + "elapsed": 678, + "status": "ok", + "timestamp": 1696841022168, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "ns5hFcVL2yvs", + "papermill": { + "duration": 0.017248, + "end_time": "2024-03-26T12:45:58.325392", + "exception": false, + "start_time": "2024-03-26T12:45:58.308144", + "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-26T12:45:58.346826Z", + "iopub.status.busy": "2024-03-26T12:45:58.346261Z", + "iopub.status.idle": "2024-03-26T12:45:58.351997Z", + "shell.execute_reply": "2024-03-26T12:45:58.351115Z" + }, + "papermill": { + "duration": 0.01848, + "end_time": "2024-03-26T12:45:58.353872", + "exception": false, + "start_time": "2024-03-26T12:45:58.335392", + "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": "124915d4", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:45:58.376491Z", + "iopub.status.busy": "2024-03-26T12:45:58.376197Z", + "iopub.status.idle": "2024-03-26T12:45:58.381908Z", + "shell.execute_reply": "2024-03-26T12:45:58.380814Z" + }, + "papermill": { + "duration": 0.019825, + "end_time": "2024-03-26T12:45:58.384349", + "exception": false, + "start_time": "2024-03-26T12:45:58.364524", + "status": "completed" + }, + "tags": [ + "injected-parameters" + ] + }, + "outputs": [], + "source": [ + "# Parameters\n", + "dataset = \"treatment\"\n", + "dataset_name = \"treatment\"\n", + "single_model = \"lct_gan\"\n", + "gp = True\n", + "gp_multiply = True\n", + "random_seed = 2\n", + "debug = False\n", + "folder = \"eval\"\n", + "path_prefix = \"../../../../\"\n", + "path = \"eval/treatment/lct_gan/2\"\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.011565, + "end_time": "2024-03-26T12:45:58.407875", + "exception": false, + "start_time": "2024-03-26T12:45:58.396310", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5f45b1d0", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:45:58.433710Z", + "iopub.status.busy": "2024-03-26T12:45:58.432766Z", + "iopub.status.idle": "2024-03-26T12:45:58.444195Z", + "shell.execute_reply": "2024-03-26T12:45:58.443151Z" + }, + "executionInfo": { + "elapsed": 7, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "UdvXYv3c3LXy", + "papermill": { + "duration": 0.026928, + "end_time": "2024-03-26T12:45:58.446588", + "exception": false, + "start_time": "2024-03-26T12:45:58.419660", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/working\n", + "/kaggle/working/eval/treatment/lct_gan/2\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-26T12:45:58.471887Z", + "iopub.status.busy": "2024-03-26T12:45:58.471518Z", + "iopub.status.idle": "2024-03-26T12:46:00.530583Z", + "shell.execute_reply": "2024-03-26T12:46:00.529561Z" + }, + "papermill": { + "duration": 2.073621, + "end_time": "2024-03-26T12:46:00.532823", + "exception": false, + "start_time": "2024-03-26T12:45:58.459202", + "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-26T12:46:00.559187Z", + "iopub.status.busy": "2024-03-26T12:46:00.558727Z", + "iopub.status.idle": "2024-03-26T12:46:00.575319Z", + "shell.execute_reply": "2024-03-26T12:46:00.574453Z" + }, + "papermill": { + "duration": 0.031393, + "end_time": "2024-03-26T12:46:00.577304", + "exception": false, + "start_time": "2024-03-26T12:46:00.545911", + "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-26T12:46:00.599839Z", + "iopub.status.busy": "2024-03-26T12:46:00.599160Z", + "iopub.status.idle": "2024-03-26T12:46:00.606801Z", + "shell.execute_reply": "2024-03-26T12:46:00.606078Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "Vrl2QkoV3o_8", + "papermill": { + "duration": 0.020732, + "end_time": "2024-03-26T12:46:00.608747", + "exception": false, + "start_time": "2024-03-26T12:46:00.588015", + "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-26T12:46:00.630528Z", + "iopub.status.busy": "2024-03-26T12:46:00.630206Z", + "iopub.status.idle": "2024-03-26T12:46:00.727762Z", + "shell.execute_reply": "2024-03-26T12:46:00.726968Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "TilUuFk9vqMb", + "papermill": { + "duration": 0.110868, + "end_time": "2024-03-26T12:46:00.730044", + "exception": false, + "start_time": "2024-03-26T12:46:00.619176", + "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-26T12:46:00.754718Z", + "iopub.status.busy": "2024-03-26T12:46:00.754361Z", + "iopub.status.idle": "2024-03-26T12:46:05.649081Z", + "shell.execute_reply": "2024-03-26T12:46:05.648117Z" + }, + "executionInfo": { + "elapsed": 3113, + "status": "ok", + "timestamp": 1696841025277, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "7Abt8nStvr9Z", + "papermill": { + "duration": 4.910009, + "end_time": "2024-03-26T12:46:05.651560", + "exception": false, + "start_time": "2024-03-26T12:46:00.741551", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-26 12:46:03.119316: 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-26 12:46:03.119365: 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-26 12:46:03.121104: 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-26T12:46:05.675200Z", + "iopub.status.busy": "2024-03-26T12:46:05.674582Z", + "iopub.status.idle": "2024-03-26T12:46:05.681339Z", + "shell.execute_reply": "2024-03-26T12:46:05.680586Z" + }, + "papermill": { + "duration": 0.020663, + "end_time": "2024-03-26T12:46:05.683356", + "exception": false, + "start_time": "2024-03-26T12:46:05.662693", + "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-26T12:46:05.707178Z", + "iopub.status.busy": "2024-03-26T12:46:05.706873Z", + "iopub.status.idle": "2024-03-26T12:46:28.590555Z", + "shell.execute_reply": "2024-03-26T12:46:28.589350Z" + }, + "executionInfo": { + "elapsed": 20137, + "status": "ok", + "timestamp": 1696841045408, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "tbaguWxAvtPi", + "papermill": { + "duration": 22.898833, + "end_time": "2024-03-26T12:46:28.593290", + "exception": false, + "start_time": "2024-03-26T12:46:05.694457", + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.10/site-packages/sklearn/preprocessing/_encoders.py:868: FutureWarning: `sparse` was renamed to `sparse_output` in version 1.2 and will be removed in 1.4. `sparse_output` is ignored unless you leave `sparse` to its default value.\n", + " warnings.warn(\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-26T12:46:28.620728Z", + "iopub.status.busy": "2024-03-26T12:46:28.619561Z", + "iopub.status.idle": "2024-03-26T12:46:28.627315Z", + "shell.execute_reply": "2024-03-26T12:46:28.626281Z" + }, + "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.023258, + "end_time": "2024-03-26T12:46:28.629341", + "exception": false, + "start_time": "2024-03-26T12:46:28.606083", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tvae': 95,\n", + " 'realtabformer': (69, 281, Embedding(281, 768), True),\n", + " 'lct_gan': 75,\n", + " 'tab_ddpm_concat': 12}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preprocessor.adapter_sizes" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ad1eb833", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:28.653205Z", + "iopub.status.busy": "2024-03-26T12:46:28.652887Z", + "iopub.status.idle": "2024-03-26T12:46:28.717510Z", + "shell.execute_reply": "2024-03-26T12:46:28.716520Z" + }, + "papermill": { + "duration": 0.079027, + "end_time": "2024-03-26T12:46:28.719466", + "exception": false, + "start_time": "2024-03-26T12:46:28.640439", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../treatment/_cache_aug_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/aug_test/treatment 0\n", + "Caching in ../../../../treatment/_cache_bs_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/bs_test/treatment 0\n", + "Caching in ../../../../treatment/_cache_synth_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/synthetics/treatment 600\n", + "600\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": 17, + "id": "14ff8b40", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:28.746433Z", + "iopub.status.busy": "2024-03-26T12:46:28.746104Z", + "iopub.status.idle": "2024-03-26T12:46:29.079518Z", + "shell.execute_reply": "2024-03-26T12:46:29.078546Z" + }, + "executionInfo": { + "elapsed": 588, + "status": "ok", + "timestamp": 1696841049215, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "NgahtU1q9uLO", + "papermill": { + "duration": 0.349928, + "end_time": "2024-03-26T12:46:29.082164", + "exception": false, + "start_time": "2024-03-26T12:46:28.732236", + "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': 'torch',\n", + " 'grad_clip': 0.75,\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", + " 'loss_balancer_beta': 0.75,\n", + " 'loss_balancer_r': 0.96,\n", + " 'dataset_size': 2048,\n", + " 'batch_size': 2,\n", + " 'epochs': 100,\n", + " 'lr_mul': 0.06,\n", + " 'n_warmup_steps': 80,\n", + " 'Optim': torch_optimizer.diffgrad.DiffGrad,\n", + " 'fixed_role_model': 'lct_gan',\n", + " 'g_loss_mul': 0.2,\n", + " 'd_model': 512,\n", + " 'attn_activation': torch.nn.modules.activation.SELU,\n", + " 'tf_d_inner': 256,\n", + " 'tf_n_layers_enc': 4,\n", + " 'tf_n_head': 32,\n", + " 'tf_activation': ml_utility_loss.activations.LeakyHardtanh,\n", + " 'tf_activation_final': ml_utility_loss.activations.LeakyHardtanh,\n", + " 'ada_d_hid': 2048,\n", + " 'ada_n_layers': 6,\n", + " 'ada_activation': ml_utility_loss.activations.LeakyHardtanh,\n", + " 'ada_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'head_d_hid': 128,\n", + " 'head_n_layers': 7,\n", + " 'head_n_head': 64,\n", + " 'head_activation': ml_utility_loss.activations.LeakyHardsigmoid,\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': 32,\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.5, 'multiply': True, 'forgive_over': True}}}" + ] + }, + "execution_count": 17, + "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", + "params = getattr(PARAMS, dataset_name).BEST_DICT[gp][gp_multiply][single_model]\n", + "params = {\n", + " **getattr(PARAMS, dataset_name).DEFAULTS,\n", + " **params,\n", + "}\n", + "if isinstance(params, (list, tuple)):\n", + " params = params[param_index]\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": 18, + "id": "2fcb1418", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "execution": { + "iopub.execute_input": "2024-03-26T12:46:29.107844Z", + "iopub.status.busy": "2024-03-26T12:46:29.107551Z", + "iopub.status.idle": "2024-03-26T12:46:29.754839Z", + "shell.execute_reply": "2024-03-26T12:46:29.753780Z" + }, + "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.662308, + "end_time": "2024-03-26T12:46:29.756867", + "exception": false, + "start_time": "2024-03-26T12:46:29.094559", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating model of type \n", + "[*] Embedding False True\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['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": 19, + "id": "938f94fc", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:29.785757Z", + "iopub.status.busy": "2024-03-26T12:46:29.784922Z", + "iopub.status.idle": "2024-03-26T12:46:29.789475Z", + "shell.execute_reply": "2024-03-26T12:46:29.788615Z" + }, + "papermill": { + "duration": 0.02141, + "end_time": "2024-03-26T12:46:29.791465", + "exception": false, + "start_time": "2024-03-26T12:46:29.770055", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "study_name=f\"{model_name}_{dataset_name}\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "12fb613e", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:29.817032Z", + "iopub.status.busy": "2024-03-26T12:46:29.816701Z", + "iopub.status.idle": "2024-03-26T12:46:29.824659Z", + "shell.execute_reply": "2024-03-26T12:46:29.823655Z" + }, + "papermill": { + "duration": 0.022886, + "end_time": "2024-03-26T12:46:29.826684", + "exception": false, + "start_time": "2024-03-26T12:46:29.803798", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "29688705" + ] + }, + "execution_count": 20, + "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": 21, + "id": "bd386e57", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:29.853279Z", + "iopub.status.busy": "2024-03-26T12:46:29.853040Z", + "iopub.status.idle": "2024-03-26T12:46:29.951480Z", + "shell.execute_reply": "2024-03-26T12:46:29.950581Z" + }, + "papermill": { + "duration": 0.114124, + "end_time": "2024-03-26T12:46:29.953658", + "exception": false, + "start_time": "2024-03-26T12:46:29.839534", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "========================================================================================================================\n", + "Layer (type:depth-idx) Output Shape Param #\n", + "========================================================================================================================\n", + "MLUtilitySingle [2, 2648, 75] --\n", + "├─Adapter: 1-1 [2, 2648, 75] --\n", + "│ └─Sequential: 2-1 [2, 2648, 512] --\n", + "│ │ └─FeedForward: 3-1 [2, 2648, 2048] --\n", + "│ │ │ └─Linear: 4-1 [2, 2648, 2048] 155,648\n", + "│ │ │ └─LeakyHardtanh: 4-2 [2, 2648, 2048] --\n", + "│ │ └─FeedForward: 3-2 [2, 2648, 2048] --\n", + "│ │ │ └─Linear: 4-3 [2, 2648, 2048] 4,196,352\n", + "│ │ │ └─LeakyHardtanh: 4-4 [2, 2648, 2048] --\n", + "│ │ └─FeedForward: 3-3 [2, 2648, 2048] --\n", + "│ │ │ └─Linear: 4-5 [2, 2648, 2048] 4,196,352\n", + "│ │ │ └─LeakyHardtanh: 4-6 [2, 2648, 2048] --\n", + "│ │ └─FeedForward: 3-4 [2, 2648, 2048] --\n", + "│ │ │ └─Linear: 4-7 [2, 2648, 2048] 4,196,352\n", + "│ │ │ └─LeakyHardtanh: 4-8 [2, 2648, 2048] --\n", + "│ │ └─FeedForward: 3-5 [2, 2648, 2048] --\n", + "│ │ │ └─Linear: 4-9 [2, 2648, 2048] 4,196,352\n", + "│ │ │ └─LeakyHardtanh: 4-10 [2, 2648, 2048] --\n", + "│ │ └─FeedForward: 3-6 [2, 2648, 512] --\n", + "│ │ │ └─Linear: 4-11 [2, 2648, 512] 1,049,088\n", + "│ │ │ └─LeakyHardsigmoid: 4-12 [2, 2648, 512] --\n", + "├─Adapter: 1-2 [2, 661, 75] (recursive)\n", + "│ └─Sequential: 2-2 [2, 661, 512] (recursive)\n", + "│ │ └─FeedForward: 3-7 [2, 661, 2048] (recursive)\n", + "│ │ │ └─Linear: 4-13 [2, 661, 2048] (recursive)\n", + "│ │ │ └─LeakyHardtanh: 4-14 [2, 661, 2048] --\n", + "│ │ └─FeedForward: 3-8 [2, 661, 2048] (recursive)\n", + "│ │ │ └─Linear: 4-15 [2, 661, 2048] (recursive)\n", + "│ │ │ └─LeakyHardtanh: 4-16 [2, 661, 2048] --\n", + "│ │ └─FeedForward: 3-9 [2, 661, 2048] (recursive)\n", + "│ │ │ └─Linear: 4-17 [2, 661, 2048] (recursive)\n", + "│ │ │ └─LeakyHardtanh: 4-18 [2, 661, 2048] --\n", + "│ │ └─FeedForward: 3-10 [2, 661, 2048] (recursive)\n", + "│ │ │ └─Linear: 4-19 [2, 661, 2048] (recursive)\n", + "│ │ │ └─LeakyHardtanh: 4-20 [2, 661, 2048] --\n", + "│ │ └─FeedForward: 3-11 [2, 661, 2048] (recursive)\n", + "│ │ │ └─Linear: 4-21 [2, 661, 2048] (recursive)\n", + "│ │ │ └─LeakyHardtanh: 4-22 [2, 661, 2048] --\n", + "│ │ └─FeedForward: 3-12 [2, 661, 512] (recursive)\n", + "│ │ │ └─Linear: 4-23 [2, 661, 512] (recursive)\n", + "│ │ │ └─LeakyHardsigmoid: 4-24 [2, 661, 512] --\n", + "├─TwinEncoder: 1-3 [2, 8192] --\n", + "│ └─Encoder: 2-3 [2, 16, 512] --\n", + "│ │ └─ModuleList: 3-14 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-25 [2, 2648, 512] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-1 [2, 2648, 512] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-1 [2, 32, 512] 16,384\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-2 [2, 32, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-1 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-2 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-3 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-4 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-1 [2, 32, 32, 2648] --\n", + "│ │ │ │ │ │ └─Linear: 7-5 [2, 32, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-6 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-3 [2, 2648, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-7 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-8 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-9 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-10 [2, 32, 2648, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-2 [2, 32, 2648, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-11 [2, 2648, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-12 [2, 2648, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-2 [2, 2648, 512] --\n", + "│ │ │ │ │ └─Linear: 6-4 [2, 2648, 256] 131,328\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-5 [2, 2648, 256] --\n", + "│ │ │ │ │ └─Linear: 6-6 [2, 2648, 512] 131,584\n", + "│ │ │ └─EncoderLayer: 4-26 [2, 2648, 512] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-3 [2, 2648, 512] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-7 [2, 32, 512] 16,384\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-8 [2, 32, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-13 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-14 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-15 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-16 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-3 [2, 32, 32, 2648] --\n", + "│ │ │ │ │ │ └─Linear: 7-17 [2, 32, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-18 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-9 [2, 2648, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-19 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-20 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-21 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-22 [2, 32, 2648, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-4 [2, 32, 2648, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-23 [2, 2648, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-24 [2, 2648, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-4 [2, 2648, 512] --\n", + "│ │ │ │ │ └─Linear: 6-10 [2, 2648, 256] 131,328\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-11 [2, 2648, 256] --\n", + "│ │ │ │ │ └─Linear: 6-12 [2, 2648, 512] 131,584\n", + "│ │ │ └─EncoderLayer: 4-27 [2, 2648, 512] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-5 [2, 2648, 512] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-13 [2, 32, 512] 16,384\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-14 [2, 32, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-25 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-26 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-27 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-28 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-5 [2, 32, 32, 2648] --\n", + "│ │ │ │ │ │ └─Linear: 7-29 [2, 32, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-30 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-15 [2, 2648, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-31 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-32 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-33 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-34 [2, 32, 2648, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-6 [2, 32, 2648, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-35 [2, 2648, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-36 [2, 2648, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-6 [2, 2648, 512] --\n", + "│ │ │ │ │ └─Linear: 6-16 [2, 2648, 256] 131,328\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-17 [2, 2648, 256] --\n", + "│ │ │ │ │ └─Linear: 6-18 [2, 2648, 512] 131,584\n", + "│ │ │ └─EncoderLayer: 4-28 [2, 16, 512] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-7 [2, 2648, 512] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-19 [2, 32, 512] 16,384\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-20 [2, 32, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-37 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-38 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-39 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-40 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-7 [2, 32, 32, 2648] --\n", + "│ │ │ │ │ │ └─Linear: 7-41 [2, 32, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-42 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-21 [2, 2648, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-43 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-44 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-45 [2, 32, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-46 [2, 32, 2648, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-8 [2, 32, 2648, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-47 [2, 2648, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-48 [2, 2648, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-8 [2, 2648, 512] --\n", + "│ │ │ │ │ └─Linear: 6-22 [2, 2648, 256] 131,328\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-23 [2, 2648, 256] --\n", + "│ │ │ │ │ └─Linear: 6-24 [2, 2648, 512] 131,584\n", + "│ │ │ │ └─PoolingByMultiheadAttention: 5-9 [2, 16, 512] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-25 [2, 16, 512] 8,192\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-26 [2, 16, 512] --\n", + "│ │ │ │ │ │ └─Linear: 7-49 [2, 16, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-50 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─Linear: 7-51 [2, 2648, 512] 262,144\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-52 [2, 32, 16, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-9 [2, 32, 16, 2648] --\n", + "│ │ │ │ │ │ └─Linear: 7-53 [2, 16, 512] 262,656\n", + "│ │ │ │ │ │ └─SELU: 7-54 [2, 16, 512] --\n", + "│ └─Encoder: 2-4 [2, 16, 512] (recursive)\n", + "│ │ └─ModuleList: 3-14 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-29 [2, 661, 512] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-10 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-27 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-28 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-55 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-56 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-57 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-58 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-10 [2, 32, 32, 661] --\n", + "│ │ │ │ │ │ └─Linear: 7-59 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-60 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-29 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-61 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-62 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-63 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-64 [2, 32, 661, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-11 [2, 32, 661, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-65 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-66 [2, 661, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-11 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-30 [2, 661, 256] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-31 [2, 661, 256] --\n", + "│ │ │ │ │ └─Linear: 6-32 [2, 661, 512] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-30 [2, 661, 512] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-12 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-33 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-34 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-67 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-68 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-69 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-70 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-12 [2, 32, 32, 661] --\n", + "│ │ │ │ │ │ └─Linear: 7-71 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-72 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-35 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-73 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-74 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-75 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-76 [2, 32, 661, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-13 [2, 32, 661, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-77 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-78 [2, 661, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-13 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-36 [2, 661, 256] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-37 [2, 661, 256] --\n", + "│ │ │ │ │ └─Linear: 6-38 [2, 661, 512] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-31 [2, 661, 512] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-14 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-39 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-40 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-79 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-80 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-81 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-82 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-14 [2, 32, 32, 661] --\n", + "│ │ │ │ │ │ └─Linear: 7-83 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-84 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-41 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-85 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-86 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-87 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-88 [2, 32, 661, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-15 [2, 32, 661, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-89 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-90 [2, 661, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-15 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-42 [2, 661, 256] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-43 [2, 661, 256] --\n", + "│ │ │ │ │ └─Linear: 6-44 [2, 661, 512] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-32 [2, 16, 512] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-16 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-45 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-46 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-91 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-92 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-93 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-94 [2, 32, 32, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-16 [2, 32, 32, 661] --\n", + "│ │ │ │ │ │ └─Linear: 7-95 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-96 [2, 32, 512] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-47 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-97 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-98 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-99 [2, 32, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-100 [2, 32, 661, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-17 [2, 32, 661, 32] --\n", + "│ │ │ │ │ │ └─Linear: 7-101 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-102 [2, 661, 512] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-17 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-48 [2, 661, 256] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-49 [2, 661, 256] --\n", + "│ │ │ │ │ └─Linear: 6-50 [2, 661, 512] (recursive)\n", + "│ │ │ │ └─PoolingByMultiheadAttention: 5-18 [2, 16, 512] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-51 [2, 16, 512] (recursive)\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-52 [2, 16, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-103 [2, 16, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-104 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-105 [2, 661, 512] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-106 [2, 32, 16, 16] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-18 [2, 32, 16, 661] --\n", + "│ │ │ │ │ │ └─Linear: 7-107 [2, 16, 512] (recursive)\n", + "│ │ │ │ │ │ └─SELU: 7-108 [2, 16, 512] --\n", + "├─Head: 1-4 [2] --\n", + "│ └─Sequential: 2-5 [2, 1] --\n", + "│ │ └─FeedForward: 3-15 [2, 128] --\n", + "│ │ │ └─Linear: 4-33 [2, 128] 1,048,704\n", + "│ │ │ └─LeakyHardsigmoid: 4-34 [2, 128] --\n", + "│ │ └─FeedForward: 3-16 [2, 128] --\n", + "│ │ │ └─Linear: 4-35 [2, 128] 16,512\n", + "│ │ │ └─LeakyHardsigmoid: 4-36 [2, 128] --\n", + "│ │ └─FeedForward: 3-17 [2, 128] --\n", + "│ │ │ └─Linear: 4-37 [2, 128] 16,512\n", + "│ │ │ └─LeakyHardsigmoid: 4-38 [2, 128] --\n", + "│ │ └─FeedForward: 3-18 [2, 128] --\n", + "│ │ │ └─Linear: 4-39 [2, 128] 16,512\n", + "│ │ │ └─LeakyHardsigmoid: 4-40 [2, 128] --\n", + "│ │ └─FeedForward: 3-19 [2, 128] --\n", + "│ │ │ └─Linear: 4-41 [2, 128] 16,512\n", + "│ │ │ └─LeakyHardsigmoid: 4-42 [2, 128] --\n", + "│ │ └─FeedForward: 3-20 [2, 128] --\n", + "│ │ │ └─Linear: 4-43 [2, 128] 16,512\n", + "│ │ │ └─LeakyHardsigmoid: 4-44 [2, 128] --\n", + "│ │ └─FeedForward: 3-21 [2, 1] --\n", + "│ │ │ └─Linear: 4-45 [2, 1] 129\n", + "│ │ │ └─LeakyHardsigmoid: 4-46 [2, 1] --\n", + "========================================================================================================================\n", + "Total params: 29,688,705\n", + "Trainable params: 29,688,705\n", + "Non-trainable params: 0\n", + "Total mult-adds (M): 116.20\n", + "========================================================================================================================\n", + "Input size (MB): 1.99\n", + "Forward/backward pass size (MB): 1231.11\n", + "Params size (MB): 118.75\n", + "Estimated Total Size (MB): 1351.85\n", + "========================================================================================================================" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from torchinfo import summary\n", + "\n", + "role_model = params[\"fixed_role_model\"]\n", + "s = test_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": 22, + "id": "90576617", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:29.985252Z", + "iopub.status.busy": "2024-03-26T12:46:29.984910Z", + "iopub.status.idle": "2024-03-26T12:46:30.125419Z", + "shell.execute_reply": "2024-03-26T12:46:30.124416Z" + }, + "papermill": { + "duration": 0.159533, + "end_time": "2024-03-26T12:46:30.127703", + "exception": false, + "start_time": "2024-03-26T12:46:29.968170", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "model.load_state_dict(torch.load(\"model.pt\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "2586ba0a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:46:30.156028Z", + "iopub.status.busy": "2024-03-26T12:46:30.155659Z", + "iopub.status.idle": "2024-03-26T12:51:27.019967Z", + "shell.execute_reply": "2024-03-26T12:51:27.018975Z" + }, + "papermill": { + "duration": 296.881691, + "end_time": "2024-03-26T12:51:27.022857", + "exception": false, + "start_time": "2024-03-26T12:46:30.141166", + "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": 24, + "id": "187137f6", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:51:27.056139Z", + "iopub.status.busy": "2024-03-26T12:51:27.055710Z", + "iopub.status.idle": "2024-03-26T12:51:27.082062Z", + "shell.execute_reply": "2024-03-26T12:51:27.080982Z" + }, + "papermill": { + "duration": 0.046009, + "end_time": "2024-03-26T12:51:27.084294", + "exception": false, + "start_time": "2024-03-26T12:51:27.038285", + "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.00.120.0043414.9898780.0919271.798790.131940.0000366.6368560.047166836807.1250.0658830.2110940.00024911.626734
\n", + "
" + ], + "text/plain": [ + " avg_g_cos_loss avg_g_mag_loss avg_loss grad_duration grad_mae \\\n", + "lct_gan 0.0 0.12 0.004341 4.989878 0.091927 \n", + "\n", + " grad_mape grad_rmse mean_pred_loss pred_duration pred_mae \\\n", + "lct_gan 1.79879 0.13194 0.000036 6.636856 0.047166 \n", + "\n", + " pred_mape pred_rmse pred_std std_loss total_duration \n", + "lct_gan 836807.125 0.065883 0.211094 0.000249 11.626734 " + ] + }, + "execution_count": 24, + "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": 25, + "id": "123d305b", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:51:27.115770Z", + "iopub.status.busy": "2024-03-26T12:51:27.115217Z", + "iopub.status.idle": "2024-03-26T12:51:27.511473Z", + "shell.execute_reply": "2024-03-26T12:51:27.510422Z" + }, + "papermill": { + "duration": 0.414184, + "end_time": "2024-03-26T12:51:27.513543", + "exception": false, + "start_time": "2024-03-26T12:51:27.099359", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from ml_utility_loss.util import clear_memory\n", + "clear_memory()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "a3eecc2a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:51:27.543833Z", + "iopub.status.busy": "2024-03-26T12:51:27.543516Z", + "iopub.status.idle": "2024-03-26T12:56:34.602968Z", + "shell.execute_reply": "2024-03-26T12:56:34.602114Z" + }, + "papermill": { + "duration": 307.077605, + "end_time": "2024-03-26T12:56:34.605828", + "exception": false, + "start_time": "2024-03-26T12:51:27.528223", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../treatment/_cache_aug_test/lct_gan/all inf False\n", + "Caching in ../../../../treatment/_cache_bs_test/lct_gan/all inf False\n", + "Caching in ../../../../treatment/_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": 27, + "id": "6ab51db8", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:56:34.636779Z", + "iopub.status.busy": "2024-03-26T12:56:34.636017Z", + "iopub.status.idle": "2024-03-26T12:56:34.657091Z", + "shell.execute_reply": "2024-03-26T12:56:34.656335Z" + }, + "papermill": { + "duration": 0.038445, + "end_time": "2024-03-26T12:56:34.659109", + "exception": false, + "start_time": "2024-03-26T12:56:34.620664", + "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": 28, + "id": "d81a30f1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:56:34.686668Z", + "iopub.status.busy": "2024-03-26T12:56:34.686396Z", + "iopub.status.idle": "2024-03-26T12:56:34.691769Z", + "shell.execute_reply": "2024-03-26T12:56:34.690980Z" + }, + "papermill": { + "duration": 0.021649, + "end_time": "2024-03-26T12:56:34.693762", + "exception": false, + "start_time": "2024-03-26T12:56:34.672113", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'lct_gan': 0.4631171667436077}\n" + ] + } + ], + "source": [ + "print({k: sum(v[\"pred\"])/len(v[\"pred\"]) for k, v in y.items()})" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "3b3ff322", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:56:34.721244Z", + "iopub.status.busy": "2024-03-26T12:56:34.720741Z", + "iopub.status.idle": "2024-03-26T12:56:35.156277Z", + "shell.execute_reply": "2024-03-26T12:56:35.155385Z" + }, + "papermill": { + "duration": 0.451329, + "end_time": "2024-03-26T12:56:35.158354", + "exception": false, + "start_time": "2024-03-26T12:56:34.707025", + "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_pred_density_2\n", + "\n", + "_ = plot_pred_density_2(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "e79e4b0f", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:56:35.191132Z", + "iopub.status.busy": "2024-03-26T12:56:35.190766Z", + "iopub.status.idle": "2024-03-26T12:56:35.542909Z", + "shell.execute_reply": "2024-03-26T12:56:35.541778Z" + }, + "papermill": { + "duration": 0.371185, + "end_time": "2024-03-26T12:56:35.545300", + "exception": false, + "start_time": "2024-03-26T12:56:35.174115", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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YjIQNrm05BX2ahNkRUZIIhqhTl47SJwq2XWfo2qTiLHl9Xquoii4bSYiRgehWAIScYicebUD0XejKxGpqtYeMNS3fvznXLp0KRs2bGDVqlUoioKiKBw8eJBbbrmFcePGYbfbmTRpEqtWrTrlcYsXL+aBBx6goqIiteriW2+9xcyZM7HZbMyePZuXX34ZRVF6jMDetWsXV199NTk5OZSWlnLjjTfS2traazx1dXUD/lVkg2QicqndCeUsWwW57WZUxUgwOQtf2okyZnT1msWj8OYjQ/+8l/4fMFn6dOqqVas4cOAA5557bmpCan5+PpWVlbz44osUFhby1ltv8fWvf53y8nK++MUvph772muv4Xa7WbduHaDNfL722mu55ppreO6556ivrz+litXZ2cmVV17Jrbfeyk9+8hOCwSB33XUXX/ziF/nHP/5x2niKi4sz8KboKxpPEAhry384kyWik6Z2nOycUhelbhs5TfkQPqG1E+WOOeNjRN+MrkQ0DOTm5mKxWHA4HJSVlaWO33vvvanvx40bx9tvv80LL7zQIxE5nU5++ctfplZu/J//+R8UReEXv/gFNpuNqVOncuzYMW677bbUY372s58xa9Ys/vM//zN17KmnnqKqqooDBw5wzjnnnDae4S4QjgFgNiqYI90Nz2cpEU0p7x7MGCqCEye0diKREaMrERnNWulEj+cdoCeeeIKnnnqKhoYGgsEgkUikxxZAoC0tm0xCAPv372f69Ok91v/5+ML5ADt27OD111/vsTtH0sGDBznnnIFth5StfCEtEeVYjCjhZCLK69uDbcmEJD1nmTK6EpGi9LmKlE2ef/557rzzTh555BHmzZuHy+Xiv//7v9m0aVOP85xOZ7+v7ff7ufbaa/nxj398yn3JnTlGokBES0RuUxSCMe1v4ywlonhCxROMEovaKAFpI8qg0ZWIhgmLxdJjQfyNGzcyf/58vvWtb6WOHTx48KzXmTRpEr/+9a8Jh8NYrVaAHgvnA5x//vn8/ve/p6amBpPp9H8OJ8czErhtZs4bk0uJ2gJBtDWqT5p1fzJ/OMbTb9VREO7iJqeKEuocklhHg9HVazZM1NTUsGnTJurq6mhtbWXixIm89957rF27lgMHDvDv//7vpySU0/nKV75CIpHg61//Onv37mXt2rWp9aeTi+XffvvttLe38+Uvf5nNmzdz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", + "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": 31, + "id": "745adde1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:56:35.578696Z", + "iopub.status.busy": "2024-03-26T12:56:35.578311Z", + "iopub.status.idle": "2024-03-26T12:56:35.830290Z", + "shell.execute_reply": "2024-03-26T12:56:35.829287Z" + }, + "papermill": { + "duration": 0.271201, + "end_time": "2024-03-26T12:56:35.832459", + "exception": false, + "start_time": "2024-03-26T12:56:35.561258", + "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": 32, + "id": "eabe1bab", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T12:56:35.864727Z", + "iopub.status.busy": "2024-03-26T12:56:35.864414Z", + "iopub.status.idle": "2024-03-26T12:56:36.144741Z", + "shell.execute_reply": "2024-03-26T12:56:36.143746Z" + }, + "papermill": { + "duration": 0.29892, + "end_time": "2024-03-26T12:56:36.146879", + "exception": false, + "start_time": "2024-03-26T12:56:35.847959", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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aqNOp+PmzZs4OzujUJRtYbuCqUmxsbHiSudjiPeq5MrbeyVJEunp6fj6+hYaJvWgCtfyUiqVVKtWTdYYXFxcysWHrCyI96rkytN79agWVwHRYS8IglUSyUsQBKskklcZsrOzY8KECaLKRQmI96rkKup7VeE67AVBKB9Ey0sQBKskkpcgCFZJJC9BEKySSF6CIFglkbzMLDk5mf79++Pi4oKbmxtDhw4lIyPjkfu///771KtXDwcHBwICAhgxYgSpqallGHXZECull5wx79WiRYto37497u7uuLu7Exoa+tj31ipJgll1795dCgoKkvbv3y/t2rVLql27ttS3b99i9z916pT08ssvS+vXr5cuXbokRUZGSnXq1JH+85//lGHU5rdq1SrJ1tZWWrx4sXTmzBlp2LBhkpubmxQfH1/k/nv27JFUKpX0xRdfSGfPnpXGjRsn2djYSKdOnSrjyMuese9Vv379pAULFkjHjh2ToqKipMGDB0uurq7S9evXyzhy8xLJy4zOnj0rAdKhQ4cM2/766y9JoVBIN27cKPHzrFmzRrK1tZXy8/PNEaYsgoODpffee8/ws1arlXx9faUZM2YUuX/v3r2lHj16FNoWEhIivfXWW2aN0xIY+149SKPRSM7OztLSpUvNFaIsxGmjGe3btw83Nzdatmxp2BYaGopSqeTAgQMlfp6CcrjqcrL4almslF5elOa9elBWVhb5+fl4eHiYK0xZiORlRnFxcXh5eRXaplar8fDwKHaF7wclJSUxZcoU3nzzTXOEKIuyWCm9vCjNe/WgTz/9FF9f34eSv7UTyasUIiIiUCgUj7ydO3fuiV8nLS2NHj160LBhQyZOnPjkgQsVzsyZM1m1ahW//fYb9vb2codjUuXjPKSMffTRRwwePPiR+9SsWRMfHx8SEhIKbddoNCQnJxe7wneB9PR0unfvjrOzM7/99hs2NjZPGrbFKIuV0suL0rxXBWbNmsXMmTPZtm0bTZs2NWeY8pC70608K+iwP3z4sGHb33///dgO+9TUVKl169ZShw4dpMzMzLIItcwFBwdLw4cPN/ys1WolPz+/R3bYP//884W2tWnTpsJ02BvzXkmSJH3++eeSi4uLtG/fvrIIURYieZlZ9+7dpebNm0sHDhyQdu/eLdWpU6fQUInr169L9erVkw4cOCBJkj5xhYSESE2aNJEuXbok3bp1y3DTaDRy/Romt2rVKsnOzk768ccfpbNnz0pvvvmm5ObmJsXFxUmSJEkDBgyQIiIiDPvv2bNHUqvV0qxZs6SoqChpwoQJFWqohDHv1cyZMyVbW1tp7dq1hT4/6enpcv0KZiGSl5ndvn1b6tu3r1SpUiXJxcVFGjJkSKEPUXR0tARI27dvlyRJkrZv3y4BRd6io6Pl+SXMZP78+VJAQIBka2srBQcHS/v37zc81qFDB2nQoEGF9l+zZo1Ut25dydbWVmrUqJG0cePGMo5YPsa8V9WrVy/y8zNhwoSyD9yMREkcQRCskrjaKAiCVRLJSxAEqySSlyAIVkkkL0EQrJJIXoIgWCWRvARBsEoieQmCYJVE8hIEwSqJ5CVYhMGDBxdZnaN79+5yhyZYKFFVQrAY3bt3Z8mSJYW2FbcKdH5+/kOVNvLy8rC1tTX6dUt7nCAv0fISLIadnR0+Pj6Fbu7u7gAoFAq+/fZbXnjhBZycnJg2bRoTJ06kWbNmfP/999SoUcNQryomJoYXX3yRSpUq4eLiQu/evQuVlCnuOMG6iOQlWI2JEyfSq1cvTp06xeuvvw7ApUuX+PXXX1m3bh3Hjx9Hp9Px4osvkpyczM6dO9m6dStXrlyhT58+hZ7rweME6yNOGwWLsWHDBipVqlRo25gxYxgzZgwA/fr1Y8iQIYUez8vL46effqJKlSoAbN26lVOnThEdHY2/vz8AP/30E40aNeLQoUO0atWqyOME6yOSl2AxOnXqxLffflto2/2LRty/kEmB6tWrF0pAUVFR+Pv7GxIXQMOGDXFzcyMqKsqQvB48TrA+InkJFsPJyYnatWs/8vGSbCvpawnWTfR5CeVKgwYNiI2NJTY21rDt7NmzpKSk0LBhQxkjE0xNtLwEi5Gbm/vQcl5qtRpPT88SP0doaChNmjShf//+zJ07F41Gw7vvvkuHDh2KPO0UrJdoeQkWY/PmzVStWrXQ7emnnzbqORQKBX/88Qfu7u4888wzhIaGUrNmTVavXm2mqAW5iDLQgiBYJdHyEgTBKonkJQiCVRLJSxAEqySSlyAIVkkkL0EQrJJIXoIgWCWRvARBsEoieQmCYJVE8hIEwSqJ5CUIglUSyUsQBKskkpcgCFbp/wG7hDKJXXKHngAAAABJRU5ErkJggg==", + "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.016118, + "end_time": "2024-03-26T12:56:36.178869", + "exception": false, + "start_time": "2024-03-26T12:56:36.162751", + "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": 642.1685, + "end_time": "2024-03-26T12:56:38.916310", + "environment_variables": {}, + "exception": null, + "input_path": "eval/treatment/lct_gan/2/mlu-eval-load.ipynb", + "output_path": "eval/treatment/lct_gan/2/mlu-eval-load.ipynb", + "parameters": { + "allow_same_prediction": true, + "dataset": "treatment", + "dataset_name": "treatment", + "debug": false, + "folder": "eval", + "gp": true, + "gp_multiply": true, + "log_wandb": false, + "param_index": 0, + "path": "eval/treatment/lct_gan/2", + "path_prefix": "../../../../", + "random_seed": 2, + "single_model": "lct_gan" + }, + "start_time": "2024-03-26T12:45:56.747810", + "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