{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/ueharam1/miniconda3/envs/testgrelu/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n", "Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.\n", "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mmasatoshi136\u001b[0m (\u001b[33mmasa136\u001b[0m). Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "%matplotlib inline\n", "\n", "import torch\n", "import numpy as np\n", "import pandas as pd\n", "import sys \n", "sys.path.append(\"../../\")\n", "sys.path.append(\"../../src/\")\n", "sys.path.append(\"../../src/model\")\n", "\n", "from src.model import ddsm as ddsm\n", "from src.model import ddsm_model as modeld\n", "from src.model.lightning_model_diffusion import LightningDiffusion as lightning_dif\n", "\n", "import scipy as sp\n", "from matplotlib import pyplot as plt\n", "\n", "import wandb\n", "wandb.login(host=\"https://api.wandb.ai\") \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Load Pre-trained Model " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Tracking run with wandb version 0.17.4" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Run data is saved locally in /raid/home/ueharam1/prj/RLfinetuning_Diffusion_Bioseq/tutorials/UTR/wandb/run-20240718_000220-kwar416y" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Syncing run classic-dew-5 to Weights & Biases (docs)
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View project at https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View run at https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR/runs/kwar416y" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact UTR-Model:v0, 1499.65MB. 3 files... \n", "\u001b[34m\u001b[1mwandb\u001b[0m: 3 of 3 files downloaded. \n", "Done. 0:0:2.1\n" ] }, { "data": { "text/html": [ " View run classic-dew-5 at: https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR/runs/kwar416y
View project at: https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR
Synced 6 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Find logs at: ./wandb/run-20240718_000220-kwar416y/logs" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "The new W&B backend becomes opt-out in version 0.18.0; try it out with `wandb.require(\"core\")`! See https://wandb.me/wandb-core for more information." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "run = wandb.init()\n", "artifact = run.use_artifact('fderc_diffusion/Diffusion-DNA-RNA/UTR-Model:v0')\n", "dir = artifact.download()\n", "wandb.finish()\n", "\n", "class ModelParameters:\n", " diffusion_weights_file = 'artifacts/UTR-dataset:v0/steps400.cat4.speed_balance.time4.0.samples100000.pth'\n", " time_schedule = \"artifacts/UTR-dataset:v0/time_dependent.npz\"\n", " checkpoint_path = 'artifacts/UTR-Model:v0/diffusion_unconditional_epoch=075.ckpt'\n", "config = ModelParameters() \n", "DEVICE = \"cuda:2\" # Any number is fine" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ScoreNet(\n", " (embed): Sequential(\n", " (0): GaussianFourierProjection()\n", " (1): Linear(in_features=256, out_features=256, bias=True)\n", " )\n", " (linear): Conv1d(4, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (blocks): ModuleList(\n", " (0-1): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (2): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (3): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (4): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " (5-6): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (7): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (8): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (9): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " (10-11): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (12): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (13): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (14): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " (15-16): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (17): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (18): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (19): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " )\n", " (denses): ModuleList(\n", " (0-19): 20 x Dense(\n", " (dense): Linear(in_features=256, out_features=256, bias=True)\n", " )\n", " )\n", " (norms): ModuleList(\n", " (0-19): 20 x GroupNorm(1, 256, eps=1e-05, affine=True)\n", " )\n", " (relu): ReLU()\n", " (softplus): Softplus(beta=1.0, threshold=20.0)\n", " (final): Sequential(\n", " (0): Conv1d(256, 256, kernel_size=(1,), stride=(1,))\n", " (1): GELU(approximate='none')\n", " (2): Conv1d(256, 4, kernel_size=(1,), stride=(1,))\n", " )\n", ")" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Introduce Two Models\n", "score_model = lightning_dif.load_from_checkpoint(checkpoint_path= config.checkpoint_path, weight_file = config.diffusion_weights_file, time_schedule = config.time_schedule, all_class_number =1)\n", "score_model = score_model.model\n", "score_model.cuda(device = DEVICE) \n", "\n", "\n", "original_model = lightning_dif.load_from_checkpoint(checkpoint_path= config.checkpoint_path, weight_file = config.diffusion_weights_file, time_schedule = config.time_schedule, all_class_number =1)\n", "original_model = original_model.model\n", "original_model.cuda(device = DEVICE) " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[34m\u001b[1mwandb\u001b[0m: Downloading large artifact human_state_dict:latest, 939.29MB. 1 files... \n", "\u001b[34m\u001b[1mwandb\u001b[0m: 1 of 1 files downloaded. \n", "Done. 0:0:0.7\n" ] } ], "source": [ "# Load Reward model\n", "from grelu.lightning import LightningModel\n", "model = LightningModel.load_from_checkpoint(\"artifacts/UTR-Model:v0/reward_model.ckpt\")\n", "model.eval()\n", "model.to(DEVICE)\n", "\n", "def new_reward_model(x):\n", " x = torch.nn.functional.softmax(x /0.1, -1)\n", " seq = torch.transpose(x, 1, 2) \n", " return model(seq)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Start Fine-Tuning Diffusion Models " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Tracking run with wandb version 0.17.4" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Run data is saved locally in /raid/home/ueharam1/prj/RLfinetuning_Diffusion_Bioseq/tutorials/UTR/wandb/run-20240718_000246-op8l42at" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Syncing run golden-shape-6 to Weights & Biases (docs)
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View project at https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View run at https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR/runs/op8l42at" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 50/50 [00:01<00:00, 45.64it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.14it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 127.25it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.85it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 51.15it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 120.65it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.36it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.89it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 120.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 67.61it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.99it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.50it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.75it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.74it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 58.43it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 109.73it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.15it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.61it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.44it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 66.71it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.69it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 128.60it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 128.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.88it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 66.38it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 120.72it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.20it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 125.86it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 66.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.88it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.23it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.24it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.63it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 67.04it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 127.81it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 128.67it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.06it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 124.77it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 66.94it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 123.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 126.19it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 117.79it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 124.53it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 66.53it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.78it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 123.62it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 124.73it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 127.67it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 66.90it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 126.35it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 123.04it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 121.76it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 124.95it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 64.91it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 132.18it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 128.33it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 119.63it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.58it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 67.72it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.13it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 129.26it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 120.28it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 114.18it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 65.21it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.02it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 125.39it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 122.51it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 128.37it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 67.09it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 130.43it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 128.31it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 131.14it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 120.23it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 50.10it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 121.60it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 120.82it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 122.63it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 122.59it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 50.39it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.11it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 67.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.32it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.45it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.01it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.65it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.15it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 87.11it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 33.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.11it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.41it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.77it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.63it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.10it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.66it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.37it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.75it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.07it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.72it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.71it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.59it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.00it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 83.70it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.44it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 89.51it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.90it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 82.70it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.24it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 77.92it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.46it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 79.27it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.60it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.05it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.92it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.80it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.66it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.41it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.49it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.59it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 79.49it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 69.34it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.36it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.27it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.77it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.19it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.17it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.99it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 35.05it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.55it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.24it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.27it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.69it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.35it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.84it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 88.16it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 82.76it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.23it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.90it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.69it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.08it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.76it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.61it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.54it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.19it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.06it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 33.67it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.51it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.43it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.90it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.16it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.45it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.29it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.41it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.00it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.24it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 37.96it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 70.73it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.18it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.86it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 78.33it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.57it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.14it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.82it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.00it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.61it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 32.90it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.25it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 84.98it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.17it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.80it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.26it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.33it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.53it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.60it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.87it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.37it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.22it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 35.33it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.52it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.61it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.93it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.46it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 35.70it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.70it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 86.00it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.25it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.37it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.80it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.26it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 94.07it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 90.80it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 83.94it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.62it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.37it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.20it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 89.23it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.78it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 32.88it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.64it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.27it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 82.03it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.31it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.63it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.72it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.10it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.40it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.85it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.38it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.00it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.51it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.63it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.46it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.67it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 95.21it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 88.61it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 37.53it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.91it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.59it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.86it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.05it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.71it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.95it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.34it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 77.36it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.24it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 33.91it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.19it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.76it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.63it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.55it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 74.08it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.44it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.88it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 75.67it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.45it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.76it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.32it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.93it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.70it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 32.56it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.16it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.77it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 83.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.20it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.38it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.96it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.46it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 90.56it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.88it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.23it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 90.19it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 78.01it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.96it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.64it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.77it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.10it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.40it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.21it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.88it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.50it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.80it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.68it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 33.90it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.86it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.24it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.28it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 95.96it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.51it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.84it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.91it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.22it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 67.72it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.53it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.47it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.14it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 101.06it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.91it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 39.46it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.92it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.88it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 95.25it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 78.64it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 32.86it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.92it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 95.79it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.85it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.20it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.12it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 94.37it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.72it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.84it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.04it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.09it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.59it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.12it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 95.58it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.84it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.57it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.31it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 92.09it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 35.09it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.21it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 78.63it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.64it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 37.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.51it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 69.65it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.75it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.27it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.74it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.42it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.04it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.93it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.46it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 32.75it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.38it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 87.96it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 82.68it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.02it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.46it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.58it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 87.27it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 83.50it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.05it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.84it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.11it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.96it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.14it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 86.97it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.34it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.01it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 84.57it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.20it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.07it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.85it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.57it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.11it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.24it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.54it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.71it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.10it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.33it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.03it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.60it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 72.49it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.72it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.87it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.70it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.54it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.80it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 79.27it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.75it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 90.14it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.06it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 112.50it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.14it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 86.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.75it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.10it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.25it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.25it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.39it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.42it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.85it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.12it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 89.17it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.96it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.01it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 37.37it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.78it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.31it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.48it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.75it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.26it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 88.44it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.53it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.21it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.06it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.82it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.79it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 96.63it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 78.70it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.82it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.20it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 75.83it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.67it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.38it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 95.07it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.67it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.94it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.34it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.50it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 95.12it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.81it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.20it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.76it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 96.32it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.17it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 38.65it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 80.68it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 93.83it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 92.92it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.37it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 38.22it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.05it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.46it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.17it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.21it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.33it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.58it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 96.58it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 81.53it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.12it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.21it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.79it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 92.00it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.17it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 82.35it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.49it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.59it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.70it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.43it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.44it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 35.62it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.36it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 64.56it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.52it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 88.34it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.80it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.19it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.40it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.04it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 83.82it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 37.07it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.43it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.62it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 90.50it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 82.35it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.79it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.64it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.42it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 81.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.06it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 34.40it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.98it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 91.02it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 79.12it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.98it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.29it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.71it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.73it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 83.97it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.63it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.32it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.28it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.87it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.37it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.72it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 36.31it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 85.13it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 85.13it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.56it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 86.97it/s] \n", "100%|██████████| 50/50 [00:01<00:00, 33.61it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 84.20it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 90.40it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.10it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 84.01it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 36.25it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 78.34it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 91.42it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 83.64it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 86.10it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 35.60it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 86.17it/s] \n", "100%|██████████| 50/50 [00:00<00:00, 80.29it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.06it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.55it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 33.96it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 89.78it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 79.38it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 87.38it/s]\n", "100%|██████████| 50/50 [00:00<00:00, 92.00it/s]\n", "100%|██████████| 50/50 [00:01<00:00, 34.53it/s]\n" ] }, { "data": { "text/html": [ "\n", "

Run history:


reward▄▄▃▃▃▃▃▃▃▃▃▃▃▃▂▂▂▂▁▁▂▇▇█████████████████
step▁▁▁▁▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███

Run summary:


reward1.08068
step399

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ " View run golden-shape-6 at: https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR/runs/op8l42at
View project at: https://wandb.ai/masa136/RLfinetuning_Diffusion_Bioseq-tutorials_UTR
Synced 6 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "Find logs at: ./wandb/run-20240718_000246-op8l42at/logs" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "The new W&B backend becomes opt-out in version 0.18.0; try it out with `wandb.require(\"core\")`! See https://wandb.me/wandb-core for more information." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from src.model import ddsm_fine_tune as fine_tune\n", "\n", "import os\n", "save_name = \"./log_finetune/\"\n", "isExist = os.path.exists(save_name)\n", "if not isExist:\n", " os.makedirs(save_name)\n", "\n", "loss_curves, eval_curves = fine_tune.fine_tuning(score_model, new_reward_model, [new_reward_model], original_model,\n", " learning_rate =1e-3, num_epoch = 400, length = 50, num_steps = 50, accmu = 4, gradient_start = 45, \\\n", " batch_size = 128, save_name = save_name, entropy_coff = 0.0, device= DEVICE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Evaluation" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ScoreNet(\n", " (embed): Sequential(\n", " (0): GaussianFourierProjection()\n", " (1): Linear(in_features=256, out_features=256, bias=True)\n", " )\n", " (linear): Conv1d(4, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (blocks): ModuleList(\n", " (0-1): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (2): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (3): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (4): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " (5-6): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (7): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (8): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (9): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " (10-11): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (12): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (13): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (14): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " (15-16): 2 x Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(4,))\n", " (17): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(16,), dilation=(4,))\n", " (18): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(64,), dilation=(16,))\n", " (19): Conv1d(256, 256, kernel_size=(9,), stride=(1,), padding=(256,), dilation=(64,))\n", " )\n", " (denses): ModuleList(\n", " (0-19): 20 x Dense(\n", " (dense): Linear(in_features=256, out_features=256, bias=True)\n", " )\n", " )\n", " (norms): ModuleList(\n", " (0-19): 20 x GroupNorm(1, 256, eps=1e-05, affine=True)\n", " )\n", " (relu): ReLU()\n", " (softplus): Softplus(beta=1.0, threshold=20.0)\n", " (final): Sequential(\n", " (0): Conv1d(256, 256, kernel_size=(1,), stride=(1,))\n", " (1): GELU(approximate='none')\n", " (2): Conv1d(256, 4, kernel_size=(1,), stride=(1,))\n", " )\n", ")" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#### Load Fine-Tuned Model \n", "time_dependent_weights = torch.tensor(np.load(config.time_schedule)['x'])\n", "score_finetuned_model = modeld.ScoreNet(time_dependent_weights=torch.sqrt(time_dependent_weights)) \n", "score_finetuned_model.load_state_dict(torch.load(\"./log_finetune/_399.pth\")) # Change here\n", "score_finetuned_model.cuda(device = DEVICE) \n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 100/100 [00:01<00:00, 88.97it/s]\n", "100%|██████████| 100/100 [00:00<00:00, 102.06it/s]\n", "100%|██████████| 100/100 [00:01<00:00, 90.17it/s]\n", "100%|██████████| 100/100 [00:00<00:00, 104.16it/s]\n", "100%|██████████| 100/100 [00:01<00:00, 87.68it/s]\n" ] } ], "source": [ "### Get Samples from Fine-tuned Models\n", "\n", "sampler = ddsm.Euler_Maruyama_sampler\n", "\n", "\n", "allsamples_original = []\n", "for t in range(5):\n", " samples=[]\n", " score_finetuned_model.eval()\n", " samples.append(sampler(score_finetuned_model,\n", " (50,4),\n", " batch_size=128,\n", " new_class = None,\n", " class_number = 1,\n", " strength = 10, \n", " max_time= 4.0,\n", " min_time= 1.0/400,\n", " time_dilation=1,\n", " num_steps=100, \n", " eps=1e-5,\n", " speed_balanced= True,\n", " device= DEVICE, \n", " ).cpu().detach().numpy())\n", " allsamples_original.append(samples)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "allsamples = np.concatenate(allsamples_original, axis=1)\n", "allsamples = allsamples[0,:,:,:]\n", "\n", "generated_samples = []\n", "data_loader = torch.utils.data.DataLoader(allsamples.astype(\"float32\"), batch_size = 128 , num_workers=0)\n", "for batch in data_loader:\n", " batch = (batch > 0.5) * torch.ones_like(batch)\n", " batch = torch.permute(batch, (0, 2, 1)).to(DEVICE)\n", " generated_samples.append(model(batch).detach().cpu() ) \n", "\n", "generated_samples = np.concatenate(generated_samples)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 100/100 [00:01<00:00, 97.55it/s]\n", "100%|██████████| 100/100 [00:01<00:00, 88.96it/s]\n", " 54%|█████▍ | 54/100 [00:00<00:00, 87.38it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 100/100 [00:01<00:00, 85.72it/s]\n", "100%|██████████| 100/100 [00:01<00:00, 84.28it/s]\n", "100%|██████████| 100/100 [00:01<00:00, 86.81it/s]\n" ] } ], "source": [ "### Get Samples from Pre-Trained Models \n", "\n", "sampler = ddsm.Euler_Maruyama_sampler\n", "\n", "allsamples_original = []\n", "for t in range(5):\n", " samples=[]\n", " score_model.eval()\n", " samples.append(sampler(original_model,\n", " (50,4),\n", " batch_size=128,\n", " new_class = None,\n", " class_number = 1,\n", " strength = 10, \n", " max_time= 4.0,\n", " min_time= 1.0/400,\n", " time_dilation=1,\n", " num_steps=100, \n", " eps=1e-5,\n", " speed_balanced= True,\n", " device= DEVICE, \n", " ).cpu().detach().numpy())\n", " allsamples_original.append(samples)\n", "\n", "allsamples = np.concatenate(allsamples_original, axis=1)\n", "allsamples = allsamples[0,:,:,:]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "generated_samples_before = []\n", "data_loader = torch.utils.data.DataLoader(allsamples.astype(\"float32\"), batch_size = 128 , num_workers=0)\n", "for batch in data_loader:\n", " batch = (batch > 0.5) * torch.ones_like(batch)\n", " batch = torch.permute(batch, (0, 2, 1)).to(DEVICE)\n", " generated_samples_before.append( model(batch).detach().cpu() ) \n", "\n", "generated_samples_before = np.concatenate(generated_samples_before)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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t1dycrIOHz5c6vJffvml7rzzTo0aNUpff/21+vfvr/79++ubb76p4soBAKg8wzRNM9BFVFS3bt3UtWtXvfLKK5Ikt9uthIQEjR07VuPHjy+x/ODBg3Xy5EktWbLEM++qq65Shw4d9MYbb5S6jYKCAhUUFHgeO51OJSQkKDs7W1FRURe8D8XFxUpKStKJzsOlkKD6joSLjdutyK1ztGLFCtnt9kBXA6AUQZMShYWF2rp1q5KSkjzzQkJClJSUpPXr15e6zvr1672Wl6Tk5OQyl5ekyZMnKzo62jMlJCT4ZgcAAKikoAnpo0ePyuVyKTY21mt+bGyssrKySl0nKyurUstL0oQJE5Sdne2ZDh48eOHFAwBwHujjOktYWJjCwsICXQYAAMHTkq5Xr55sNpsOHTrkNf/QoUOKi4srdZ24uLhKLQ8AgJUETUiHhoaqc+fOWrlypWee2+3WypUr1b1791LX6d69u9fykrR8+fIylwcAwEqCqrt73LhxGjZsmLp06aIrr7xS06dP18mTJzVixAhJ0tChQ3XppZdq8uTJkqSHHnpIPXr00NSpU9WnTx+999572rJli956661A7gYAABUSVCE9ePBgHTlyRBMnTlRWVpY6dOig1NRUz+CwjIwMhZxxWlNiYqLmz5+vJ554Qn/5y1/UokULLV68WJdffnmgdgEAgAoLqvOkA8HpdCo6OprzpHHx4TxpwPJICQAALIqQBgDAoghpAAAsipAGAMCiCGkAACyKkAYAwKIIaQAALIqQBgDAoghpAAAsipAGAMCiCGkAACyKkAYAwKIIaQAALIqQBgDAoghpAAAsipAGAMCiCGkAACyKkAYAwKIIaQAALIqQBgDAoghpAAAsipAGAMCiCGkAACyq0iH91FNP6YcffvBHLQAA4AyVDumPPvpIzZo10w033KD58+eroKDAH3UBAFDtVTqk09LStHnzZv3mN7/RQw89pLi4OI0ZM0abN2/2R30AAFRb53VMumPHjnrppZf0888/a+bMmfrxxx919dVX64orrtCLL76o7OxsX9cJAEC1c0EDx0zTVFFRkQoLC2Wapi655BK98sorSkhI0MKFC31VIwAA1dJ5hfTWrVv1wAMPKD4+Xo888og6duyonTt36j//+Y/27NmjSZMm6cEHH/R1rQAAVCuVDul27drpqquu0v79+zVz5kwdPHhQ/+///T81b97cs8ydd96pI0eO+LRQAACqG3tlVxg0aJBGjhypSy+9tMxl6tWrJ7fbfUGFAQBQ3VW6JX362PPZ8vLy9Mwzz/ikKAAAcB4hnZKSopycnBLzc3NzlZKS4pOiAADAebakDcMoMX/btm2qU6eOT4oCAACVOCZ9ySWXyDAMGYahli1begW1y+VSTk6O7r33Xr8UCQBAdVThkJ4+fbpM09TIkSOVkpKi6Ohoz3OhoaFq3Lixunfv7pciAQCojioc0sOGDZMkNWnSRImJiapRo4bfigIAABUMaafTqaioKEmnLgmal5envLy8Upc9vRwAALgwFQrpSy65RJmZmapfv75q165d6sCx0wPKXC6Xz4sEAKA6qlBIf/HFF56R21988UWpIQ0AAHyrQiHdo0cPz889e/b0Vy0AAOAMlT5PukWLFnr66ae1Z88ef9QDAAD+T6VD+r777tPSpUvVunVrde3aVS+++KKysrL8URsAANVapUP6kUce0ebNm7Vz507dcsstevXVV5WQkKCbbrpJc+fO9UeNAABUS+d1P2lJatmypVJSUrR7926tXbtWR44c0YgRI3xZGwAA1Vqlb1V5pk2bNmn+/PlauHChnE6n7rjjDl/VBQBAtVfpkN69e7fmzZunBQsWaP/+/erVq5emTJmiAQMGqFatWv6oEQCAaqnSIX16wNj999+vIUOGKDY21h91AQBQ7VU6pNPT09WiRQt/1AIAAM5wXudJAwAA/6tQSNepU0dHjx6VdOo63nXq1Clz8pdff/1Vd911l6KiolS7dm2NGjVKOTk551ynZ8+enntgn5645zUAIFhUqLt72rRpioyM9PwciGt333XXXcrMzNTy5ctVVFSkESNG6J577tH8+fPPud7o0aP1zDPPeB47HA5/lwoAgE9UKKRP30takoYPH+6vWsq0c+dOpaamavPmzerSpYsk6eWXX9Ytt9yiF154QQ0aNChzXYfDobi4uKoqFQAAn6n0MWmbzabDhw+XmP/LL7/IZrP5pKizrV+/XrVr1/YEtCQlJSUpJCREGzduPOe68+bNU7169XT55ZdrwoQJys3NPefyBQUFcjqdXhMAAIFQ6dHdpmmWOr+goEChoaEXXFBpsrKyVL9+fa95drtdderUOed1w3/3u9+pUaNGatCggbZv367HH39c6enp+ve//13mOpMnT1ZK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raA4Jn22vXv36uWXX9Yf//jHMpfJyspSaGioateu7TU/NjZWWVlZZa43YcIEZWdne6aDBw/6qmxcgO3bt8vlcqlPnz6egJakNm3aqGXLltqyZUsAqwMA/whoSI8fP16GYZxz2rVrl9c6P/30k3r37q077rhDo0eP9nlNYWFhioqK8poQeCdPnlRYWJgiIyNLPFevXj2dPHkyAFUBgH8FtLv70Ucf1fDhw8+5TNOmTT0///zzz7r++uuVmJiot95665zrxcXFqbCwUMePH/dqTR86dEhxcXEXUjYCID4+Xnl5ecrIyFDDhg09891ut3bv3q3LLrssgNUBgH8ENKRjYmIUExNToWV/+uknXX/99ercubNmz57t1eVZms6dO6tGjRpauXKlBg4cKElKT09XRkaGunfvfsG1o2q1bt1aMTExWrBgge688041bNhQJ06c0LJly3T06FENGTIk0CUCgM8Fxejun376ST179lSjRo30zjvveI3iPd0q/umnn3TDDTdo7ty5ngFEY8aM0bJlyzRnzhxFRUVp7NixkqQvv/yywtt2Op2Kjo5mdLcFHD16VDNnztSRI0fkcDiUn5+vkJAQDRw4UF27dg10eQDgc0Exunv58uXau3ev9u7dW6Jb8/R3jKKiIqWnpys3N9fz3LRp0zx/xAsKCpScnKzXXnutSmuH79SrV09/+tOftGvXLmVmZqpmzZq64oor5HA4Al0aAPhFULSkA4mWNAAgUILyFCwAAKoDQhoAAIsipAEAsChCGgAAiyKkAQCwKEIaAACLIqQBALAoQhoAAIsipAEAsChCGgAAiyKkAQCwKEIaAACLIqQBALCooLhVZSCdvkmY0+kMcCUAgItNZGSkDMMo83lCuhwnTpyQJCUkJAS4EgDAxaa82yBzP+lyuN1u/fzzz+V+20HVcjqdSkhI0MGDB7nPN3AOfFasjZb0BQoJCdFll10W6DJQhqioKP7wABXAZyU4MXAMAACLIqQBALAoQhpBKSwsTE899ZTCwsICXQpgaXxWghsDxwAAsCha0gAAWBQhDQCARRHSAABYFCENj6efflqxsbEyDEOLFy8OdDkePXv21MMPPxzoMs7bgQMHZBiG0tLSAl0KzoNpmrrnnntUp04dS/w/Nm7cWNOnTw9oDRdi9erVMgxDx48fD3QpwcFEUBs2bJgpyTPVqVPHTE5ONrdt21ap1/nuu+9MSeaiRYvMzMxMMz8/308Vl+7s/Tg97dmzx/zll19Mp9Ppl+2uWrWq1O2eOa1ateqCtlFcXGxmZmaaRUVFvikaPvfll1+aISEh5i233FLiuWXLlpk1atQw161b5/l/PP1Z8ZcePXqU+l4sKioyDx8+bJ48edIv2509e3a5n4f9+/df0DYKCgrMzMxM0+12+6boixwt6YtA7969lZmZqczMTK1cuVJ2u1233nprpV5j3759kqR+/fopLi7uvE/XKCoqOq/1JO/9OD01adJEderUUWRk5Hm/7rkkJiZ6bW/QoEEl6khMTLygbdhsNsXFxclu5wJ/VjVz5kyNHTtWa9as0c8//+z13L59+xQfH6/ExESf/z+e6/MyevToEp8Hu92umJgYORwOn9VwpsGDB3ttr3v37iXquND7GISGhiouLo7LLFcQIX0RCAsLU1xcnOLi4tShQweNHz9eBw8e1JEjRzzLHDx4UIMGDVLt2rVVp04d9evXTwcOHJB0qpu7b9++kk5dBvX0h8ftduuZZ57RZZddprCwMHXo0EGpqame1zzdjbtw4UL16NFD4eHhmjdvniRpxowZatOmjcLDw9W6dWu99tprldqP05PNZivR3d24cWM9//zzGjlypCIjI9WwYUO99dZbXq91rv090+k/GKeniIgIrzqGDBmiP//5z17r9O/fX8OHD69wPWd3d5/u7lu5cqW6dOkih8OhxMREpaene23nueeeU/369RUZGam7775b48ePV4cOHcr9PaJycnJytHDhQo0ZM0Z9+vTRnDlzPM8NHz5cY8eOVUZGhgzDUOPGjdW4cWNJ0u233+6Zd9pHH32kTp06KTw8XE2bNlVKSoqKi4s9zxuGoddff1233XabatasqUmTJpVZl8PhKPF5kEp2dxuGoRkzZuj222+Xw+FQixYt9PHHH3u91jfffKObb75ZtWrVUmxsrP7whz/o6NGjJbYZERHhtb3Q0FCvOq666iq9/PLLXut06NBBTz/9dIXrObu7e86cOapdu7Y+++wztWnTRrVq1fJ8UT6tuLhYDz74oGrXrq26devq8ccf17Bhw9S/f/8yf38XC0L6IpOTk6N//vOfat68uerWrSvp1Lf15ORkRUZGau3atVq3bp3ng1BYWKjHHntMs2fPliTPt2VJevHFFzV16lS98MIL2r59u5KTk3Xbbbdpz549XtscP368HnroIe3cuVPJycmaN2+eJk6cqEmTJmnnzp16/vnn9eSTT+qdd97x2X5OnTpVXbp00ddff6377rtPY8aM8YRcefvrD+eqpyx//etfNXXqVG3ZskV2u10jR470PDdv3jxNmjRJU6ZM0datW9WwYUO9/vrrfqm9unv//ffVunVrtWrVSr///e81a9Yszy1qX3zxRc8X1czMTG3evFmbN2+WJM2ePdszT5LWrl2roUOH6qGHHtJ3332nN998U3PmzCkRxE8//bRuv/127dixw+v//EKkpKRo0KBB2r59u2655Rbddddd+vXXXyVJx48fV69evdSxY0dt2bJFqampOnTokAYNGuSTbVe2ntLk5ubqhRde0Lvvvqs1a9YoIyNDjz32mOf5KVOmaN68eZo9e7bWrVsnp9NpqXEzfhXo/nZcmGHDhpk2m82sWbOmWbNmTVOSGR8fb27dutWzzLvvvmu2atXK6xhQQUGBGRERYX722WemaZrmokWLzLPfDg0aNDAnTZrkNa9r167mfffdZ5qmae7fv9+UZE6fPt1rmWbNmpnz58/3mvfss8+a3bt3r/B+1KxZ0/ztb39rmuap43MPPfSQZ9lGjRqZv//97z2P3W63Wb9+ffP111+v8P6eq45+/fp5Hp+9bdM0zX79+pnDhg2rcD2nf09ff/21aZr/Ow6+YsUKzzpLly41JZl5eXmmaZpmt27dzPvvv99ru1dffbXZvn37c9aPyktMTPS8h4uKisx69ep5jUOYNm2a2ahRI691VMox6RtuuMF8/vnnvea9++67Znx8vNd6Dz/8cLk19ejRw6xRo4bX52HcuHGmaZ56v02bNs3rNZ944gnP45ycHFOS+emnn5qmeeqzd9NNN3m9/sGDB01JZnp6erl1nP3ZO3Pbpmma7du3N5966qkK13P6/X/s2DHTNP93HHzv3r2edV599VUzNjbW8zg2Ntb8+9//7nlcXFxsNmzY0OuzerHiINlF4Prrr/e0so4dO6bXXntNN998szZt2qRGjRpp27Zt2rt3b4njuvn5+Z5j0WdzOp36+eefdfXVV3vNv/rqq7Vt2zaveV26dPH8fPLkSe3bt0+jRo3S6NGjPfOLi4sVHR1d4f2QpJo1a5a57BVXXOH52TAMxcXF6fDhw5JU7v6uXbtWN998s2f+m2++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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "plt.figure(figsize=(80, 10))\n", "\n", "compare = np.concatenate( (generated_samples_before[:,0], generated_samples[:,0] ), axis= 0)\n", "\n", "type1 = ['Before Fine-Tuning' for i in range(len(generated_samples_before[:,0] ))]\n", "type3 = ['After Fine-Tuning ' for i in range(len(generated_samples[:,0]))]\n", "\n", "type = type1 + type3\n", "data_dict = {'type': type, 'Activity': compare[:,0] }\n", "plot_data = pd.DataFrame(data_dict)\n", "fig = sns.catplot(data=plot_data, x = 'type', y = 'Activity', hue=\"type\", kind=\"boxen\" )\n", "sns.set_context(\"paper\", rc={\"figure.figsize\": (80, 10)})\n", "#fig.savefig(\"../../media/RNA_output_high_finetune.png\")\n", "\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "GRELU1", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 2 }