diff --git "a/contraceptive/lct_gan/mlu-eval-load.ipynb" "b/contraceptive/lct_gan/mlu-eval-load.ipynb" new file mode 100644--- /dev/null +++ "b/contraceptive/lct_gan/mlu-eval-load.ipynb" @@ -0,0 +1,1891 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "982e76f5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:02:12.417443Z", + "iopub.status.busy": "2024-03-26T07:02:12.416703Z", + "iopub.status.idle": "2024-03-26T07:02:12.449971Z", + "shell.execute_reply": "2024-03-26T07:02:12.449270Z" + }, + "papermill": { + "duration": 0.047215, + "end_time": "2024-03-26T07:02:12.451992", + "exception": false, + "start_time": "2024-03-26T07:02:12.404777", + "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:02:12.474839Z", + "iopub.status.busy": "2024-03-26T07:02:12.474507Z", + "iopub.status.idle": "2024-03-26T07:02:12.481011Z", + "shell.execute_reply": "2024-03-26T07:02:12.480100Z" + }, + "papermill": { + "duration": 0.020096, + "end_time": "2024-03-26T07:02:12.483029", + "exception": false, + "start_time": "2024-03-26T07:02:12.462933", + "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:02:12.504021Z", + "iopub.status.busy": "2024-03-26T07:02:12.503779Z", + "iopub.status.idle": "2024-03-26T07:02:12.507801Z", + "shell.execute_reply": "2024-03-26T07:02:12.506969Z" + }, + "papermill": { + "duration": 0.016766, + "end_time": "2024-03-26T07:02:12.509678", + "exception": false, + "start_time": "2024-03-26T07:02:12.492912", + "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:02:12.532080Z", + "iopub.status.busy": "2024-03-26T07:02:12.531842Z", + "iopub.status.idle": "2024-03-26T07:02:12.535367Z", + "shell.execute_reply": "2024-03-26T07:02:12.534699Z" + }, + "executionInfo": { + "elapsed": 678, + "status": "ok", + "timestamp": 1696841022168, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "ns5hFcVL2yvs", + "papermill": { + "duration": 0.016239, + "end_time": "2024-03-26T07:02:12.537370", + "exception": false, + "start_time": "2024-03-26T07:02:12.521131", + "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:02:12.558226Z", + "iopub.status.busy": "2024-03-26T07:02:12.557923Z", + "iopub.status.idle": "2024-03-26T07:02:12.564108Z", + "shell.execute_reply": "2024-03-26T07:02:12.563406Z" + }, + "papermill": { + "duration": 0.018993, + "end_time": "2024-03-26T07:02:12.566082", + "exception": false, + "start_time": "2024-03-26T07:02:12.547089", + "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": "b858079c", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:02:12.588874Z", + "iopub.status.busy": "2024-03-26T07:02:12.588317Z", + "iopub.status.idle": "2024-03-26T07:02:12.593261Z", + "shell.execute_reply": "2024-03-26T07:02:12.592443Z" + }, + "papermill": { + "duration": 0.018287, + "end_time": "2024-03-26T07:02:12.595095", + "exception": false, + "start_time": "2024-03-26T07:02:12.576808", + "status": "completed" + }, + "tags": [ + "injected-parameters" + ] + }, + "outputs": [], + "source": [ + "# Parameters\n", + "dataset = \"contraceptive\"\n", + "dataset_name = \"contraceptive\"\n", + "single_model = \"lct_gan\"\n", + "gp = True\n", + "gp_multiply = True\n", + "random_seed = 42\n", + "debug = False\n", + "folder = \"eval\"\n", + "path_prefix = \"../../../../\"\n", + "path = \"eval/contraceptive/lct_gan/42\"\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.009863, + "end_time": "2024-03-26T07:02:12.614868", + "exception": false, + "start_time": "2024-03-26T07:02:12.605005", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5f45b1d0", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:02:12.636298Z", + "iopub.status.busy": "2024-03-26T07:02:12.635672Z", + "iopub.status.idle": "2024-03-26T07:02:12.644408Z", + "shell.execute_reply": "2024-03-26T07:02:12.643640Z" + }, + "executionInfo": { + "elapsed": 7, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "UdvXYv3c3LXy", + "papermill": { + "duration": 0.021529, + "end_time": "2024-03-26T07:02:12.646287", + "exception": false, + "start_time": "2024-03-26T07:02:12.624758", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/kaggle/working\n", + "/kaggle/working/eval/contraceptive/lct_gan/42\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:02:12.668084Z", + "iopub.status.busy": "2024-03-26T07:02:12.667457Z", + "iopub.status.idle": "2024-03-26T07:02:14.615406Z", + "shell.execute_reply": "2024-03-26T07:02:14.614489Z" + }, + "papermill": { + "duration": 1.961215, + "end_time": "2024-03-26T07:02:14.617625", + "exception": false, + "start_time": "2024-03-26T07:02:12.656410", + "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:02:14.641191Z", + "iopub.status.busy": "2024-03-26T07:02:14.640268Z", + "iopub.status.idle": "2024-03-26T07:02:14.653315Z", + "shell.execute_reply": "2024-03-26T07:02:14.652601Z" + }, + "papermill": { + "duration": 0.026634, + "end_time": "2024-03-26T07:02:14.655264", + "exception": false, + "start_time": "2024-03-26T07:02:14.628630", + "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:02:14.676819Z", + "iopub.status.busy": "2024-03-26T07:02:14.676539Z", + "iopub.status.idle": "2024-03-26T07:02:14.683573Z", + "shell.execute_reply": "2024-03-26T07:02:14.682770Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "Vrl2QkoV3o_8", + "papermill": { + "duration": 0.020205, + "end_time": "2024-03-26T07:02:14.685389", + "exception": false, + "start_time": "2024-03-26T07:02:14.665184", + "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:02:14.706766Z", + "iopub.status.busy": "2024-03-26T07:02:14.706499Z", + "iopub.status.idle": "2024-03-26T07:02:14.801732Z", + "shell.execute_reply": "2024-03-26T07:02:14.800750Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "TilUuFk9vqMb", + "papermill": { + "duration": 0.108319, + "end_time": "2024-03-26T07:02:14.803852", + "exception": false, + "start_time": "2024-03-26T07:02:14.695533", + "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:02:14.827250Z", + "iopub.status.busy": "2024-03-26T07:02:14.826979Z", + "iopub.status.idle": "2024-03-26T07:02:19.478683Z", + "shell.execute_reply": "2024-03-26T07:02:19.477856Z" + }, + "executionInfo": { + "elapsed": 3113, + "status": "ok", + "timestamp": 1696841025277, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "7Abt8nStvr9Z", + "papermill": { + "duration": 4.666057, + "end_time": "2024-03-26T07:02:19.481151", + "exception": false, + "start_time": "2024-03-26T07:02:14.815094", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-26 07:02:17.052860: 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:02:17.052915: 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:02:17.054585: 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:02:19.503687Z", + "iopub.status.busy": "2024-03-26T07:02:19.503148Z", + "iopub.status.idle": "2024-03-26T07:02:19.508962Z", + "shell.execute_reply": "2024-03-26T07:02:19.508236Z" + }, + "papermill": { + "duration": 0.018995, + "end_time": "2024-03-26T07:02:19.510852", + "exception": false, + "start_time": "2024-03-26T07:02:19.491857", + "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:02:19.534311Z", + "iopub.status.busy": "2024-03-26T07:02:19.534035Z", + "iopub.status.idle": "2024-03-26T07:02:27.867879Z", + "shell.execute_reply": "2024-03-26T07:02:27.866611Z" + }, + "executionInfo": { + "elapsed": 20137, + "status": "ok", + "timestamp": 1696841045408, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "tbaguWxAvtPi", + "papermill": { + "duration": 8.349106, + "end_time": "2024-03-26T07:02:27.871099", + "exception": false, + "start_time": "2024-03-26T07:02:19.521993", + "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:02:27.899172Z", + "iopub.status.busy": "2024-03-26T07:02:27.898744Z", + "iopub.status.idle": "2024-03-26T07:02:27.906135Z", + "shell.execute_reply": "2024-03-26T07:02:27.905319Z" + }, + "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.022906, + "end_time": "2024-03-26T07:02:27.907989", + "exception": false, + "start_time": "2024-03-26T07:02:27.885083", + "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:02:27.930393Z", + "iopub.status.busy": "2024-03-26T07:02:27.929860Z", + "iopub.status.idle": "2024-03-26T07:02:27.996610Z", + "shell.execute_reply": "2024-03-26T07:02:27.995783Z" + }, + "papermill": { + "duration": 0.079913, + "end_time": "2024-03-26T07:02:27.998534", + "exception": false, + "start_time": "2024-03-26T07:02:27.918621", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/aug_test/contraceptive 0\n", + "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/bs_test/contraceptive 0\n", + "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/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:02:28.023439Z", + "iopub.status.busy": "2024-03-26T07:02:28.022748Z", + "iopub.status.idle": "2024-03-26T07:02:28.349942Z", + "shell.execute_reply": "2024-03-26T07:02:28.348993Z" + }, + "executionInfo": { + "elapsed": 588, + "status": "ok", + "timestamp": 1696841049215, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "NgahtU1q9uLO", + "papermill": { + "duration": 0.342343, + "end_time": "2024-03-26T07:02:28.352048", + "exception": false, + "start_time": "2024-03-26T07:02:28.009705", + "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.95,\n", + " 'tf_pma_low': 8,\n", + " 'grad_loss_fn': torch.Tensor>,\n", + " 'pma_ffn_mode': 'none',\n", + " 'patience': 10,\n", + " 'inds_init_mode': 'fixnorm',\n", + " 'grad_clip': 0.7,\n", + " 'bias_weight_decay': 0.05,\n", + " 'head_activation': torch.nn.modules.activation.ReLU6,\n", + " 'tf_activation': torch.nn.modules.activation.Tanh,\n", + " 'dataset_size': 2048,\n", + " 'batch_size': 4,\n", + " 'epochs': 100,\n", + " 'lr_mul': 0.07,\n", + " 'n_warmup_steps': 200,\n", + " 'Optim': functools.partial(, amsgrad=True),\n", + " 'fixed_role_model': 'lct_gan',\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': 64,\n", + " 'tf_activation_final': ml_utility_loss.activations.LeakyHardtanh,\n", + " 'ada_d_hid': 512,\n", + " 'ada_n_layers': 9,\n", + " 'ada_activation': torch.nn.modules.activation.Softsign,\n", + " 'ada_activation_final': ml_utility_loss.activations.LeakyHardsigmoid,\n", + " 'head_d_hid': 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': ['lct_gan'],\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': 128,\n", + " 'ada_n_seeds': 0,\n", + " 'gradient_penalty_kwargs': {'mag_loss': True,\n", + " 'mse_mag': True,\n", + " 'mag_corr': False,\n", + " 'seq_mag': False,\n", + " 'cos_loss': False,\n", + " 'mag_corr_kwargs': {'only_sign': False},\n", + " 'cos_loss_kwargs': {'only_sign': True, 'cos_matrix': False},\n", + " 'mse_mag_kwargs': {'target': 0.5, 'multiply': True, 'forgive_over': True}}}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import ml_utility_loss.loss_learning.estimator.params2 as PARAMS\n", + "from ml_utility_loss.tuning import map_parameters\n", + "from ml_utility_loss.loss_learning.estimator.params.default import update_param_space, update_param_space_2\n", + "import wandb\n", + "\n", + "#\"\"\"\n", + "param_space = {\n", + " **getattr(PARAMS, dataset_name).PARAM_SPACE,\n", + "}\n", + "# params = {\n", + "# **getattr(PARAMS, dataset_name).BESTS[param_index],\n", + "# }\n", + "params = getattr(PARAMS, dataset_name).BEST_DICT[gp][gp_multiply][single_model]\n", + "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:02:28.377372Z", + "iopub.status.busy": "2024-03-26T07:02:28.377075Z", + "iopub.status.idle": "2024-03-26T07:02:28.805846Z", + "shell.execute_reply": "2024-03-26T07:02:28.804741Z" + }, + "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.443746, + "end_time": "2024-03-26T07:02:28.807872", + "exception": false, + "start_time": "2024-03-26T07:02:28.364126", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating model of type \n", + "[*] Embedding False True\n", + "['lct_gan'] 1\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.model.pipeline import remove_non_model_params\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import create_model\n", + "from ml_utility_loss.util import filter_dict, clear_memory\n", + "\n", + "clear_memory()\n", + "\n", + "params2 = remove_non_model_params(params)\n", + "adapters = filter_dict(preprocessor.adapter_sizes, params[\"models\"])\n", + "\n", + "model = create_model(\n", + " adapters=adapters,\n", + " #Body=\"twin_encoder\",\n", + " **params2,\n", + ")\n", + "#cf.apply_weight_standardization(model, n_last_layers_ignore=0)\n", + "print(model.models, len(model.adapters))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "938f94fc", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:02:28.836626Z", + "iopub.status.busy": "2024-03-26T07:02:28.836204Z", + "iopub.status.idle": "2024-03-26T07:02:28.840905Z", + "shell.execute_reply": "2024-03-26T07:02:28.839966Z" + }, + "papermill": { + "duration": 0.022416, + "end_time": "2024-03-26T07:02:28.843382", + "exception": false, + "start_time": "2024-03-26T07:02:28.820966", + "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:02:28.870881Z", + "iopub.status.busy": "2024-03-26T07:02:28.870225Z", + "iopub.status.idle": "2024-03-26T07:02:28.878302Z", + "shell.execute_reply": "2024-03-26T07:02:28.877297Z" + }, + "papermill": { + "duration": 0.024476, + "end_time": "2024-03-26T07:02:28.880618", + "exception": false, + "start_time": "2024-03-26T07:02:28.856142", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7604993" + ] + }, + "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:02:28.909498Z", + "iopub.status.busy": "2024-03-26T07:02:28.908629Z", + "iopub.status.idle": "2024-03-26T07:02:28.994190Z", + "shell.execute_reply": "2024-03-26T07:02:28.993322Z" + }, + "papermill": { + "duration": 0.10216, + "end_time": "2024-03-26T07:02:28.996229", + "exception": false, + "start_time": "2024-03-26T07:02:28.894069", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "========================================================================================================================\n", + "Layer (type:depth-idx) Output Shape Param #\n", + "========================================================================================================================\n", + "MLUtilitySingle [2, 1179, 40] --\n", + "├─Adapter: 1-1 [2, 1179, 40] --\n", + "│ └─Sequential: 2-1 [2, 1179, 256] --\n", + "│ │ └─FeedForward: 3-1 [2, 1179, 512] --\n", + "│ │ │ └─Linear: 4-1 [2, 1179, 512] 20,992\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, 512] --\n", + "│ │ │ └─Linear: 4-15 [2, 1179, 512] 262,656\n", + "│ │ │ └─Softsign: 4-16 [2, 1179, 512] --\n", + "│ │ └─FeedForward: 3-9 [2, 1179, 256] --\n", + "│ │ │ └─Linear: 4-17 [2, 1179, 256] 131,328\n", + "│ │ │ └─LeakyHardsigmoid: 4-18 [2, 1179, 256] --\n", + "├─Adapter: 1-2 [2, 294, 40] (recursive)\n", + "│ └─Sequential: 2-2 [2, 294, 256] (recursive)\n", + "│ │ └─FeedForward: 3-10 [2, 294, 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, 512] (recursive)\n", + "│ │ │ └─Linear: 4-31 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-32 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-17 [2, 294, 512] (recursive)\n", + "│ │ │ └─Linear: 4-33 [2, 294, 512] (recursive)\n", + "│ │ │ └─Softsign: 4-34 [2, 294, 512] --\n", + "│ │ └─FeedForward: 3-18 [2, 294, 256] (recursive)\n", + "│ │ │ └─Linear: 4-35 [2, 294, 256] (recursive)\n", + "│ │ │ └─LeakyHardsigmoid: 4-36 [2, 294, 256] --\n", + "├─TwinEncoder: 1-3 [2, 2048] --\n", + "│ └─Encoder: 2-3 [2, 8, 256] --\n", + "│ │ └─ModuleList: 3-20 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-37 [2, 1179, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-1 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-1 [2, 128, 256] 32,768\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-2 [2, 128, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-1 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-2 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-3 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-4 [2, 64, 128, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-1 [2, 64, 128, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-5 [2, 128, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-6 [2, 128, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-3 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-7 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-8 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-9 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-10 [2, 64, 1179, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-2 [2, 64, 1179, 128] --\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", + "│ │ │ │ │ └─Tanh: 6-5 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-6 [2, 1179, 256] 131,328\n", + "│ │ │ └─EncoderLayer: 4-38 [2, 1179, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-3 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-7 [2, 128, 256] 32,768\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-8 [2, 128, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-13 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-14 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-15 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-16 [2, 64, 128, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-3 [2, 64, 128, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-17 [2, 128, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-18 [2, 128, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-9 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-19 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-20 [2, 128, 256] 65,536\n", + "�� │ │ │ │ │ └─Linear: 7-21 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-22 [2, 64, 1179, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-4 [2, 64, 1179, 128] --\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", + "│ │ │ │ │ └─Tanh: 6-11 [2, 1179, 512] --\n", + "│ │ │ │ │ └─Linear: 6-12 [2, 1179, 256] 131,328\n", + "│ │ │ └─EncoderLayer: 4-39 [2, 8, 256] --\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-5 [2, 1179, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-13 [2, 128, 256] 32,768\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-14 [2, 128, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-25 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-26 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-27 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-28 [2, 64, 128, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-5 [2, 64, 128, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-29 [2, 128, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-30 [2, 128, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-15 [2, 1179, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-31 [2, 1179, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-32 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─Linear: 7-33 [2, 128, 256] 65,536\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-34 [2, 64, 1179, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-6 [2, 64, 1179, 128] --\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, 8, 256] --\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-19 [2, 8, 256] 2,048\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-20 [2, 8, 256] --\n", + "│ │ │ │ │ │ └─Linear: 7-37 [2, 8, 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, 64, 8, 4] --\n", + "│ │ │ │ │ │ │ ���─Softmax: 8-7 [2, 64, 8, 1179] --\n", + "│ │ │ │ │ │ └─Linear: 7-41 [2, 8, 256] 65,792\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-42 [2, 8, 256] --\n", + "│ └─Encoder: 2-4 [2, 8, 256] (recursive)\n", + "│ │ └─ModuleList: 3-20 -- (recursive)\n", + "│ │ │ └─EncoderLayer: 4-40 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-8 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-21 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-22 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-43 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-44 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-45 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-46 [2, 64, 128, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-8 [2, 64, 128, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-47 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-48 [2, 128, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-23 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-49 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-50 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-51 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-52 [2, 64, 294, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-9 [2, 64, 294, 128] --\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", + "│ │ │ │ │ └─Tanh: 6-25 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-26 [2, 294, 256] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-41 [2, 294, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-10 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-27 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-28 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-55 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-56 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-57 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-58 [2, 64, 128, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-10 [2, 64, 128, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-59 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-60 [2, 128, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-29 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-61 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-62 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-63 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-64 [2, 64, 294, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-11 [2, 64, 294, 128] --\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", + "│ │ │ │ │ └─Tanh: 6-31 [2, 294, 512] --\n", + "│ │ │ │ │ └─Linear: 6-32 [2, 294, 256] (recursive)\n", + "│ │ │ └─EncoderLayer: 4-42 [2, 8, 256] (recursive)\n", + "│ │ │ │ └─SimpleInducedSetAttention: 5-12 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-33 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-34 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-67 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-68 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-69 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-70 [2, 64, 128, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-12 [2, 64, 128, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-71 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-72 [2, 128, 256] --\n", + "│ │ │ │ │ └─MultiHeadAttention: 6-35 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-73 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-74 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-75 [2, 128, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-76 [2, 64, 294, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-13 [2, 64, 294, 128] --\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, 8, 256] (recursive)\n", + "│ │ │ │ │ └─TensorInductionPoint: 6-39 [2, 8, 256] (recursive)\n", + "│ │ │ │ │ └─SimpleMultiHeadAttention: 6-40 [2, 8, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-79 [2, 8, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-80 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─Linear: 7-81 [2, 294, 256] (recursive)\n", + "│ │ │ │ │ │ └─ScaledDotProductAttention: 7-82 [2, 64, 8, 4] --\n", + "│ │ │ │ │ │ │ └─Softmax: 8-14 [2, 64, 8, 294] --\n", + "│ │ │ │ │ │ └─Linear: 7-83 [2, 8, 256] (recursive)\n", + "│ │ │ │ │ │ └─LeakyHardtanh: 7-84 [2, 8, 256] --\n", + "├─Head: 1-4 [2] --\n", + "│ └─Sequential: 2-5 [2, 1] --\n", + "│ │ └─FeedForward: 3-21 [2, 512] --\n", + "│ │ │ └─Linear: 4-43 [2, 512] 1,049,088\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, 512] --\n", + "│ │ │ └─Linear: 4-55 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-56 [2, 512] --\n", + "│ │ └─FeedForward: 3-28 [2, 512] --\n", + "│ │ │ └─Linear: 4-57 [2, 512] 262,656\n", + "│ │ │ └─ReLU6: 4-58 [2, 512] --\n", + "│ │ └─FeedForward: 3-29 [2, 1] --\n", + "│ │ │ └─Linear: 4-59 [2, 1] 513\n", + "│ │ │ └─LeakyHardsigmoid: 4-60 [2, 1] --\n", + "========================================================================================================================\n", + "Total params: 7,604,993\n", + "Trainable params: 7,604,993\n", + "Non-trainable params: 0\n", + "Total mult-adds (M): 24.24\n", + "========================================================================================================================\n", + "Input size (MB): 0.47\n", + "Forward/backward pass size (MB): 257.33\n", + "Params size (MB): 30.42\n", + "Estimated Total Size (MB): 288.22\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:02:29.023730Z", + "iopub.status.busy": "2024-03-26T07:02:29.022983Z", + "iopub.status.idle": "2024-03-26T07:02:29.076384Z", + "shell.execute_reply": "2024-03-26T07:02:29.075484Z" + }, + "papermill": { + "duration": 0.069356, + "end_time": "2024-03-26T07:02:29.078454", + "exception": false, + "start_time": "2024-03-26T07:02:29.009098", + "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:02:29.104859Z", + "iopub.status.busy": "2024-03-26T07:02:29.104570Z", + "iopub.status.idle": "2024-03-26T07:04:43.125983Z", + "shell.execute_reply": "2024-03-26T07:04:43.124916Z" + }, + "papermill": { + "duration": 134.03742, + "end_time": "2024-03-26T07:04:43.128535", + "exception": false, + "start_time": "2024-03-26T07:02:29.091115", + "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:04:43.157466Z", + "iopub.status.busy": "2024-03-26T07:04:43.157125Z", + "iopub.status.idle": "2024-03-26T07:04:43.178957Z", + "shell.execute_reply": "2024-03-26T07:04:43.178165Z" + }, + "papermill": { + "duration": 0.03883, + "end_time": "2024-03-26T07:04:43.181158", + "exception": false, + "start_time": "2024-03-26T07:04:43.142328", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
avg_g_cos_lossavg_g_mag_lossavg_lossgrad_durationgrad_maegrad_mapegrad_rmsemean_pred_losspred_durationpred_maepred_mapepred_rmsepred_stdstd_losstotal_duration
lct_gan0.0079890.0067450.0018551.6703410.0106010.3454720.0163060.0000032.7118340.0321230.092560.0430740.0875690.0166044.382175
\n", + "
" + ], + "text/plain": [ + " avg_g_cos_loss avg_g_mag_loss avg_loss grad_duration grad_mae \\\n", + "lct_gan 0.007989 0.006745 0.001855 1.670341 0.010601 \n", + "\n", + " grad_mape grad_rmse mean_pred_loss pred_duration pred_mae \\\n", + "lct_gan 0.345472 0.016306 0.000003 2.711834 0.032123 \n", + "\n", + " pred_mape pred_rmse pred_std std_loss total_duration \n", + "lct_gan 0.09256 0.043074 0.087569 0.016604 4.382175 " + ] + }, + "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:04:43.207461Z", + "iopub.status.busy": "2024-03-26T07:04:43.207140Z", + "iopub.status.idle": "2024-03-26T07:04:43.664078Z", + "shell.execute_reply": "2024-03-26T07:04:43.663180Z" + }, + "papermill": { + "duration": 0.472335, + "end_time": "2024-03-26T07:04:43.666225", + "exception": false, + "start_time": "2024-03-26T07:04:43.193890", + "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:04:43.694954Z", + "iopub.status.busy": "2024-03-26T07:04:43.694087Z", + "iopub.status.idle": "2024-03-26T07:07:10.524565Z", + "shell.execute_reply": "2024-03-26T07:07:10.523643Z" + }, + "papermill": { + "duration": 146.847692, + "end_time": "2024-03-26T07:07:10.527325", + "exception": false, + "start_time": "2024-03-26T07:04:43.679633", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n", + "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n", + "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/all inf False\n" + ] + } + ], + "source": [ + "#\"\"\"\n", + "from ml_utility_loss.loss_learning.estimator.process import pred, pred_2\n", + "from ml_utility_loss.util import stack_samples\n", + "\n", + "#samples = test_set[list(range(len(test_set)))]\n", + "#y = {m: pred(model[m], s) for m, s in samples.items()}\n", + "y = pred_2(model, test_set, batch_size=batch_size)\n", + "#\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "6ab51db8", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-26T07:07:10.555967Z", + "iopub.status.busy": "2024-03-26T07:07:10.555657Z", + "iopub.status.idle": "2024-03-26T07:07:10.575846Z", + "shell.execute_reply": "2024-03-26T07:07:10.575130Z" + }, + "papermill": { + "duration": 0.036416, + "end_time": "2024-03-26T07:07:10.577639", + "exception": false, + "start_time": "2024-03-26T07:07:10.541223", + "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:07:10.603605Z", + "iopub.status.busy": "2024-03-26T07:07:10.603305Z", + "iopub.status.idle": "2024-03-26T07:07:10.608506Z", + "shell.execute_reply": "2024-03-26T07:07:10.607674Z" + }, + "papermill": { + "duration": 0.020724, + "end_time": "2024-03-26T07:07:10.610366", + "exception": false, + "start_time": "2024-03-26T07:07:10.589642", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'lct_gan': 0.40845790738860766}\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:07:10.635276Z", + "iopub.status.busy": "2024-03-26T07:07:10.635012Z", + "iopub.status.idle": "2024-03-26T07:07:11.081476Z", + "shell.execute_reply": "2024-03-26T07:07:11.080563Z" + }, + "papermill": { + "duration": 0.461541, + "end_time": "2024-03-26T07:07:11.083670", + "exception": false, + "start_time": "2024-03-26T07:07:10.622129", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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u3cjLS0NQ4cOxb/927+hsbExpLHfTLCvzWw2Iy8vDzk5OVi0aBHOnDnjfyyW3rd33nkH9913H+LjA/e1ivT7Romom7ralba2trbDn6mtre3yfN9tT64ZDsG8ths988wzyMrKCvilmDdvHjZt2oSvv/4aL730Evbs2YP58+fD4+lkF9wwCOa1DR06FO+++y4+//xzvP/+++B5HrfddhsqKysBxM77dvDgQZw+fRrLly8POC7G+xbVs+9J37B+/Xps3boVu3fvDmjUve+++/zfjxo1CqNHj8agQYOwe/duzJo1S4xQu2XKlCkB++rddtttGD58ON566y288MILIkYWWu+88w5GjRqFSZMmBRwX432jElE39XRXWgDIyMjo8nzfbU+uGQ7BvDafV155BevXr8dXX32F0aNHd3nuwIEDkZKSgkuXLvU65u7qzWvzkcvlKCws9McdC++bxWLB1q1b8cgjj9z0eSLxvlEi6qZgdqWdMmVKwPkAsGvXLv/5BQUFyMjICDjHaDTiwIEDEd3pNtgdd19++WW88MIL2LFjByZMmHDT56msrERjYyMyMzNDEnd3hGI3YY/Hg1OnTvnjjvb3DRCGlTgcDvziF7+46fNE5H2LaNN4lNu6dStTKpWstLSUnT17lj322GNMr9f7u3YffPBB9uyzz/rP37dvH5PJZOyVV15h586dY2vWrOmw+16v17PPP/+cnTx5ki1atEi0buCevLb169czhULBPvnkk4BuXpPJxBhjzGQysZUrV7LvvvuOlZWVsb///e9s3LhxbMiQIcxut/fp17Z27Vq2c+dOdvnyZXbkyBF23333MZVKxc6cORPw+qPxffO5/fbb2b333tvuuFjvGyWiHvrLX/7CcnNzmUKhYJMmTWL79+/3PzZ9+nS2dOnSgPM/+ugjdssttzCFQsFGjBjBtm/fHvA4z/PsD3/4A0tPT2dKpZLNmjWLnT9/PhIvpZ2evLa8vDwGoN3XmjVrGGOMWa1WNmfOHJaamsrkcjnLy8tjjz76aLvxOJHSk9f29NNP+89NT09nd911Fzt69GjA9aL1fWOMse+//54BYF999VW7a4n1vtEyIIQQ0VEbESFEdJSICCGio0RECBEdJSJCiOgoERFCREeJiBAiOkpEhBDRUSIihIiOEhGJKqWlpdDr9f77zz33HMaOHeu/X1RUhMWLF0c8LtI7lIhIh3zrFv/yl79s99iKFSvAcRyKiooCzg91AsjPz8cbb7wRcOzee+/FhQsXOv2ZDRs2oLS01H9/xowZePrpp0MaFwk9SkSkUzk5Odi6dStsNpv/mN1ux+bNm5GbmytKTGq1GmlpaZ0+rtPpAkpMJDpQIiKdGjduHHJycrBt2zb/sW3btiE3NxeFhYW9unZHJZXFixf7S1kzZsxAeXk5fvOb3/h3kgDaV81u1LZkVlRUhD179mDDhg3+a5SVlWHw4MF45ZVXAn7u+PHj4DguomslkVaUiEiXli1bhpKSEv/9d999Fw8//HDYn3fbtm3Izs7G888/j5qaGtTU1PT4Ghs2bMCUKVPw6KOP+q+Rm5vb7jUBQElJCe644w4MHjw4VC+B9AAlItKlX/ziF/j2229RXl6O8vJy7Nu3r1uLafVWUlISpFIpNBoNMjIyglr5UKfTQaFQIC4uzn8NqVSKoqIinD9/3r//l8vlwubNm7Fs2bJQvwzSTbRmNelSamoqFixYgNLSUjDGsGDBAqSkpIgdVq9kZWVhwYIFePfddzFp0iT8z//8DxwOB5YsWSJ2aP0WlYjITS1btgylpaV47733QlZqkEgkuHEpLJfLFZJrd8fy5cv9DfElJSW49957ERcXF7HnJ4EoEZGbmjdvHpxOJ1wuF+bOnRuSa6ampga0+3g8Hpw+fTrgHIVC0estbDq7xl133YX4+Hhs3LgRO3bsoGqZyKhqRm5KKpXi3Llz/u87YzAYcPz48YBjycnJyMnJaXfunXfeieLiYmzfvh2DBg3Ca6+9hpaWloBz8vPzsXfvXtx3331QKpVBVQnz8/Nx4MABXL16FQkJCUhKSoJEIvG3Fa1atQpDhgyJ6KL3pD0qEZFu0Wq10Gq1XZ6ze/duFBYWBnytXbu2w3OXLVuGpUuX4qGHHsL06dMxcOBAzJw5M+Cc559/HlevXsWgQYOQmpoaVNwrV66EVCrFrbfeitTUVFy7ds3/2COPPAKn0xmRXkDSNVqzmvRb//znPzFr1ixUVFS02y2VRBYlItLvOBwO1NfXY+nSpcjIyMAHH3wgdkj9HlXNSL+zZcsW5OXloaWlBS+//LLY4RBQiYgQ0gdQiYgQIjpKRIQQ0VEiIoSIjhIRIUR0lIgIIaKjREQIER0lIkKI6CgREUJE9/8B2f0996LWQd4AAAAASUVORK5CYII=", + "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:07:11.113345Z", + "iopub.status.busy": "2024-03-26T07:07:11.112987Z", + "iopub.status.idle": "2024-03-26T07:07:11.438261Z", + "shell.execute_reply": "2024-03-26T07:07:11.437073Z" + }, + "papermill": { + "duration": 0.343203, + "end_time": "2024-03-26T07:07:11.440509", + "exception": false, + "start_time": "2024-03-26T07:07:11.097306", + "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_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:07:11.470252Z", + "iopub.status.busy": "2024-03-26T07:07:11.469886Z", + "iopub.status.idle": "2024-03-26T07:07:11.628752Z", + "shell.execute_reply": "2024-03-26T07:07:11.627634Z" + }, + "papermill": { + "duration": 0.176558, + "end_time": "2024-03-26T07:07:11.631582", + "exception": false, + "start_time": "2024-03-26T07:07:11.455024", + "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:07:11.662693Z", + "iopub.status.busy": "2024-03-26T07:07:11.662372Z", + "iopub.status.idle": "2024-03-26T07:07:11.874079Z", + "shell.execute_reply": "2024-03-26T07:07:11.873190Z" + }, + "papermill": { + "duration": 0.229991, + "end_time": "2024-03-26T07:07:11.876254", + "exception": false, + "start_time": "2024-03-26T07:07:11.646263", + "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.015014, + "end_time": "2024-03-26T07:07:11.906494", + "exception": false, + "start_time": "2024-03-26T07:07:11.891480", + "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": 303.656298, + "end_time": "2024-03-26T07:07:14.641908", + "environment_variables": {}, + "exception": null, + "input_path": "eval/contraceptive/lct_gan/42/mlu-eval-load.ipynb", + "output_path": "eval/contraceptive/lct_gan/42/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/lct_gan/42", + "path_prefix": "../../../../", + "random_seed": 42, + "single_model": "lct_gan" + }, + "start_time": "2024-03-26T07:02:10.985610", + "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