diff --git "a/contraceptive/lct_gan/mlu-eval.ipynb" "b/contraceptive/lct_gan/mlu-eval.ipynb" new file mode 100644--- /dev/null +++ "b/contraceptive/lct_gan/mlu-eval.ipynb" @@ -0,0 +1,2269 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "982e76f5", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T16:48:55.756313Z", + "iopub.status.busy": "2024-03-24T16:48:55.755963Z", + "iopub.status.idle": "2024-03-24T16:48:55.791654Z", + "shell.execute_reply": "2024-03-24T16:48:55.790907Z" + }, + "papermill": { + "duration": 0.051893, + "end_time": "2024-03-24T16:48:55.793856", + "exception": false, + "start_time": "2024-03-24T16:48:55.741963", + "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-24T16:48:55.820237Z", + "iopub.status.busy": "2024-03-24T16:48:55.819887Z", + "iopub.status.idle": "2024-03-24T16:48:55.826763Z", + "shell.execute_reply": "2024-03-24T16:48:55.825852Z" + }, + "papermill": { + "duration": 0.022407, + "end_time": "2024-03-24T16:48:55.828668", + "exception": false, + "start_time": "2024-03-24T16:48:55.806261", + "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-24T16:48:55.852180Z", + "iopub.status.busy": "2024-03-24T16:48:55.851939Z", + "iopub.status.idle": "2024-03-24T16:48:55.856102Z", + "shell.execute_reply": "2024-03-24T16:48:55.855228Z" + }, + "papermill": { + "duration": 0.018137, + "end_time": "2024-03-24T16:48:55.858103", + "exception": false, + "start_time": "2024-03-24T16:48:55.839966", + "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-24T16:48:55.882533Z", + "iopub.status.busy": "2024-03-24T16:48:55.882167Z", + "iopub.status.idle": "2024-03-24T16:48:55.886502Z", + "shell.execute_reply": "2024-03-24T16:48:55.885612Z" + }, + "executionInfo": { + "elapsed": 678, + "status": "ok", + "timestamp": 1696841022168, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "ns5hFcVL2yvs", + "papermill": { + "duration": 0.018935, + "end_time": "2024-03-24T16:48:55.888576", + "exception": false, + "start_time": "2024-03-24T16:48:55.869641", + "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-24T16:48:55.912595Z", + "iopub.status.busy": "2024-03-24T16:48:55.912264Z", + "iopub.status.idle": "2024-03-24T16:48:55.918703Z", + "shell.execute_reply": "2024-03-24T16:48:55.917860Z" + }, + "papermill": { + "duration": 0.021317, + "end_time": "2024-03-24T16:48:55.921283", + "exception": false, + "start_time": "2024-03-24T16:48:55.899966", + "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": "af92ecea", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T16:48:55.947000Z", + "iopub.status.busy": "2024-03-24T16:48:55.946747Z", + "iopub.status.idle": "2024-03-24T16:48:55.951653Z", + "shell.execute_reply": "2024-03-24T16:48:55.950827Z" + }, + "papermill": { + "duration": 0.019815, + "end_time": "2024-03-24T16:48:55.953665", + "exception": false, + "start_time": "2024-03-24T16:48:55.933850", + "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.011109, + "end_time": "2024-03-24T16:48:55.976177", + "exception": false, + "start_time": "2024-03-24T16:48:55.965068", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5f45b1d0", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T16:48:56.000093Z", + "iopub.status.busy": "2024-03-24T16:48:55.999462Z", + "iopub.status.idle": "2024-03-24T16:48:56.008249Z", + "shell.execute_reply": "2024-03-24T16:48:56.007468Z" + }, + "executionInfo": { + "elapsed": 7, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "UdvXYv3c3LXy", + "papermill": { + "duration": 0.022732, + "end_time": "2024-03-24T16:48:56.010121", + "exception": false, + "start_time": "2024-03-24T16:48:55.987389", + "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-24T16:48:56.033962Z", + "iopub.status.busy": "2024-03-24T16:48:56.033701Z", + "iopub.status.idle": "2024-03-24T16:48:58.104299Z", + "shell.execute_reply": "2024-03-24T16:48:58.102687Z" + }, + "papermill": { + "duration": 2.08582, + "end_time": "2024-03-24T16:48:58.107485", + "exception": false, + "start_time": "2024-03-24T16:48:56.021665", + "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-24T16:48:58.147952Z", + "iopub.status.busy": "2024-03-24T16:48:58.147383Z", + "iopub.status.idle": "2024-03-24T16:48:58.160625Z", + "shell.execute_reply": "2024-03-24T16:48:58.159716Z" + }, + "papermill": { + "duration": 0.039124, + "end_time": "2024-03-24T16:48:58.162865", + "exception": false, + "start_time": "2024-03-24T16:48:58.123741", + "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-24T16:48:58.188688Z", + "iopub.status.busy": "2024-03-24T16:48:58.188092Z", + "iopub.status.idle": "2024-03-24T16:48:58.196834Z", + "shell.execute_reply": "2024-03-24T16:48:58.195931Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "Vrl2QkoV3o_8", + "papermill": { + "duration": 0.023806, + "end_time": "2024-03-24T16:48:58.199192", + "exception": false, + "start_time": "2024-03-24T16:48:58.175386", + "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-24T16:48:58.232505Z", + "iopub.status.busy": "2024-03-24T16:48:58.231709Z", + "iopub.status.idle": "2024-03-24T16:48:58.338342Z", + "shell.execute_reply": "2024-03-24T16:48:58.337444Z" + }, + "executionInfo": { + "elapsed": 6, + "status": "ok", + "timestamp": 1696841022169, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "TilUuFk9vqMb", + "papermill": { + "duration": 0.125269, + "end_time": "2024-03-24T16:48:58.340746", + "exception": false, + "start_time": "2024-03-24T16:48:58.215477", + "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-24T16:48:58.369454Z", + "iopub.status.busy": "2024-03-24T16:48:58.369151Z", + "iopub.status.idle": "2024-03-24T16:49:03.130885Z", + "shell.execute_reply": "2024-03-24T16:49:03.129963Z" + }, + "executionInfo": { + "elapsed": 3113, + "status": "ok", + "timestamp": 1696841025277, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "7Abt8nStvr9Z", + "papermill": { + "duration": 4.779479, + "end_time": "2024-03-24T16:49:03.133283", + "exception": false, + "start_time": "2024-03-24T16:48:58.353804", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-24 16:49:00.662068: 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-24 16:49:00.662158: 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-24 16:49:00.664213: 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-24T16:49:03.159806Z", + "iopub.status.busy": "2024-03-24T16:49:03.158703Z", + "iopub.status.idle": "2024-03-24T16:49:03.164356Z", + "shell.execute_reply": "2024-03-24T16:49:03.163663Z" + }, + "papermill": { + "duration": 0.020618, + "end_time": "2024-03-24T16:49:03.166282", + "exception": false, + "start_time": "2024-03-24T16:49:03.145664", + "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-24T16:49:03.192968Z", + "iopub.status.busy": "2024-03-24T16:49:03.192703Z", + "iopub.status.idle": "2024-03-24T16:49:11.591059Z", + "shell.execute_reply": "2024-03-24T16:49:11.589986Z" + }, + "executionInfo": { + "elapsed": 20137, + "status": "ok", + "timestamp": 1696841045408, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "tbaguWxAvtPi", + "papermill": { + "duration": 8.41478, + "end_time": "2024-03-24T16:49:11.593583", + "exception": false, + "start_time": "2024-03-24T16:49:03.178803", + "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-24T16:49:11.621678Z", + "iopub.status.busy": "2024-03-24T16:49:11.621156Z", + "iopub.status.idle": "2024-03-24T16:49:11.628321Z", + "shell.execute_reply": "2024-03-24T16:49:11.627434Z" + }, + "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.023898, + "end_time": "2024-03-24T16:49:11.630234", + "exception": false, + "start_time": "2024-03-24T16:49:11.606336", + "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-24T16:49:11.654694Z", + "iopub.status.busy": "2024-03-24T16:49:11.654418Z", + "iopub.status.idle": "2024-03-24T16:49:11.659115Z", + "shell.execute_reply": "2024-03-24T16:49:11.658253Z" + }, + "papermill": { + "duration": 0.019272, + "end_time": "2024-03-24T16:49:11.661078", + "exception": false, + "start_time": "2024-03-24T16:49:11.641806", + "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-24T16:49:11.685585Z", + "iopub.status.busy": "2024-03-24T16:49:11.685304Z", + "iopub.status.idle": "2024-03-24T16:49:12.202349Z", + "shell.execute_reply": "2024-03-24T16:49:12.201381Z" + }, + "papermill": { + "duration": 0.532005, + "end_time": "2024-03-24T16:49:12.204786", + "exception": false, + "start_time": "2024-03-24T16:49:11.672781", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/aug_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n", + "../../../../ml-utility-loss/bs_test/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/all inf False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "../../../../ml-utility-loss/synthetics/contraceptive [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", + "1050\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.pipeline import load_dataset_4\n", + "\n", + "test_set = load_dataset_4(\n", + " dataset_dir=os.path.join(path_prefix, \"ml-utility-loss/\"),\n", + " dataset_name=dataset_name,\n", + " preprocessor=preprocessor,\n", + " model=single_model,\n", + " cache_dir=path_prefix,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "14ff8b40", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T16:49:12.236168Z", + "iopub.status.busy": "2024-03-24T16:49:12.235297Z", + "iopub.status.idle": "2024-03-24T16:49:12.563979Z", + "shell.execute_reply": "2024-03-24T16:49:12.563107Z" + }, + "executionInfo": { + "elapsed": 588, + "status": "ok", + "timestamp": 1696841049215, + "user": { + "displayName": "Rizqi Nur", + "userId": "09644007964068789560" + }, + "user_tz": -420 + }, + "id": "NgahtU1q9uLO", + "papermill": { + "duration": 0.346363, + "end_time": "2024-03-24T16:49:12.566071", + "exception": false, + "start_time": "2024-03-24T16:49:12.219708", + "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": 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", + "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-24T16:49:12.594922Z", + "iopub.status.busy": "2024-03-24T16:49:12.594370Z", + "iopub.status.idle": "2024-03-24T16:49:12.703911Z", + "shell.execute_reply": "2024-03-24T16:49:12.703086Z" + }, + "papermill": { + "duration": 0.126462, + "end_time": "2024-03-24T16:49:12.706021", + "exception": false, + "start_time": "2024-03-24T16:49:12.579559", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_train/lct_gan/all inf False\n", + "split df ratio is 0\n", + "../../../../ml-utility-loss/aug_train/contraceptive [400, 0]\n", + "Caching in ../../../../contraceptive/_cache_aug_val/lct_gan/all inf False\n", + "split df ratio is 1\n", + "../../../../ml-utility-loss/aug_val/contraceptive [0, 200]\n", + "Caching in ../../../../contraceptive/_cache_bs_train/lct_gan/all inf False\n", + "split df ratio is 0\n", + "../../../../ml-utility-loss/bs_train/contraceptive [100, 0]\n", + "Caching in ../../../../contraceptive/_cache_bs_val/lct_gan/all inf False\n", + "split df ratio is 1\n", + "../../../../ml-utility-loss/bs_val/contraceptive [0, 50]\n", + "Caching in ../../../../contraceptive/_cache_synth/lct_gan/all inf False\n", + "Splitting without random!\n", + "Split with reverse index!\n", + "../../../../ml-utility-loss/synthetics/contraceptive [400, 200]\n", + "[900, 450]\n", + "[900, 450]\n" + ] + } + ], + "source": [ + "train_set, val_set = datasetsn(model=params[\"fixed_role_model\"], synth_data=params[\"synth_data\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "2fcb1418", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "execution": { + "iopub.execute_input": "2024-03-24T16:49:12.735014Z", + "iopub.status.busy": "2024-03-24T16:49:12.734314Z", + "iopub.status.idle": "2024-03-24T16:49:13.136389Z", + "shell.execute_reply": "2024-03-24T16:49:13.135431Z" + }, + "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.418903, + "end_time": "2024-03-24T16:49:13.138768", + "exception": false, + "start_time": "2024-03-24T16:49:12.719865", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating model of type \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[*] Embedding False True\n", + "['lct_gan'] 1\n" + ] + } + ], + "source": [ + "from ml_utility_loss.loss_learning.estimator.model.pipeline import remove_non_model_params\n", + "from ml_utility_loss.loss_learning.estimator.pipeline import create_model\n", + "from ml_utility_loss.util import filter_dict, clear_memory\n", + "\n", + "clear_memory()\n", + "\n", + "params2 = remove_non_model_params(params)\n", + "adapters = filter_dict(preprocessor.adapter_sizes, params[\"models\"])\n", + "\n", + "model = create_model(\n", + " adapters=adapters,\n", + " #Body=\"twin_encoder\",\n", + " **params2,\n", + ")\n", + "#cf.apply_weight_standardization(model, n_last_layers_ignore=0)\n", + "print(model.models, len(model.adapters))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "938f94fc", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T16:49:13.168988Z", + "iopub.status.busy": "2024-03-24T16:49:13.168657Z", + "iopub.status.idle": "2024-03-24T16:49:13.173072Z", + "shell.execute_reply": "2024-03-24T16:49:13.172203Z" + }, + "papermill": { + "duration": 0.02214, + "end_time": "2024-03-24T16:49:13.175165", + "exception": false, + "start_time": "2024-03-24T16:49:13.153025", + "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-24T16:49:13.201165Z", + "iopub.status.busy": "2024-03-24T16:49:13.200908Z", + "iopub.status.idle": "2024-03-24T16:49:13.207683Z", + "shell.execute_reply": "2024-03-24T16:49:13.206823Z" + }, + "papermill": { + "duration": 0.021906, + "end_time": "2024-03-24T16:49:13.209657", + "exception": false, + "start_time": "2024-03-24T16:49:13.187751", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7604993" + ] + }, + "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-24T16:49:13.235982Z", + "iopub.status.busy": "2024-03-24T16:49:13.235318Z", + "iopub.status.idle": "2024-03-24T16:49:13.317960Z", + "shell.execute_reply": "2024-03-24T16:49:13.317115Z" + }, + "papermill": { + "duration": 0.097864, + "end_time": "2024-03-24T16:49:13.319865", + "exception": false, + "start_time": "2024-03-24T16:49:13.222001", + "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": 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-24T16:49:13.349035Z", + "iopub.status.busy": "2024-03-24T16:49:13.348769Z", + "iopub.status.idle": "2024-03-24T17:54:43.774627Z", + "shell.execute_reply": "2024-03-24T17:54:43.773664Z" + }, + "papermill": { + "duration": 3930.457885, + "end_time": "2024-03-24T17:54:43.791813", + "exception": false, + "start_time": "2024-03-24T16:49:13.333928", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 datasets [900, 450, 1050]\n", + "Creating model of type \n", + "[*] Embedding False True\n", + "g_loss_mul 0.1\n", + "Epoch 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.019665115947168993, 'avg_role_model_std_loss': 1.3259430897919648, 'avg_role_model_mean_pred_loss': 0.0016351528701719095, 'avg_role_model_g_mag_loss': 0.12722583417470257, '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.0199518630333801, 'n_size': 900, 'n_batch': 225, 'duration': 270.090327501297, 'duration_batch': 1.20040145556132, 'duration_size': 0.30010036389033, 'avg_pred_std': 0.11211167593641827}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.005123136696509189, 'avg_role_model_std_loss': 1.9587845133610828, 'avg_role_model_mean_pred_loss': 3.225599730537245e-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.005123136696509189, 'n_size': 450, 'n_batch': 113, 'duration': 87.16603398323059, 'duration_batch': 0.7713808317100053, 'duration_size': 0.19370229774051242, 'avg_pred_std': 0.048274144109964896}\n", + "Epoch 1\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.004459613269524804, 'avg_role_model_std_loss': 0.5696247978427467, 'avg_role_model_mean_pred_loss': 4.493151174229456e-05, 'avg_role_model_g_mag_loss': 0.02243374695568087, '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.004538138056490829, 'n_size': 900, 'n_batch': 225, 'duration': 271.9333186149597, 'duration_batch': 1.2085925271775988, 'duration_size': 0.3021481317943997, 'avg_pred_std': 0.10111145882142915}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.003131905284826644, 'avg_role_model_std_loss': 1.191799519885096, 'avg_role_model_mean_pred_loss': 1.3011600207322418e-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.003131905284826644, 'n_size': 450, 'n_batch': 113, 'duration': 92.20275020599365, 'duration_batch': 0.8159535416459616, 'duration_size': 0.20489500045776368, 'avg_pred_std': 0.05275093076289096}\n", + "Epoch 2\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0035123983815234777, 'avg_role_model_std_loss': 0.4977147144650333, 'avg_role_model_mean_pred_loss': 2.859574940254904e-05, 'avg_role_model_g_mag_loss': 0.018076600913837965, '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.003567821487797321, 'n_size': 900, 'n_batch': 225, 'duration': 275.1772153377533, 'duration_batch': 1.2230098459455703, 'duration_size': 0.30575246148639257, 'avg_pred_std': 0.1008471870360275}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0031233079556032962, 'avg_role_model_std_loss': 1.3221473698086115, 'avg_role_model_mean_pred_loss': 4.6298641943619236e-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.0031233079556032962, 'n_size': 450, 'n_batch': 113, 'duration': 88.90858387947083, 'duration_batch': 0.7868016272519542, 'duration_size': 0.1975746308432685, 'avg_pred_std': 0.05913279911882318}\n", + "Epoch 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.003161510648399902, 'avg_role_model_std_loss': 0.5058521567848904, 'avg_role_model_mean_pred_loss': 2.4743936033731546e-05, 'avg_role_model_g_mag_loss': 0.014727871190666014, '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.00322171315592843, 'n_size': 900, 'n_batch': 225, 'duration': 272.91378474235535, 'duration_batch': 1.2129501544104682, 'duration_size': 0.30323753860261704, 'avg_pred_std': 0.09905971649413307}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.004386183474238755, 'avg_role_model_std_loss': 2.076401953705954, 'avg_role_model_mean_pred_loss': 2.7025729084248062e-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.004386183474238755, 'n_size': 450, 'n_batch': 113, 'duration': 88.29646849632263, 'duration_batch': 0.7813846769586074, 'duration_size': 0.19621437443627252, 'avg_pred_std': 0.03421469124248334}\n", + "Epoch 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0026987572804662505, 'avg_role_model_std_loss': 0.35000921227432324, 'avg_role_model_mean_pred_loss': 1.5105901600198398e-05, 'avg_role_model_g_mag_loss': 0.015139500791944253, '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.0027399578163426162, 'n_size': 900, 'n_batch': 225, 'duration': 272.80935049057007, 'duration_batch': 1.2124860021803114, 'duration_size': 0.30312150054507786, 'avg_pred_std': 0.09980787922110823}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.002216681500544332, 'avg_role_model_std_loss': 1.5294503328664861, 'avg_role_model_mean_pred_loss': 5.906305432745928e-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.002216681500544332, 'n_size': 450, 'n_batch': 113, 'duration': 88.42259788513184, 'duration_batch': 0.7825008662401047, 'duration_size': 0.19649466196695964, 'avg_pred_std': 0.05325051893447155}\n", + "Epoch 5\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.002033243282720731, 'avg_role_model_std_loss': 0.23602186178530385, 'avg_role_model_mean_pred_loss': 7.030283134612784e-06, 'avg_role_model_g_mag_loss': 0.015872358748973865, '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.0020601135703246756, 'n_size': 900, 'n_batch': 225, 'duration': 275.2858557701111, 'duration_batch': 1.2234926923116047, 'duration_size': 0.3058731730779012, 'avg_pred_std': 0.10312151636100478}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.002322478660401733, 'avg_role_model_std_loss': 1.320404739686366, 'avg_role_model_mean_pred_loss': 9.749587738599938e-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.002322478660401733, 'n_size': 450, 'n_batch': 113, 'duration': 90.18929839134216, 'duration_batch': 0.7981353839941784, 'duration_size': 0.20042066309187148, 'avg_pred_std': 0.0515262810760631}\n", + "Epoch 6\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.001614498706185259, 'avg_role_model_std_loss': 0.1809647554011328, 'avg_role_model_mean_pred_loss': 2.9324602819437286e-06, 'avg_role_model_g_mag_loss': 0.01615508396980456, '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.0016328314457981225, 'n_size': 900, 'n_batch': 225, 'duration': 275.734769821167, 'duration_batch': 1.2254878658718533, 'duration_size': 0.30637196646796333, 'avg_pred_std': 0.10563728055192365}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0019716585887686556, 'avg_role_model_std_loss': 1.9351633055870725, 'avg_role_model_mean_pred_loss': 4.450378878835354e-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.0019716585887686556, 'n_size': 450, 'n_batch': 113, 'duration': 88.78998851776123, 'duration_batch': 0.7857521107766481, 'duration_size': 0.19731108559502494, 'avg_pred_std': 0.04906956392414538}\n", + "Epoch 7\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.0014726841067183867, 'avg_role_model_std_loss': 0.21683113766619005, 'avg_role_model_mean_pred_loss': 2.8254440730661005e-06, 'avg_role_model_g_mag_loss': 0.016018104005423892, '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.0014894471139349562, 'n_size': 900, 'n_batch': 225, 'duration': 272.83155059814453, 'duration_batch': 1.2125846693250868, 'duration_size': 0.3031461673312717, 'avg_pred_std': 0.10693864568240112}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0019270910127347127, 'avg_role_model_std_loss': 1.2538913027706378, 'avg_role_model_mean_pred_loss': 3.4612182754591007e-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.0019270910127347127, 'n_size': 450, 'n_batch': 113, 'duration': 89.2393867969513, 'duration_batch': 0.789729086698684, 'duration_size': 0.19830974843766955, 'avg_pred_std': 0.050700269499381556}\n", + "Epoch 8\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.001313657746925148, 'avg_role_model_std_loss': 0.1492658925630795, 'avg_role_model_mean_pred_loss': 3.4148349597811518e-06, 'avg_role_model_g_mag_loss': 0.016415953670317927, '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.0013283096294455592, 'n_size': 900, 'n_batch': 225, 'duration': 286.74962306022644, 'duration_batch': 1.2744427691565618, 'duration_size': 0.31861069228914046, 'avg_pred_std': 0.1061259970565637}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0018737697858078818, 'avg_role_model_std_loss': 1.1538138667777444, 'avg_role_model_mean_pred_loss': 4.4807563205433855e-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.0018737697858078818, 'n_size': 450, 'n_batch': 113, 'duration': 99.40478444099426, 'duration_batch': 0.879688357884905, 'duration_size': 0.22089952097998725, 'avg_pred_std': 0.05413557932530818}\n", + "Epoch 9\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train loss {'avg_role_model_loss': 0.001177909866010446, 'avg_role_model_std_loss': 0.1193157453701771, 'avg_role_model_mean_pred_loss': 2.5867055472029534e-06, 'avg_role_model_g_mag_loss': 0.01608747973675943, '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.001191412492368929, 'n_size': 900, 'n_batch': 225, 'duration': 287.26546144485474, 'duration_batch': 1.2767353841993543, 'duration_size': 0.31918384604983857, 'avg_pred_std': 0.10842714142054319}\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Val loss {'avg_role_model_loss': 0.0018042887282919966, 'avg_role_model_std_loss': 0.9737242848529073, 'avg_role_model_mean_pred_loss': 4.131605657280651e-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.0018042887282919966, 'n_size': 450, 'n_batch': 113, 'duration': 97.79816961288452, 'duration_batch': 0.8654705275476506, 'duration_size': 0.21732926580641004, 'avg_pred_std': 0.05228815563806061}\n", + "Time out: 3681.44966673851/3600\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Eval loss {'role_model': 'lct_gan', 'n_size': 1050, 'n_batch': 263, 'role_model_metrics': {'avg_loss': 0.0014803996638372717, 'avg_g_mag_loss': 0.005388011875739759, 'avg_g_cos_loss': 0.0038071341092082937, 'pred_duration': 4.85994815826416, 'grad_duration': 2.964001417160034, 'total_duration': 7.823949575424194, 'pred_std': 0.10189060121774673, 'std_loss': 0.00683511421084404, 'mean_pred_loss': 2.3611642063769978e-06, 'pred_rmse': 0.03847596049308777, 'pred_mae': 0.028478950262069702, 'pred_mape': 0.09100271761417389, 'grad_rmse': 0.022572096437215805, 'grad_mae': 0.011139169335365295, 'grad_mape': 0.344256192445755}, '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.0014803996638372717, 'avg_g_mag_loss': 0.005388011875739759, 'avg_g_cos_loss': 0.0038071341092082937, 'avg_pred_duration': 4.85994815826416, 'avg_grad_duration': 2.964001417160034, 'avg_total_duration': 7.823949575424194, 'avg_pred_std': 0.10189060121774673, 'avg_std_loss': 0.00683511421084404, 'avg_mean_pred_loss': 2.3611642063769978e-06}, 'min_metrics': {'avg_loss': 0.0014803996638372717, 'avg_g_mag_loss': 0.005388011875739759, 'avg_g_cos_loss': 0.0038071341092082937, 'pred_duration': 4.85994815826416, 'grad_duration': 2.964001417160034, 'total_duration': 7.823949575424194, 'pred_std': 0.10189060121774673, 'std_loss': 0.00683511421084404, 'mean_pred_loss': 2.3611642063769978e-06, 'pred_rmse': 0.03847596049308777, 'pred_mae': 0.028478950262069702, 'pred_mape': 0.09100271761417389, 'grad_rmse': 0.022572096437215805, 'grad_mae': 0.011139169335365295, 'grad_mape': 0.344256192445755}, 'model_metrics': {'lct_gan': {'avg_loss': 0.0014803996638372717, 'avg_g_mag_loss': 0.005388011875739759, 'avg_g_cos_loss': 0.0038071341092082937, 'pred_duration': 4.85994815826416, 'grad_duration': 2.964001417160034, 'total_duration': 7.823949575424194, 'pred_std': 0.10189060121774673, 'std_loss': 0.00683511421084404, 'mean_pred_loss': 2.3611642063769978e-06, 'pred_rmse': 0.03847596049308777, 'pred_mae': 0.028478950262069702, 'pred_mape': 0.09100271761417389, 'grad_rmse': 0.022572096437215805, 'grad_mae': 0.011139169335365295, 'grad_mape': 0.344256192445755}}}\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-24T17:54:43.825332Z", + "iopub.status.busy": "2024-03-24T17:54:43.824674Z", + "iopub.status.idle": "2024-03-24T17:54:43.828973Z", + "shell.execute_reply": "2024-03-24T17:54:43.828164Z" + }, + "papermill": { + "duration": 0.02359, + "end_time": "2024-03-24T17:54:43.830986", + "exception": false, + "start_time": "2024-03-24T17:54:43.807396", + "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-24T17:54:43.862693Z", + "iopub.status.busy": "2024-03-24T17:54:43.862393Z", + "iopub.status.idle": "2024-03-24T17:54:43.933774Z", + "shell.execute_reply": "2024-03-24T17:54:43.932612Z" + }, + "papermill": { + "duration": 0.09002, + "end_time": "2024-03-24T17:54:43.936193", + "exception": false, + "start_time": "2024-03-24T17:54:43.846173", + "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-24T17:54:43.971892Z", + "iopub.status.busy": "2024-03-24T17:54:43.971478Z", + "iopub.status.idle": "2024-03-24T17:54:44.297234Z", + "shell.execute_reply": "2024-03-24T17:54:44.296063Z" + }, + "papermill": { + "duration": 0.347246, + "end_time": "2024-03-24T17:54:44.300426", + "exception": false, + "start_time": "2024-03-24T17:54:43.953180", + "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-24T17:54:44.345308Z", + "iopub.status.busy": "2024-03-24T17:54:44.344309Z", + "iopub.status.idle": "2024-03-24T17:58:38.026994Z", + "shell.execute_reply": "2024-03-24T17:58:38.025930Z" + }, + "papermill": { + "duration": 233.706406, + "end_time": "2024-03-24T17:58:38.029725", + "exception": false, + "start_time": "2024-03-24T17:54:44.323319", + "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-24T17:58:38.066343Z", + "iopub.status.busy": "2024-03-24T17:58:38.065514Z", + "iopub.status.idle": "2024-03-24T17:58:38.087460Z", + "shell.execute_reply": "2024-03-24T17:58:38.086416Z" + }, + "papermill": { + "duration": 0.042144, + "end_time": "2024-03-24T17:58:38.089709", + "exception": false, + "start_time": "2024-03-24T17:58:38.047565", + "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.004060.0198720.001482.9478840.0111390.3442560.0225720.0000024.8571980.0284790.0910030.0384760.1018910.0068357.805082
\n", + "
" + ], + "text/plain": [ + " avg_g_cos_loss avg_g_mag_loss avg_loss grad_duration grad_mae \\\n", + "lct_gan 0.00406 0.019872 0.00148 2.947884 0.011139 \n", + "\n", + " grad_mape grad_rmse mean_pred_loss pred_duration pred_mae \\\n", + "lct_gan 0.344256 0.022572 0.000002 4.857198 0.028479 \n", + "\n", + " pred_mape pred_rmse pred_std std_loss total_duration \n", + "lct_gan 0.091003 0.038476 0.101891 0.006835 7.805082 " + ] + }, + "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-24T17:58:38.122299Z", + "iopub.status.busy": "2024-03-24T17:58:38.122027Z", + "iopub.status.idle": "2024-03-24T17:58:38.505706Z", + "shell.execute_reply": "2024-03-24T17:58:38.504742Z" + }, + "papermill": { + "duration": 0.402502, + "end_time": "2024-03-24T17:58:38.508059", + "exception": false, + "start_time": "2024-03-24T17:58:38.105557", + "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-24T17:58:38.544114Z", + "iopub.status.busy": "2024-03-24T17:58:38.543339Z", + "iopub.status.idle": "2024-03-24T18:03:02.462418Z", + "shell.execute_reply": "2024-03-24T18:03:02.461477Z" + }, + "papermill": { + "duration": 263.939983, + "end_time": "2024-03-24T18:03:02.464987", + "exception": false, + "start_time": "2024-03-24T17:58:38.525004", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Caching in ../../../../contraceptive/_cache_aug_test/lct_gan/all inf False\n", + "Caching in ../../../../contraceptive/_cache_bs_test/lct_gan/all inf False\n", + "Caching in ../../../../contraceptive/_cache_synth_test/lct_gan/all inf False\n" + ] + } + ], + "source": [ + "#\"\"\"\n", + "from ml_utility_loss.loss_learning.estimator.process import pred, pred_2\n", + "from ml_utility_loss.util import stack_samples\n", + "\n", + "#samples = test_set[list(range(len(test_set)))]\n", + "#y = {m: pred(model[m], s) for m, s in samples.items()}\n", + "y = pred_2(model, test_set, batch_size=batch_size)\n", + "#\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "6ab51db8", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T18:03:02.501612Z", + "iopub.status.busy": "2024-03-24T18:03:02.501249Z", + "iopub.status.idle": "2024-03-24T18:03:02.529244Z", + "shell.execute_reply": "2024-03-24T18:03:02.528445Z" + }, + "papermill": { + "duration": 0.048639, + "end_time": "2024-03-24T18:03:02.531339", + "exception": false, + "start_time": "2024-03-24T18:03:02.482700", + "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-24T18:03:02.566128Z", + "iopub.status.busy": "2024-03-24T18:03:02.565498Z", + "iopub.status.idle": "2024-03-24T18:03:02.570909Z", + "shell.execute_reply": "2024-03-24T18:03:02.569993Z" + }, + "papermill": { + "duration": 0.025176, + "end_time": "2024-03-24T18:03:02.573016", + "exception": false, + "start_time": "2024-03-24T18:03:02.547840", + "status": "completed" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'lct_gan': 0.38817292616480875}\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-24T18:03:02.609131Z", + "iopub.status.busy": "2024-03-24T18:03:02.608503Z", + "iopub.status.idle": "2024-03-24T18:03:02.996812Z", + "shell.execute_reply": "2024-03-24T18:03:02.995877Z" + }, + "papermill": { + "duration": 0.408606, + "end_time": "2024-03-24T18:03:02.999055", + "exception": false, + "start_time": "2024-03-24T18:03:02.590449", + "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-24T18:03:03.033745Z", + "iopub.status.busy": "2024-03-24T18:03:03.033448Z", + "iopub.status.idle": "2024-03-24T18:03:03.399582Z", + "shell.execute_reply": "2024-03-24T18:03:03.398574Z" + }, + "papermill": { + "duration": 0.385969, + "end_time": "2024-03-24T18:03:03.401750", + "exception": false, + "start_time": "2024-03-24T18:03:03.015781", + "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": 36, + "id": "745adde1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-03-24T18:03:03.442011Z", + "iopub.status.busy": "2024-03-24T18:03:03.441185Z", + "iopub.status.idle": "2024-03-24T18:03:03.611855Z", + "shell.execute_reply": "2024-03-24T18:03:03.610864Z" + }, + "papermill": { + "duration": 0.192798, + "end_time": "2024-03-24T18:03:03.614119", + "exception": false, + "start_time": "2024-03-24T18:03:03.421321", + "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-24T18:03:03.653383Z", + "iopub.status.busy": "2024-03-24T18:03:03.653088Z", + "iopub.status.idle": "2024-03-24T18:03:03.880388Z", + "shell.execute_reply": "2024-03-24T18:03:03.879469Z" + }, + "papermill": { + "duration": 0.249442, + "end_time": "2024-03-24T18:03:03.882455", + "exception": false, + "start_time": "2024-03-24T18:03:03.633013", + "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.018825, + "end_time": "2024-03-24T18:03:03.919922", + "exception": false, + "start_time": "2024-03-24T18:03:03.901097", + "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": 4452.398135, + "end_time": "2024-03-24T18:03:06.660126", + "environment_variables": {}, + "exception": null, + "input_path": "eval/contraceptive/lct_gan/42/mlu-eval.ipynb", + "output_path": "eval/contraceptive/lct_gan/42/mlu-eval.ipynb", + "parameters": { + "allow_same_prediction": true, + "dataset": "contraceptive", + "dataset_name": "contraceptive", + "debug": false, + "folder": "eval", + "gp": true, + "gp_multiply": true, + "log_wandb": false, + "param_index": 0, + "path": "eval/contraceptive/lct_gan/42", + "path_prefix": "../../../../", + "random_seed": 42, + "single_model": "lct_gan" + }, + "start_time": "2024-03-24T16:48:54.261991", + "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