diff --git "a/contraceptive/realtabformer/mlu-eval-load.ipynb" "b/contraceptive/realtabformer/mlu-eval-load.ipynb" new file mode 100644--- /dev/null +++ "b/contraceptive/realtabformer/mlu-eval-load.ipynb" @@ -0,0 +1,1892 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "982e76f5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:26:40.831378Z", + "iopub.status.busy": "2024-03-26T07:26:40.830526Z", + "iopub.status.idle": "2024-03-26T07:26:40.863942Z", + "shell.execute_reply": "2024-03-26T07:26:40.863194Z" + }, + "papermill": { + "duration": 0.047495, + "end_time": "2024-03-26T07:26:40.865965", + "exception": false, + "start_time": "2024-03-26T07:26:40.818470", + "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-26T07:26:40.889233Z", + "iopub.status.busy": "2024-03-26T07:26:40.888808Z", + "iopub.status.idle": "2024-03-26T07:26:40.895597Z", + "shell.execute_reply": "2024-03-26T07:26:40.894790Z" + }, + "papermill": { + "duration": 0.020549, + "end_time": "2024-03-26T07:26:40.897522", + "exception": false, + "start_time": "2024-03-26T07:26:40.876973", + "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-26T07:26:40.919116Z", + "iopub.status.busy": "2024-03-26T07:26:40.918330Z", + "iopub.status.idle": "2024-03-26T07:26:40.922735Z", + "shell.execute_reply": "2024-03-26T07:26:40.921901Z" + }, + "papermill": { + "duration": 0.017084, + "end_time": "2024-03-26T07:26:40.924716", + "exception": false, + "start_time": "2024-03-26T07:26:40.907632", + "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-26T07:26:40.946265Z", + "iopub.status.busy": "2024-03-26T07:26:40.945723Z", + "iopub.status.idle": "2024-03-26T07:26:40.949723Z", + "shell.execute_reply": "2024-03-26T07:26:40.948751Z" + }, + "executionInfo": { + "elapsed": 678, + "status": "ok", + "timestamp": 1696841022168, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "ns5hFcVL2yvs", + "papermill": { + "duration": 0.01676, + "end_time": "2024-03-26T07:26:40.951524", + "exception": false, + "start_time": "2024-03-26T07:26:40.934764", + "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-26T07:26:40.973484Z", + "iopub.status.busy": "2024-03-26T07:26:40.973168Z", + "iopub.status.idle": "2024-03-26T07:26:40.979014Z", + "shell.execute_reply": "2024-03-26T07:26:40.978206Z" + }, + "papermill": { + "duration": 0.019579, + "end_time": "2024-03-26T07:26:40.980840", + "exception": false, + "start_time": "2024-03-26T07:26:40.961261", + "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": "18969463", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:26:41.003839Z", + "iopub.status.busy": "2024-03-26T07:26:41.003169Z", + "iopub.status.idle": "2024-03-26T07:26:41.009013Z", + "shell.execute_reply": "2024-03-26T07:26:41.008148Z" + }, + "papermill": { + "duration": 0.019386, + "end_time": "2024-03-26T07:26:41.010884", + "exception": false, + "start_time": "2024-03-26T07:26:40.991498", + "status": "completed" + }, + "tags": [ + "injected-parameters" + ] + }, + "outputs": [], + "source": [ + "# Parameters\n", + "dataset = \"contraceptive\"\n", + "dataset_name = \"contraceptive\"\n", + "single_model = \"realtabformer\"\n", + "gp = True\n", + "gp_multiply = True\n", + "random_seed = 3\n", + "debug = False\n", + "folder = \"eval\"\n", + "path_prefix = \"../../../../\"\n", + "path = \"eval/contraceptive/realtabformer/3\"\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.009782, + "end_time": "2024-03-26T07:26:41.030508", + "exception": false, + "start_time": "2024-03-26T07:26:41.020726", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5f45b1d0", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:26:41.052720Z", + "iopub.status.busy": "2024-03-26T07:26:41.052387Z", + "iopub.status.idle": "2024-03-26T07:26:41.062837Z", + "shell.execute_reply": "2024-03-26T07:26:41.061827Z" + }, + "executionInfo": { + "elapsed": 7, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "UdvXYv3c3LXy", + "papermill": { + "duration": 0.024195, + "end_time": "2024-03-26T07:26:41.065000", + "exception": false, + "start_time": "2024-03-26T07:26:41.040805", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/working\n", + "/kaggle/working/eval/contraceptive/realtabformer/3\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-26T07:26:41.087450Z", + "iopub.status.busy": "2024-03-26T07:26:41.087128Z", + "iopub.status.idle": "2024-03-26T07:26:43.063141Z", + "shell.execute_reply": "2024-03-26T07:26:43.062126Z" + }, + "papermill": { + "duration": 1.989828, + "end_time": "2024-03-26T07:26:43.065599", + "exception": false, + "start_time": "2024-03-26T07:26:41.075771", + "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-26T07:26:43.090641Z", + "iopub.status.busy": "2024-03-26T07:26:43.090146Z", + "iopub.status.idle": "2024-03-26T07:26:43.104202Z", + "shell.execute_reply": "2024-03-26T07:26:43.103139Z" + }, + "papermill": { + "duration": 0.028664, + "end_time": "2024-03-26T07:26:43.106468", + "exception": false, + "start_time": "2024-03-26T07:26:43.077804", + "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-26T07:26:43.128949Z", + "iopub.status.busy": "2024-03-26T07:26:43.128689Z", + "iopub.status.idle": "2024-03-26T07:26:43.135518Z", + "shell.execute_reply": "2024-03-26T07:26:43.134835Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "Vrl2QkoV3o_8", + "papermill": { + "duration": 0.020033, + "end_time": "2024-03-26T07:26:43.137478", + "exception": false, + "start_time": "2024-03-26T07:26:43.117445", + "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-26T07:26:43.159190Z", + "iopub.status.busy": "2024-03-26T07:26:43.158944Z", + "iopub.status.idle": "2024-03-26T07:26:43.255223Z", + "shell.execute_reply": "2024-03-26T07:26:43.254262Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "TilUuFk9vqMb", + "papermill": { + "duration": 0.109664, + "end_time": "2024-03-26T07:26:43.257415", + "exception": false, + "start_time": "2024-03-26T07:26:43.147751", + "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-26T07:26:43.280813Z", + "iopub.status.busy": "2024-03-26T07:26:43.280521Z", + "iopub.status.idle": "2024-03-26T07:26:47.886826Z", + "shell.execute_reply": "2024-03-26T07:26:47.885973Z" + }, + "executionInfo": { + "elapsed": 3113, + "status": "ok", + "timestamp": 1696841025277, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "7Abt8nStvr9Z", + "papermill": { + "duration": 4.62073, + "end_time": "2024-03-26T07:26:47.889253", + "exception": false, + "start_time": "2024-03-26T07:26:43.268523", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-26 07:26:45.486000: 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 07:26:45.486056: 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 07:26:45.487635: 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-26T07:26:47.913147Z", + "iopub.status.busy": "2024-03-26T07:26:47.912080Z", + "iopub.status.idle": "2024-03-26T07:26:47.918464Z", + "shell.execute_reply": "2024-03-26T07:26:47.917570Z" + }, + "papermill": { + "duration": 0.020614, + "end_time": "2024-03-26T07:26:47.920637", + "exception": false, + "start_time": "2024-03-26T07:26:47.900023", + "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-26T07:26:47.944393Z", + "iopub.status.busy": "2024-03-26T07:26:47.944073Z", + "iopub.status.idle": "2024-03-26T07:26:56.168151Z", + "shell.execute_reply": "2024-03-26T07:26:56.166875Z" + }, + "executionInfo": { + "elapsed": 20137, + "status": "ok", + "timestamp": 1696841045408, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "tbaguWxAvtPi", + "papermill": { + "duration": 8.239005, + "end_time": "2024-03-26T07:26:56.170980", + "exception": false, + "start_time": "2024-03-26T07:26:47.931975", + "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-26T07:26:56.197862Z", + "iopub.status.busy": "2024-03-26T07:26:56.196876Z", + "iopub.status.idle": "2024-03-26T07:26:56.205023Z", + "shell.execute_reply": "2024-03-26T07:26:56.204004Z" + }, + "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.023939, + "end_time": "2024-03-26T07:26:56.207023", + "exception": false, + "start_time": "2024-03-26T07:26:56.183084", + "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": "ad1eb833", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:26:56.230833Z", + "iopub.status.busy": "2024-03-26T07:26:56.230245Z", + "iopub.status.idle": "2024-03-26T07:26:56.303119Z", + "shell.execute_reply": "2024-03-26T07:26:56.302032Z" + }, + "papermill": { + "duration": 0.087354, + "end_time": "2024-03-26T07:26:56.305549", + "exception": false, + "start_time": "2024-03-26T07:26:56.218195", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/realtabformer/all inf False\n", + "../../../../ml-utility-loss/aug_test/contraceptive 0\n", + "Caching in ../../../../contraceptive/_cache_bs_test/realtabformer/all inf False\n", + "../../../../ml-utility-loss/bs_test/contraceptive 0\n", + "Caching in ../../../../contraceptive/_cache_synth_test/realtabformer/all inf False\n", + "../../../../ml-utility-loss/synthetics/contraceptive 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-26T07:26:56.331135Z", + "iopub.status.busy": "2024-03-26T07:26:56.330816Z", + "iopub.status.idle": "2024-03-26T07:26:56.654533Z", + "shell.execute_reply": "2024-03-26T07:26:56.653664Z" + }, + "executionInfo": { + "elapsed": 588, + "status": "ok", + "timestamp": 1696841049215, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "NgahtU1q9uLO", + "papermill": { + "duration": 0.338682, + "end_time": "2024-03-26T07:26:56.656561", + "exception": false, + "start_time": "2024-03-26T07:26:56.317879", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'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", + " 'loss_balancer_beta': 0.7999999999999999,\n", + " 'loss_balancer_r': 0.96,\n", + " 'tf_pma_low': 16,\n", + " 'grad_loss_fn': torch.Tensor>,\n", + " 'pma_ffn_mode': 'none',\n", + " 'patience': 10,\n", + " 'inds_init_mode': 'fixnorm',\n", + " 'grad_clip': 0.7999999999999999,\n", + " 'bias_weight_decay': 0.05,\n", + " 'head_activation': torch.nn.modules.activation.ReLU6,\n", + " 'tf_activation': ml_utility_loss.activations.LeakyHardtanh,\n", + " 'dataset_size': 2048,\n", + " 'batch_size': 4,\n", + " 'epochs': 100,\n", + " 'lr_mul': 0.09,\n", + " 'n_warmup_steps': 80,\n", + " 'Optim': functools.partial(, amsgrad=True),\n", + " 'fixed_role_model': 'realtabformer',\n", + " 'g_loss_mul': 0.1,\n", + " 'd_model': 256,\n", + " 'attn_activation': ml_utility_loss.activations.LeakyHardtanh,\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': 512,\n", + " 'ada_n_layers': 8,\n", + " 'ada_activation': torch.nn.modules.activation.Softsign,\n", + " 'ada_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'head_d_hid': 512,\n", + " 'head_n_layers': 9,\n", + " 'head_n_head': 64,\n", + " 'head_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'single_model': True,\n", + " 'models': ['realtabformer'],\n", + " 'max_seconds': 3600,\n", + " 'Body': 'twin_encoder',\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", + " 'dropout': 0,\n", + " 'combine_mode': 'diff_left',\n", + " 'tf_isab_mode': 'separate',\n", + " 'bias': True,\n", + " 'bias_final': True,\n", + " 'synth_data': 2,\n", + " 'bias_lr_mul': 1.0,\n", + " 'tf_lora': False,\n", + " 'tf_num_inds': 16,\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': 1.0, '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", + "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-26T07:26:56.681474Z", + "iopub.status.busy": "2024-03-26T07:26:56.680881Z", + "iopub.status.idle": "2024-03-26T07:26:57.096125Z", + "shell.execute_reply": "2024-03-26T07:26:57.095205Z" + }, + "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.429989, + "end_time": "2024-03-26T07:26:57.098235", + "exception": false, + "start_time": "2024-03-26T07:26:56.668246", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating model of type \n", + "[*] Embedding True True\n", + "['realtabformer'] 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-26T07:26:57.123623Z", + "iopub.status.busy": "2024-03-26T07:26:57.122990Z", + "iopub.status.idle": "2024-03-26T07:26:57.127382Z", + "shell.execute_reply": "2024-03-26T07:26:57.126473Z" + }, + "papermill": { + "duration": 0.019295, + "end_time": "2024-03-26T07:26:57.129303", + "exception": false, + "start_time": "2024-03-26T07:26:57.110008", + "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-26T07:26:57.153047Z", + "iopub.status.busy": "2024-03-26T07:26:57.152297Z", + "iopub.status.idle": "2024-03-26T07:26:57.159482Z", + "shell.execute_reply": "2024-03-26T07:26:57.158638Z" + }, + "papermill": { + "duration": 0.021132, + "end_time": "2024-03-26T07:26:57.161396", + "exception": false, + "start_time": "2024-03-26T07:26:57.140264", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8630553" + ] + }, + "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-26T07:26:57.185355Z", + "iopub.status.busy": "2024-03-26T07:26:57.185067Z", + "iopub.status.idle": "2024-03-26T07:26:57.267717Z", + "shell.execute_reply": "2024-03-26T07:26:57.266767Z" + }, + "papermill": { + "duration": 0.097317, + "end_time": "2024-03-26T07:26:57.269982", + "exception": false, + "start_time": "2024-03-26T07:26:57.172665", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "========================================================================================================================\n", + "Layer (type:depth-idx) Output Shape Param #\n", + "========================================================================================================================\n", + "MLUtilitySingle [2, 1179, 16128] --\n", + "├─Adapter: 1-1 [2, 1179, 16128] --\n", + "│ └─Embedding: 2-1 [2, 1179, 24, 672] (48,384)\n", + "│ └─TensorInductionPoint: 2-2 [24, 1] 24\n", + "│ └─Sequential: 2-3 [2, 1179, 256] --\n", + "│ │ └─FeedForward: 3-1 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-1 [2, 1179, 512] 344,576\n", + "│ │ │ └─Softsign: 4-2 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-2 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-3 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-4 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-3 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-5 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-6 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-4 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-7 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-8 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-5 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-9 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-10 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-6 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-11 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-12 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-7 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-13 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-14 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-8 [2, 1179, 256] --\n", + "│ │ │ └─Linear: 4-15 [2, 1179, 256] 131,328\n", + "│ │ │ └─LeakyHardsigmoid: 4-16 [2, 1179, 256] --\n", + "├─Adapter: 1-2 [2, 294, 16128] (recursive)\n", + "│ └─Embedding: 2-4 [2, 294, 24, 672] (recursive)\n", + "│ └─TensorInductionPoint: 2-5 [24, 1] (recursive)\n", + "│ └─Sequential: 2-6 [2, 294, 256] (recursive)\n", + "│ │ └─FeedForward: 3-9 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-17 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-18 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-10 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-19 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-20 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-11 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-21 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-22 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-12 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-23 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-24 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-13 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-25 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-26 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-14 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-27 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-28 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-15 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-29 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-30 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-16 [2, 294, 256] (recursive)\n", + "│ │ │ └─Linear: 4-31 [2, 294, 256] (recursive)\n", + "│ │ │ └─LeakyHardsigmoid: 4-32 [2, 294, 256] --\n", + "├─TwinEncoder: 1-3 [2, 4096] --\n", + "│ └─Encoder: 2-7 [2, 16, 256] --\n", + "│ │ └─ModuleList: 3-18 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-33 [2, 1179, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-1 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-1 [2, 16, 256] 4,096\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-2 [2, 16, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-1 [2, 16, 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, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-1 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-5 [2, 16, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-6 [2, 16, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-3 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-7 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-8 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-9 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-10 [2, 32, 1179, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-2 [2, 32, 1179, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-11 [2, 1179, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-12 [2, 1179, 256] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-2 [2, 1179, 256] --\n", + "│ │ │ │ │ └─Linear: 6-4 [2, 1179, 512] 131,584\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-5 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-6 [2, 1179, 256] 131,328\n", + "│ │ │ └─EncoderLayer: 4-34 [2, 1179, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-3 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-7 [2, 16, 256] 4,096\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-8 [2, 16, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-13 [2, 16, 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, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-3 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-17 [2, 16, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-18 [2, 16, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-9 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-19 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-20 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-21 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-22 [2, 32, 1179, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-4 [2, 32, 1179, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-23 [2, 1179, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-24 [2, 1179, 256] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-4 [2, 1179, 256] --\n", + "│ │ │ │ │ └─Linear: 6-10 [2, 1179, 512] 131,584\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-11 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-12 [2, 1179, 256] 131,328\n", + "│ │ │ └─EncoderLayer: 4-35 [2, 16, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-5 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-13 [2, 16, 256] 4,096\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-14 [2, 16, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-25 [2, 16, 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, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-5 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-29 [2, 16, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-30 [2, 16, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-15 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-31 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-32 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-33 [2, 16, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-34 [2, 32, 1179, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-6 [2, 32, 1179, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-35 [2, 1179, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-36 [2, 1179, 256] --\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", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-42 [2, 16, 256] --\n", + "│ └─Encoder: 2-8 [2, 16, 256] (recursive)\n", + "│ │ └─ModuleList: 3-18 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-36 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-8 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-21 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-22 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-43 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-44 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-45 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-46 [2, 32, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-8 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-47 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-48 [2, 16, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-23 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-49 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-50 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-51 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-52 [2, 32, 294, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-9 [2, 32, 294, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-53 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-54 [2, 294, 256] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-9 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-24 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-25 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-26 [2, 294, 256] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-37 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-10 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-27 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-28 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-55 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-56 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-57 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-58 [2, 32, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-10 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-59 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-60 [2, 16, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-29 [2, 294, 256] (recursive)\n", + "�� │ │ │ │ │ └─Linear: 7-61 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-62 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-63 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-64 [2, 32, 294, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-11 [2, 32, 294, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-65 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-66 [2, 294, 256] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-11 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-30 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-31 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-32 [2, 294, 256] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-38 [2, 16, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-12 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-33 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-34 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-67 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-68 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-69 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-70 [2, 32, 16, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-12 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-71 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-72 [2, 16, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-35 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-73 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-74 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-75 [2, 16, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-76 [2, 32, 294, 8] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-13 [2, 32, 294, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-77 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-78 [2, 294, 256] --\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", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-84 [2, 16, 256] --\n", + "├─Head: 1-4 [2] --\n", + "│ └─Sequential: 2-9 [2, 1] --\n", + "│ │ └─FeedForward: 3-19 [2, 512] --\n", + "│ │ │ └─Linear: 4-39 [2, 512] 2,097,664\n", + "│ │ │ └─ReLU6: 4-40 [2, 512] --\n", + "│ │ └─FeedForward: 3-20 [2, 512] --\n", + "│ │ │ └─Linear: 4-41 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-42 [2, 512] --\n", + "│ │ └─FeedForward: 3-21 [2, 512] --\n", + "│ │ │ └─Linear: 4-43 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-44 [2, 512] --\n", + "│ │ └─FeedForward: 3-22 [2, 512] --\n", + "│ │ │ └─Linear: 4-45 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-46 [2, 512] --\n", + "│ │ └─FeedForward: 3-23 [2, 512] --\n", + "│ │ │ └─Linear: 4-47 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-48 [2, 512] --\n", + "│ │ └─FeedForward: 3-24 [2, 512] --\n", + "│ │ │ └─Linear: 4-49 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-50 [2, 512] --\n", + "│ │ └─FeedForward: 3-25 [2, 512] --\n", + "│ │ │ └─Linear: 4-51 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-52 [2, 512] --\n", + "│ │ └─FeedForward: 3-26 [2, 512] --\n", + "│ │ │ └─Linear: 4-53 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-54 [2, 512] --\n", + "│ │ └─FeedForward: 3-27 [2, 1] --\n", + "│ │ │ └─Linear: 4-55 [2, 1] 513\n", + "│ │ │ └─LeakyHardsigmoid: 4-56 [2, 1] --\n", + "========================================================================================================================\n", + "Total params: 8,678,937\n", + "Trainable params: 8,630,553\n", + "Non-trainable params: 48,384\n", + "Total mult-adds (M): 26.78\n", + "========================================================================================================================\n", + "Input size (MB): 0.28\n", + "Forward/backward pass size (MB): 611.80\n", + "Params size (MB): 34.72\n", + "Estimated Total Size (MB): 646.80\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": "357e54f8", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:26:57.298334Z", + "iopub.status.busy": "2024-03-26T07:26:57.297625Z", + "iopub.status.idle": "2024-03-26T07:26:57.351148Z", + "shell.execute_reply": "2024-03-26T07:26:57.350264Z" + }, + "papermill": { + "duration": 0.070214, + "end_time": "2024-03-26T07:26:57.353219", + "exception": false, + "start_time": "2024-03-26T07:26:57.283005", + "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-26T07:26:57.378317Z", + "iopub.status.busy": "2024-03-26T07:26:57.378000Z", + "iopub.status.idle": "2024-03-26T07:28:55.431010Z", + "shell.execute_reply": "2024-03-26T07:28:55.430034Z" + }, + "papermill": { + "duration": 118.068266, + "end_time": "2024-03-26T07:28:55.433593", + "exception": false, + "start_time": "2024-03-26T07:26:57.365327", + "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-26T07:28:55.460773Z", + "iopub.status.busy": "2024-03-26T07:28:55.460451Z", + "iopub.status.idle": "2024-03-26T07:28:55.480918Z", + "shell.execute_reply": "2024-03-26T07:28:55.480077Z" + }, + "papermill": { + "duration": 0.036167, + "end_time": "2024-03-26T07:28:55.482901", + "exception": false, + "start_time": "2024-03-26T07:28:55.446734", + "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
realtabformer0.0120810.0188910.0019071.5411150.226876.4617590.3824680.0000043.990210.0328070.0918250.0436660.0926020.0068535.531325
\n", + "
" + ], + "text/plain": [ + " avg_g_cos_loss avg_g_mag_loss avg_loss grad_duration \\\n", + "realtabformer 0.012081 0.018891 0.001907 1.541115 \n", + "\n", + " grad_mae grad_mape grad_rmse mean_pred_loss pred_duration \\\n", + "realtabformer 0.22687 6.461759 0.382468 0.000004 3.99021 \n", + "\n", + " pred_mae pred_mape pred_rmse pred_std std_loss \\\n", + "realtabformer 0.032807 0.091825 0.043666 0.092602 0.006853 \n", + "\n", + " total_duration \n", + "realtabformer 5.531325 " + ] + }, + "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-26T07:28:55.508032Z", + "iopub.status.busy": "2024-03-26T07:28:55.507773Z", + "iopub.status.idle": "2024-03-26T07:28:55.882843Z", + "shell.execute_reply": "2024-03-26T07:28:55.881912Z" + }, + "papermill": { + "duration": 0.39035, + "end_time": "2024-03-26T07:28:55.885037", + "exception": false, + "start_time": "2024-03-26T07:28:55.494687", + "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-26T07:28:55.912203Z", + "iopub.status.busy": "2024-03-26T07:28:55.911912Z", + "iopub.status.idle": "2024-03-26T07:31:07.173898Z", + "shell.execute_reply": "2024-03-26T07:31:07.173011Z" + }, + "papermill": { + "duration": 131.278434, + "end_time": "2024-03-26T07:31:07.176509", + "exception": false, + "start_time": "2024-03-26T07:28:55.898075", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/realtabformer/all inf False\n", + "Caching in ../../../../contraceptive/_cache_bs_test/realtabformer/all inf False\n", + "Caching in ../../../../contraceptive/_cache_synth_test/realtabformer/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-26T07:31:07.205481Z", + "iopub.status.busy": "2024-03-26T07:31:07.205109Z", + "iopub.status.idle": "2024-03-26T07:31:07.227326Z", + "shell.execute_reply": "2024-03-26T07:31:07.226670Z" + }, + "papermill": { + "duration": 0.039158, + "end_time": "2024-03-26T07:31:07.229440", + "exception": false, + "start_time": "2024-03-26T07:31:07.190282", + "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-26T07:31:07.255797Z", + "iopub.status.busy": "2024-03-26T07:31:07.255492Z", + "iopub.status.idle": "2024-03-26T07:31:07.261027Z", + "shell.execute_reply": "2024-03-26T07:31:07.260145Z" + }, + "papermill": { + "duration": 0.021277, + "end_time": "2024-03-26T07:31:07.263161", + "exception": false, + "start_time": "2024-03-26T07:31:07.241884", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'realtabformer': 0.40327791005373004}\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-26T07:31:07.289048Z", + "iopub.status.busy": "2024-03-26T07:31:07.288773Z", + "iopub.status.idle": "2024-03-26T07:31:07.722179Z", + "shell.execute_reply": "2024-03-26T07:31:07.721284Z" + }, + "papermill": { + "duration": 0.449164, + "end_time": "2024-03-26T07:31:07.724405", + "exception": false, + "start_time": "2024-03-26T07:31:07.275241", + "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-26T07:31:07.754067Z", + "iopub.status.busy": "2024-03-26T07:31:07.753691Z", + "iopub.status.idle": "2024-03-26T07:31:08.135937Z", + "shell.execute_reply": "2024-03-26T07:31:08.135080Z" + }, + "papermill": { + "duration": 0.399431, + "end_time": "2024-03-26T07:31:08.138041", + "exception": false, + "start_time": "2024-03-26T07:31:07.738610", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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tm3D2bNn8fvf/75VQmnLQw89BJ7n8eSTT+L06dPYtm0bXn31VQDwdUKdP38+amtr8eCDD+LgwYMoKCjAtm3b8Nhjj/mSz5XxXNmTPlxcVyaikDdUt6D0VF2pRBQSASWigwcP4pe//GWr7X369EFFRUW3g+rtFi9eDKlUiqFDh8JoNOLWW2/Fvffei1mzZmH8+PGoqanxKx21R6fT4V//+heOHj2K0aNH47//+7+xbNkyAPB9gVxtYv624ikuLg7dyXfAO8asedR996q8ncEYg8vNo6zJk/SoRBQSAU2en5SUhG3btiE3NxdarRbHjh1D3759sWPHDsydOxclJSWhiLUVmjy/695//3089thjaGhogFqtFjucLqlvcsDpciGe1UMq4YDY5JA3Vjc1WXHizDmcr6jFQ6rvwcUagXFPXP2JBECIJ8+/66678MILL8DpFPrkcByH4uJiPPfcc63WTifieu+997Bnzx5cvHgRn332ma+PUKQlIQAwaBRIVEsg8V62D3ESApq7fzmkGqFqaGsQ+qORoAronXzttdfQ2NgIo9EIq9WKyZMno3///tBqtfjjH/8Y7BhJN1RUVOCRRx7BkCFD8Mwzz+D+++/H22+/LXZYAeN4p+eKWeirZYDwJctxgFOqEaqGbifgsoXltXuTgFr79Ho9duzYgb179+LYsWNobGzEmDFjMG3atGDHR7rp2WefxbPPPit2GMHDe8aYdbNLRNdw4DkpXFI1AIfQYC2PvBJlT9blRMTzPPLy8rB582YUFhaC4zjk5OQgJSXFb11zQoKp0e6CzemGzm2HIsRzEF3JVz2TxwLuWqHBWpscttfvDbpUNWOM4a677sLjjz+OsrIyjBgxAsOGDUNRURHmzJnTI6eJDaAtnvRALjcvdCfgw3fFDBD+f4Q8xMEhpUv4odKlr5W8vDx899132LlzJ6ZOner32DfffIO7774b7733Hh599NGgBhkI70DcpqamiGyYJf7cPIOEuTwN1dKwDTx1OBxggDBLoywWcACwN4TltXuTLiWiDz74AP/1X//VKgkBwE033YQlS5bg/fff7xGJSCqVwmAwoKqqCgCg0Wio2hihGGOw2hyQua1wSF1wQQrYQt9gzPM8qquroVZrMGVIAuKttUAThCtnJKi6lIiOHz+OV155pd3Hb7/99h610qt3tLg3GZHIxPMMjXYX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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-26T07:31:08.167352Z", + "iopub.status.busy": "2024-03-26T07:31:08.167032Z", + "iopub.status.idle": "2024-03-26T07:31:08.397180Z", + "shell.execute_reply": "2024-03-26T07:31:08.396233Z" + }, + "papermill": { + "duration": 0.247481, + "end_time": "2024-03-26T07:31:08.399501", + "exception": false, + "start_time": "2024-03-26T07:31:08.152020", + "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-26T07:31:08.432786Z", + "iopub.status.busy": "2024-03-26T07:31:08.431820Z", + "iopub.status.idle": "2024-03-26T07:31:08.729544Z", + "shell.execute_reply": "2024-03-26T07:31:08.728578Z" + }, + "papermill": { + "duration": 0.316237, + "end_time": "2024-03-26T07:31:08.731572", + "exception": false, + "start_time": "2024-03-26T07:31:08.415335", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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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.014658, + "end_time": "2024-03-26T07:31:08.761379", + "exception": false, + "start_time": "2024-03-26T07:31:08.746721", + "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": 272.095697, + "end_time": "2024-03-26T07:31:11.497251", + "environment_variables": {}, + "exception": null, + "input_path": "eval/contraceptive/realtabformer/3/mlu-eval-load.ipynb", + "output_path": "eval/contraceptive/realtabformer/3/mlu-eval-load.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/realtabformer/3", + "path_prefix": "../../../../", + "random_seed": 3, + "single_model": "realtabformer" + }, + "start_time": "2024-03-26T07:26:39.401554", + "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