diff --git "a/contraceptive/tab_ddpm_concat/mlu-eval.ipynb" "b/contraceptive/tab_ddpm_concat/mlu-eval.ipynb" new file mode 100644--- /dev/null +++ "b/contraceptive/tab_ddpm_concat/mlu-eval.ipynb" @@ -0,0 +1,2313 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "982e76f5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:02.995339Z", + "iopub.status.busy": "2024-03-26T07:35:02.994416Z", + "iopub.status.idle": "2024-03-26T07:35:03.027714Z", + "shell.execute_reply": "2024-03-26T07:35:03.027003Z" + }, + "papermill": { + "duration": 0.048104, + "end_time": "2024-03-26T07:35:03.029650", + "exception": false, + "start_time": "2024-03-26T07:35:02.981546", + "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:35:03.055960Z", + "iopub.status.busy": "2024-03-26T07:35:03.055176Z", + "iopub.status.idle": "2024-03-26T07:35:03.062623Z", + "shell.execute_reply": "2024-03-26T07:35:03.061845Z" + }, + "papermill": { + "duration": 0.022772, + "end_time": "2024-03-26T07:35:03.064554", + "exception": false, + "start_time": "2024-03-26T07:35:03.041782", + "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:35:03.087890Z", + "iopub.status.busy": "2024-03-26T07:35:03.087631Z", + "iopub.status.idle": "2024-03-26T07:35:03.091817Z", + "shell.execute_reply": "2024-03-26T07:35:03.090938Z" + }, + "papermill": { + "duration": 0.018301, + "end_time": "2024-03-26T07:35:03.093817", + "exception": false, + "start_time": "2024-03-26T07:35:03.075516", + "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:35:03.118179Z", + "iopub.status.busy": "2024-03-26T07:35:03.117885Z", + "iopub.status.idle": "2024-03-26T07:35:03.121725Z", + "shell.execute_reply": "2024-03-26T07:35:03.120894Z" + }, + "executionInfo": { + "elapsed": 678, + "status": "ok", + "timestamp": 1696841022168, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "ns5hFcVL2yvs", + "papermill": { + "duration": 0.018653, + "end_time": "2024-03-26T07:35:03.123548", + "exception": false, + "start_time": "2024-03-26T07:35:03.104895", + "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:35:03.147229Z", + "iopub.status.busy": "2024-03-26T07:35:03.146680Z", + "iopub.status.idle": "2024-03-26T07:35:03.152343Z", + "shell.execute_reply": "2024-03-26T07:35:03.151495Z" + }, + "papermill": { + "duration": 0.019628, + "end_time": "2024-03-26T07:35:03.154323", + "exception": false, + "start_time": "2024-03-26T07:35:03.134695", + "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": "adaee8e7", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:03.179799Z", + "iopub.status.busy": "2024-03-26T07:35:03.179435Z", + "iopub.status.idle": "2024-03-26T07:35:03.184808Z", + "shell.execute_reply": "2024-03-26T07:35:03.184010Z" + }, + "papermill": { + "duration": 0.020621, + "end_time": "2024-03-26T07:35:03.186624", + "exception": false, + "start_time": "2024-03-26T07:35:03.166003", + "status": "completed" + }, + "tags": [ + "injected-parameters" + ] + }, + "outputs": [], + "source": [ + "# Parameters\n", + "dataset = \"contraceptive\"\n", + "dataset_name = \"contraceptive\"\n", + "single_model = \"tab_ddpm_concat\"\n", + "gp = True\n", + "gp_multiply = True\n", + "random_seed = 1\n", + "debug = False\n", + "folder = \"eval\"\n", + "path_prefix = \"../../../../\"\n", + "path = \"eval/contraceptive/tab_ddpm_concat/1\"\n", + "param_index = 0\n", + "allow_same_prediction = True\n", + "log_wandb = False\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd7c02d6", + "metadata": { + "papermill": { + "duration": 0.010991, + "end_time": "2024-03-26T07:35:03.208708", + "exception": false, + "start_time": "2024-03-26T07:35:03.197717", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5f45b1d0", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:03.232116Z", + "iopub.status.busy": "2024-03-26T07:35:03.231793Z", + "iopub.status.idle": "2024-03-26T07:35:03.241260Z", + "shell.execute_reply": "2024-03-26T07:35:03.240402Z" + }, + "executionInfo": { + "elapsed": 7, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "UdvXYv3c3LXy", + "papermill": { + "duration": 0.023482, + "end_time": "2024-03-26T07:35:03.243190", + "exception": false, + "start_time": "2024-03-26T07:35:03.219708", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/working\n", + "/kaggle/working/eval/contraceptive/tab_ddpm_concat/1\n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "import os\n", + "\n", + "%cd /kaggle/working/\n", + "\n", + "if path is None:\n", + " path = os.path.join(folder, dataset_name, single_model, random_seed)\n", + "Path(path).mkdir(parents=True, exist_ok=True)\n", + "\n", + "%cd {path}" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f85bf540", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:03.266996Z", + "iopub.status.busy": "2024-03-26T07:35:03.266687Z", + "iopub.status.idle": "2024-03-26T07:35:05.265679Z", + "shell.execute_reply": "2024-03-26T07:35:05.264724Z" + }, + "papermill": { + "duration": 2.013942, + "end_time": "2024-03-26T07:35:05.268393", + "exception": false, + "start_time": "2024-03-26T07:35:03.254451", + "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:35:05.300607Z", + "iopub.status.busy": "2024-03-26T07:35:05.299496Z", + "iopub.status.idle": "2024-03-26T07:35:05.312893Z", + "shell.execute_reply": "2024-03-26T07:35:05.312104Z" + }, + "papermill": { + "duration": 0.029904, + "end_time": "2024-03-26T07:35:05.314826", + "exception": false, + "start_time": "2024-03-26T07:35:05.284922", + "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:35:05.339428Z", + "iopub.status.busy": "2024-03-26T07:35:05.339167Z", + "iopub.status.idle": "2024-03-26T07:35:05.349826Z", + "shell.execute_reply": "2024-03-26T07:35:05.348900Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "Vrl2QkoV3o_8", + "papermill": { + "duration": 0.02534, + "end_time": "2024-03-26T07:35:05.351893", + "exception": false, + "start_time": "2024-03-26T07:35:05.326553", + "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:35:05.375758Z", + "iopub.status.busy": "2024-03-26T07:35:05.375488Z", + "iopub.status.idle": "2024-03-26T07:35:05.868120Z", + "shell.execute_reply": "2024-03-26T07:35:05.866917Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "TilUuFk9vqMb", + "papermill": { + "duration": 0.507742, + "end_time": "2024-03-26T07:35:05.870935", + "exception": false, + "start_time": "2024-03-26T07:35:05.363193", + "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:35:05.898221Z", + "iopub.status.busy": "2024-03-26T07:35:05.897740Z", + "iopub.status.idle": "2024-03-26T07:35:19.187741Z", + "shell.execute_reply": "2024-03-26T07:35:19.186849Z" + }, + "executionInfo": { + "elapsed": 3113, + "status": "ok", + "timestamp": 1696841025277, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "7Abt8nStvr9Z", + "papermill": { + "duration": 13.3063, + "end_time": "2024-03-26T07:35:19.190224", + "exception": false, + "start_time": "2024-03-26T07:35:05.883924", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-26 07:35:10.386642: 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:35:10.386743: 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:35:10.519405: 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:35:19.218014Z", + "iopub.status.busy": "2024-03-26T07:35:19.216822Z", + "iopub.status.idle": "2024-03-26T07:35:19.226877Z", + "shell.execute_reply": "2024-03-26T07:35:19.226183Z" + }, + "papermill": { + "duration": 0.026024, + "end_time": "2024-03-26T07:35:19.228924", + "exception": false, + "start_time": "2024-03-26T07:35:19.202900", + "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:35:19.254876Z", + "iopub.status.busy": "2024-03-26T07:35:19.254580Z", + "iopub.status.idle": "2024-03-26T07:35:28.746044Z", + "shell.execute_reply": "2024-03-26T07:35:28.744936Z" + }, + "executionInfo": { + "elapsed": 20137, + "status": "ok", + "timestamp": 1696841045408, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "tbaguWxAvtPi", + "papermill": { + "duration": 9.507866, + "end_time": "2024-03-26T07:35:28.748938", + "exception": false, + "start_time": "2024-03-26T07:35:19.241072", + "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" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/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:35:28.777730Z", + "iopub.status.busy": "2024-03-26T07:35:28.776930Z", + "iopub.status.idle": "2024-03-26T07:35:28.783689Z", + "shell.execute_reply": "2024-03-26T07:35:28.782890Z" + }, + "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.023315, + "end_time": "2024-03-26T07:35:28.785971", + "exception": false, + "start_time": "2024-03-26T07:35:28.762656", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tvae': 46,\n", + " 'realtabformer': (24, 72, Embedding(72, 672), True),\n", + " 'lct_gan': 40,\n", + " 'tab_ddpm_concat': 10}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preprocessor.adapter_sizes" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3cb9ed90", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:28.810552Z", + "iopub.status.busy": "2024-03-26T07:35:28.810301Z", + "iopub.status.idle": "2024-03-26T07:35:28.815012Z", + "shell.execute_reply": "2024-03-26T07:35:28.814118Z" + }, + "papermill": { + "duration": 0.019136, + "end_time": "2024-03-26T07:35:28.816851", + "exception": false, + "start_time": "2024-03-26T07:35:28.797715", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from ml_utility_loss.loss_learning.estimator.pipeline import load_dataset_3_factory\n", + "\n", + "datasetsn = load_dataset_3_factory(\n", + " dataset_dir=os.path.join(path_prefix, \"ml-utility-loss/\"),\n", + " dataset_name=dataset_name,\n", + " preprocessor=preprocessor,\n", + " cache_dir=path_prefix,\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ad1eb833", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:28.842295Z", + "iopub.status.busy": "2024-03-26T07:35:28.841737Z", + "iopub.status.idle": "2024-03-26T07:35:49.690743Z", + "shell.execute_reply": "2024-03-26T07:35:49.689743Z" + }, + "papermill": { + "duration": 20.864112, + "end_time": "2024-03-26T07:35:49.692830", + "exception": false, + "start_time": "2024-03-26T07:35:28.828718", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/tab_ddpm_concat/all inf False\n", + "../../../../ml-utility-loss/aug_test/contraceptive 0\n", + "Caching in ../../../../contraceptive/_cache_bs_test/tab_ddpm_concat/all inf False\n", + "../../../../ml-utility-loss/bs_test/contraceptive 0\n", + "Caching in ../../../../contraceptive/_cache_synth_test/tab_ddpm_concat/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "../../../../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": 18, + "id": "14ff8b40", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:49.721298Z", + "iopub.status.busy": "2024-03-26T07:35:49.720938Z", + "iopub.status.idle": "2024-03-26T07:35:50.346184Z", + "shell.execute_reply": "2024-03-26T07:35:50.345173Z" + }, + "executionInfo": { + "elapsed": 588, + "status": "ok", + "timestamp": 1696841049215, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "NgahtU1q9uLO", + "papermill": { + "duration": 0.643036, + "end_time": "2024-03-26T07:35:50.348714", + "exception": false, + "start_time": "2024-03-26T07:35:49.705678", + "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': 4,\n", + " 'dropout': 0,\n", + " 'combine_mode': 'diff_left',\n", + " 'tf_isab_mode': 'separate',\n", + " 'grad_loss_fn': torch.Tensor>,\n", + " 'single_model': True,\n", + " 'bias': True,\n", + " 'bias_final': True,\n", + " 'pma_ffn_mode': 'none',\n", + " 'patience': 10,\n", + " 'inds_init_mode': 'fixnorm',\n", + " 'grad_clip': 0.7494458230986923,\n", + " 'gradient_penalty_mode': {'gradient_penalty': True,\n", + " 'forward_once': False,\n", + " 'calc_grad_m': False,\n", + " 'avg_non_role_model_m': False,\n", + " 'inverse_avg_non_role_model_m': False},\n", + " 'synth_data': 2,\n", + " 'bias_lr_mul': 1.0,\n", + " 'bias_weight_decay': 0.05,\n", + " 'head_activation': torch.nn.modules.activation.ReLU6,\n", + " 'loss_balancer_beta': 0.6806661100374879,\n", + " 'loss_balancer_r': 0.9427716710925113,\n", + " 'tf_activation': torch.nn.modules.activation.ReLU6,\n", + " 'dataset_size': 2048,\n", + " 'batch_size': 4,\n", + " 'epochs': 100,\n", + " 'lr_mul': 0.07424782199493057,\n", + " 'n_warmup_steps': 104,\n", + " 'Optim': functools.partial(, amsgrad=True),\n", + " 'fixed_role_model': 'tab_ddpm_concat',\n", + " 'd_model': 128,\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': 1024,\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': 256,\n", + " 'head_n_layers': 8,\n", + " 'head_n_head': 16,\n", + " 'head_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'models': ['tab_ddpm_concat'],\n", + " 'max_seconds': 3600,\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': 0.20359405820922769,\n", + " 'multiply': True,\n", + " 'forgive_over': True}}}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n", + "from ml_utility_loss.tuning import map_parameters\n", + "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n", + "import wandb\n", + "\n", + "#\"\"\"\n", + "param_space = {\n", + " **getattr(PARAMS, dataset_name).PARAM_SPACE,\n", + "}\n", + "# params = {\n", + "# **getattr(PARAMS, dataset_name).BESTS[param_index],\n", + "# }\n", + "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": 19, + "id": "a48bd9e9", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:35:50.377743Z", + "iopub.status.busy": "2024-03-26T07:35:50.377384Z", + "iopub.status.idle": "2024-03-26T07:36:37.247201Z", + "shell.execute_reply": "2024-03-26T07:36:37.246033Z" + }, + "papermill": { + "duration": 46.898103, + "end_time": "2024-03-26T07:36:37.260942", + "exception": false, + "start_time": "2024-03-26T07:35:50.362839", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_train/tab_ddpm_concat/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "split df ratio is 0\n", + "../../../../ml-utility-loss/aug_train/contraceptive [400, 0]\n", + "Caching in ../../../../contraceptive/_cache_aug_val/tab_ddpm_concat/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "split df ratio is 1\n", + "../../../../ml-utility-loss/aug_val/contraceptive [0, 200]\n", + "Caching in ../../../../contraceptive/_cache_bs_train/tab_ddpm_concat/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "split df ratio is 0\n", + "../../../../ml-utility-loss/bs_train/contraceptive [100, 0]\n", + "Caching in ../../../../contraceptive/_cache_bs_val/tab_ddpm_concat/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "split df ratio is 1\n", + "../../../../ml-utility-loss/bs_val/contraceptive [0, 50]\n", + "Caching in ../../../../contraceptive/_cache_synth/tab_ddpm_concat/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Splitting without random!\n", + "Split with reverse index!\n", + "../../../../ml-utility-loss/synthetics/contraceptive [400, 200]\n", + "[900, 450]\n", + "[900, 450]\n" + ] + } + ], + "source": [ + "train_set, val_set = datasetsn(model=params[\"fixed_role_model\"], synth_data=params[\"synth_data\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "2fcb1418", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "execution": { + "iopub.execute_input": "2024-03-26T07:36:37.289564Z", + "iopub.status.busy": "2024-03-26T07:36:37.289232Z", + "iopub.status.idle": "2024-03-26T07:36:37.730723Z", + "shell.execute_reply": "2024-03-26T07:36:37.729782Z" + }, + "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.458557, + "end_time": "2024-03-26T07:36:37.732807", + "exception": false, + "start_time": "2024-03-26T07:36:37.274250", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating model of type \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[*] Embedding False True\n", + "['tab_ddpm_concat'] 1\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.model.pipeline import remove_non_model_params\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import create_model\n", + "from ml_utility_loss.util import filter_dict, clear_memory\n", + "\n", + "clear_memory()\n", + "\n", + "params2 = remove_non_model_params(params)\n", + "adapters = filter_dict(preprocessor.adapter_sizes, params[\"models\"])\n", + "\n", + "model = create_model(\n", + " adapters=adapters,\n", + " #Body=\"twin_encoder\",\n", + " **params2,\n", + ")\n", + "#cf.apply_weight_standardization(model, n_last_layers_ignore=0)\n", + "print(model.models, len(model.adapters))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "938f94fc", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:36:37.763346Z", + "iopub.status.busy": "2024-03-26T07:36:37.763000Z", + "iopub.status.idle": "2024-03-26T07:36:37.767427Z", + "shell.execute_reply": "2024-03-26T07:36:37.766569Z" + }, + "papermill": { + "duration": 0.022401, + "end_time": "2024-03-26T07:36:37.769485", + "exception": false, + "start_time": "2024-03-26T07:36:37.747084", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "study_name=f\"{model_name}_{dataset_name}\"" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "12fb613e", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:36:37.798816Z", + "iopub.status.busy": "2024-03-26T07:36:37.798462Z", + "iopub.status.idle": "2024-03-26T07:36:37.806558Z", + "shell.execute_reply": "2024-03-26T07:36:37.805620Z" + }, + "papermill": { + "duration": 0.0258, + "end_time": "2024-03-26T07:36:37.808874", + "exception": false, + "start_time": "2024-03-26T07:36:37.783074", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7827841" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def count_parameters(model):\n", + " return sum(p.numel() for p in model.parameters() if p.requires_grad)\n", + "\n", + "count_parameters(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "bd386e57", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:36:37.840768Z", + "iopub.status.busy": "2024-03-26T07:36:37.840422Z", + "iopub.status.idle": "2024-03-26T07:36:37.924244Z", + "shell.execute_reply": "2024-03-26T07:36:37.923277Z" + }, + "papermill": { + "duration": 0.102431, + "end_time": "2024-03-26T07:36:37.926641", + "exception": false, + "start_time": "2024-03-26T07:36:37.824210", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "========================================================================================================================\n", + "Layer (type:depth-idx) Output Shape Param #\n", + "========================================================================================================================\n", + "MLUtilitySingle [2, 1179, 10] --\n", + "├─Adapter: 1-1 [2, 1179, 10] --\n", + "│ └─Sequential: 2-1 [2, 1179, 128] --\n", + "│ │ └─FeedForward: 3-1 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-1 [2, 1179, 1024] 11,264\n", + "│ │ │ └─Softsign: 4-2 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-2 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-3 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-4 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-3 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-5 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-6 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-4 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-7 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-8 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-5 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-9 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-10 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-6 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-11 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-12 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-7 [2, 1179, 1024] --\n", + "│ │ │ └─Linear: 4-13 [2, 1179, 1024] 1,049,600\n", + "│ │ │ └─Softsign: 4-14 [2, 1179, 1024] --\n", + "│ │ └─FeedForward: 3-8 [2, 1179, 128] --\n", + "│ │ │ └─Linear: 4-15 [2, 1179, 128] 131,200\n", + "│ │ │ └─LeakyHardsigmoid: 4-16 [2, 1179, 128] --\n", + "├─Adapter: 1-2 [2, 294, 10] (recursive)\n", + "│ └─Sequential: 2-2 [2, 294, 128] (recursive)\n", + "│ │ └─FeedForward: 3-9 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-17 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-18 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-10 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-19 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-20 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-11 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-21 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-22 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-12 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-23 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-24 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-13 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-25 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-26 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-14 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-27 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-28 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-15 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Linear: 4-29 [2, 294, 1024] (recursive)\n", + "│ │ │ └─Softsign: 4-30 [2, 294, 1024] --\n", + "│ │ └─FeedForward: 3-16 [2, 294, 128] (recursive)\n", + "│ │ │ └─Linear: 4-31 [2, 294, 128] (recursive)\n", + "│ │ │ └─LeakyHardsigmoid: 4-32 [2, 294, 128] --\n", + "├─TwinEncoder: 1-3 [2, 512] --\n", + "│ └─Encoder: 2-3 [2, 4, 128] --\n", + "│ │ └─ModuleList: 3-18 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-33 [2, 1179, 128] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-1 [2, 1179, 128] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-1 [2, 16, 128] 2,048\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-2 [2, 16, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-1 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-2 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-3 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-4 [2, 32, 16, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-1 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-5 [2, 16, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-6 [2, 16, 128] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-3 [2, 1179, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-7 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-8 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-9 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-10 [2, 32, 1179, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-2 [2, 32, 1179, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-11 [2, 1179, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-12 [2, 1179, 128] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-2 [2, 1179, 128] --\n", + "│ │ │ │ │ └─Linear: 6-4 [2, 1179, 512] 66,048\n", + "│ │ │ │ │ └─ReLU6: 6-5 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-6 [2, 1179, 128] 65,664\n", + "│ │ │ └─EncoderLayer: 4-34 [2, 1179, 128] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-3 [2, 1179, 128] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-7 [2, 16, 128] 2,048\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-8 [2, 16, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-13 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-14 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-15 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-16 [2, 32, 16, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-3 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-17 [2, 16, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-18 [2, 16, 128] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-9 [2, 1179, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-19 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-20 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-21 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-22 [2, 32, 1179, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-4 [2, 32, 1179, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-23 [2, 1179, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-24 [2, 1179, 128] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-4 [2, 1179, 128] --\n", + "│ │ │ │ │ └─Linear: 6-10 [2, 1179, 512] 66,048\n", + "│ │ │ │ │ └─ReLU6: 6-11 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-12 [2, 1179, 128] 65,664\n", + "│ │ │ └─EncoderLayer: 4-35 [2, 4, 128] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-5 [2, 1179, 128] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-13 [2, 16, 128] 2,048\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-14 [2, 16, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-25 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-26 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-27 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-28 [2, 32, 16, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-5 [2, 32, 16, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-29 [2, 16, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-30 [2, 16, 128] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-15 [2, 1179, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-31 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-32 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-33 [2, 16, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-34 [2, 32, 1179, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-6 [2, 32, 1179, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-35 [2, 1179, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-36 [2, 1179, 128] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-6 [2, 1179, 128] --\n", + "│ │ │ │ │ └─Linear: 6-16 [2, 1179, 512] 66,048\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-17 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-18 [2, 1179, 128] 65,664\n", + "│ │ │ │ └─PoolingByMultiheadAttention: 5-7 [2, 4, 128] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-19 [2, 4, 128] 512\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-20 [2, 4, 128] --\n", + "│ │ │ │ │ │ └─Linear: 7-37 [2, 4, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-38 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─Linear: 7-39 [2, 1179, 128] 16,384\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-40 [2, 32, 4, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-7 [2, 32, 4, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-41 [2, 4, 128] 16,512\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-42 [2, 4, 128] --\n", + "│ └─Encoder: 2-4 [2, 4, 128] (recursive)\n", + "│ │ └─ModuleList: 3-18 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-36 [2, 294, 128] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-8 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-21 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-22 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-43 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-44 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-45 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-46 [2, 32, 16, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-8 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-47 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-48 [2, 16, 128] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-23 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-49 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-50 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-51 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-52 [2, 32, 294, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-9 [2, 32, 294, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-53 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-54 [2, 294, 128] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-9 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-24 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─ReLU6: 6-25 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-26 [2, 294, 128] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-37 [2, 294, 128] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-10 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-27 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-28 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-55 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-56 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-57 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-58 [2, 32, 16, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-10 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-59 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-60 [2, 16, 128] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-29 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-61 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-62 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-63 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-64 [2, 32, 294, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-11 [2, 32, 294, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-65 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-66 [2, 294, 128] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-11 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-30 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─ReLU6: 6-31 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-32 [2, 294, 128] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-38 [2, 4, 128] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-12 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-33 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-34 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-67 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-68 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-69 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-70 [2, 32, 16, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-12 [2, 32, 16, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-71 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-72 [2, 16, 128] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-35 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-73 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-74 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-75 [2, 16, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-76 [2, 32, 294, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-13 [2, 32, 294, 16] --\n", + "│ │ │ │ │ │ └─Linear: 7-77 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-78 [2, 294, 128] --\n", + "│ │ │ │ └─DoubleFeedForward: 5-13 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ └─Linear: 6-36 [2, 294, 512] (recursive)\n", + "│ │ │ │ │ └─LeakyHardtanh: 6-37 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-38 [2, 294, 128] (recursive)\n", + "│ │ │ │ └─PoolingByMultiheadAttention: 5-14 [2, 4, 128] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-39 [2, 4, 128] (recursive)\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-40 [2, 4, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-79 [2, 4, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-80 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-81 [2, 294, 128] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-82 [2, 32, 4, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-14 [2, 32, 4, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-83 [2, 4, 128] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-84 [2, 4, 128] --\n", + "├─Head: 1-4 [2] --\n", + "│ └─Sequential: 2-5 [2, 1] --\n", + "│ │ └─FeedForward: 3-19 [2, 256] --\n", + "│ │ │ └─Linear: 4-39 [2, 256] 131,328\n", + "│ │ │ └─ReLU6: 4-40 [2, 256] --\n", + "│ │ └─FeedForward: 3-20 [2, 256] --\n", + "│ │ │ └─Linear: 4-41 [2, 256] 65,792\n", + "│ │ │ └─ReLU6: 4-42 [2, 256] --\n", + "│ │ └─FeedForward: 3-21 [2, 256] --\n", + "│ │ │ └─Linear: 4-43 [2, 256] 65,792\n", + "│ │ │ └─ReLU6: 4-44 [2, 256] --\n", + "│ │ └─FeedForward: 3-22 [2, 256] --\n", + "│ │ │ └─Linear: 4-45 [2, 256] 65,792\n", + "│ │ │ └─ReLU6: 4-46 [2, 256] --\n", + "│ │ └─FeedForward: 3-23 [2, 256] --\n", + "│ │ │ └─Linear: 4-47 [2, 256] 65,792\n", + "│ │ │ └─ReLU6: 4-48 [2, 256] --\n", + "│ │ └─FeedForward: 3-24 [2, 256] --\n", + "│ │ │ └─Linear: 4-49 [2, 256] 65,792\n", + "│ │ │ └─ReLU6: 4-50 [2, 256] --\n", + "│ │ └─FeedForward: 3-25 [2, 256] --\n", + "│ │ │ └─Linear: 4-51 [2, 256] 65,792\n", + "│ │ │ └─ReLU6: 4-52 [2, 256] --\n", + "│ │ └─FeedForward: 3-26 [2, 1] --\n", + "│ │ │ └─Linear: 4-53 [2, 1] 257\n", + "│ │ │ └─LeakyHardsigmoid: 4-54 [2, 1] --\n", + "========================================================================================================================\n", + "Total params: 7,827,841\n", + "Trainable params: 7,827,841\n", + "Non-trainable params: 0\n", + "Total mult-adds (M): 30.23\n", + "========================================================================================================================\n", + "Input size (MB): 0.12\n", + "Forward/backward pass size (MB): 260.50\n", + "Params size (MB): 31.31\n", + "Estimated Total Size (MB): 291.93\n", + "========================================================================================================================" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from torchinfo import summary\n", + "\n", + "role_model = params[\"fixed_role_model\"]\n", + "s = train_set[0][role_model]\n", + "summary(model[role_model], input_size=((2, *s[0].shape), (2, *s[1].shape)), depth=9) # 8 max" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "0f42c4d1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:36:37.959402Z", + "iopub.status.busy": "2024-03-26T07:36:37.958471Z", + "iopub.status.idle": "2024-03-26T08:41:08.861629Z", + "shell.execute_reply": "2024-03-26T08:41:08.860610Z" + }, + "papermill": { + "duration": 3870.937668, + "end_time": "2024-03-26T08:41:08.879443", + "exception": false, + "start_time": "2024-03-26T07:36:37.941775", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 datasets [900, 450, 600]\n", + "Creating model of type \n", + "[*] Embedding False True\n", + "g_loss_mul 0.1\n", + "Epoch 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.02739265464660194, 'avg_role_model_std_loss': 1.1173570523565528, 'avg_role_model_mean_pred_loss': 0.0028521220052700534, 'avg_role_model_g_mag_loss': 0.025119311889219616, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.032262347015138304, 'n_size': 900, 'n_batch': 225, 'duration': 242.43868017196655, 'duration_batch': 1.0775052452087401, 'duration_size': 0.26937631130218503, 'avg_pred_std': 0.1347517560606098}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.010731746522295806, 'avg_role_model_std_loss': 0.1493522447505341, 'avg_role_model_mean_pred_loss': 0.00033917589715015434, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.010731746522295806, 'n_size': 450, 'n_batch': 113, 'duration': 95.67721843719482, 'duration_batch': 0.8467010481167684, 'duration_size': 0.21261604097154405, 'avg_pred_std': 0.11410295747352385}\n", + "Epoch 1\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.006208910436317739, 'avg_role_model_std_loss': 0.8280145235490416, 'avg_role_model_mean_pred_loss': 0.00010301458273136867, 'avg_role_model_g_mag_loss': 0.0001026008653247522, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.008540319710607744, 'n_size': 900, 'n_batch': 225, 'duration': 238.80838418006897, 'duration_batch': 1.0613705963558622, 'duration_size': 0.26534264908896554, 'avg_pred_std': 0.099707847174464}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0031002509969726413, 'avg_role_model_std_loss': 1.9949667974594831, 'avg_role_model_mean_pred_loss': 8.847060396063784e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0031002509969726413, 'n_size': 450, 'n_batch': 113, 'duration': 99.60530400276184, 'duration_batch': 0.8814628672810783, 'duration_size': 0.22134512000613743, 'avg_pred_std': 0.055952131002317225}\n", + "Epoch 2\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0029732521030948395, 'avg_role_model_std_loss': 0.5794144581668509, 'avg_role_model_mean_pred_loss': 1.9065153760119242e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0029732521030948395, 'n_size': 900, 'n_batch': 225, 'duration': 252.49774837493896, 'duration_batch': 1.1222122149997287, 'duration_size': 0.28055305374993217, 'avg_pred_std': 0.10085780898264299}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0026095288946655477, 'avg_role_model_std_loss': 1.492227238601099, 'avg_role_model_mean_pred_loss': 6.204995277141776e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0026095288946655477, 'n_size': 450, 'n_batch': 113, 'duration': 102.85050177574158, 'duration_batch': 0.9101814316437308, 'duration_size': 0.22855667061275906, 'avg_pred_std': 0.04310003738537167}\n", + "Epoch 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0027397574804975495, 'avg_role_model_std_loss': 0.5239720547694948, 'avg_role_model_mean_pred_loss': 8.14726122460083e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0027397574804975495, 'n_size': 900, 'n_batch': 225, 'duration': 244.73538613319397, 'duration_batch': 1.0877128272586398, 'duration_size': 0.27192820681465996, 'avg_pred_std': 0.10142784766697635}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.003070051697626089, 'avg_role_model_std_loss': 1.5696541906561932, 'avg_role_model_mean_pred_loss': 1.166988729526114e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.003070051697626089, 'n_size': 450, 'n_batch': 113, 'duration': 101.8385443687439, 'duration_batch': 0.9012260563605654, 'duration_size': 0.22630787637498645, 'avg_pred_std': 0.06228261488949287}\n", + "Epoch 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0023581975257548037, 'avg_role_model_std_loss': 0.3410672404423733, 'avg_role_model_mean_pred_loss': 1.1994138098866438e-05, 'avg_role_model_g_mag_loss': 1.4866391300327249e-05, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.00252653114331123, 'n_size': 900, 'n_batch': 225, 'duration': 247.05686163902283, 'duration_batch': 1.0980304961734348, 'duration_size': 0.2745076240433587, 'avg_pred_std': 0.09989041606171263}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0022714212175924333, 'avg_role_model_std_loss': 1.8832387516627003, 'avg_role_model_mean_pred_loss': 7.2981029367872995e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0022714212175924333, 'n_size': 450, 'n_batch': 113, 'duration': 100.17966938018799, 'duration_batch': 0.8865457467273273, 'duration_size': 0.22262148751152885, 'avg_pred_std': 0.052650303883782994}\n", + "Epoch 5\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0024742192417842386, 'avg_role_model_std_loss': 0.3507677028266865, 'avg_role_model_mean_pred_loss': 6.229266246524888e-06, 'avg_role_model_g_mag_loss': 2.6323258255918822e-06, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0028022190412189552, 'n_size': 900, 'n_batch': 225, 'duration': 247.09229588508606, 'duration_batch': 1.0981879817114937, 'duration_size': 0.2745469954278734, 'avg_pred_std': 0.1015876992026137}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.002520995658188541, 'avg_role_model_std_loss': 1.5546536559230526, 'avg_role_model_mean_pred_loss': 5.602417538170796e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002520995658188541, 'n_size': 450, 'n_batch': 113, 'duration': 99.56677508354187, 'duration_batch': 0.8811219033941758, 'duration_size': 0.2212595001856486, 'avg_pred_std': 0.048813573702906086}\n", + "Epoch 6\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.002148849349759985, 'avg_role_model_std_loss': 0.3859976332026933, 'avg_role_model_mean_pred_loss': 5.054510944888613e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002148849349759985, 'n_size': 900, 'n_batch': 225, 'duration': 248.287282705307, 'duration_batch': 1.1034990342458089, 'duration_size': 0.2758747585614522, 'avg_pred_std': 0.10126116779943307}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0025426524340744234, 'avg_role_model_std_loss': 1.8411945350910226, 'avg_role_model_mean_pred_loss': 1.1723544970543994e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0025426524340744234, 'n_size': 450, 'n_batch': 113, 'duration': 100.16489577293396, 'duration_batch': 0.8864150068401235, 'duration_size': 0.22258865727318658, 'avg_pred_std': 0.05908973131790361}\n", + "Epoch 7\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0020464518228416433, 'avg_role_model_std_loss': 0.2880907567315516, 'avg_role_model_mean_pred_loss': 5.413586949876549e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0020464518228416433, 'n_size': 900, 'n_batch': 225, 'duration': 248.08354210853577, 'duration_batch': 1.1025935204823811, 'duration_size': 0.2756483801205953, 'avg_pred_std': 0.10204729804148277}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.002012234483457481, 'avg_role_model_std_loss': 1.4328002845302086, 'avg_role_model_mean_pred_loss': 5.459719962973194e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002012234483457481, 'n_size': 450, 'n_batch': 113, 'duration': 100.88333654403687, 'duration_batch': 0.8927728897702377, 'duration_size': 0.2241851923200819, 'avg_pred_std': 0.05221234420335036}\n", + "Epoch 8\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.001945750925806351, 'avg_role_model_std_loss': 0.2846149470687626, 'avg_role_model_mean_pred_loss': 3.628518232128718e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.001945750925806351, 'n_size': 900, 'n_batch': 225, 'duration': 249.2025444507599, 'duration_batch': 1.1075668642255996, 'duration_size': 0.2768917160563999, 'avg_pred_std': 0.10608977859425876}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0024451360522329602, 'avg_role_model_std_loss': 1.5600430507726564, 'avg_role_model_mean_pred_loss': 1.1627008480942101e-05, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0024451360522329602, 'n_size': 450, 'n_batch': 113, 'duration': 100.29779386520386, 'duration_batch': 0.8875910961522465, 'duration_size': 0.22288398636711967, 'avg_pred_std': 0.04840205141458562}\n", + "Epoch 9\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0018871993097127416, 'avg_role_model_std_loss': 0.3353491520646711, 'avg_role_model_mean_pred_loss': 5.283127970706369e-06, 'avg_role_model_g_mag_loss': 4.544905904266569e-08, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.002344711327880052, 'n_size': 900, 'n_batch': 225, 'duration': 247.01215744018555, 'duration_batch': 1.0978318108452692, 'duration_size': 0.2744579527113173, 'avg_pred_std': 0.10287626234814524}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.001859568822482187, 'avg_role_model_std_loss': 1.4678312607579032, 'avg_role_model_mean_pred_loss': 4.946820349966716e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.001859568822482187, 'n_size': 450, 'n_batch': 113, 'duration': 100.66262602806091, 'duration_batch': 0.8908196993633709, 'duration_size': 0.22369472450680203, 'avg_pred_std': 0.05059397140254093}\n", + "Epoch 10\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0018023989783654947, 'avg_role_model_std_loss': 0.23040446630229616, 'avg_role_model_mean_pred_loss': 4.0523389028073935e-06, 'avg_role_model_g_mag_loss': 0.0, 'avg_role_model_g_cos_loss': 0.0, 'avg_non_role_model_g_mag_loss': 0.0, 'avg_non_role_model_g_cos_loss': 0.0, 'avg_non_role_model_embed_loss': 0.0, 'avg_loss': 0.0018023989783654947, 'n_size': 900, 'n_batch': 225, 'duration': 246.93518829345703, 'duration_batch': 1.097489725748698, 'duration_size': 0.2743724314371745, 'avg_pred_std': 0.10276419790254698}\n", + "Time out: 3726.1000921726227/3600\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Eval loss {'role_model': 'tab_ddpm_concat', 'n_size': 600, 'n_batch': 150, 'role_model_metrics': {'avg_loss': 0.0019968665854927774, 'avg_g_mag_loss': 0.01371617328345046, 'avg_g_cos_loss': 0.022173850040417165, 'pred_duration': 2.9101011753082275, 'grad_duration': 2.418388843536377, 'total_duration': 5.3284900188446045, 'pred_std': 0.08744335174560547, 'std_loss': 0.016910480335354805, 'mean_pred_loss': 3.5965992992714746e-06, 'pred_rmse': 0.04468631371855736, 'pred_mae': 0.034377578645944595, 'pred_mape': 0.09727925807237625, 'grad_rmse': 0.04156146198511124, 'grad_mae': 0.031993232667446136, 'grad_mape': 0.9314482808113098}, 'non_role_model_metrics': {'avg_loss': 0, 'avg_g_mag_loss': 0, 'avg_g_cos_loss': 0, 'avg_pred_duration': 0, 'avg_grad_duration': 0, 'avg_total_duration': 0, 'avg_pred_std': 0, 'avg_std_loss': 0, 'avg_mean_pred_loss': 0}, 'avg_metrics': {'avg_loss': 0.0019968665854927774, 'avg_g_mag_loss': 0.01371617328345046, 'avg_g_cos_loss': 0.022173850040417165, 'avg_pred_duration': 2.9101011753082275, 'avg_grad_duration': 2.418388843536377, 'avg_total_duration': 5.3284900188446045, 'avg_pred_std': 0.08744335174560547, 'avg_std_loss': 0.016910480335354805, 'avg_mean_pred_loss': 3.5965992992714746e-06}, 'min_metrics': {'avg_loss': 0.0019968665854927774, 'avg_g_mag_loss': 0.01371617328345046, 'avg_g_cos_loss': 0.022173850040417165, 'pred_duration': 2.9101011753082275, 'grad_duration': 2.418388843536377, 'total_duration': 5.3284900188446045, 'pred_std': 0.08744335174560547, 'std_loss': 0.016910480335354805, 'mean_pred_loss': 3.5965992992714746e-06, 'pred_rmse': 0.04468631371855736, 'pred_mae': 0.034377578645944595, 'pred_mape': 0.09727925807237625, 'grad_rmse': 0.04156146198511124, 'grad_mae': 0.031993232667446136, 'grad_mape': 0.9314482808113098}, 'model_metrics': {'tab_ddpm_concat': {'avg_loss': 0.0019968665854927774, 'avg_g_mag_loss': 0.01371617328345046, 'avg_g_cos_loss': 0.022173850040417165, 'pred_duration': 2.9101011753082275, 'grad_duration': 2.418388843536377, 'total_duration': 5.3284900188446045, 'pred_std': 0.08744335174560547, 'std_loss': 0.016910480335354805, 'mean_pred_loss': 3.5965992992714746e-06, 'pred_rmse': 0.04468631371855736, 'pred_mae': 0.034377578645944595, 'pred_mape': 0.09727925807237625, 'grad_rmse': 0.04156146198511124, 'grad_mae': 0.031993232667446136, 'grad_mape': 0.9314482808113098}}}\n" + ] + } + ], + "source": [ + "import torch\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import train, train_2\n", + "from ml_utility_loss.loss_learning.estimator.process_simple import train_epoch, eval as _eval\n", + "from ml_utility_loss.params import GradientPenaltyMode\n", + "from ml_utility_loss.util import clear_memory\n", + "import time\n", + "#torch.autograd.set_detect_anomaly(True)\n", + "\n", + "del model\n", + "clear_memory()\n", + "\n", + "#opt = params[\"Optim\"](model.parameters())\n", + "loss = train_2(\n", + " [train_set, val_set, test_set],\n", + " preprocessor=preprocessor,\n", + " #whole_model=model,\n", + " #optim=opt,\n", + " log_dir=\"logs\",\n", + " checkpoint_dir=\"checkpoints\",\n", + " verbose=True,\n", + " allow_same_prediction=allow_same_prediction,\n", + " wandb=wandb if log_wandb else None,\n", + " study_name=study_name,\n", + " **params\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9b514a07", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:41:08.913434Z", + "iopub.status.busy": "2024-03-26T08:41:08.913073Z", + "iopub.status.idle": "2024-03-26T08:41:08.917724Z", + "shell.execute_reply": "2024-03-26T08:41:08.916933Z" + }, + "papermill": { + "duration": 0.024161, + "end_time": "2024-03-26T08:41:08.919711", + "exception": false, + "start_time": "2024-03-26T08:41:08.895550", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "model = loss[\"whole_model\"]\n", + "opt = loss[\"optim\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "331a49e1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:41:08.952210Z", + "iopub.status.busy": "2024-03-26T08:41:08.951891Z", + "iopub.status.idle": "2024-03-26T08:41:09.022114Z", + "shell.execute_reply": "2024-03-26T08:41:09.021265Z" + }, + "papermill": { + "duration": 0.089496, + "end_time": "2024-03-26T08:41:09.024569", + "exception": false, + "start_time": "2024-03-26T08:41:08.935073", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import torch\n", + "from copy import deepcopy\n", + "\n", + "torch.save(deepcopy(model.state_dict()), \"model.pt\")\n", + "#torch.save(deepcopy(opt.state_dict()), \"optim.pt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "123b4b17", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:41:09.060795Z", + "iopub.status.busy": "2024-03-26T08:41:09.060444Z", + "iopub.status.idle": "2024-03-26T08:41:09.366330Z", + "shell.execute_reply": "2024-03-26T08:41:09.365392Z" + }, + "papermill": { + "duration": 0.326389, + "end_time": "2024-03-26T08:41:09.368482", + "exception": false, + "start_time": "2024-03-26T08:41:09.042093", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "history = loss[\"history\"]\n", + "history.to_csv(\"history.csv\")\n", + "history[[\"avg_loss_train\", \"avg_loss_test\"]].plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "2586ba0a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:41:09.403812Z", + "iopub.status.busy": "2024-03-26T08:41:09.403488Z", + "iopub.status.idle": "2024-03-26T08:43:35.721493Z", + "shell.execute_reply": "2024-03-26T08:43:35.720641Z" + }, + "papermill": { + "duration": 146.338301, + "end_time": "2024-03-26T08:43:35.723993", + "exception": false, + "start_time": "2024-03-26T08:41:09.385692", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import eval\n", + "#eval_loss = loss[\"eval_loss\"]\n", + "\n", + "batch_size = params[\"batch_size_low\"] if \"batch_size_low\" in params else params[\"batch_size\"]\n", + "\n", + "eval_loss = eval(\n", + " test_set, model,\n", + " batch_size=batch_size,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "187137f6", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:43:35.760009Z", + "iopub.status.busy": "2024-03-26T08:43:35.759656Z", + "iopub.status.idle": "2024-03-26T08:43:35.780792Z", + "shell.execute_reply": "2024-03-26T08:43:35.779964Z" + }, + "papermill": { + "duration": 0.041366, + "end_time": "2024-03-26T08:43:35.782769", + "exception": false, + "start_time": "2024-03-26T08:43:35.741403", + "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
tab_ddpm_concat0.0237090.0152460.0019972.455820.0319930.9314480.0415610.0000042.9244880.0343780.0972790.0446860.0874430.016915.380308
\n", + "
" + ], + "text/plain": [ + " avg_g_cos_loss avg_g_mag_loss avg_loss grad_duration \\\n", + "tab_ddpm_concat 0.023709 0.015246 0.001997 2.45582 \n", + "\n", + " grad_mae grad_mape grad_rmse mean_pred_loss \\\n", + "tab_ddpm_concat 0.031993 0.931448 0.041561 0.000004 \n", + "\n", + " pred_duration pred_mae pred_mape pred_rmse pred_std \\\n", + "tab_ddpm_concat 2.924488 0.034378 0.097279 0.044686 0.087443 \n", + "\n", + " std_loss total_duration \n", + "tab_ddpm_concat 0.01691 5.380308 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "metrics = pd.DataFrame(eval_loss[\"model_metrics\"]).T\n", + "metrics.to_csv(\"eval.csv\")\n", + "metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "123d305b", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:43:35.816375Z", + "iopub.status.busy": "2024-03-26T08:43:35.816090Z", + "iopub.status.idle": "2024-03-26T08:43:36.199071Z", + "shell.execute_reply": "2024-03-26T08:43:36.198183Z" + }, + "papermill": { + "duration": 0.402447, + "end_time": "2024-03-26T08:43:36.201191", + "exception": false, + "start_time": "2024-03-26T08:43:35.798744", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from ml_utility_loss.util import clear_memory\n", + "clear_memory()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a3eecc2a", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:43:36.238415Z", + "iopub.status.busy": "2024-03-26T08:43:36.238062Z", + "iopub.status.idle": "2024-03-26T08:46:05.123316Z", + "shell.execute_reply": "2024-03-26T08:46:05.122429Z" + }, + "papermill": { + "duration": 148.907419, + "end_time": "2024-03-26T08:46:05.125776", + "exception": false, + "start_time": "2024-03-26T08:43:36.218357", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/tab_ddpm_concat/all inf False\n", + "Caching in ../../../../contraceptive/_cache_bs_test/tab_ddpm_concat/all inf False\n", + "Caching in ../../../../contraceptive/_cache_synth_test/tab_ddpm_concat/all inf False\n" + ] + } + ], + "source": [ + "#\"\"\"\n", + "from ml_utility_loss.loss_learning.estimator.process import pred, pred_2\n", + "from ml_utility_loss.util import stack_samples\n", + "\n", + "#samples = test_set[list(range(len(test_set)))]\n", + "#y = {m: pred(model[m], s) for m, s in samples.items()}\n", + "y = pred_2(model, test_set, batch_size=batch_size)\n", + "#\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "6ab51db8", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:46:05.166746Z", + "iopub.status.busy": "2024-03-26T08:46:05.165537Z", + "iopub.status.idle": "2024-03-26T08:46:05.187747Z", + "shell.execute_reply": "2024-03-26T08:46:05.186770Z" + }, + "papermill": { + "duration": 0.044373, + "end_time": "2024-03-26T08:46:05.190001", + "exception": false, + "start_time": "2024-03-26T08:46:05.145628", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "from ml_utility_loss.util import transpose_dict\n", + "\n", + "os.makedirs(\"pred\", exist_ok=True)\n", + "y2 = transpose_dict(y)\n", + "for k, v in y2.items():\n", + " df = pd.DataFrame(v)\n", + " df.to_csv(f\"pred/{k}.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d81a30f1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:46:05.226990Z", + "iopub.status.busy": "2024-03-26T08:46:05.226208Z", + "iopub.status.idle": "2024-03-26T08:46:05.231946Z", + "shell.execute_reply": "2024-03-26T08:46:05.231004Z" + }, + "papermill": { + "duration": 0.026219, + "end_time": "2024-03-26T08:46:05.233979", + "exception": false, + "start_time": "2024-03-26T08:46:05.207760", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'tab_ddpm_concat': 0.4075574319064617}\n" + ] + } + ], + "source": [ + "print({k: sum(v[\"pred\"])/len(v[\"pred\"]) for k, v in y.items()})" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3b3ff322", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:46:05.269156Z", + "iopub.status.busy": "2024-03-26T08:46:05.268758Z", + "iopub.status.idle": "2024-03-26T08:46:05.681822Z", + "shell.execute_reply": "2024-03-26T08:46:05.680840Z" + }, + "papermill": { + "duration": 0.433186, + "end_time": "2024-03-26T08:46:05.683950", + "exception": false, + "start_time": "2024-03-26T08:46:05.250764", + "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": 35, + "id": "e79e4b0f", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:46:05.719383Z", + "iopub.status.busy": "2024-03-26T08:46:05.719014Z", + "iopub.status.idle": "2024-03-26T08:46:06.042463Z", + "shell.execute_reply": "2024-03-26T08:46:06.041356Z" + }, + "papermill": { + "duration": 0.343484, + "end_time": "2024-03-26T08:46:06.044610", + "exception": false, + "start_time": "2024-03-26T08:46:05.701126", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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qK2tRVFREdLS0to8d15eHmw2G8aNG+c+Fh0djf79+7tvnzlzBjKZDNdcc4372IABAxAZGeleOuNqEY0fP97j/OPHj8exY8c8jg0bNsz9c3x8PABg6NChHsdKS0vbrLNLaWkpLl++jFtvvbXV+8+cOQOj0eiRBnnQoEGIjIzEmTNnMGbMGABAenq6R+bDxMRE9/OfOXMGVqu1zecAgA8//BB//vOfkZeXh9raWjgcDtESDNIYUZgQJuG1/iWTSrwuK/eibCBs2bIFixcvxvz587Fjxw4cO3YMc+fO9Xr8J5CcPEOpqQEVtVb34LQrePM+jFXL5XL3z65A1vwYz3c8xqZWq71/Ui/r0/z5O3qOffv24f7778fUqVPxxRdf4OjRo3j++edFeX8ACkQkQBQKhUfakr1792LChAl44oknMHLkSPTt2xd5eXktHnf8+HFYLBb37f3790Or1Xa4KUKfPn0gl8tx4MAB97Gqqirk5ua6bw8YMAAOhwM//vgjGIS5RLm5uaiuroaE46BWSN2TG/fv3+9x/v3793uMDwWSTqdDeno6du3a1er9AwcORFFREYqKitzHTp8+jerqagwaNMir58jMzIRarW7zOX744QekpaXh+eefx+jRo5GZmYmCggKPMs3f02CirhkJiPT0dBw4cAAXLlyAVqtFZmYmNm7ciO3btyMjIwPvvfceDh06hIwMz66gzWbD/Pnz8cc//hEXLlzAsmXL8Jvf/KbD9UtarRbz58/H008/jZiYGMTFxeH555/3eFz//v0xefJkPPH443jlzTVQKOR4cckzUKvVkEkl0KuaWhTbtm3D6NGjcd111+GDDz7AwYMH8e677wb2l3SVF198EY899hji4uIwZcoUmM1m7N27F08++SQmTZqEoUOH4v7778eaNWvgcDjwxBNP4MYbb8To0aO9Or9KpcKzzz6LZ555BgqFAhMnTkRZWRlOnTqF+fPnIzMzE4WFhdiyZQvGjBmDL7/8Ep9++qnHOdLT05Gfn49jx44hJSUFOp0OSqUyGL8OcQerHQ4H++Mf/8jS09OZSqVivXv3Zi+99BLjed6rx/ekwequ7ty5c+zaa69larWaAWBnz55lWVlZzGAwsMjISPb444+z5557zmPwc86cOWz69Ols6dKlLCYmhmm1WrZgwQLW0NDg1XOazWb2wAMPMI1Gw+Lj49lr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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": 36, + "id": "745adde1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:46:06.083016Z", + "iopub.status.busy": "2024-03-26T08:46:06.082012Z", + "iopub.status.idle": "2024-03-26T08:46:06.307788Z", + "shell.execute_reply": "2024-03-26T08:46:06.306819Z" + }, + "papermill": { + "duration": 0.247357, + "end_time": "2024-03-26T08:46:06.309975", + "exception": false, + "start_time": "2024-03-26T08:46:06.062618", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from ml_utility_loss.loss_learning.visualization import plot_box_3\n", + "\n", + "_ = plot_box_3(y2[\"pred\"], next(iter(y2[\"y\"].values())))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "eabe1bab", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T08:46:06.348666Z", + "iopub.status.busy": "2024-03-26T08:46:06.347794Z", + "iopub.status.idle": "2024-03-26T08:46:06.605328Z", + "shell.execute_reply": "2024-03-26T08:46:06.604309Z" + }, + "papermill": { + "duration": 0.279396, + "end_time": "2024-03-26T08:46:06.607758", + "exception": false, + "start_time": "2024-03-26T08:46:06.328362", + "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.022571, + "end_time": "2024-03-26T08:46:06.653182", + "exception": false, + "start_time": "2024-03-26T08:46:06.630611", + "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": 4267.894457, + "end_time": "2024-03-26T08:46:09.396960", + "environment_variables": {}, + "exception": null, + "input_path": "eval/contraceptive/tab_ddpm_concat/1/mlu-eval.ipynb", + "output_path": "eval/contraceptive/tab_ddpm_concat/1/mlu-eval.ipynb", + "parameters": { + "allow_same_prediction": true, + "dataset": "contraceptive", + "dataset_name": "contraceptive", + "debug": false, + "folder": "eval", + "gp": true, + "gp_multiply": true, + "log_wandb": false, + "param_index": 0, + "path": "eval/contraceptive/tab_ddpm_concat/1", + "path_prefix": "../../../../", + "random_seed": 1, + "single_model": "tab_ddpm_concat" + }, + "start_time": "2024-03-26T07:35:01.502503", + "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