diff --git a/Makefile b/Makefile index 8021fd3..01e62d0 100644 --- a/Makefile +++ b/Makefile @@ -68,15 +68,38 @@ clean_data: requirements data: requirements $(PYTHON_INTERPRETER) scripts/process_data.py -## Train model +## Process external data for pretrain (external -> processed) +.PHONY: data_pretrain +data_pretrain: requirements + $(PYTHON_INTERPRETER) scripts/process_external.py + +# MPNN 支持:使用 USE_MPNN=1 启用 MPNN encoder +# 例如:make pretrain USE_MPNN=1 +MPNN_FLAG = $(if $(USE_MPNN),--use-mpnn,) + +# Backbone 冻结:使用 FREEZE_BACKBONE=1 冻结 backbone,只训练 heads +# 例如:make finetune FREEZE_BACKBONE=1 +FREEZE_FLAG = $(if $(FREEZE_BACKBONE),--freeze-backbone,) + +## Pretrain on external data (delivery only) +.PHONY: pretrain +pretrain: requirements + $(PYTHON_INTERPRETER) -m lnp_ml.modeling.pretrain $(MPNN_FLAG) + +## Train model (multi-task, from scratch) .PHONY: train train: requirements - $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train + $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train $(MPNN_FLAG) + +## Finetune from pretrained checkpoint (use FREEZE_BACKBONE=1 to freeze backbone) +.PHONY: finetune +finetune: requirements + $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train --init-from-pretrain models/pretrain_delivery.pt $(FREEZE_FLAG) $(MPNN_FLAG) ## Train with hyperparameter tuning .PHONY: tune tune: requirements - $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train --tune + $(PYTHON_INTERPRETER) -m lnp_ml.modeling.train --tune $(MPNN_FLAG) ## Run predictions .PHONY: predict diff --git a/README.md b/README.md index 9ae6413..266f176 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,106 @@ -A short description of the project. +LNP(脂质纳米颗粒)药物递送性能预测模型。 + +## 快速开始 + +### 1. 安装环境 + +```bash +pixi install +pixi shell +``` + +### 2. 数据处理 + +```bash +# 清洗原始数据 (raw -> interim) +make clean_data + +# 处理内部数据集 (interim -> processed) +make data + +# 处理外部预训练数据 (external -> processed) +make data_pretrain +``` + +### 3. 训练模型 + +**方式 A:直接训练(从零开始)** + +```bash +make train +``` + +**方式 B:预训练 + 微调(推荐)** + +利用外部 LiON 数据集(约 9000 条)进行预训练,再在内部数据上微调: + +```bash +# Step 1: 处理外部数据 +make data_pretrain + +# Step 2: 在外部数据上预训练 backbone + delivery head +make pretrain + +# Step 3: 加载预训练权重,在内部数据上多任务微调 +make finetune +``` + +**方式 C:超参数调优** + +```bash +make tune +``` + +### 4. 测试与预测 + +```bash +# 在测试集上评估 +make test + +# 生成预测结果 +make predict +``` + +## 训练流程详解 + +### 预训练 (Pretrain) + +在外部 LiON 数据上,仅训练 `quantified_delivery` 任务: + +```bash +# 1. 先处理外部数据 +python scripts/process_external.py + +# 2. 预训练 +python -m lnp_ml.modeling.pretrain \ + --train-path data/processed/train_pretrain.parquet \ + --val-path data/processed/val_pretrain.parquet \ + --epochs 50 \ + --lr 1e-4 +``` + +产出: +- `data/processed/train_pretrain.parquet`: 处理后的训练数据 +- `data/processed/val_pretrain.parquet`: 处理后的验证数据 +- `models/pretrain_delivery.pt`: backbone + delivery head 权重 +- `models/pretrain_history.json`: 训练历史 + +### 微调 (Finetune) + +加载预训练权重,在内部多任务数据上训练: + +```bash +python -m lnp_ml.modeling.train \ + --init-from-pretrain models/pretrain_delivery.pt \ + --load-delivery-head # 可选:是否加载 delivery head 权重 +``` + +产出: +- `models/model.pt`: 完整模型权重 +- `models/history.json`: 训练历史 ## Project Organization diff --git a/lnp_ml/dataset.py b/lnp_ml/dataset.py index bb09e81..2f39943 100644 --- a/lnp_ml/dataset.py +++ b/lnp_ml/dataset.py @@ -346,3 +346,185 @@ def load_dataset( LNPDataset(val_df, config), LNPDataset(test_df, config), ) + + +# ============ 外部数据(仅 delivery)处理 ============ + +# 外部数据中 Value_name 的值映射(空格 -> 下划线) +EXTERNAL_VALUE_NAME_MAP = { + "log luminescence": "log_luminescence", + "Luminescence": "luminescence", + "FFL silencing": "FFL_silencing", + "Peptide abundance": "Peptide_abundance", + "hEPO": "hEPO", + "FVII silencing": "FVII_silencing", + "GFP delivery": "GFP_delivery", + "Discretized luminescence": "Discretized_luminescence", +} + +# 外部数据中 Mix_type 的值映射 +EXTERNAL_MIX_TYPE_MAP = { + "Hand": "Pipetting", # 外部数据用 "Hand" 表示 "Pipetting" + "Microfluidic": "Microfluidic", + "Pipetting": "Pipetting", +} + + +def process_external_dataframe(df: pd.DataFrame) -> pd.DataFrame: + """ + 处理外部 LiON 数据的 DataFrame,对齐到模型所需的列格式。 + + 与 process_dataframe 类似,但针对外部数据的列名差异做适配: + - Value_name 值中的空格需要转为下划线 + - Mix_type 中 "Hand" 需要映射为 "Pipetting" + """ + df = df.copy() + + # 1. 预处理:映射 Value_name 和 Mix_type 的值 + if "Value_name" in df.columns: + df["Value_name"] = df["Value_name"].map( + lambda x: EXTERNAL_VALUE_NAME_MAP.get(x, x) if pd.notna(x) else x + ) + + if "Mix_type" in df.columns: + df["Mix_type"] = df["Mix_type"].map( + lambda x: EXTERNAL_MIX_TYPE_MAP.get(x, x) if pd.notna(x) else x + ) + + # 2. 处理 phys token 的 one-hot 列(如果不存在则从原始列生成) + for col, values in PHYS_ONEHOT_SPECS.items(): + for v in values: + onehot_col = f"{col}_{v}" + if onehot_col not in df.columns: + if col in df.columns: + df[onehot_col] = (df[col] == v).astype(float) + else: + df[onehot_col] = 0.0 + + # 3. 处理 exp token 的 one-hot 列 + # 外部数据部分列已存在(如 Model_type_*, Delivery_target_* 等),但可能缺失某些类别 + for col, values in EXP_ONEHOT_SPECS.items(): + for v in values: + onehot_col = f"{col}_{v}" + if onehot_col not in df.columns: + if col in df.columns: + df[onehot_col] = (df[col] == v).astype(float) + else: + df[onehot_col] = 0.0 + else: + # 确保是 float 类型 + df[onehot_col] = df[onehot_col].fillna(0.0).astype(float) + + # 4. 确保 comp 列存在且为 float + for col in COMP_COLS: + if col in df.columns: + df[col] = pd.to_numeric(df[col], errors="coerce").fillna(0.0) + else: + df[col] = 0.0 + + # 5. 确保 help 列存在 + for col in HELP_COLS: + if col not in df.columns: + df[col] = 0.0 + else: + df[col] = df[col].fillna(0.0).astype(float) + + # 6. 处理 quantified_delivery + if "quantified_delivery" in df.columns: + df["quantified_delivery"] = pd.to_numeric(df["quantified_delivery"], errors="coerce") + + return df + + +class ExternalDeliveryDataset(Dataset): + """ + 外部 LiON 数据集,仅用于 delivery 预训练。 + + 返回: + - smiles: str + - tabular: Dict[str, Tensor] with keys "comp", "phys", "help", "exp" + - targets: Dict[str, Tensor] with key "delivery" + - mask: Dict[str, Tensor] with key "delivery" + """ + + def __init__( + self, + df: pd.DataFrame, + config: Optional[LNPDatasetConfig] = None, + ): + self.config = config or LNPDatasetConfig() + self.df = process_external_dataframe(df) + + # 提取数据 + self.smiles = self.df[SMILES_COL].tolist() + + # Tabular features + self.comp = self.df[self.config.comp_cols].values.astype(np.float32) + self.phys = self.df[self.config.phys_cols].values.astype(np.float32) + self.help = self.df[self.config.help_cols].values.astype(np.float32) + self.exp = self.df[self.config.exp_cols].values.astype(np.float32) + + # 只有 delivery 作为 target + self.delivery = self.df["quantified_delivery"].values.astype(np.float32) if "quantified_delivery" in self.df.columns else None + + def __len__(self) -> int: + return len(self.smiles) + + def __getitem__(self, idx: int) -> Dict: + item = { + "smiles": self.smiles[idx], + "tabular": { + "comp": torch.from_numpy(self.comp[idx]), + "phys": torch.from_numpy(self.phys[idx]), + "help": torch.from_numpy(self.help[idx]), + "exp": torch.from_numpy(self.exp[idx]), + }, + "targets": {}, + "mask": {}, + } + + # delivery target and mask + if self.delivery is not None: + item["targets"]["delivery"] = torch.tensor(self.delivery[idx], dtype=torch.float32) + item["mask"]["delivery"] = torch.tensor(not np.isnan(self.delivery[idx]), dtype=torch.bool) + + return item + + +def load_external_dataset( + path: Path, + train_ratio: float = 0.9, + seed: int = 42, +) -> Tuple[ExternalDeliveryDataset, ExternalDeliveryDataset]: + """ + 加载外部 LiON 数据集并划分为 train/val。 + + Args: + path: CSV 文件路径 + train_ratio: 训练集比例(剩余为验证集) + seed: 随机种子 + + Returns: + (train_dataset, val_dataset) + """ + df = pd.read_csv(path) + + # 过滤掉 quantified_delivery 为空的行 + if "quantified_delivery" in df.columns: + df = df[df["quantified_delivery"].notna()].reset_index(drop=True) + + # 随机打乱 + df = df.sample(frac=1, random_state=seed).reset_index(drop=True) + + n = len(df) + n_train = int(n * train_ratio) + + train_df = df.iloc[:n_train] + val_df = df.iloc[n_train:] + + config = LNPDatasetConfig() + + return ( + ExternalDeliveryDataset(train_df, config), + ExternalDeliveryDataset(val_df, config), + ) diff --git a/lnp_ml/featurization/smiles.py b/lnp_ml/featurization/smiles.py index 64a8cef..434c08d 100644 --- a/lnp_ml/featurization/smiles.py +++ b/lnp_ml/featurization/smiles.py @@ -43,7 +43,13 @@ class RDKitFeaturizer: return np.array(MACCSkeys.GenMACCSKeys(mol).ToList(), dtype=np.float32) def _encode_desc(self, mol: Chem.Mol) -> np.ndarray: - return np.array(list(Descriptors.CalcMolDescriptors(mol).values()), dtype=np.float32) + # 使用 float64 计算,然后 clip 到 float32 范围,避免 overflow + desc_values = list(Descriptors.CalcMolDescriptors(mol).values()) + arr = np.array(desc_values, dtype=np.float64) + # 替换 inf/nan,clip 到 float32 范围 + arr = np.nan_to_num(arr, nan=0.0, posinf=1e10, neginf=-1e10) + arr = np.clip(arr, -1e10, 1e10) + return arr.astype(np.float32) def _encode_one(self, smiles: str) -> Dict[str, np.ndarray]: mol = Chem.MolFromSmiles(smiles) diff --git a/lnp_ml/modeling/models.py b/lnp_ml/modeling/models.py index b37d0ea..4cd60a7 100644 --- a/lnp_ml/modeling/models.py +++ b/lnp_ml/modeling/models.py @@ -121,28 +121,16 @@ class LNPModel(nn.Module): dropout=dropout, ) - def forward( + def _encode_and_project( self, smiles: List[str], tabular: Dict[str, torch.Tensor], - ) -> Dict[str, torch.Tensor]: + ) -> torch.Tensor: """ - Args: - smiles: SMILES 字符串列表,长度为 B - tabular: Dict[str, Tensor],包含: - - "comp": [B, 5] 配方比例 - - "phys": [B, 12] 物理参数 - - "help": [B, 4] Helper lipid - - "exp": [B, 32] 实验条件 - + 内部方法:编码 SMILES 和 tabular,返回 stacked tokens。 + Returns: - Dict[str, Tensor]: - - "size": [B, 1] - - "pdi": [B, 4] - - "ee": [B, 3] - - "delivery": [B, 1] - - "biodist": [B, 7] - - "toxic": [B, 2] + stacked: [B, n_tokens, d_model] """ # 1. Encode SMILES rdkit_features = self.rdkit_encoder(smiles) # {"morgan", "maccs", "desc"} @@ -170,23 +158,87 @@ class LNPModel(nn.Module): projected = self.token_projector(all_features) # Dict[str, [B, d_model]] # 4. Stack tokens: [B, n_tokens, d_model] - # 按顺序 stack:Channel A (化学) + Channel B (配方/实验) if self.use_mpnn: token_order = ["mpnn", "morgan", "maccs", "desc", "comp", "phys", "help", "exp"] else: token_order = ["morgan", "maccs", "desc", "comp", "phys", "help", "exp"] stacked = torch.stack([projected[k] for k in token_order], dim=1) + return stacked - # 5. Cross Modal Attention + def forward_backbone( + self, + smiles: List[str], + tabular: Dict[str, torch.Tensor], + ) -> torch.Tensor: + """ + Backbone forward:编码 -> 投影 -> 注意力 -> 融合,不经过任务头。 + + 用于 pretrain 阶段或需要提取特征的场景。 + + Args: + smiles: SMILES 字符串列表,长度为 B + tabular: Dict[str, Tensor] + + Returns: + fused: [B, fusion_dim] 融合后的特征向量 + """ + # 编码 + 投影 + stack + stacked = self._encode_and_project(smiles, tabular) + + # Cross Modal Attention attended = self.cross_attention(stacked) - - # 6. Fusion + + # Fusion fused = self.fusion(attended) + + return fused - # 7. Multi-Task Head + def forward_delivery( + self, + smiles: List[str], + tabular: Dict[str, torch.Tensor], + ) -> torch.Tensor: + """ + 仅预测 delivery(用于 pretrain)。 + + Args: + smiles: SMILES 字符串列表,长度为 B + tabular: Dict[str, Tensor] + + Returns: + delivery: [B, 1] 预测的 delivery 值 + """ + fused = self.forward_backbone(smiles, tabular) + return self.head.delivery_head(fused) + + def forward( + self, + smiles: List[str], + tabular: Dict[str, torch.Tensor], + ) -> Dict[str, torch.Tensor]: + """ + 完整的多任务 forward。 + + Args: + smiles: SMILES 字符串列表,长度为 B + tabular: Dict[str, Tensor],包含: + - "comp": [B, 5] 配方比例 + - "phys": [B, 12] 物理参数 + - "help": [B, 4] Helper lipid + - "exp": [B, 32] 实验条件 + + Returns: + Dict[str, Tensor]: + - "size": [B, 1] + - "pdi": [B, 4] + - "ee": [B, 3] + - "delivery": [B, 1] + - "biodist": [B, 7] + - "toxic": [B, 2] + """ + fused = self.forward_backbone(smiles, tabular) outputs = self.head(fused) - return outputs def clear_cache(self) -> None: @@ -195,6 +247,69 @@ class LNPModel(nn.Module): if self.mpnn_encoder is not None: self.mpnn_encoder.clear_cache() + def get_backbone_state_dict(self) -> Dict[str, torch.Tensor]: + """ + 获取 backbone 部分的 state_dict(不含任务头)。 + + 包含: token_projector, cross_attention, fusion + """ + backbone_keys = [] + for name in self.state_dict().keys(): + if name.startswith(("token_projector.", "cross_attention.", "fusion.")): + backbone_keys.append(name) + + return {k: v for k, v in self.state_dict().items() if k in backbone_keys} + + def get_delivery_head_state_dict(self) -> Dict[str, torch.Tensor]: + """获取 delivery head 的 state_dict""" + return { + k: v for k, v in self.state_dict().items() + if k.startswith("head.delivery_head.") + } + + def load_pretrain_weights( + self, + pretrain_state_dict: Dict[str, torch.Tensor], + load_delivery_head: bool = True, + strict: bool = False, + ) -> None: + """ + 从预训练 checkpoint 加载 backbone 和(可选)delivery head 权重。 + + Args: + pretrain_state_dict: 预训练模型的 state_dict + load_delivery_head: 是否加载 delivery head 权重 + strict: 是否严格匹配(默认 False,允许缺失/多余的键) + """ + # 筛选要加载的参数 + keys_to_load = [] + for name in pretrain_state_dict.keys(): + # Backbone 部分 + if name.startswith(("token_projector.", "cross_attention.", "fusion.")): + keys_to_load.append(name) + # Delivery head(可选) + elif load_delivery_head and name.startswith("head.delivery_head."): + keys_to_load.append(name) + + filtered_state_dict = {k: v for k, v in pretrain_state_dict.items() if k in keys_to_load} + + # 加载权重 + missing, unexpected = [], [] + model_state = self.state_dict() + for k, v in filtered_state_dict.items(): + if k in model_state: + if model_state[k].shape == v.shape: + model_state[k] = v + else: + unexpected.append(f"{k} (shape mismatch: {model_state[k].shape} vs {v.shape})") + else: + unexpected.append(k) + + self.load_state_dict(model_state, strict=False) + + if strict and (missing or unexpected): + raise RuntimeError(f"Missing keys: {missing}, Unexpected keys: {unexpected}") + class LNPModelWithoutMPNN(LNPModel): """不使用 MPNN 的简化版本""" diff --git a/lnp_ml/modeling/predict.py b/lnp_ml/modeling/predict.py index f3df290..2746dc5 100644 --- a/lnp_ml/modeling/predict.py +++ b/lnp_ml/modeling/predict.py @@ -1,7 +1,7 @@ """预测脚本:使用训练好的模型进行推理""" from pathlib import Path -from typing import Dict, List +from typing import Dict, List, Union import pandas as pd import torch @@ -11,25 +11,63 @@ import typer from lnp_ml.config import MODELS_DIR, PROCESSED_DATA_DIR from lnp_ml.dataset import LNPDataset, collate_fn -from lnp_ml.modeling.models import LNPModelWithoutMPNN +from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN app = typer.Typer() +# MPNN ensemble 默认路径 +DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" -def load_model(model_path: Path, device: torch.device) -> LNPModelWithoutMPNN: - """加载训练好的模型""" + +def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: + """自动查找 MPNN ensemble 的 model.pt 文件。""" + model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) + if not model_paths: + raise FileNotFoundError(f"No model.pt files found in {base_dir}") + return [str(p) for p in model_paths] + + +def load_model( + model_path: Path, + device: torch.device, + mpnn_device: str = "cpu", +) -> Union[LNPModel, LNPModelWithoutMPNN]: + """ + 加载训练好的模型。 + + 自动根据 checkpoint 的 config.use_mpnn 选择模型类型。 + """ checkpoint = torch.load(model_path, map_location=device) config = checkpoint["config"] + use_mpnn = config.get("use_mpnn", False) + + if use_mpnn: + # 自动查找 MPNN ensemble + logger.info("Model was trained with MPNN, auto-detecting ensemble...") + ensemble_paths = find_mpnn_ensemble_paths() + logger.info(f"Found {len(ensemble_paths)} MPNN models") + + model = LNPModel( + d_model=config["d_model"], + num_heads=config["num_heads"], + n_attn_layers=config["n_attn_layers"], + fusion_strategy=config["fusion_strategy"], + head_hidden_dim=config["head_hidden_dim"], + dropout=config["dropout"], + mpnn_ensemble_paths=ensemble_paths, + mpnn_device=mpnn_device, + ) + else: + model = LNPModelWithoutMPNN( + d_model=config["d_model"], + num_heads=config["num_heads"], + n_attn_layers=config["n_attn_layers"], + fusion_strategy=config["fusion_strategy"], + head_hidden_dim=config["head_hidden_dim"], + dropout=config["dropout"], + ) - model = LNPModelWithoutMPNN( - d_model=config["d_model"], - num_heads=config["num_heads"], - n_attn_layers=config["n_attn_layers"], - fusion_strategy=config["fusion_strategy"], - head_hidden_dim=config["head_hidden_dim"], - dropout=config["dropout"], - ) model.load_state_dict(checkpoint["model_state_dict"]) model.to(device) model.eval() @@ -43,7 +81,7 @@ def load_model(model_path: Path, device: torch.device) -> LNPModelWithoutMPNN: @torch.no_grad() def predict_batch( - model: LNPModelWithoutMPNN, + model: Union[LNPModel, LNPModelWithoutMPNN], loader: DataLoader, device: torch.device, ) -> Dict[str, List]: diff --git a/lnp_ml/modeling/pretrain.py b/lnp_ml/modeling/pretrain.py new file mode 100644 index 0000000..22dddf1 --- /dev/null +++ b/lnp_ml/modeling/pretrain.py @@ -0,0 +1,361 @@ +"""预训练脚本:在外部 LiON 数据上预训练 backbone + delivery head""" + +import json +from pathlib import Path +from typing import Dict, List, Optional + +import pandas as pd +import torch +import torch.nn as nn +from torch.utils.data import DataLoader +from loguru import logger +from tqdm import tqdm +import typer + +from lnp_ml.config import MODELS_DIR, PROCESSED_DATA_DIR +from lnp_ml.dataset import ExternalDeliveryDataset, collate_fn + +# MPNN ensemble 默认路径 +DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" + + +def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: + """ + 自动查找 MPNN ensemble 的 model.pt 文件。 + + 在 base_dir 下查找所有 cv_*/fold_*/model_*/model.pt 文件。 + """ + model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) + if not model_paths: + raise FileNotFoundError(f"No model.pt files found in {base_dir}") + return [str(p) for p in model_paths] +from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN + + +app = typer.Typer() + + +class EarlyStopping: + """早停机制""" + + def __init__(self, patience: int = 10, min_delta: float = 0.0): + self.patience = patience + self.min_delta = min_delta + self.counter = 0 + self.best_loss = float("inf") + + def __call__(self, val_loss: float) -> bool: + if val_loss < self.best_loss - self.min_delta: + self.best_loss = val_loss + self.counter = 0 + return False + self.counter += 1 + return self.counter >= self.patience + + +def warmup_cache(model: nn.Module, smiles_list: List[str], batch_size: int = 256) -> None: + """ + 预热 RDKit 特征缓存,避免训练时计算阻塞。 + """ + unique_smiles = list(set(smiles_list)) + logger.info(f"Warming up RDKit cache for {len(unique_smiles)} unique SMILES...") + + for i in tqdm(range(0, len(unique_smiles), batch_size), desc="Cache warmup"): + batch = unique_smiles[i:i + batch_size] + model.rdkit_encoder(batch) + + logger.success(f"Cache warmup complete. Cached {len(model.rdkit_encoder._cache)} SMILES.") + + +def train_epoch_delivery( + model: nn.Module, + loader: DataLoader, + optimizer: torch.optim.Optimizer, + device: torch.device, + epoch: int = 0, +) -> Dict[str, float]: + """ + 单个 epoch 的预训练(仅 delivery 任务)。 + """ + model.train() + total_loss = 0.0 + n_samples = 0 + + pbar = tqdm(loader, desc=f"Epoch {epoch+1} [Train]", leave=False) + for batch in pbar: + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + targets = batch["targets"]["delivery"].to(device) + mask = batch["mask"]["delivery"].to(device) + + optimizer.zero_grad() + + # Forward: 只预测 delivery + pred = model.forward_delivery(smiles, tabular) # [B, 1] + pred = pred.squeeze(-1) # [B] + + # 计算损失(仅对有效样本) + if mask.any(): + loss = nn.functional.mse_loss(pred[mask], targets[mask]) + loss.backward() + optimizer.step() + total_loss += loss.item() * mask.sum().item() + n_samples += mask.sum().item() + + pbar.set_postfix({"loss": total_loss / max(n_samples, 1)}) + + avg_loss = total_loss / max(n_samples, 1) + return {"loss": avg_loss, "n_samples": n_samples} + + +@torch.no_grad() +def validate_delivery( + model: nn.Module, + loader: DataLoader, + device: torch.device, +) -> Dict[str, float]: + """ + 验证(仅 delivery 任务)。 + """ + model.eval() + total_loss = 0.0 + n_samples = 0 + + for batch in loader: + smiles = batch["smiles"] + tabular = {k: v.to(device) for k, v in batch["tabular"].items()} + targets = batch["targets"]["delivery"].to(device) + mask = batch["mask"]["delivery"].to(device) + + pred = model.forward_delivery(smiles, tabular).squeeze(-1) + + if mask.any(): + loss = nn.functional.mse_loss(pred[mask], targets[mask]) + total_loss += loss.item() * mask.sum().item() + n_samples += mask.sum().item() + + avg_loss = total_loss / max(n_samples, 1) + return {"loss": avg_loss, "n_samples": n_samples} + + +def pretrain( + train_loader: DataLoader, + val_loader: DataLoader, + model: nn.Module, + device: torch.device, + lr: float = 1e-4, + weight_decay: float = 1e-5, + epochs: int = 50, + patience: int = 10, +) -> dict: + """ + 预训练循环。 + + Returns: + 训练历史和最佳验证损失 + """ + model = model.to(device) + optimizer = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=weight_decay) + scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, mode="min", factor=0.5, patience=5, verbose=True + ) + early_stopping = EarlyStopping(patience=patience) + + history = {"train": [], "val": []} + best_val_loss = float("inf") + best_state = None + + for epoch in range(epochs): + # Train + train_metrics = train_epoch_delivery(model, train_loader, optimizer, device, epoch) + + # Validate + val_metrics = validate_delivery(model, val_loader, device) + + # Log + logger.info( + f"Epoch {epoch + 1}/{epochs} | " + f"Train Loss: {train_metrics['loss']:.4f} | " + f"Val Loss: {val_metrics['loss']:.4f}" + ) + + history["train"].append(train_metrics) + history["val"].append(val_metrics) + + # Learning rate scheduling + scheduler.step(val_metrics["loss"]) + + # Save best model + if val_metrics["loss"] < best_val_loss: + best_val_loss = val_metrics["loss"] + best_state = {k: v.cpu().clone() for k, v in model.state_dict().items()} + logger.info(f" -> New best model (val_loss={best_val_loss:.4f})") + + # Early stopping + if early_stopping(val_metrics["loss"]): + logger.info(f"Early stopping at epoch {epoch + 1}") + break + + # Restore best model + if best_state is not None: + model.load_state_dict(best_state) + + return { + "history": history, + "best_val_loss": best_val_loss, + } + + +@app.command() +def main( + # 数据路径(已处理的 parquet 文件) + train_path: Path = PROCESSED_DATA_DIR / "train_pretrain.parquet", + val_path: Path = PROCESSED_DATA_DIR / "val_pretrain.parquet", + output_dir: Path = MODELS_DIR, + # 模型参数 + d_model: int = 256, + num_heads: int = 8, + n_attn_layers: int = 4, + fusion_strategy: str = "attention", + head_hidden_dim: int = 128, + dropout: float = 0.1, + # MPNN 参数(可选) + use_mpnn: bool = False, # 启用 MPNN,自动从默认路径加载 ensemble + mpnn_checkpoint: Optional[str] = None, + mpnn_ensemble_paths: Optional[str] = None, # 逗号分隔的路径列表 + mpnn_device: str = "cpu", + # 训练参数 + batch_size: int = 64, + lr: float = 1e-4, + weight_decay: float = 1e-5, + epochs: int = 50, + patience: int = 10, + # 设备 + device: str = "cuda" if torch.cuda.is_available() else "cpu", +): + """ + 在外部 LiON 数据上预训练 backbone + delivery head。 + + 需要先运行 `make data_pretrain` 生成 parquet 文件。 + + 使用 --use-mpnn 启用 MPNN encoder(自动从 models/mpnn/all_amine_split_for_LiON 加载)。 + + 产出: + - models/pretrain_delivery.pt: 包含 backbone + delivery head 权重 + - models/pretrain_history.json: 训练历史 + """ + logger.info(f"Using device: {device}") + device_obj = torch.device(device) + + # 加载已处理的 parquet 文件 + logger.info(f"Loading train data from {train_path}") + train_df = pd.read_parquet(train_path) + train_dataset = ExternalDeliveryDataset(train_df) + + logger.info(f"Loading val data from {val_path}") + val_df = pd.read_parquet(val_path) + val_dataset = ExternalDeliveryDataset(val_df) + + logger.info(f"Train samples: {len(train_dataset)}, Val samples: {len(val_dataset)}") + + train_loader = DataLoader( + train_dataset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn + ) + val_loader = DataLoader( + val_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn + ) + + # 解析 MPNN 配置 + # 优先级:mpnn_checkpoint > mpnn_ensemble_paths > use_mpnn(自动查找) + ensemble_paths_list = None + if mpnn_ensemble_paths: + ensemble_paths_list = mpnn_ensemble_paths.split(",") + elif use_mpnn and mpnn_checkpoint is None: + # --use-mpnn 但没有指定具体路径,自动查找 + logger.info(f"Auto-detecting MPNN ensemble from {DEFAULT_MPNN_ENSEMBLE_DIR}") + ensemble_paths_list = find_mpnn_ensemble_paths() + logger.info(f"Found {len(ensemble_paths_list)} MPNN models") + + enable_mpnn = mpnn_checkpoint is not None or ensemble_paths_list is not None + + # 创建模型 + logger.info(f"Creating model (use_mpnn={enable_mpnn})...") + if enable_mpnn: + model = LNPModel( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + mpnn_checkpoint=mpnn_checkpoint, + mpnn_ensemble_paths=ensemble_paths_list, + mpnn_device=mpnn_device, + ) + else: + model = LNPModelWithoutMPNN( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + ) + + n_params = sum(p.numel() for p in model.parameters() if p.requires_grad) + logger.info(f"Model parameters: {n_params:,}") + + # 预热 RDKit 缓存(避免训练时阻塞) + all_smiles = train_df["smiles"].tolist() + val_df["smiles"].tolist() + warmup_cache(model, all_smiles, batch_size=256) + + # 预训练 + logger.info("Starting pretraining on external data (delivery only)...") + result = pretrain( + train_loader=train_loader, + val_loader=val_loader, + model=model, + device=device_obj, + lr=lr, + weight_decay=weight_decay, + epochs=epochs, + patience=patience, + ) + + # 保存预训练 checkpoint + output_dir.mkdir(parents=True, exist_ok=True) + checkpoint_path = output_dir / "pretrain_delivery.pt" + torch.save( + { + "model_state_dict": model.state_dict(), + "backbone_state_dict": model.get_backbone_state_dict(), + "delivery_head_state_dict": model.get_delivery_head_state_dict(), + "config": { + "d_model": d_model, + "num_heads": num_heads, + "n_attn_layers": n_attn_layers, + "fusion_strategy": fusion_strategy, + "head_hidden_dim": head_hidden_dim, + "dropout": dropout, + "use_mpnn": enable_mpnn, + }, + "best_val_loss": result["best_val_loss"], + }, + checkpoint_path, + ) + logger.success(f"Saved pretrain checkpoint to {checkpoint_path}") + + # 保存训练历史 + history_path = output_dir / "pretrain_history.json" + with open(history_path, "w") as f: + json.dump(result["history"], f, indent=2) + logger.success(f"Saved pretrain history to {history_path}") + + logger.success( + f"Pretraining complete! Best val_loss: {result['best_val_loss']:.4f}" + ) + + +if __name__ == "__main__": + app() + diff --git a/lnp_ml/modeling/train.py b/lnp_ml/modeling/train.py index a447993..ec8f7fc 100644 --- a/lnp_ml/modeling/train.py +++ b/lnp_ml/modeling/train.py @@ -2,7 +2,7 @@ import json from pathlib import Path -from typing import Optional +from typing import List, Optional, Union import pandas as pd import torch @@ -12,7 +12,7 @@ import typer from lnp_ml.config import MODELS_DIR, PROCESSED_DATA_DIR from lnp_ml.dataset import LNPDataset, collate_fn -from lnp_ml.modeling.models import LNPModelWithoutMPNN +from lnp_ml.modeling.models import LNPModel, LNPModelWithoutMPNN from lnp_ml.modeling.trainer import ( train_epoch, validate, @@ -20,6 +20,21 @@ from lnp_ml.modeling.trainer import ( LossWeights, ) +# MPNN ensemble 默认路径 +DEFAULT_MPNN_ENSEMBLE_DIR = MODELS_DIR / "mpnn" / "all_amine_split_for_LiON" + + +def find_mpnn_ensemble_paths(base_dir: Path = DEFAULT_MPNN_ENSEMBLE_DIR) -> List[str]: + """ + 自动查找 MPNN ensemble 的 model.pt 文件。 + + 在 base_dir 下查找所有 cv_*/fold_*/model_*/model.pt 文件。 + """ + model_paths = sorted(base_dir.glob("cv_*/fold_*/model_*/model.pt")) + if not model_paths: + raise FileNotFoundError(f"No model.pt files found in {base_dir}") + return [str(p) for p in model_paths] + app = typer.Typer() @@ -31,16 +46,35 @@ def create_model( fusion_strategy: str = "attention", head_hidden_dim: int = 128, dropout: float = 0.1, -) -> LNPModelWithoutMPNN: - """创建模型""" - return LNPModelWithoutMPNN( - d_model=d_model, - num_heads=num_heads, - n_attn_layers=n_attn_layers, - fusion_strategy=fusion_strategy, - head_hidden_dim=head_hidden_dim, - dropout=dropout, - ) + # MPNN 参数(可选) + mpnn_checkpoint: Optional[str] = None, + mpnn_ensemble_paths: Optional[List[str]] = None, + mpnn_device: str = "cpu", +) -> Union[LNPModel, LNPModelWithoutMPNN]: + """创建模型(支持可选的 MPNN encoder)""" + use_mpnn = mpnn_checkpoint is not None or mpnn_ensemble_paths is not None + + if use_mpnn: + return LNPModel( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + mpnn_checkpoint=mpnn_checkpoint, + mpnn_ensemble_paths=mpnn_ensemble_paths, + mpnn_device=mpnn_device, + ) + else: + return LNPModelWithoutMPNN( + d_model=d_model, + num_heads=num_heads, + n_attn_layers=n_attn_layers, + fusion_strategy=fusion_strategy, + head_hidden_dim=head_hidden_dim, + dropout=dropout, + ) def train_model( @@ -191,6 +225,11 @@ def main( fusion_strategy: str = "attention", head_hidden_dim: int = 128, dropout: float = 0.1, + # MPNN 参数(可选) + use_mpnn: bool = False, # 启用 MPNN,自动从默认路径加载 ensemble + mpnn_checkpoint: Optional[str] = None, + mpnn_ensemble_paths: Optional[str] = None, # 逗号分隔的路径列表 + mpnn_device: str = "cpu", # 训练参数 batch_size: int = 32, lr: float = 1e-4, @@ -201,13 +240,20 @@ def main( tune: bool = False, n_trials: int = 20, epochs_per_trial: int = 30, + # 预训练权重加载 + init_from_pretrain: Optional[Path] = None, + load_delivery_head: bool = True, + freeze_backbone: bool = False, # 冻结 backbone,只训练 heads # 设备 device: str = "cuda" if torch.cuda.is_available() else "cpu", ): """ - 训练 LNP 预测模型。 + 训练 LNP 预测模型(多任务 finetune)。 使用 --tune 启用超参数调优。 + 使用 --init-from-pretrain 从预训练 checkpoint 初始化 backbone。 + 使用 --use-mpnn 启用 MPNN encoder(自动从 models/mpnn/all_amine_split_for_LiON 加载)。 + 使用 --freeze-backbone 冻结 backbone,只训练多任务 heads。 """ logger.info(f"Using device: {device}") device = torch.device(device) @@ -258,8 +304,21 @@ def main( lr = best_params["lr"] weight_decay = best_params["weight_decay"] + # 解析 MPNN 配置 + # 优先级:mpnn_checkpoint > mpnn_ensemble_paths > use_mpnn(自动查找) + ensemble_paths_list = None + if mpnn_ensemble_paths: + ensemble_paths_list = mpnn_ensemble_paths.split(",") + elif use_mpnn and mpnn_checkpoint is None: + # --use-mpnn 但没有指定具体路径,自动查找 + logger.info(f"Auto-detecting MPNN ensemble from {DEFAULT_MPNN_ENSEMBLE_DIR}") + ensemble_paths_list = find_mpnn_ensemble_paths() + logger.info(f"Found {len(ensemble_paths_list)} MPNN models") + + enable_mpnn = mpnn_checkpoint is not None or ensemble_paths_list is not None + # 创建模型 - logger.info("Creating model...") + logger.info(f"Creating model (use_mpnn={enable_mpnn})...") model = create_model( d_model=d_model, num_heads=num_heads, @@ -267,11 +326,48 @@ def main( fusion_strategy=fusion_strategy, head_hidden_dim=head_hidden_dim, dropout=dropout, + mpnn_checkpoint=mpnn_checkpoint, + mpnn_ensemble_paths=ensemble_paths_list, + mpnn_device=mpnn_device, ) + # 加载预训练权重(如果指定) + if init_from_pretrain is not None: + logger.info(f"Loading pretrain weights from {init_from_pretrain}") + checkpoint = torch.load(init_from_pretrain, map_location="cpu") + + # 检查配置是否兼容 + pretrain_config = checkpoint.get("config", {}) + if pretrain_config.get("d_model") != d_model: + logger.warning( + f"d_model mismatch: pretrain={pretrain_config.get('d_model')}, " + f"current={d_model}. Skipping pretrain loading." + ) + else: + # 加载 backbone + (可选) delivery head + model.load_pretrain_weights( + pretrain_state_dict=checkpoint["model_state_dict"], + load_delivery_head=load_delivery_head, + strict=False, + ) + logger.success( + f"Loaded pretrain weights (backbone + delivery_head={load_delivery_head})" + ) + + # 冻结 backbone(如果指定) + if freeze_backbone: + logger.info("Freezing backbone (token_projector, cross_attention, fusion)...") + frozen_count = 0 + for name, param in model.named_parameters(): + if name.startswith(("token_projector.", "cross_attention.", "fusion.")): + param.requires_grad = False + frozen_count += 1 + logger.info(f"Frozen {frozen_count} parameter tensors") + # 打印模型信息 - n_params = sum(p.numel() for p in model.parameters() if p.requires_grad) - logger.info(f"Model parameters: {n_params:,}") + n_params_total = sum(p.numel() for p in model.parameters()) + n_params_trainable = sum(p.numel() for p in model.parameters() if p.requires_grad) + logger.info(f"Model parameters: {n_params_total:,} total, {n_params_trainable:,} trainable") # 训练 logger.info("Starting training...") @@ -297,8 +393,10 @@ def main( "fusion_strategy": fusion_strategy, "head_hidden_dim": head_hidden_dim, "dropout": dropout, + "use_mpnn": enable_mpnn, }, "best_val_loss": result["best_val_loss"], + "init_from_pretrain": str(init_from_pretrain) if init_from_pretrain else None, }, model_path) logger.success(f"Saved model to {model_path}") diff --git a/models/history.json b/models/history.json index a7bdd2f..312a5ba 100644 --- a/models/history.json +++ b/models/history.json @@ -1,656 +1,2042 @@ { "train": [ { - "loss": 19.801735162734985, - "loss_size": 14.35811984539032, - "loss_pdi": 1.419530838727951, - "loss_ee": 1.0615579634904861, - "loss_delivery": 1.1513914689421654, - "loss_biodist": 1.238842561841011, - "loss_toxic": 0.5722923278808594 + "loss": 25.9716534614563, + "loss_size": 20.24160861968994, + "loss_pdi": 1.3472331166267395, + "loss_ee": 1.1013503819704056, + "loss_delivery": 1.4049430154263973, + "loss_biodist": 1.2294384688138962, + "loss_toxic": 0.6470795646309853 }, { - "loss": 8.425787031650543, - "loss_size": 3.660134330391884, - "loss_pdi": 1.175126627087593, - "loss_ee": 0.9683727994561195, - "loss_delivery": 1.1206831969320774, - "loss_biodist": 1.0895558297634125, - "loss_toxic": 0.4119141288101673 + "loss": 23.77423596382141, + "loss_size": 18.47769021987915, + "loss_pdi": 1.2455639243125916, + "loss_ee": 1.0423222184181213, + "loss_delivery": 1.296642705798149, + "loss_biodist": 1.16373211145401, + "loss_toxic": 0.5482855997979641 }, { - "loss": 4.890879034996033, - "loss_size": 0.5715616792440414, - "loss_pdi": 0.9125325158238411, - "loss_ee": 0.924556627869606, - "loss_delivery": 1.2105156518518925, - "loss_biodist": 0.9783133715391159, - "loss_toxic": 0.29339898377656937 + "loss": 21.890457153320312, + "loss_size": 16.907308220863342, + "loss_pdi": 1.1504559814929962, + "loss_ee": 0.9951949268579483, + "loss_delivery": 1.2649681903421879, + "loss_biodist": 1.0959244892001152, + "loss_toxic": 0.4766053706407547 }, { - "loss": 4.220313906669617, - "loss_size": 0.24587923847138882, - "loss_pdi": 0.77839545160532, - "loss_ee": 0.910746157169342, - "loss_delivery": 1.1220976933836937, - "loss_biodist": 0.9082718268036842, - "loss_toxic": 0.25492355413734913 + "loss": 19.999611377716064, + "loss_size": 15.311449527740479, + "loss_pdi": 1.0705267116427422, + "loss_ee": 0.9475761577486992, + "loss_delivery": 1.2161596529185772, + "loss_biodist": 1.040858842432499, + "loss_toxic": 0.41304082050919533 }, { - "loss": 3.821678251028061, - "loss_size": 0.22942939028143883, - "loss_pdi": 0.6982513815164566, - "loss_ee": 0.8703903555870056, - "loss_delivery": 0.9583318457007408, - "loss_biodist": 0.8230277448892593, - "loss_toxic": 0.24224759358912706 + "loss": 18.511160850524902, + "loss_size": 14.151495695114136, + "loss_pdi": 0.997661679983139, + "loss_ee": 0.9168402180075645, + "loss_delivery": 1.0985701605677605, + "loss_biodist": 0.9873060286045074, + "loss_toxic": 0.35928767547011375 }, { - "loss": 3.6422846913337708, - "loss_size": 0.2943352358415723, - "loss_pdi": 0.642115443944931, - "loss_ee": 0.834287479519844, - "loss_delivery": 0.9906296711415052, - "loss_biodist": 0.7021987289190292, - "loss_toxic": 0.1787180369719863 + "loss": 16.843316555023193, + "loss_size": 12.564021348953247, + "loss_pdi": 0.9332254827022552, + "loss_ee": 0.8977891877293587, + "loss_delivery": 1.1698411088436842, + "loss_biodist": 0.9497506842017174, + "loss_toxic": 0.3286888003349304 }, { - "loss": 3.2558620870113373, - "loss_size": 0.2535699959844351, - "loss_pdi": 0.6135993227362633, - "loss_ee": 0.7736481726169586, - "loss_delivery": 0.89691730029881, - "loss_biodist": 0.5883788056671619, - "loss_toxic": 0.12974846456199884 + "loss": 15.443416118621826, + "loss_size": 11.327888250350952, + "loss_pdi": 0.8805835843086243, + "loss_ee": 0.8734613284468651, + "loss_delivery": 1.1609287671744823, + "loss_biodist": 0.8936299160122871, + "loss_toxic": 0.30692412704229355 }, { - "loss": 3.095754951238632, - "loss_size": 0.3008947093039751, - "loss_pdi": 0.5887892656028271, - "loss_ee": 0.730943076312542, - "loss_delivery": 0.8772530537098646, - "loss_biodist": 0.5044719725847244, - "loss_toxic": 0.0934028816409409 + "loss": 14.08805501461029, + "loss_size": 10.007415056228638, + "loss_pdi": 0.8400777131319046, + "loss_ee": 0.8545695245265961, + "loss_delivery": 1.2719034925103188, + "loss_biodist": 0.8452144712209702, + "loss_toxic": 0.26887485571205616 }, { - "loss": 2.853863760828972, - "loss_size": 0.24649357236921787, - "loss_pdi": 0.5792484246194363, - "loss_ee": 0.6907523274421692, - "loss_delivery": 0.7996992748230696, - "loss_biodist": 0.4447066970169544, - "loss_toxic": 0.09296349296346307 + "loss": 12.719679474830627, + "loss_size": 8.955224633216858, + "loss_pdi": 0.7929210364818573, + "loss_ee": 0.8508650660514832, + "loss_delivery": 1.0332960579544306, + "loss_biodist": 0.8195833638310432, + "loss_toxic": 0.2677891217172146 }, { - "loss": 2.7370710372924805, - "loss_size": 0.2393215736374259, - "loss_pdi": 0.5310847833752632, - "loss_ee": 0.6698194481432438, - "loss_delivery": 0.8438112968578935, - "loss_biodist": 0.37191740795969963, - "loss_toxic": 0.08111646771430969 + "loss": 11.719684600830078, + "loss_size": 8.014833927154541, + "loss_pdi": 0.7591684088110924, + "loss_ee": 0.8181160017848015, + "loss_delivery": 1.0873776115477085, + "loss_biodist": 0.7861169949173927, + "loss_toxic": 0.25407182052731514 }, { - "loss": 2.5620490461587906, - "loss_size": 0.2313800435513258, - "loss_pdi": 0.5440232343971729, - "loss_ee": 0.6346339136362076, - "loss_delivery": 0.7632925817742944, - "loss_biodist": 0.311477467417717, - "loss_toxic": 0.07724180119112134 + "loss": 10.390779733657837, + "loss_size": 6.543184518814087, + "loss_pdi": 0.7359360381960869, + "loss_ee": 0.8175727277994156, + "loss_delivery": 1.3261936996132135, + "loss_biodist": 0.74173803627491, + "loss_toxic": 0.22615496441721916 }, { - "loss": 2.4396377950906754, - "loss_size": 0.22545795049518347, - "loss_pdi": 0.5102365277707577, - "loss_ee": 0.5724069699645042, - "loss_delivery": 0.7819116842001677, - "loss_biodist": 0.2837779298424721, - "loss_toxic": 0.0658467230387032 + "loss": 9.279924273490906, + "loss_size": 5.779706597328186, + "loss_pdi": 0.7089737802743912, + "loss_ee": 0.8029346913099289, + "loss_delivery": 1.0412847138941288, + "loss_biodist": 0.7369969710707664, + "loss_toxic": 0.21002776641398668 }, { - "loss": 2.285309001803398, - "loss_size": 0.23147230129688978, - "loss_pdi": 0.4668895788490772, - "loss_ee": 0.6054624281823635, - "loss_delivery": 0.6695475745946169, - "loss_biodist": 0.2563781104981899, - "loss_toxic": 0.05555897764861584 + "loss": 8.56308901309967, + "loss_size": 4.867785036563873, + "loss_pdi": 0.6987971663475037, + "loss_ee": 0.7856745272874832, + "loss_delivery": 1.3176121786236763, + "loss_biodist": 0.694796048104763, + "loss_toxic": 0.19842391926795244 }, { - "loss": 2.2476960122585297, - "loss_size": 0.23254966363310814, - "loss_pdi": 0.48378554731607437, - "loss_ee": 0.5625484213232994, - "loss_delivery": 0.6714967219159007, - "loss_biodist": 0.22976274229586124, - "loss_toxic": 0.06755285989493132 + "loss": 7.576077699661255, + "loss_size": 4.09323313832283, + "loss_pdi": 0.6696358025074005, + "loss_ee": 0.7626904547214508, + "loss_delivery": 1.1467845663428307, + "loss_biodist": 0.6884731277823448, + "loss_toxic": 0.2152608297765255 }, { - "loss": 2.075557619333267, - "loss_size": 0.1991214593872428, - "loss_pdi": 0.4666460305452347, - "loss_ee": 0.5353769697248936, - "loss_delivery": 0.5960409259423614, - "loss_biodist": 0.21837125346064568, - "loss_toxic": 0.060001003788784146 + "loss": 6.771063804626465, + "loss_size": 3.47174733877182, + "loss_pdi": 0.6470936611294746, + "loss_ee": 0.7558285966515541, + "loss_delivery": 1.0831638108938932, + "loss_biodist": 0.6334695816040039, + "loss_toxic": 0.17976099345833063 }, { - "loss": 2.5380745232105255, - "loss_size": 0.26692971400916576, - "loss_pdi": 0.46107836067676544, - "loss_ee": 0.5409572347998619, - "loss_delivery": 1.0045308656990528, - "loss_biodist": 0.20893055945634842, - "loss_toxic": 0.05564788053743541 + "loss": 5.920511543750763, + "loss_size": 2.759486570954323, + "loss_pdi": 0.6359409764409065, + "loss_ee": 0.7437839284539223, + "loss_delivery": 0.9403424672782421, + "loss_biodist": 0.6445382535457611, + "loss_toxic": 0.1964192632585764 }, { - "loss": 2.187355950474739, - "loss_size": 0.19620049092918634, - "loss_pdi": 0.4322536773979664, - "loss_ee": 0.5325545407831669, - "loss_delivery": 0.791555093601346, - "loss_biodist": 0.19126823358237743, - "loss_toxic": 0.0435238650534302 + "loss": 5.423723220825195, + "loss_size": 2.331495225429535, + "loss_pdi": 0.6351363807916641, + "loss_ee": 0.7376566380262375, + "loss_delivery": 0.9581479858607054, + "loss_biodist": 0.5950389876961708, + "loss_toxic": 0.16624799743294716 }, { - "loss": 2.0472205132246017, - "loss_size": 0.2132822722196579, - "loss_pdi": 0.4357164613902569, - "loss_ee": 0.4921276159584522, - "loss_delivery": 0.6838537249714136, - "loss_biodist": 0.17821292020380497, - "loss_toxic": 0.04402748285792768 + "loss": 5.267421782016754, + "loss_size": 1.8453679084777832, + "loss_pdi": 0.6130843386054039, + "loss_ee": 0.7249858379364014, + "loss_delivery": 1.3575894925743341, + "loss_biodist": 0.5606166198849678, + "loss_toxic": 0.16577763762325048 }, { - "loss": 1.8377329260110855, - "loss_size": 0.1911225076764822, - "loss_pdi": 0.40041540563106537, - "loss_ee": 0.48244743049144745, - "loss_delivery": 0.5407265722751617, - "loss_biodist": 0.18436198495328426, - "loss_toxic": 0.03865901718381792 + "loss": 4.479124903678894, + "loss_size": 1.4466428607702255, + "loss_pdi": 0.5825827047228813, + "loss_ee": 0.7108604460954666, + "loss_delivery": 1.0510947555303574, + "loss_biodist": 0.5334530249238014, + "loss_toxic": 0.15449106134474277 }, { - "loss": 1.767472356557846, - "loss_size": 0.1669206041842699, - "loss_pdi": 0.41016123816370964, - "loss_ee": 0.48856623098254204, - "loss_delivery": 0.4990109819918871, - "loss_biodist": 0.17120445892214775, - "loss_toxic": 0.03160886780824512 + "loss": 4.296796411275864, + "loss_size": 1.391601286828518, + "loss_pdi": 0.5907623171806335, + "loss_ee": 0.7128616869449615, + "loss_delivery": 0.9416903126984835, + "loss_biodist": 0.5074036121368408, + "loss_toxic": 0.15247714705765247 }, { - "loss": 1.7883769124746323, - "loss_size": 0.18442536424845457, - "loss_pdi": 0.40120166912674904, - "loss_ee": 0.46751197054982185, - "loss_delivery": 0.537370229139924, - "loss_biodist": 0.16241099871695042, - "loss_toxic": 0.03545669896993786 + "loss": 4.6071557104587555, + "loss_size": 1.3102504722774029, + "loss_pdi": 0.5903710909187794, + "loss_ee": 0.6987340599298477, + "loss_delivery": 1.3774405717849731, + "loss_biodist": 0.49313804879784584, + "loss_toxic": 0.13722141925245523 }, { - "loss": 1.7724643051624298, - "loss_size": 0.1618126342073083, - "loss_pdi": 0.40923435613512993, - "loss_ee": 0.4502934068441391, - "loss_delivery": 0.5432828362099826, - "loss_biodist": 0.17081433162093163, - "loss_toxic": 0.03702673775842413 + "loss": 3.9111519753932953, + "loss_size": 1.058611437678337, + "loss_pdi": 0.5584814138710499, + "loss_ee": 0.6937372237443924, + "loss_delivery": 1.0242730379104614, + "loss_biodist": 0.446026936173439, + "loss_toxic": 0.13002192694693804 }, { - "loss": 1.8993548452854156, - "loss_size": 0.15662006475031376, - "loss_pdi": 0.37853332981467247, - "loss_ee": 0.4373016320168972, - "loss_delivery": 0.7414433392696083, - "loss_biodist": 0.15876813046634197, - "loss_toxic": 0.02668837201781571 + "loss": 3.6934784650802612, + "loss_size": 0.9869462251663208, + "loss_pdi": 0.5499657578766346, + "loss_ee": 0.6769986003637314, + "loss_delivery": 0.932591987773776, + "loss_biodist": 0.434326708316803, + "loss_toxic": 0.11264921864494681 }, { - "loss": 1.7090002000331879, - "loss_size": 0.18559002690017223, - "loss_pdi": 0.3948023244738579, - "loss_ee": 0.4514715373516083, - "loss_delivery": 0.5189001243561506, - "loss_biodist": 0.13513169158250093, - "loss_toxic": 0.023104518884792924 + "loss": 3.609632909297943, + "loss_size": 0.9397555366158485, + "loss_pdi": 0.5484890341758728, + "loss_ee": 0.6419399157166481, + "loss_delivery": 0.9404868837445974, + "loss_biodist": 0.4236420728266239, + "loss_toxic": 0.11531943175941706 }, { - "loss": 1.5656199902296066, - "loss_size": 0.1486712908372283, - "loss_pdi": 0.37246324494481087, - "loss_ee": 0.4362662769854069, - "loss_delivery": 0.4543162193149328, - "loss_biodist": 0.13266231305897236, - "loss_toxic": 0.021240679430775344 + "loss": 3.476574957370758, + "loss_size": 0.8621037006378174, + "loss_pdi": 0.5306216962635517, + "loss_ee": 0.6655778735876083, + "loss_delivery": 0.9486417435109615, + "loss_biodist": 0.3750348165631294, + "loss_toxic": 0.09459509095177054 }, { - "loss": 1.6873565018177032, - "loss_size": 0.16270869225263596, - "loss_pdi": 0.3765699379146099, - "loss_ee": 0.4488464966416359, - "loss_delivery": 0.5208693165332079, - "loss_biodist": 0.15251764748245478, - "loss_toxic": 0.025844466988928616 + "loss": 3.2607316374778748, + "loss_size": 0.764001876115799, + "loss_pdi": 0.5195549540221691, + "loss_ee": 0.6295172236859798, + "loss_delivery": 0.8859440544620156, + "loss_biodist": 0.37055982276797295, + "loss_toxic": 0.09115382377058268 }, { - "loss": 1.611741527915001, - "loss_size": 0.1608524639159441, - "loss_pdi": 0.3773089461028576, - "loss_ee": 0.4431660957634449, - "loss_delivery": 0.47964918427169323, - "loss_biodist": 0.13358874432742596, - "loss_toxic": 0.017176096327602863 + "loss": 3.3650560081005096, + "loss_size": 0.6877520456910133, + "loss_pdi": 0.5163812413811684, + "loss_ee": 0.6349174529314041, + "loss_delivery": 1.0614477675408125, + "loss_biodist": 0.3767742030322552, + "loss_toxic": 0.08778328960761428 }, { - "loss": 1.547684259712696, - "loss_size": 0.15734383463859558, - "loss_pdi": 0.3490111008286476, - "loss_ee": 0.4290902689099312, - "loss_delivery": 0.45983999967575073, - "loss_biodist": 0.1339349802583456, - "loss_toxic": 0.01846407217090018 + "loss": 3.1449066549539566, + "loss_size": 0.7033557221293449, + "loss_pdi": 0.5112948007881641, + "loss_ee": 0.6182029843330383, + "loss_delivery": 0.8769390396773815, + "loss_biodist": 0.35101368278265, + "loss_toxic": 0.08410049765370786 }, { - "loss": 1.4728069305419922, - "loss_size": 0.16153435036540031, - "loss_pdi": 0.3516402244567871, - "loss_ee": 0.4158446751534939, - "loss_delivery": 0.3929086276330054, - "loss_biodist": 0.12818495463579893, - "loss_toxic": 0.02269406005507335 + "loss": 3.198059171438217, + "loss_size": 0.738056268543005, + "loss_pdi": 0.5025036409497261, + "loss_ee": 0.6464762836694717, + "loss_delivery": 0.8959850911051035, + "loss_biodist": 0.336670720949769, + "loss_toxic": 0.07836716645397246 }, { - "loss": 1.494736596941948, - "loss_size": 0.13391354773193598, - "loss_pdi": 0.3454095683991909, - "loss_ee": 0.3995618261396885, - "loss_delivery": 0.47225130116567016, - "loss_biodist": 0.12276446260511875, - "loss_toxic": 0.02083588083041832 + "loss": 3.0968509018421173, + "loss_size": 0.6075208149850368, + "loss_pdi": 0.49481675028800964, + "loss_ee": 0.6283772960305214, + "loss_delivery": 0.9538011457771063, + "loss_biodist": 0.33442937210202217, + "loss_toxic": 0.0779055068269372 }, { - "loss": 1.5983823090791702, - "loss_size": 0.15655907429754734, - "loss_pdi": 0.3302378598600626, - "loss_ee": 0.40332265198230743, - "loss_delivery": 0.558618601411581, - "loss_biodist": 0.13051889464259148, - "loss_toxic": 0.019125229271594435 + "loss": 3.0471641421318054, + "loss_size": 0.5784552656114101, + "loss_pdi": 0.5156531557440758, + "loss_ee": 0.6174600012600422, + "loss_delivery": 0.9347921572625637, + "loss_biodist": 0.31574787199497223, + "loss_toxic": 0.0850557005032897 + }, + { + "loss": 3.074565827846527, + "loss_size": 0.6493570990860462, + "loss_pdi": 0.5111677534878254, + "loss_ee": 0.6072432287037373, + "loss_delivery": 0.9208926521241665, + "loss_biodist": 0.30962972342967987, + "loss_toxic": 0.07627540593966842 + }, + { + "loss": 3.1479561775922775, + "loss_size": 0.7691093385219574, + "loss_pdi": 0.5043143332004547, + "loss_ee": 0.6039227098226547, + "loss_delivery": 0.9247475061565638, + "loss_biodist": 0.2875036410987377, + "loss_toxic": 0.05835856357589364 + }, + { + "loss": 3.2086785435676575, + "loss_size": 0.6118294671177864, + "loss_pdi": 0.5001381486654282, + "loss_ee": 0.6337357684969902, + "loss_delivery": 1.0925203282386065, + "loss_biodist": 0.30640872195363045, + "loss_toxic": 0.06404614564962685 + }, + { + "loss": 2.903267800807953, + "loss_size": 0.6084516011178493, + "loss_pdi": 0.5031622871756554, + "loss_ee": 0.6048430800437927, + "loss_delivery": 0.8152581034228206, + "loss_biodist": 0.3017992302775383, + "loss_toxic": 0.06975363730452955 + }, + { + "loss": 2.7227470725774765, + "loss_size": 0.47578552551567554, + "loss_pdi": 0.48987653106451035, + "loss_ee": 0.5831519588828087, + "loss_delivery": 0.8346315119415522, + "loss_biodist": 0.2752541806548834, + "loss_toxic": 0.06404732668306679 + }, + { + "loss": 2.9256694465875626, + "loss_size": 0.5421494208276272, + "loss_pdi": 0.4676680266857147, + "loss_ee": 0.5828219950199127, + "loss_delivery": 1.007380524650216, + "loss_biodist": 0.25513165071606636, + "loss_toxic": 0.0705178261268884 + }, + { + "loss": 2.776222825050354, + "loss_size": 0.560955211520195, + "loss_pdi": 0.5120605081319809, + "loss_ee": 0.5816002264618874, + "loss_delivery": 0.7777703925967216, + "loss_biodist": 0.2862227726727724, + "loss_toxic": 0.05761362751945853 + }, + { + "loss": 2.903283640742302, + "loss_size": 0.598876278847456, + "loss_pdi": 0.48118938133120537, + "loss_ee": 0.6039806753396988, + "loss_delivery": 0.8762990292161703, + "loss_biodist": 0.26536008156836033, + "loss_toxic": 0.07757818652316928 + }, + { + "loss": 2.8232152611017227, + "loss_size": 0.4981044437736273, + "loss_pdi": 0.5083095543086529, + "loss_ee": 0.5776484534144402, + "loss_delivery": 0.9345780871808529, + "loss_biodist": 0.2536482270807028, + "loss_toxic": 0.0509264167631045 + }, + { + "loss": 2.719878375530243, + "loss_size": 0.5266173202544451, + "loss_pdi": 0.4750731997191906, + "loss_ee": 0.5943448096513748, + "loss_delivery": 0.8238696120679379, + "loss_biodist": 0.24152903258800507, + "loss_toxic": 0.05844438471831381 + }, + { + "loss": 2.669362887740135, + "loss_size": 0.41083680652081966, + "loss_pdi": 0.47290581837296486, + "loss_ee": 0.5690933167934418, + "loss_delivery": 0.8954417379572988, + "loss_biodist": 0.26001916266977787, + "loss_toxic": 0.061066087102517486 + }, + { + "loss": 2.7296886146068573, + "loss_size": 0.40873375721275806, + "loss_pdi": 0.5100873447954655, + "loss_ee": 0.5963915809988976, + "loss_delivery": 0.8862678501754999, + "loss_biodist": 0.2582801654934883, + "loss_toxic": 0.06992789637297392 + }, + { + "loss": 2.6801713705062866, + "loss_size": 0.4124011751264334, + "loss_pdi": 0.4926849640905857, + "loss_ee": 0.5796162374317646, + "loss_delivery": 0.8792719375342131, + "loss_biodist": 0.2574870977550745, + "loss_toxic": 0.05870996415615082 + }, + { + "loss": 2.5923274010419846, + "loss_size": 0.43998449202626944, + "loss_pdi": 0.4787449426949024, + "loss_ee": 0.5642235241830349, + "loss_delivery": 0.807167736813426, + "loss_biodist": 0.24508678168058395, + "loss_toxic": 0.05711989430710673 + }, + { + "loss": 2.706703007221222, + "loss_size": 0.48683931678533554, + "loss_pdi": 0.46516377106308937, + "loss_ee": 0.5705448277294636, + "loss_delivery": 0.8720798492431641, + "loss_biodist": 0.23792196623981, + "loss_toxic": 0.07415329676587135 + }, + { + "loss": 2.5786157697439194, + "loss_size": 0.4590853825211525, + "loss_pdi": 0.4839537553489208, + "loss_ee": 0.5635706633329391, + "loss_delivery": 0.7978988699615002, + "loss_biodist": 0.23025565408170223, + "loss_toxic": 0.04385152133181691 + }, + { + "loss": 2.6873574256896973, + "loss_size": 0.4268788732588291, + "loss_pdi": 0.4642701633274555, + "loss_ee": 0.5801760032773018, + "loss_delivery": 0.913929826579988, + "loss_biodist": 0.23901514150202274, + "loss_toxic": 0.06308741425164044 + }, + { + "loss": 2.685258597135544, + "loss_size": 0.5264910068362951, + "loss_pdi": 0.4676165319979191, + "loss_ee": 0.5818453542888165, + "loss_delivery": 0.8150268085300922, + "loss_biodist": 0.22798488661646843, + "loss_toxic": 0.06629409588640556 + }, + { + "loss": 2.52669258415699, + "loss_size": 0.41255798749625683, + "loss_pdi": 0.4563356712460518, + "loss_ee": 0.5704724453389645, + "loss_delivery": 0.8344292026013136, + "loss_biodist": 0.20569896139204502, + "loss_toxic": 0.04719832225237042 + }, + { + "loss": 2.5535005182027817, + "loss_size": 0.381014097481966, + "loss_pdi": 0.4735785350203514, + "loss_ee": 0.5684775337576866, + "loss_delivery": 0.8227455485612154, + "loss_biodist": 0.23827529326081276, + "loss_toxic": 0.06940951908472925 + }, + { + "loss": 2.5589767545461655, + "loss_size": 0.44938809610903263, + "loss_pdi": 0.45997676625847816, + "loss_ee": 0.5761362612247467, + "loss_delivery": 0.80368347838521, + "loss_biodist": 0.21627510525286198, + "loss_toxic": 0.05351710086688399 + }, + { + "loss": 2.4209747910499573, + "loss_size": 0.4209021870046854, + "loss_pdi": 0.4443623758852482, + "loss_ee": 0.5494826473295689, + "loss_delivery": 0.726479004137218, + "loss_biodist": 0.21563152223825455, + "loss_toxic": 0.06411702185869217 + }, + { + "loss": 2.402697578072548, + "loss_size": 0.3580847531557083, + "loss_pdi": 0.4626186229288578, + "loss_ee": 0.5826950781047344, + "loss_delivery": 0.7483663521707058, + "loss_biodist": 0.20891179516911507, + "loss_toxic": 0.04202097177039832 + }, + { + "loss": 2.402700573205948, + "loss_size": 0.42229970917105675, + "loss_pdi": 0.4451366700232029, + "loss_ee": 0.566058874130249, + "loss_delivery": 0.7094440292567015, + "loss_biodist": 0.21921667829155922, + "loss_toxic": 0.04054457793245092 + }, + { + "loss": 2.447406530380249, + "loss_size": 0.39806674513965845, + "loss_pdi": 0.44775110855698586, + "loss_ee": 0.5492517799139023, + "loss_delivery": 0.7928667366504669, + "loss_biodist": 0.21111027523875237, + "loss_toxic": 0.04835996555630118 + }, + { + "loss": 2.4445116221904755, + "loss_size": 0.3879490252584219, + "loss_pdi": 0.4956270530819893, + "loss_ee": 0.5405614376068115, + "loss_delivery": 0.7789672082290053, + "loss_biodist": 0.20555796474218369, + "loss_toxic": 0.03584893117658794 + }, + { + "loss": 2.3815398663282394, + "loss_size": 0.40303290262818336, + "loss_pdi": 0.44058041274547577, + "loss_ee": 0.5845668762922287, + "loss_delivery": 0.6737456526607275, + "loss_biodist": 0.2069079726934433, + "loss_toxic": 0.07270607736427337 + }, + { + "loss": 2.4094582945108414, + "loss_size": 0.3885020185261965, + "loss_pdi": 0.46220706030726433, + "loss_ee": 0.5269934982061386, + "loss_delivery": 0.7990537015721202, + "loss_biodist": 0.19428402185440063, + "loss_toxic": 0.03841806924901903 + }, + { + "loss": 2.4859633445739746, + "loss_size": 0.41715021431446075, + "loss_pdi": 0.43104546144604683, + "loss_ee": 0.5929308645427227, + "loss_delivery": 0.7805162407457829, + "loss_biodist": 0.21075740829110146, + "loss_toxic": 0.05356312752701342 + }, + { + "loss": 2.3863512128591537, + "loss_size": 0.36496103554964066, + "loss_pdi": 0.4448041245341301, + "loss_ee": 0.5620445422828197, + "loss_delivery": 0.7598662171512842, + "loss_biodist": 0.21108629740774632, + "loss_toxic": 0.04358899069484323 + }, + { + "loss": 2.540374130010605, + "loss_size": 0.421149879693985, + "loss_pdi": 0.4305218234658241, + "loss_ee": 0.5474253967404366, + "loss_delivery": 0.9024681374430656, + "loss_biodist": 0.2017455119639635, + "loss_toxic": 0.037063447292894125 + }, + { + "loss": 2.256133273243904, + "loss_size": 0.35868640802800655, + "loss_pdi": 0.4526713415980339, + "loss_ee": 0.5558537244796753, + "loss_delivery": 0.6482365503907204, + "loss_biodist": 0.19766092114150524, + "loss_toxic": 0.04302433942211792 + }, + { + "loss": 2.4118791967630386, + "loss_size": 0.3626519478857517, + "loss_pdi": 0.439793910831213, + "loss_ee": 0.5639018379151821, + "loss_delivery": 0.7862588986754417, + "loss_biodist": 0.2167180608958006, + "loss_toxic": 0.042554557556286454 + }, + { + "loss": 2.421144977211952, + "loss_size": 0.3997096996754408, + "loss_pdi": 0.4268031716346741, + "loss_ee": 0.54468197748065, + "loss_delivery": 0.7987409122288227, + "loss_biodist": 0.1979309469461441, + "loss_toxic": 0.053278335835784674 + }, + { + "loss": 2.484893947839737, + "loss_size": 0.40917484275996685, + "loss_pdi": 0.4523083493113518, + "loss_ee": 0.5565394945442677, + "loss_delivery": 0.7811942044645548, + "loss_biodist": 0.21532400511205196, + "loss_toxic": 0.07035311090294272 + }, + { + "loss": 2.508310005068779, + "loss_size": 0.392028434202075, + "loss_pdi": 0.46563537418842316, + "loss_ee": 0.5610726661980152, + "loss_delivery": 0.868115178309381, + "loss_biodist": 0.19330977648496628, + "loss_toxic": 0.028148552868515253 + }, + { + "loss": 2.2823522984981537, + "loss_size": 0.3725826870650053, + "loss_pdi": 0.4436277002096176, + "loss_ee": 0.5445637330412865, + "loss_delivery": 0.6825304059311748, + "loss_biodist": 0.20507806539535522, + "loss_toxic": 0.03396970289759338 + }, + { + "loss": 2.340677961707115, + "loss_size": 0.3237522132694721, + "loss_pdi": 0.4429183080792427, + "loss_ee": 0.5430723577737808, + "loss_delivery": 0.7789825117215514, + "loss_biodist": 0.1932805050164461, + "loss_toxic": 0.05867206456605345 + }, + { + "loss": 2.43579663336277, + "loss_size": 0.3825421128422022, + "loss_pdi": 0.46084684878587723, + "loss_ee": 0.5356369465589523, + "loss_delivery": 0.8061059219762683, + "loss_biodist": 0.18804593943059444, + "loss_toxic": 0.06261878390796483 + }, + { + "loss": 2.375033915042877, + "loss_size": 0.37097565829753876, + "loss_pdi": 0.45299821346998215, + "loss_ee": 0.5483061745762825, + "loss_delivery": 0.7634187545627356, + "loss_biodist": 0.19628103263676167, + "loss_toxic": 0.043054113164544106 + }, + { + "loss": 2.375073567032814, + "loss_size": 0.39385137148201466, + "loss_pdi": 0.43302949890494347, + "loss_ee": 0.5369623377919197, + "loss_delivery": 0.7776657920330763, + "loss_biodist": 0.1930943038314581, + "loss_toxic": 0.04047024482861161 + }, + { + "loss": 2.498472973704338, + "loss_size": 0.457756033167243, + "loss_pdi": 0.48180752620100975, + "loss_ee": 0.5444387346506119, + "loss_delivery": 0.7720571514219046, + "loss_biodist": 0.21357632335275412, + "loss_toxic": 0.028837116580689326 + }, + { + "loss": 2.251427784562111, + "loss_size": 0.31997708044946194, + "loss_pdi": 0.4557594656944275, + "loss_ee": 0.5722625702619553, + "loss_delivery": 0.6752464389428496, + "loss_biodist": 0.1944030299782753, + "loss_toxic": 0.033779169199988246 + }, + { + "loss": 2.3404635787010193, + "loss_size": 0.39547222293913364, + "loss_pdi": 0.48117559030652046, + "loss_ee": 0.5512082874774933, + "loss_delivery": 0.6834059152752161, + "loss_biodist": 0.18757404759526253, + "loss_toxic": 0.04162753582932055 + }, + { + "loss": 2.332062780857086, + "loss_size": 0.40330377221107483, + "loss_pdi": 0.45610927417874336, + "loss_ee": 0.5598709620535374, + "loss_delivery": 0.6991077661514282, + "loss_biodist": 0.1802004612982273, + "loss_toxic": 0.03347053553443402 + }, + { + "loss": 2.5532881915569305, + "loss_size": 0.3296027425676584, + "loss_pdi": 0.4313250593841076, + "loss_ee": 0.5530117489397526, + "loss_delivery": 1.0097075831145048, + "loss_biodist": 0.19308063574135303, + "loss_toxic": 0.036560436128638685 + }, + { + "loss": 2.3191350996494293, + "loss_size": 0.36579276248812675, + "loss_pdi": 0.4509471468627453, + "loss_ee": 0.5503131933510303, + "loss_delivery": 0.7146945651620626, + "loss_biodist": 0.1930693220347166, + "loss_toxic": 0.044318083906546235 + }, + { + "loss": 2.329015627503395, + "loss_size": 0.3625293876975775, + "loss_pdi": 0.447160255163908, + "loss_ee": 0.5637771524488926, + "loss_delivery": 0.7219901196658611, + "loss_biodist": 0.182708989828825, + "loss_toxic": 0.05084967764560133 + }, + { + "loss": 2.2387402057647705, + "loss_size": 0.37715523317456245, + "loss_pdi": 0.443161316215992, + "loss_ee": 0.532851655036211, + "loss_delivery": 0.637946292757988, + "loss_biodist": 0.19288873113691807, + "loss_toxic": 0.05473693599924445 + }, + { + "loss": 2.3392106890678406, + "loss_size": 0.37016443349421024, + "loss_pdi": 0.43577099218964577, + "loss_ee": 0.5809498429298401, + "loss_delivery": 0.7330322470515966, + "loss_biodist": 0.1861476842314005, + "loss_toxic": 0.03314550075447187 + }, + { + "loss": 2.381509318947792, + "loss_size": 0.45705906488001347, + "loss_pdi": 0.4459034390747547, + "loss_ee": 0.5371449440717697, + "loss_delivery": 0.7081572283059359, + "loss_biodist": 0.1915800031274557, + "loss_toxic": 0.04166470328345895 + }, + { + "loss": 2.2895610630512238, + "loss_size": 0.30787856690585613, + "loss_pdi": 0.43192387744784355, + "loss_ee": 0.5282911062240601, + "loss_delivery": 0.8125729402527213, + "loss_biodist": 0.17857834417372942, + "loss_toxic": 0.03031624120194465 + }, + { + "loss": 2.342302069067955, + "loss_size": 0.35507766902446747, + "loss_pdi": 0.4288671351969242, + "loss_ee": 0.5287903435528278, + "loss_delivery": 0.799028629437089, + "loss_biodist": 0.19781222939491272, + "loss_toxic": 0.03272609505802393 + }, + { + "loss": 2.2220213413238525, + "loss_size": 0.3336242912337184, + "loss_pdi": 0.4279674366116524, + "loss_ee": 0.5243929699063301, + "loss_delivery": 0.7046115137636662, + "loss_biodist": 0.18190770782530308, + "loss_toxic": 0.04951742372941226 + }, + { + "loss": 2.2642442733049393, + "loss_size": 0.3745464440435171, + "loss_pdi": 0.4190495200455189, + "loss_ee": 0.5312219671905041, + "loss_delivery": 0.7121039722114801, + "loss_biodist": 0.18861200101673603, + "loss_toxic": 0.03871038107899949 + }, + { + "loss": 2.2668907940387726, + "loss_size": 0.3055088045075536, + "loss_pdi": 0.44202207773923874, + "loss_ee": 0.558069571852684, + "loss_delivery": 0.753497414290905, + "loss_biodist": 0.18022325448691845, + "loss_toxic": 0.027569634490646422 + }, + { + "loss": 2.265577092766762, + "loss_size": 0.3527289964258671, + "loss_pdi": 0.4210794195532799, + "loss_ee": 0.5633058845996857, + "loss_delivery": 0.7165728658437729, + "loss_biodist": 0.18325274251401424, + "loss_toxic": 0.028637277253437787 + }, + { + "loss": 2.3678945302963257, + "loss_size": 0.3269524369388819, + "loss_pdi": 0.4376198649406433, + "loss_ee": 0.5548702776432037, + "loss_delivery": 0.8310786969959736, + "loss_biodist": 0.1766184400767088, + "loss_toxic": 0.040754887741059065 + }, + { + "loss": 2.376565784215927, + "loss_size": 0.3146391473710537, + "loss_pdi": 0.4377659671008587, + "loss_ee": 0.5472971461713314, + "loss_delivery": 0.827107597142458, + "loss_biodist": 0.193230664357543, + "loss_toxic": 0.05652518745046109 + }, + { + "loss": 2.3293388187885284, + "loss_size": 0.313828706741333, + "loss_pdi": 0.4662150889635086, + "loss_ee": 0.5857372991740704, + "loss_delivery": 0.7384721748530865, + "loss_biodist": 0.19804997369647026, + "loss_toxic": 0.02703562140231952 + }, + { + "loss": 2.2240894734859467, + "loss_size": 0.32816210202872753, + "loss_pdi": 0.4228389263153076, + "loss_ee": 0.5168202854692936, + "loss_delivery": 0.7309106634929776, + "loss_biodist": 0.17415916360914707, + "loss_toxic": 0.05119828786700964 + }, + { + "loss": 2.3003778904676437, + "loss_size": 0.3464476577937603, + "loss_pdi": 0.4299623481929302, + "loss_ee": 0.5327660068869591, + "loss_delivery": 0.7682454977184534, + "loss_biodist": 0.17687828838825226, + "loss_toxic": 0.04607809009030461 + }, + { + "loss": 2.4176031351089478, + "loss_size": 0.33616673201322556, + "loss_pdi": 0.4266280457377434, + "loss_ee": 0.539965070784092, + "loss_delivery": 0.8959930576384068, + "loss_biodist": 0.1849408494308591, + "loss_toxic": 0.033909388119354844 + }, + { + "loss": 2.220036804676056, + "loss_size": 0.3079969398677349, + "loss_pdi": 0.4420403353869915, + "loss_ee": 0.5316371433436871, + "loss_delivery": 0.7277526371181011, + "loss_biodist": 0.18354396149516106, + "loss_toxic": 0.027065691770985723 + }, + { + "loss": 2.568151220679283, + "loss_size": 0.3081513475626707, + "loss_pdi": 0.4065406657755375, + "loss_ee": 0.5534945167601109, + "loss_delivery": 1.0929491445422173, + "loss_biodist": 0.17446389142423868, + "loss_toxic": 0.032551744021475315 + }, + { + "loss": 2.2266090363264084, + "loss_size": 0.30730851739645004, + "loss_pdi": 0.4372030571103096, + "loss_ee": 0.5150774084031582, + "loss_delivery": 0.7617569454014301, + "loss_biodist": 0.1675817985087633, + "loss_toxic": 0.03768134908750653 } ], "val": [ { - "loss": 10.642529010772705, - "loss_size": 6.192671060562134, - "loss_pdi": 1.2811625599861145, - "loss_ee": 1.0301620960235596, - "loss_delivery": 0.41728606820106506, - "loss_biodist": 1.2410815358161926, - "loss_toxic": 0.4801655113697052, - "acc_pdi": 0.45, - "acc_ee": 0.5833333333333334, - "acc_toxic": 0.9743589743589743 + "loss": 23.08255672454834, + "loss_size": 18.165200233459473, + "loss_pdi": 1.38570237159729, + "loss_ee": 1.0819937586784363, + "loss_delivery": 0.5172057598829269, + "loss_biodist": 1.2911686301231384, + "loss_toxic": 0.6412850320339203, + "acc_pdi": 0.15, + "acc_ee": 0.4, + "acc_toxic": 0.8717948717948718 }, { - "loss": 4.37042236328125, - "loss_size": 0.6340591907501221, - "loss_pdi": 0.9936424493789673, - "loss_ee": 0.9678087830543518, - "loss_delivery": 0.41530802845954895, - "loss_biodist": 1.0821772813796997, - "loss_toxic": 0.2774266004562378, - "acc_pdi": 0.75, - "acc_ee": 0.5833333333333334, - "acc_toxic": 0.9743589743589743 + "loss": 21.95634937286377, + "loss_size": 17.241751670837402, + "loss_pdi": 1.321295142173767, + "loss_ee": 1.065436601638794, + "loss_delivery": 0.49157825112342834, + "loss_biodist": 1.2544752359390259, + "loss_toxic": 0.5818120241165161, + "acc_pdi": 0.4, + "acc_ee": 0.5, + "acc_toxic": 0.9487179487179487 }, { - "loss": 3.4235814809799194, - "loss_size": 0.07745273411273956, - "loss_pdi": 0.7955547869205475, - "loss_ee": 0.9630871117115021, - "loss_delivery": 0.41978873312473297, - "loss_biodist": 1.0081366300582886, - "loss_toxic": 0.1595613993704319, - "acc_pdi": 0.75, - "acc_ee": 0.5833333333333334, - "acc_toxic": 0.9743589743589743 - }, - { - "loss": 3.3056893348693848, - "loss_size": 0.13385668396949768, - "loss_pdi": 0.717946320772171, - "loss_ee": 0.9484646320343018, - "loss_delivery": 0.41560181975364685, - "loss_biodist": 0.9615574777126312, - "loss_toxic": 0.12826236337423325, - "acc_pdi": 0.75, - "acc_ee": 0.5833333333333334, - "acc_toxic": 0.9743589743589743 - }, - { - "loss": 3.1493594646453857, - "loss_size": 0.07856455072760582, - "loss_pdi": 0.668080747127533, - "loss_ee": 0.9540894627571106, - "loss_delivery": 0.474899023771286, - "loss_biodist": 0.8731786608695984, - "loss_toxic": 0.10054689273238182, - "acc_pdi": 0.75, - "acc_ee": 0.5833333333333334, - "acc_toxic": 0.9743589743589743 - }, - { - "loss": 2.8707590103149414, - "loss_size": 0.1222907267510891, - "loss_pdi": 0.6401174664497375, - "loss_ee": 0.9136309623718262, - "loss_delivery": 0.3875949829816818, - "loss_biodist": 0.7330293655395508, - "loss_toxic": 0.07409549504518509, - "acc_pdi": 0.7166666666666667, - "acc_ee": 0.6, - "acc_toxic": 0.9743589743589743 - }, - { - "loss": 2.6709553003311157, - "loss_size": 0.14854157716035843, - "loss_pdi": 0.6254143714904785, - "loss_ee": 0.8874242305755615, - "loss_delivery": 0.37635043263435364, - "loss_biodist": 0.5931203663349152, - "loss_toxic": 0.04010416939854622, - "acc_pdi": 0.7166666666666667, + "loss": 20.918076515197754, + "loss_size": 16.435887336730957, + "loss_pdi": 1.2529736161231995, + "loss_ee": 1.0552538633346558, + "loss_delivery": 0.45487193763256073, + "loss_biodist": 1.2014788389205933, + "loss_toxic": 0.5176102221012115, + "acc_pdi": 0.7, "acc_ee": 0.5666666666666667, - "acc_toxic": 1.0 + "acc_toxic": 0.9743589743589743 }, { - "loss": 2.622614026069641, - "loss_size": 0.1486668586730957, - "loss_pdi": 0.6269595921039581, - "loss_ee": 0.8829602599143982, - "loss_delivery": 0.40370240807533264, - "loss_biodist": 0.535428449511528, - "loss_toxic": 0.024896428920328617, - "acc_pdi": 0.7166666666666667, + "loss": 19.858214378356934, + "loss_size": 15.611548900604248, + "loss_pdi": 1.1820820569992065, + "loss_ee": 1.0452399253845215, + "loss_delivery": 0.4230894297361374, + "loss_biodist": 1.1472065448760986, + "loss_toxic": 0.4490478038787842, + "acc_pdi": 0.75, + "acc_ee": 0.5666666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 18.437131881713867, + "loss_size": 14.455862998962402, + "loss_pdi": 1.0957686305046082, + "loss_ee": 1.0236665606498718, + "loss_delivery": 0.39902180433273315, + "loss_biodist": 1.0887972712516785, + "loss_toxic": 0.3740147799253464, + "acc_pdi": 0.7666666666666667, + "acc_ee": 0.55, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 16.55983066558838, + "loss_size": 12.830113410949707, + "loss_pdi": 0.9735458791255951, + "loss_ee": 0.9793745875358582, + "loss_delivery": 0.4688366800546646, + "loss_biodist": 1.0075940787792206, + "loss_toxic": 0.3003671020269394, + "acc_pdi": 0.75, + "acc_ee": 0.5666666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 14.015560150146484, + "loss_size": 10.566654205322266, + "loss_pdi": 0.8625653684139252, + "loss_ee": 0.95384681224823, + "loss_delivery": 0.4795728325843811, + "loss_biodist": 0.9144233465194702, + "loss_toxic": 0.23849742859601974, + "acc_pdi": 0.75, "acc_ee": 0.5833333333333334, - "acc_toxic": 1.0 + "acc_toxic": 0.9743589743589743 }, { - "loss": 2.4939963817596436, - "loss_size": 0.11941515654325485, - "loss_pdi": 0.624951958656311, - "loss_ee": 0.882407933473587, - "loss_delivery": 0.38461272418498993, - "loss_biodist": 0.462909460067749, - "loss_toxic": 0.019699251279234886, - "acc_pdi": 0.7333333333333333, - "acc_ee": 0.6, - "acc_toxic": 1.0 + "loss": 11.799624919891357, + "loss_size": 8.538016319274902, + "loss_pdi": 0.787468433380127, + "loss_ee": 0.9436340928077698, + "loss_delivery": 0.4672486186027527, + "loss_biodist": 0.8618913292884827, + "loss_toxic": 0.2013658806681633, + "acc_pdi": 0.75, + "acc_ee": 0.5833333333333334, + "acc_toxic": 0.9743589743589743 }, { - "loss": 2.4623881578445435, - "loss_size": 0.14110726118087769, - "loss_pdi": 0.5920329689979553, - "loss_ee": 0.8816524147987366, - "loss_delivery": 0.41789302229881287, - "loss_biodist": 0.40996842086315155, - "loss_toxic": 0.019733915105462074, + "loss": 10.430795192718506, + "loss_size": 7.2916247844696045, + "loss_pdi": 0.7509226500988007, + "loss_ee": 0.9349042773246765, + "loss_delivery": 0.4556972235441208, + "loss_biodist": 0.8191786706447601, + "loss_toxic": 0.17846806347370148, + "acc_pdi": 0.75, + "acc_ee": 0.6166666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 9.274777889251709, + "loss_size": 6.23999810218811, + "loss_pdi": 0.7233669757843018, + "loss_ee": 0.9241549670696259, + "loss_delivery": 0.44265152513980865, + "loss_biodist": 0.7824479639530182, + "loss_toxic": 0.16215819492936134, "acc_pdi": 0.75, "acc_ee": 0.65, - "acc_toxic": 1.0 + "acc_toxic": 0.9743589743589743 }, { - "loss": 2.396706700325012, - "loss_size": 0.11815935745835304, - "loss_pdi": 0.6046018600463867, - "loss_ee": 0.8763127326965332, - "loss_delivery": 0.4112636297941208, - "loss_biodist": 0.36830006539821625, - "loss_toxic": 0.018068938050419092, - "acc_pdi": 0.7166666666666667, + "loss": 8.267348766326904, + "loss_size": 5.320166349411011, + "loss_pdi": 0.7005950510501862, + "loss_ee": 0.9186501204967499, + "loss_delivery": 0.42710645496845245, + "loss_biodist": 0.7505658268928528, + "loss_toxic": 0.15026485174894333, + "acc_pdi": 0.75, "acc_ee": 0.65, - "acc_toxic": 1.0 + "acc_toxic": 0.9743589743589743 }, { - "loss": 2.457483172416687, - "loss_size": 0.13330847769975662, - "loss_pdi": 0.6174256205558777, - "loss_ee": 0.8725559711456299, - "loss_delivery": 0.46076954901218414, - "loss_biodist": 0.358450323343277, - "loss_toxic": 0.014973167330026627, + "loss": 7.32521915435791, + "loss_size": 4.463782072067261, + "loss_pdi": 0.6826708316802979, + "loss_ee": 0.9134883880615234, + "loss_delivery": 0.4078119993209839, + "loss_biodist": 0.7188615798950195, + "loss_toxic": 0.138604324311018, + "acc_pdi": 0.75, + "acc_ee": 0.65, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 6.4078004360198975, + "loss_size": 3.6203211545944214, + "loss_pdi": 0.6657015681266785, + "loss_ee": 0.9120738506317139, + "loss_delivery": 0.3918580412864685, + "loss_biodist": 0.6897956728935242, + "loss_toxic": 0.1280498132109642, "acc_pdi": 0.75, "acc_ee": 0.6333333333333333, - "acc_toxic": 1.0 + "acc_toxic": 0.9743589743589743 }, { - "loss": 2.384940981864929, - "loss_size": 0.11283988133072853, - "loss_pdi": 0.5969351530075073, - "loss_ee": 0.8822423815727234, - "loss_delivery": 0.4492803066968918, - "loss_biodist": 0.3306152671575546, - "loss_toxic": 0.013027888257056475, - "acc_pdi": 0.75, - "acc_ee": 0.6, - "acc_toxic": 1.0 - }, - { - "loss": 2.395999550819397, - "loss_size": 0.1267366074025631, - "loss_pdi": 0.609168529510498, - "loss_ee": 0.8720199763774872, - "loss_delivery": 0.45844390988349915, - "loss_biodist": 0.31721335649490356, - "loss_toxic": 0.01241705659776926, - "acc_pdi": 0.75, - "acc_ee": 0.6333333333333333, - "acc_toxic": 1.0 - }, - { - "loss": 2.432988166809082, - "loss_size": 0.13193047046661377, - "loss_pdi": 0.6282809674739838, - "loss_ee": 0.889969140291214, - "loss_delivery": 0.45955638587474823, - "loss_biodist": 0.3108634203672409, - "loss_toxic": 0.012387921568006277, - "acc_pdi": 0.7333333333333333, - "acc_ee": 0.6, - "acc_toxic": 1.0 - }, - { - "loss": 2.361279010772705, - "loss_size": 0.09955761209130287, - "loss_pdi": 0.6252501904964447, - "loss_ee": 0.8960326313972473, - "loss_delivery": 0.44326628744602203, - "loss_biodist": 0.285326212644577, - "loss_toxic": 0.011845993809401989, + "loss": 5.603572607040405, + "loss_size": 2.866372585296631, + "loss_pdi": 0.653519868850708, + "loss_ee": 0.9104083180427551, + "loss_delivery": 0.3852090388536453, + "loss_biodist": 0.6665074825286865, + "loss_toxic": 0.1215553842484951, "acc_pdi": 0.7333333333333333, "acc_ee": 0.6166666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 4.989350318908691, + "loss_size": 2.298922061920166, + "loss_pdi": 0.6447156071662903, + "loss_ee": 0.9073992371559143, + "loss_delivery": 0.38263915479183197, + "loss_biodist": 0.6420116424560547, + "loss_toxic": 0.11366239935159683, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.6333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 4.424848794937134, + "loss_size": 1.7787790298461914, + "loss_pdi": 0.6333552300930023, + "loss_ee": 0.9078906178474426, + "loss_delivery": 0.37971924245357513, + "loss_biodist": 0.6179626286029816, + "loss_toxic": 0.10714217647910118, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.6333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 3.994532346725464, + "loss_size": 1.378051996231079, + "loss_pdi": 0.6262906491756439, + "loss_ee": 0.9124537408351898, + "loss_delivery": 0.37957052886486053, + "loss_biodist": 0.5964316725730896, + "loss_toxic": 0.1017337292432785, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.6, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 3.6140177249908447, + "loss_size": 1.0360195338726044, + "loss_pdi": 0.6164572238922119, + "loss_ee": 0.9151040613651276, + "loss_delivery": 0.37897755205631256, + "loss_biodist": 0.5732159912586212, + "loss_toxic": 0.09424328245222569, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 3.328765392303467, + "loss_size": 0.7998744249343872, + "loss_pdi": 0.6098372936248779, + "loss_ee": 0.9119531512260437, + "loss_delivery": 0.3727646470069885, + "loss_biodist": 0.5473044216632843, + "loss_toxic": 0.08703150600194931, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.55, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 3.185804009437561, + "loss_size": 0.6846985220909119, + "loss_pdi": 0.6066886484622955, + "loss_ee": 0.9120742380619049, + "loss_delivery": 0.3714919835329056, + "loss_biodist": 0.5310576558113098, + "loss_toxic": 0.07979300618171692, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 3.0729531049728394, + "loss_size": 0.6023903787136078, + "loss_pdi": 0.6019311547279358, + "loss_ee": 0.9207166433334351, + "loss_delivery": 0.3675245940685272, + "loss_biodist": 0.5082270801067352, + "loss_toxic": 0.07216321676969528, + "acc_pdi": 0.7333333333333333, + "acc_ee": 0.55, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.986412763595581, + "loss_size": 0.5425005555152893, + "loss_pdi": 0.5986292362213135, + "loss_ee": 0.9168869256973267, + "loss_delivery": 0.3692060112953186, + "loss_biodist": 0.4880067855119705, + "loss_toxic": 0.07118316926062107, + "acc_pdi": 0.75, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.8937536478042603, + "loss_size": 0.48279696702957153, + "loss_pdi": 0.5968037247657776, + "loss_ee": 0.9193116426467896, + "loss_delivery": 0.35497498512268066, + "loss_biodist": 0.4733995348215103, + "loss_toxic": 0.06646681018173695, + "acc_pdi": 0.75, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.8241339921951294, + "loss_size": 0.4351967126131058, + "loss_pdi": 0.5942685306072235, + "loss_ee": 0.9179154634475708, + "loss_delivery": 0.3557481914758682, + "loss_biodist": 0.45890866219997406, + "loss_toxic": 0.06209634803235531, + "acc_pdi": 0.75, + "acc_ee": 0.5166666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.775130271911621, + "loss_size": 0.41016826033592224, + "loss_pdi": 0.5879503339529037, + "loss_ee": 0.9228730499744415, + "loss_delivery": 0.35271845757961273, + "loss_biodist": 0.4440280497074127, + "loss_toxic": 0.05739211477339268, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.728317618370056, + "loss_size": 0.3769180178642273, + "loss_pdi": 0.585728108882904, + "loss_ee": 0.9276572167873383, + "loss_delivery": 0.35073578357696533, + "loss_biodist": 0.4340643882751465, + "loss_toxic": 0.05321396887302399, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.7271993160247803, + "loss_size": 0.3812417685985565, + "loss_pdi": 0.5841663330793381, + "loss_ee": 0.9325368106365204, + "loss_delivery": 0.34711775183677673, + "loss_biodist": 0.43170611560344696, + "loss_toxic": 0.050430385395884514, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.6966670751571655, + "loss_size": 0.3598712086677551, + "loss_pdi": 0.5865683704614639, + "loss_ee": 0.9341267049312592, + "loss_delivery": 0.34253913164138794, + "loss_biodist": 0.4231300801038742, + "loss_toxic": 0.050431531853973866, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.677440047264099, + "loss_size": 0.34720419347286224, + "loss_pdi": 0.5916665196418762, + "loss_ee": 0.941874772310257, + "loss_delivery": 0.34214016795158386, + "loss_biodist": 0.4104868620634079, + "loss_toxic": 0.04406765662133694, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5166666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.636168122291565, + "loss_size": 0.33124659955501556, + "loss_pdi": 0.5931780338287354, + "loss_ee": 0.9324212372303009, + "loss_delivery": 0.337383434176445, + "loss_biodist": 0.40123969316482544, + "loss_toxic": 0.040698954835534096, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.6184176206588745, + "loss_size": 0.32667799293994904, + "loss_pdi": 0.5926244109869003, + "loss_ee": 0.9347528517246246, + "loss_delivery": 0.3297251760959625, + "loss_biodist": 0.3973996490240097, + "loss_toxic": 0.037237657234072685, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.594933271408081, + "loss_size": 0.3120705187320709, + "loss_pdi": 0.5939976274967194, + "loss_ee": 0.9371457397937775, + "loss_delivery": 0.32641829550266266, + "loss_biodist": 0.39165879786014557, + "loss_toxic": 0.03364230878651142, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.5623388290405273, + "loss_size": 0.2766270190477371, + "loss_pdi": 0.5902731567621231, + "loss_ee": 0.9450692534446716, + "loss_delivery": 0.32445892691612244, + "loss_biodist": 0.39274075627326965, + "loss_toxic": 0.033169761300086975, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.5489457845687866, + "loss_size": 0.2664923220872879, + "loss_pdi": 0.5925990045070648, + "loss_ee": 0.9470328390598297, + "loss_delivery": 0.32114414870738983, + "loss_biodist": 0.38897469639778137, + "loss_toxic": 0.0327027402818203, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, "acc_toxic": 1.0 }, { - "loss": 2.420892119407654, - "loss_size": 0.13956347852945328, - "loss_pdi": 0.6046904623508453, - "loss_ee": 0.9216890335083008, - "loss_delivery": 0.4730597734451294, - "loss_biodist": 0.27191491425037384, - "loss_toxic": 0.009974355343729258, - "acc_pdi": 0.7333333333333333, + "loss": 2.5473875999450684, + "loss_size": 0.2693425267934799, + "loss_pdi": 0.5898241400718689, + "loss_ee": 0.9507412314414978, + "loss_delivery": 0.32274745404720306, + "loss_biodist": 0.3810035288333893, + "loss_toxic": 0.033728599548339844, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.5582650899887085, + "loss_size": 0.28376954793930054, + "loss_pdi": 0.5857751667499542, + "loss_ee": 0.9577462077140808, + "loss_delivery": 0.3179885745048523, + "loss_biodist": 0.38155072927474976, + "loss_toxic": 0.03143497183918953, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5, + "acc_toxic": 1.0 + }, + { + "loss": 2.5661860704421997, + "loss_size": 0.2933680862188339, + "loss_pdi": 0.5852044820785522, + "loss_ee": 0.9604993760585785, + "loss_delivery": 0.31451259553432465, + "loss_biodist": 0.3806009888648987, + "loss_toxic": 0.03200071305036545, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5166666666666667, + "acc_toxic": 0.9743589743589743 + }, + { + "loss": 2.541078805923462, + "loss_size": 0.2658995985984802, + "loss_pdi": 0.5860227644443512, + "loss_ee": 0.9658644497394562, + "loss_delivery": 0.3182491958141327, + "loss_biodist": 0.3728503882884979, + "loss_toxic": 0.03219226747751236, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 1.0 + }, + { + "loss": 2.5170637369155884, + "loss_size": 0.2407098039984703, + "loss_pdi": 0.5888298004865646, + "loss_ee": 0.9680635631084442, + "loss_delivery": 0.3207763731479645, + "loss_biodist": 0.3703601360321045, + "loss_toxic": 0.028324089013040066, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 1.0 + }, + { + "loss": 2.5068060159683228, + "loss_size": 0.23479244858026505, + "loss_pdi": 0.5894846469163895, + "loss_ee": 0.968824714422226, + "loss_delivery": 0.317771315574646, + "loss_biodist": 0.3679642081260681, + "loss_toxic": 0.027968653477728367, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.5666666666666667, "acc_toxic": 1.0 }, { - "loss": 2.453316569328308, - "loss_size": 0.11874271184206009, - "loss_pdi": 0.6105562448501587, - "loss_ee": 0.923934280872345, - "loss_delivery": 0.5215270966291428, - "loss_biodist": 0.27011625468730927, - "loss_toxic": 0.008439893601462245, - "acc_pdi": 0.7333333333333333, - "acc_ee": 0.5833333333333334, - "acc_toxic": 1.0 - }, - { - "loss": 2.4440466165542603, - "loss_size": 0.13506918773055077, - "loss_pdi": 0.6187410056591034, - "loss_ee": 0.9395149946212769, - "loss_delivery": 0.48008452355861664, - "loss_biodist": 0.26326628774404526, - "loss_toxic": 0.007370669860392809, - "acc_pdi": 0.7333333333333333, + "loss": 2.511378288269043, + "loss_size": 0.2382667362689972, + "loss_pdi": 0.5884567648172379, + "loss_ee": 0.9717344343662262, + "loss_delivery": 0.31294092535972595, + "loss_biodist": 0.36750735342502594, + "loss_toxic": 0.03247209172695875, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.5666666666666667, "acc_toxic": 1.0 }, { - "loss": 2.4298155307769775, - "loss_size": 0.11216039955615997, - "loss_pdi": 0.6475824415683746, - "loss_ee": 0.9234196841716766, - "loss_delivery": 0.46182475984096527, - "loss_biodist": 0.2774467319250107, - "loss_toxic": 0.007381373317912221, - "acc_pdi": 0.7333333333333333, - "acc_ee": 0.6333333333333333, - "acc_toxic": 1.0 - }, - { - "loss": 2.4662675857543945, - "loss_size": 0.07973097264766693, - "loss_pdi": 0.6542999148368835, - "loss_ee": 0.9407779574394226, - "loss_delivery": 0.4921555370092392, - "loss_biodist": 0.29242587089538574, - "loss_toxic": 0.006877265637740493, - "acc_pdi": 0.7166666666666667, - "acc_ee": 0.5833333333333334, - "acc_toxic": 1.0 - }, - { - "loss": 2.394904613494873, - "loss_size": 0.1067984513938427, - "loss_pdi": 0.6353477835655212, - "loss_ee": 0.9535529017448425, - "loss_delivery": 0.4185742735862732, - "loss_biodist": 0.27519282698631287, - "loss_toxic": 0.005438495893031359, - "acc_pdi": 0.7166666666666667, - "acc_ee": 0.5833333333333334, - "acc_toxic": 1.0 - }, - { - "loss": 2.424455165863037, - "loss_size": 0.09576653316617012, - "loss_pdi": 0.6532827019691467, - "loss_ee": 0.9595111310482025, - "loss_delivery": 0.4392053782939911, - "loss_biodist": 0.27055467665195465, - "loss_toxic": 0.006134827388450503, - "acc_pdi": 0.7166666666666667, + "loss": 2.4968656301498413, + "loss_size": 0.22835177183151245, + "loss_pdi": 0.5894641727209091, + "loss_ee": 0.9705208837985992, + "loss_delivery": 0.3155461549758911, + "loss_biodist": 0.36456646025180817, + "loss_toxic": 0.02841610088944435, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.5666666666666667, "acc_toxic": 1.0 }, { - "loss": 2.5053725242614746, - "loss_size": 0.10888586193323135, - "loss_pdi": 0.656737744808197, - "loss_ee": 0.9638712704181671, - "loss_delivery": 0.4994397610425949, - "loss_biodist": 0.27049925923347473, - "loss_toxic": 0.005938541842624545, - "acc_pdi": 0.7166666666666667, + "loss": 2.4925342798233032, + "loss_size": 0.2224661186337471, + "loss_pdi": 0.5911581218242645, + "loss_ee": 0.9787282645702362, + "loss_delivery": 0.3117832839488983, + "loss_biodist": 0.3618563562631607, + "loss_toxic": 0.026542033068835735, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.519076108932495, + "loss_size": 0.23777800798416138, + "loss_pdi": 0.5882950127124786, + "loss_ee": 0.9824095964431763, + "loss_delivery": 0.3143518269062042, + "loss_biodist": 0.36608877778053284, + "loss_toxic": 0.0301527613773942, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.5395556688308716, + "loss_size": 0.24812977015972137, + "loss_pdi": 0.5908422470092773, + "loss_ee": 0.9888725280761719, + "loss_delivery": 0.31910496950149536, + "loss_biodist": 0.3644738346338272, + "loss_toxic": 0.028132320381700993, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.5324513912200928, + "loss_size": 0.23656832426786423, + "loss_pdi": 0.5896281898021698, + "loss_ee": 0.9954959154129028, + "loss_delivery": 0.3214045614004135, + "loss_biodist": 0.3617252707481384, + "loss_toxic": 0.027629065327346325, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5, + "acc_toxic": 1.0 + }, + { + "loss": 2.4930797815322876, + "loss_size": 0.20964767783880234, + "loss_pdi": 0.5881698727607727, + "loss_ee": 0.9954250454902649, + "loss_delivery": 0.32059434056282043, + "loss_biodist": 0.3531523495912552, + "loss_toxic": 0.026090470142662525, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 1.0 + }, + { + "loss": 2.4868186712265015, + "loss_size": 0.21395514160394669, + "loss_pdi": 0.5830750465393066, + "loss_ee": 0.9925644099712372, + "loss_delivery": 0.3193023353815079, + "loss_biodist": 0.3552027642726898, + "loss_toxic": 0.022718950174748898, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 1.0 + }, + { + "loss": 2.4778655767440796, + "loss_size": 0.20702877640724182, + "loss_pdi": 0.5822963416576385, + "loss_ee": 0.9994721114635468, + "loss_delivery": 0.31518860161304474, + "loss_biodist": 0.35139843821525574, + "loss_toxic": 0.022481259889900684, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 1.0 + }, + { + "loss": 2.467949628829956, + "loss_size": 0.20378626137971878, + "loss_pdi": 0.5813045352697372, + "loss_ee": 0.9965270459651947, + "loss_delivery": 0.3159128874540329, + "loss_biodist": 0.3484266996383667, + "loss_toxic": 0.021992099471390247, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5333333333333333, + "acc_toxic": 1.0 + }, + { + "loss": 2.4578932523727417, + "loss_size": 0.2058413401246071, + "loss_pdi": 0.5786841958761215, + "loss_ee": 0.9927798807621002, + "loss_delivery": 0.3089330494403839, + "loss_biodist": 0.34664781391620636, + "loss_toxic": 0.025006826035678387, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4626444578170776, + "loss_size": 0.20806843042373657, + "loss_pdi": 0.5785287618637085, + "loss_ee": 0.9961800277233124, + "loss_delivery": 0.3105767220258713, + "loss_biodist": 0.34737493097782135, + "loss_toxic": 0.021915599703788757, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4782203435897827, + "loss_size": 0.21168024837970734, + "loss_pdi": 0.5783185958862305, + "loss_ee": 0.9937601685523987, + "loss_delivery": 0.31742599606513977, + "loss_biodist": 0.35029137134552, + "loss_toxic": 0.02674387115985155, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.483683466911316, + "loss_size": 0.2182474434375763, + "loss_pdi": 0.5817886888980865, + "loss_ee": 0.9968518018722534, + "loss_delivery": 0.31819912791252136, + "loss_biodist": 0.34571440517902374, + "loss_toxic": 0.022882056422531605, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4820202589035034, + "loss_size": 0.22005712240934372, + "loss_pdi": 0.5797277837991714, + "loss_ee": 0.9988358616828918, + "loss_delivery": 0.3213921785354614, + "loss_biodist": 0.34191887080669403, + "loss_toxic": 0.02008841000497341, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.475839376449585, + "loss_size": 0.20475323498249054, + "loss_pdi": 0.5745992809534073, + "loss_ee": 1.009226769208908, + "loss_delivery": 0.3221261650323868, + "loss_biodist": 0.34656713902950287, + "loss_toxic": 0.018566792830824852, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 1.0 + }, + { + "loss": 2.47631299495697, + "loss_size": 0.21439334005117416, + "loss_pdi": 0.5734581053256989, + "loss_ee": 1.0064772963523865, + "loss_delivery": 0.3126187026500702, + "loss_biodist": 0.3460565060377121, + "loss_toxic": 0.023308915086090565, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4701257944107056, + "loss_size": 0.2064252272248268, + "loss_pdi": 0.5740563273429871, + "loss_ee": 1.0102430582046509, + "loss_delivery": 0.3147464245557785, + "loss_biodist": 0.3420388251543045, + "loss_toxic": 0.02261580526828766, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4774882793426514, + "loss_size": 0.20556586235761642, + "loss_pdi": 0.5752835124731064, + "loss_ee": 1.0055716931819916, + "loss_delivery": 0.32358165085315704, + "loss_biodist": 0.3414890617132187, + "loss_toxic": 0.02599663846194744, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.470389246940613, + "loss_size": 0.20361963659524918, + "loss_pdi": 0.5763607174158096, + "loss_ee": 1.0087409019470215, + "loss_delivery": 0.3187643438577652, + "loss_biodist": 0.34229810535907745, + "loss_toxic": 0.02060555759817362, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4505800008773804, + "loss_size": 0.1872227042913437, + "loss_pdi": 0.5772093236446381, + "loss_ee": 1.0082023739814758, + "loss_delivery": 0.3152957409620285, + "loss_biodist": 0.3428477793931961, + "loss_toxic": 0.019802039489150047, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, + "acc_toxic": 1.0 + }, + { + "loss": 2.4552417993545532, + "loss_size": 0.18671875447034836, + "loss_pdi": 0.5765772759914398, + "loss_ee": 1.01038059592247, + "loss_delivery": 0.32385362684726715, + "loss_biodist": 0.3395358622074127, + "loss_toxic": 0.018175733741372824, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4580785036087036, + "loss_size": 0.19634269177913666, + "loss_pdi": 0.57661272585392, + "loss_ee": 1.006902813911438, + "loss_delivery": 0.31340549886226654, + "loss_biodist": 0.3417620062828064, + "loss_toxic": 0.023052792996168137, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4515216946601868, + "loss_size": 0.18773971498012543, + "loss_pdi": 0.5795569121837616, + "loss_ee": 1.0060312151908875, + "loss_delivery": 0.3152562975883484, + "loss_biodist": 0.3416850417852402, + "loss_toxic": 0.02125252317637205, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.449348211288452, + "loss_size": 0.18833737820386887, + "loss_pdi": 0.5763599127531052, + "loss_ee": 1.0090400576591492, + "loss_delivery": 0.3151460140943527, + "loss_biodist": 0.3424200266599655, + "loss_toxic": 0.018045054748654366, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4551481008529663, + "loss_size": 0.18659686297178268, + "loss_pdi": 0.5755659937858582, + "loss_ee": 1.0128966569900513, + "loss_delivery": 0.3214796185493469, + "loss_biodist": 0.3400968313217163, + "loss_toxic": 0.0185121176764369, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.448776125907898, + "loss_size": 0.1820262148976326, + "loss_pdi": 0.5731459110975266, + "loss_ee": 1.0081259310245514, + "loss_delivery": 0.3281840831041336, + "loss_biodist": 0.3398120403289795, + "loss_toxic": 0.017481757327914238, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.448722243309021, + "loss_size": 0.18495317548513412, + "loss_pdi": 0.5750085860490799, + "loss_ee": 1.005994737148285, + "loss_delivery": 0.32928895950317383, + "loss_biodist": 0.33658044040203094, + "loss_toxic": 0.016896324697881937, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.443658947944641, + "loss_size": 0.18055323511362076, + "loss_pdi": 0.5750256329774857, + "loss_ee": 1.004571557044983, + "loss_delivery": 0.33198240399360657, + "loss_biodist": 0.33537501096725464, + "loss_toxic": 0.01615101331844926, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4464157223701477, + "loss_size": 0.19530382752418518, + "loss_pdi": 0.5750800967216492, + "loss_ee": 1.0032556354999542, + "loss_delivery": 0.32189127802848816, + "loss_biodist": 0.3329106569290161, + "loss_toxic": 0.017974247690290213, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4568694829940796, + "loss_size": 0.19456836581230164, + "loss_pdi": 0.5787238329648972, + "loss_ee": 1.0072905719280243, + "loss_delivery": 0.32528989017009735, + "loss_biodist": 0.33407391607761383, + "loss_toxic": 0.016922770999372005, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4530590772628784, + "loss_size": 0.19079380482435226, + "loss_pdi": 0.5766863524913788, + "loss_ee": 1.0125726163387299, + "loss_delivery": 0.3218092918395996, + "loss_biodist": 0.33407746255397797, + "loss_toxic": 0.01711944444105029, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4398056268692017, + "loss_size": 0.18868489563465118, + "loss_pdi": 0.5734779387712479, + "loss_ee": 1.0145431160926819, + "loss_delivery": 0.3121902197599411, + "loss_biodist": 0.3350667208433151, + "loss_toxic": 0.015842758119106293, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.43908154964447, + "loss_size": 0.17981701344251633, + "loss_pdi": 0.5743161141872406, + "loss_ee": 1.010342001914978, + "loss_delivery": 0.324299693107605, + "loss_biodist": 0.33383095264434814, + "loss_toxic": 0.01647581998258829, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4145443439483643, + "loss_size": 0.1670462265610695, + "loss_pdi": 0.5734947621822357, + "loss_ee": 1.007502168416977, + "loss_delivery": 0.31635917723178864, + "loss_biodist": 0.3343554884195328, + "loss_toxic": 0.015786555130034685, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.422114908695221, + "loss_size": 0.1707478016614914, + "loss_pdi": 0.5725287199020386, + "loss_ee": 1.007000058889389, + "loss_delivery": 0.3204977363348007, + "loss_biodist": 0.33519069850444794, + "loss_toxic": 0.016149940434843302, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4240607023239136, + "loss_size": 0.178876593708992, + "loss_pdi": 0.5702834725379944, + "loss_ee": 1.0034980773925781, + "loss_delivery": 0.32336823642253876, + "loss_biodist": 0.3325919061899185, + "loss_toxic": 0.015442332718521357, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4249237179756165, + "loss_size": 0.18237261474132538, + "loss_pdi": 0.5713054090738297, + "loss_ee": 1.0015043318271637, + "loss_delivery": 0.3240789622068405, + "loss_biodist": 0.3306470960378647, + "loss_toxic": 0.0150153455324471, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4421173334121704, + "loss_size": 0.18255895376205444, + "loss_pdi": 0.5733452141284943, + "loss_ee": 1.0094293355941772, + "loss_delivery": 0.324260875582695, + "loss_biodist": 0.3330068737268448, + "loss_toxic": 0.01951604150235653, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.428235411643982, + "loss_size": 0.18304699659347534, + "loss_pdi": 0.5728906840085983, + "loss_ee": 1.0043113827705383, + "loss_delivery": 0.3211822509765625, + "loss_biodist": 0.33053070306777954, + "loss_toxic": 0.01627331878989935, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.423707902431488, + "loss_size": 0.17948835343122482, + "loss_pdi": 0.5713352113962173, + "loss_ee": 1.0125969350337982, + "loss_delivery": 0.31306323409080505, + "loss_biodist": 0.3301372826099396, + "loss_toxic": 0.017086807172745466, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.6166666666666667, "acc_toxic": 1.0 }, { - "loss": 2.539380669593811, - "loss_size": 0.11638890951871872, - "loss_pdi": 0.6549257636070251, - "loss_ee": 0.9761019647121429, - "loss_delivery": 0.5175990015268326, - "loss_biodist": 0.26853571832180023, - "loss_toxic": 0.0058291994500905275, - "acc_pdi": 0.7166666666666667, - "acc_ee": 0.5833333333333334, - "acc_toxic": 1.0 - }, - { - "loss": 2.4885005950927734, - "loss_size": 0.12185845524072647, - "loss_pdi": 0.667609304189682, - "loss_ee": 0.9739555716514587, - "loss_delivery": 0.45484381914138794, - "loss_biodist": 0.26541487127542496, - "loss_toxic": 0.00481854728423059, - "acc_pdi": 0.7166666666666667, - "acc_ee": 0.6, - "acc_toxic": 1.0 - }, - { - "loss": 2.514465093612671, - "loss_size": 0.11423381045460701, - "loss_pdi": 0.6905614733695984, - "loss_ee": 0.9758535623550415, - "loss_delivery": 0.47175830602645874, - "loss_biodist": 0.257549487054348, - "loss_toxic": 0.004508488811552525, - "acc_pdi": 0.7333333333333333, - "acc_ee": 0.6, - "acc_toxic": 1.0 - }, - { - "loss": 2.5609203577041626, - "loss_size": 0.11414870619773865, - "loss_pdi": 0.6677174866199493, - "loss_ee": 0.9934183955192566, - "loss_delivery": 0.5167151391506195, - "loss_biodist": 0.2642747312784195, - "loss_toxic": 0.0046457564458251, - "acc_pdi": 0.7333333333333333, + "loss": 2.4089826345443726, + "loss_size": 0.17556024342775345, + "loss_pdi": 0.5705321878194809, + "loss_ee": 1.0072000622749329, + "loss_delivery": 0.30933138728141785, + "loss_biodist": 0.33006031811237335, + "loss_toxic": 0.01629862328991294, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.6166666666666667, "acc_toxic": 1.0 }, { - "loss": 2.5480626821517944, - "loss_size": 0.10506367310881615, - "loss_pdi": 0.6713496148586273, - "loss_ee": 0.9947319328784943, - "loss_delivery": 0.5066179037094116, - "loss_biodist": 0.2658369243144989, - "loss_toxic": 0.004462693585082889, - "acc_pdi": 0.7333333333333333, + "loss": 2.4195178151130676, + "loss_size": 0.18361611664295197, + "loss_pdi": 0.5730448365211487, + "loss_ee": 1.002352625131607, + "loss_delivery": 0.30763909220695496, + "loss_biodist": 0.33182990550994873, + "loss_toxic": 0.021035287529230118, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.414033889770508, + "loss_size": 0.17641977220773697, + "loss_pdi": 0.5686511248350143, + "loss_ee": 1.0031031966209412, + "loss_delivery": 0.31490200757980347, + "loss_biodist": 0.3313785493373871, + "loss_toxic": 0.01957935281097889, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4226320385932922, + "loss_size": 0.1758788526058197, + "loss_pdi": 0.5708015114068985, + "loss_ee": 1.0085403621196747, + "loss_delivery": 0.31501661241054535, + "loss_biodist": 0.3336498290300369, + "loss_toxic": 0.018744912929832935, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.415340304374695, + "loss_size": 0.1780794858932495, + "loss_pdi": 0.5729846954345703, + "loss_ee": 1.0020167827606201, + "loss_delivery": 0.313737228512764, + "loss_biodist": 0.3304787129163742, + "loss_toxic": 0.018043378833681345, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.4289786219596863, + "loss_size": 0.17449475824832916, + "loss_pdi": 0.5745786726474762, + "loss_ee": 1.0082752704620361, + "loss_delivery": 0.32470449805259705, + "loss_biodist": 0.3305872231721878, + "loss_toxic": 0.016338232439011335, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.437878131866455, + "loss_size": 0.19016961753368378, + "loss_pdi": 0.5718495547771454, + "loss_ee": 1.0078614950180054, + "loss_delivery": 0.32231585681438446, + "loss_biodist": 0.32886606454849243, + "loss_toxic": 0.016815478913486004, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.432196855545044, + "loss_size": 0.18712375313043594, + "loss_pdi": 0.5707677900791168, + "loss_ee": 1.011586219072342, + "loss_delivery": 0.32039742171764374, + "loss_biodist": 0.3272295147180557, + "loss_toxic": 0.015092198271304369, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.442120671272278, + "loss_size": 0.1902673915028572, + "loss_pdi": 0.5707383751869202, + "loss_ee": 1.0139081478118896, + "loss_delivery": 0.31597262620925903, + "loss_biodist": 0.33136095106601715, + "loss_toxic": 0.019873091019690037, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.426782965660095, + "loss_size": 0.18581604212522507, + "loss_pdi": 0.5696376860141754, + "loss_ee": 1.0093466937541962, + "loss_delivery": 0.3177868574857712, + "loss_biodist": 0.3294990360736847, + "loss_toxic": 0.014696634840220213, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5833333333333334, + "acc_toxic": 1.0 + }, + { + "loss": 2.427416503429413, + "loss_size": 0.1857571080327034, + "loss_pdi": 0.5706104040145874, + "loss_ee": 1.0067935585975647, + "loss_delivery": 0.31886860728263855, + "loss_biodist": 0.33135633170604706, + "loss_toxic": 0.01403044443577528, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.6, "acc_toxic": 1.0 }, { - "loss": 2.5397441387176514, - "loss_size": 0.10522815585136414, - "loss_pdi": 0.6821762025356293, - "loss_ee": 0.9780809879302979, - "loss_delivery": 0.5069089531898499, - "loss_biodist": 0.2627965956926346, - "loss_toxic": 0.0045532952062785625, - "acc_pdi": 0.7333333333333333, + "loss": 2.4175720810890198, + "loss_size": 0.17682582139968872, + "loss_pdi": 0.5699317306280136, + "loss_ee": 1.008631855249405, + "loss_delivery": 0.31863583624362946, + "loss_biodist": 0.3295620381832123, + "loss_toxic": 0.013984768651425838, + "acc_pdi": 0.7833333333333333, "acc_ee": 0.5833333333333334, "acc_toxic": 1.0 }, { - "loss": 2.5472241640090942, - "loss_size": 0.11468468606472015, - "loss_pdi": 0.6848073601722717, - "loss_ee": 0.9830659925937653, - "loss_delivery": 0.5032574832439423, - "loss_biodist": 0.25694920122623444, - "loss_toxic": 0.0044593592174351215, - "acc_pdi": 0.7333333333333333, - "acc_ee": 0.5833333333333334, + "loss": 2.4234968423843384, + "loss_size": 0.17140312492847443, + "loss_pdi": 0.5711115300655365, + "loss_ee": 1.0081288516521454, + "loss_delivery": 0.3275977224111557, + "loss_biodist": 0.33037069439888, + "loss_toxic": 0.01488499902188778, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.5666666666666667, + "acc_toxic": 1.0 + }, + { + "loss": 2.4282666444778442, + "loss_size": 0.17177677899599075, + "loss_pdi": 0.573297917842865, + "loss_ee": 1.0125916004180908, + "loss_delivery": 0.327491819858551, + "loss_biodist": 0.3302319347858429, + "loss_toxic": 0.012876724824309349, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4261932373046875, + "loss_size": 0.16778022795915604, + "loss_pdi": 0.5743443667888641, + "loss_ee": 1.0115399360656738, + "loss_delivery": 0.33071593940258026, + "loss_biodist": 0.32824188470840454, + "loss_toxic": 0.0135708749294281, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.6, + "acc_toxic": 1.0 + }, + { + "loss": 2.4238767623901367, + "loss_size": 0.17259139567613602, + "loss_pdi": 0.5731173902750015, + "loss_ee": 1.0133283734321594, + "loss_delivery": 0.31513088941574097, + "loss_biodist": 0.32966548204421997, + "loss_toxic": 0.02004324784502387, + "acc_pdi": 0.7833333333333333, + "acc_ee": 0.55, "acc_toxic": 1.0 } ] diff --git a/models/model.pt b/models/model.pt index 3060b30..936a454 100644 Binary files a/models/model.pt and b/models/model.pt differ diff --git a/models/pretrained/all_amine_split_for_LiON/cv_0/args.json b/models/mpnn/all_amine_split_for_LiON/cv_0/args.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_0/args.json rename to models/mpnn/all_amine_split_for_LiON/cv_0/args.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_0/fold_0/model_0/events.out.tfevents.1722348927.andersonxps b/models/mpnn/all_amine_split_for_LiON/cv_0/fold_0/model_0/events.out.tfevents.1722348927.andersonxps similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_0/fold_0/model_0/events.out.tfevents.1722348927.andersonxps rename to models/mpnn/all_amine_split_for_LiON/cv_0/fold_0/model_0/events.out.tfevents.1722348927.andersonxps diff --git a/models/pretrained/all_amine_split_for_LiON/cv_0/fold_0/model_0/model.pt b/models/mpnn/all_amine_split_for_LiON/cv_0/fold_0/model_0/model.pt similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_0/fold_0/model_0/model.pt rename to models/mpnn/all_amine_split_for_LiON/cv_0/fold_0/model_0/model.pt diff --git a/models/pretrained/all_amine_split_for_LiON/cv_0/fold_0/test_scores.json b/models/mpnn/all_amine_split_for_LiON/cv_0/fold_0/test_scores.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_0/fold_0/test_scores.json rename to models/mpnn/all_amine_split_for_LiON/cv_0/fold_0/test_scores.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_1/args.json b/models/mpnn/all_amine_split_for_LiON/cv_1/args.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_1/args.json rename to models/mpnn/all_amine_split_for_LiON/cv_1/args.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_1/fold_0/model_0/events.out.tfevents.1722349301.andersonxps b/models/mpnn/all_amine_split_for_LiON/cv_1/fold_0/model_0/events.out.tfevents.1722349301.andersonxps similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_1/fold_0/model_0/events.out.tfevents.1722349301.andersonxps rename to models/mpnn/all_amine_split_for_LiON/cv_1/fold_0/model_0/events.out.tfevents.1722349301.andersonxps diff --git a/models/pretrained/all_amine_split_for_LiON/cv_1/fold_0/model_0/model.pt b/models/mpnn/all_amine_split_for_LiON/cv_1/fold_0/model_0/model.pt similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_1/fold_0/model_0/model.pt rename to models/mpnn/all_amine_split_for_LiON/cv_1/fold_0/model_0/model.pt diff --git a/models/pretrained/all_amine_split_for_LiON/cv_1/fold_0/test_scores.json b/models/mpnn/all_amine_split_for_LiON/cv_1/fold_0/test_scores.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_1/fold_0/test_scores.json rename to models/mpnn/all_amine_split_for_LiON/cv_1/fold_0/test_scores.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_2/args.json b/models/mpnn/all_amine_split_for_LiON/cv_2/args.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_2/args.json rename to models/mpnn/all_amine_split_for_LiON/cv_2/args.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_2/fold_0/model_0/events.out.tfevents.1722349684.andersonxps b/models/mpnn/all_amine_split_for_LiON/cv_2/fold_0/model_0/events.out.tfevents.1722349684.andersonxps similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_2/fold_0/model_0/events.out.tfevents.1722349684.andersonxps rename to models/mpnn/all_amine_split_for_LiON/cv_2/fold_0/model_0/events.out.tfevents.1722349684.andersonxps diff --git a/models/pretrained/all_amine_split_for_LiON/cv_2/fold_0/model_0/model.pt b/models/mpnn/all_amine_split_for_LiON/cv_2/fold_0/model_0/model.pt similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_2/fold_0/model_0/model.pt rename to models/mpnn/all_amine_split_for_LiON/cv_2/fold_0/model_0/model.pt diff --git a/models/pretrained/all_amine_split_for_LiON/cv_2/fold_0/test_scores.json b/models/mpnn/all_amine_split_for_LiON/cv_2/fold_0/test_scores.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_2/fold_0/test_scores.json rename to models/mpnn/all_amine_split_for_LiON/cv_2/fold_0/test_scores.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_3/args.json b/models/mpnn/all_amine_split_for_LiON/cv_3/args.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_3/args.json rename to models/mpnn/all_amine_split_for_LiON/cv_3/args.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_3/fold_0/model_0/events.out.tfevents.1722350072.andersonxps b/models/mpnn/all_amine_split_for_LiON/cv_3/fold_0/model_0/events.out.tfevents.1722350072.andersonxps similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_3/fold_0/model_0/events.out.tfevents.1722350072.andersonxps rename to models/mpnn/all_amine_split_for_LiON/cv_3/fold_0/model_0/events.out.tfevents.1722350072.andersonxps diff --git a/models/pretrained/all_amine_split_for_LiON/cv_3/fold_0/model_0/model.pt b/models/mpnn/all_amine_split_for_LiON/cv_3/fold_0/model_0/model.pt similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_3/fold_0/model_0/model.pt rename to models/mpnn/all_amine_split_for_LiON/cv_3/fold_0/model_0/model.pt diff --git a/models/pretrained/all_amine_split_for_LiON/cv_3/fold_0/test_scores.json b/models/mpnn/all_amine_split_for_LiON/cv_3/fold_0/test_scores.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_3/fold_0/test_scores.json rename to models/mpnn/all_amine_split_for_LiON/cv_3/fold_0/test_scores.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_4/args.json b/models/mpnn/all_amine_split_for_LiON/cv_4/args.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_4/args.json rename to models/mpnn/all_amine_split_for_LiON/cv_4/args.json diff --git a/models/pretrained/all_amine_split_for_LiON/cv_4/fold_0/model_0/events.out.tfevents.1722350444.andersonxps b/models/mpnn/all_amine_split_for_LiON/cv_4/fold_0/model_0/events.out.tfevents.1722350444.andersonxps similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_4/fold_0/model_0/events.out.tfevents.1722350444.andersonxps rename to models/mpnn/all_amine_split_for_LiON/cv_4/fold_0/model_0/events.out.tfevents.1722350444.andersonxps diff --git a/models/pretrained/all_amine_split_for_LiON/cv_4/fold_0/model_0/model.pt b/models/mpnn/all_amine_split_for_LiON/cv_4/fold_0/model_0/model.pt similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_4/fold_0/model_0/model.pt rename to models/mpnn/all_amine_split_for_LiON/cv_4/fold_0/model_0/model.pt diff --git a/models/pretrained/all_amine_split_for_LiON/cv_4/fold_0/test_scores.json b/models/mpnn/all_amine_split_for_LiON/cv_4/fold_0/test_scores.json similarity index 100% rename from models/pretrained/all_amine_split_for_LiON/cv_4/fold_0/test_scores.json rename to models/mpnn/all_amine_split_for_LiON/cv_4/fold_0/test_scores.json diff --git a/models/pretrain_delivery.pt b/models/pretrain_delivery.pt new file mode 100644 index 0000000..ad7a903 Binary files /dev/null and b/models/pretrain_delivery.pt differ diff --git a/models/pretrain_history.json b/models/pretrain_history.json new file mode 100644 index 0000000..81d0129 --- /dev/null +++ b/models/pretrain_history.json @@ -0,0 +1,286 @@ +{ + "train": [ + { + "loss": 0.8151603855680482, + "n_samples": 8721 + }, + { + "loss": 0.6867990841792819, + "n_samples": 8721 + }, + { + "loss": 0.645540308540888, + "n_samples": 8721 + }, + { + "loss": 0.5923176541020599, + "n_samples": 8721 + }, + { + "loss": 0.5720762926262872, + "n_samples": 8721 + }, + { + "loss": 0.5477570670417328, + "n_samples": 8721 + }, + { + "loss": 0.5280393017717573, + "n_samples": 8721 + }, + { + "loss": 0.5122504676513313, + "n_samples": 8721 + }, + { + "loss": 0.49667307051028314, + "n_samples": 8721 + }, + { + "loss": 0.486139440352648, + "n_samples": 8721 + }, + { + "loss": 0.4749755339466122, + "n_samples": 8721 + }, + { + "loss": 0.4636757543530298, + "n_samples": 8721 + }, + { + "loss": 0.4543497681877452, + "n_samples": 8721 + }, + { + "loss": 0.4408158337956461, + "n_samples": 8721 + }, + { + "loss": 0.4419790126221837, + "n_samples": 8721 + }, + { + "loss": 0.42850686623585116, + "n_samples": 8721 + }, + { + "loss": 0.41607048387867007, + "n_samples": 8721 + }, + { + "loss": 0.427172136486513, + "n_samples": 8721 + }, + { + "loss": 0.4125568530569382, + "n_samples": 8721 + }, + { + "loss": 0.39480836287767923, + "n_samples": 8721 + }, + { + "loss": 0.3885056775666858, + "n_samples": 8721 + }, + { + "loss": 0.3894976457588827, + "n_samples": 8721 + }, + { + "loss": 0.3890058272899995, + "n_samples": 8721 + }, + { + "loss": 0.3741690826284791, + "n_samples": 8721 + }, + { + "loss": 0.3534914434345719, + "n_samples": 8721 + }, + { + "loss": 0.3349389765134386, + "n_samples": 8721 + }, + { + "loss": 0.32965143874976194, + "n_samples": 8721 + }, + { + "loss": 0.32094062546116675, + "n_samples": 8721 + }, + { + "loss": 0.32526135008251184, + "n_samples": 8721 + }, + { + "loss": 0.31289531808423826, + "n_samples": 8721 + }, + { + "loss": 0.3088379208288558, + "n_samples": 8721 + }, + { + "loss": 0.2994744991261045, + "n_samples": 8721 + }, + { + "loss": 0.2981521815160671, + "n_samples": 8721 + }, + { + "loss": 0.29143649446979303, + "n_samples": 8721 + }, + { + "loss": 0.29075756723379653, + "n_samples": 8721 + } + ], + "val": [ + { + "loss": 0.7625711447683281, + "n_samples": 969 + }, + { + "loss": 0.7092331695236781, + "n_samples": 969 + }, + { + "loss": 0.7014068689723995, + "n_samples": 969 + }, + { + "loss": 0.6595172673863646, + "n_samples": 969 + }, + { + "loss": 0.6312279044905191, + "n_samples": 969 + }, + { + "loss": 0.6349272860831151, + "n_samples": 969 + }, + { + "loss": 0.6587623598744133, + "n_samples": 969 + }, + { + "loss": 0.6093261837651732, + "n_samples": 969 + }, + { + "loss": 0.6125607111474924, + "n_samples": 969 + }, + { + "loss": 0.6005943137518024, + "n_samples": 969 + }, + { + "loss": 0.6876292386783289, + "n_samples": 969 + }, + { + "loss": 0.5940848466228036, + "n_samples": 969 + }, + { + "loss": 0.5820883587079644, + "n_samples": 969 + }, + { + "loss": 0.6302792748938035, + "n_samples": 969 + }, + { + "loss": 0.5849901610914275, + "n_samples": 969 + }, + { + "loss": 0.5830434826428553, + "n_samples": 969 + }, + { + "loss": 0.5643168952858116, + "n_samples": 969 + }, + { + "loss": 0.5592790719340829, + "n_samples": 969 + }, + { + "loss": 0.600335100686833, + "n_samples": 969 + }, + { + "loss": 0.5646457721097674, + "n_samples": 969 + }, + { + "loss": 0.6288956836004376, + "n_samples": 969 + }, + { + "loss": 0.5771863222183704, + "n_samples": 969 + }, + { + "loss": 0.5738056593250687, + "n_samples": 969 + }, + { + "loss": 0.5636531712085593, + "n_samples": 969 + }, + { + "loss": 0.5465074849879163, + "n_samples": 969 + }, + { + "loss": 0.5701294839843508, + "n_samples": 969 + }, + { + "loss": 0.5570075802420438, + "n_samples": 969 + }, + { + "loss": 0.5711473401701241, + "n_samples": 969 + }, + { + "loss": 0.5576858864741552, + "n_samples": 969 + }, + { + "loss": 0.5624132422716871, + "n_samples": 969 + }, + { + "loss": 0.5655298555506272, + "n_samples": 969 + }, + { + "loss": 0.5568078993151677, + "n_samples": 969 + }, + { + "loss": 0.567752199383958, + "n_samples": 969 + }, + { + "loss": 0.5683093779442603, + "n_samples": 969 + }, + { + "loss": 0.5741443767974497, + "n_samples": 969 + } + ] +} \ No newline at end of file diff --git a/scripts/process_external.py b/scripts/process_external.py new file mode 100644 index 0000000..b29229d --- /dev/null +++ b/scripts/process_external.py @@ -0,0 +1,98 @@ +"""外部数据预处理脚本:external -> processed""" + +from pathlib import Path + +import pandas as pd +import typer +from loguru import logger +from sklearn.model_selection import train_test_split + +from lnp_ml.config import EXTERNAL_DATA_DIR, PROCESSED_DATA_DIR +from lnp_ml.dataset import process_external_dataframe, LNPDatasetConfig, get_phys_cols, get_exp_cols, COMP_COLS, HELP_COLS + + +app = typer.Typer() + + +@app.command() +def main( + input_path: Path = EXTERNAL_DATA_DIR / "all_data_LiON.csv", + output_dir: Path = PROCESSED_DATA_DIR, + train_ratio: float = 0.9, + seed: int = 42, +): + """ + 处理外部 LiON 数据,生成预训练用的 parquet 文件。 + + 输出: + - processed/train_pretrain.parquet + - processed/val_pretrain.parquet + - processed/feature_columns_pretrain.txt + """ + logger.info(f"Loading external data from {input_path}") + df = pd.read_csv(input_path) + logger.info(f"Loaded {len(df)} samples") + + # 过滤掉 quantified_delivery 为空的行 + if "quantified_delivery" in df.columns: + before_len = len(df) + df = df[df["quantified_delivery"].notna()].reset_index(drop=True) + logger.info(f"Filtered NaN delivery: {before_len} -> {len(df)} samples") + + # 处理数据(列对齐、one-hot 生成) + logger.info("Processing dataframe (column alignment, one-hot encoding)...") + df = process_external_dataframe(df) + + # 获取所需列 + config = LNPDatasetConfig() + feature_cols = ( + ["smiles"] + + config.comp_cols + + config.phys_cols + + config.help_cols + + config.exp_cols + + ["quantified_delivery"] + ) + + # 只保留需要的列 + available_cols = [c for c in feature_cols if c in df.columns] + missing_cols = [c for c in feature_cols if c not in df.columns] + if missing_cols: + logger.warning(f"Missing columns (will be filled with 0): {missing_cols}") + for col in missing_cols: + df[col] = 0.0 + + df = df[feature_cols] + + # 划分 train/val + logger.info(f"Splitting data: train_ratio={train_ratio}, seed={seed}") + train_df, val_df = train_test_split( + df, train_size=train_ratio, random_state=seed, shuffle=True + ) + train_df = train_df.reset_index(drop=True) + val_df = val_df.reset_index(drop=True) + + logger.info(f"Train samples: {len(train_df)}, Val samples: {len(val_df)}") + + # 保存 + output_dir.mkdir(parents=True, exist_ok=True) + + train_path = output_dir / "train_pretrain.parquet" + val_path = output_dir / "val_pretrain.parquet" + + train_df.to_parquet(train_path, index=False) + val_df.to_parquet(val_path, index=False) + + logger.success(f"Saved train data to {train_path}") + logger.success(f"Saved val data to {val_path}") + + # 保存特征列配置 + cols_path = output_dir / "feature_columns_pretrain.txt" + with open(cols_path, "w") as f: + f.write("\n".join(feature_cols)) + logger.success(f"Saved feature columns to {cols_path}") + + +if __name__ == "__main__": + app() +