Add new regression and ensemble experiment configurations for V2-M and OrthoBridge

- Introduced multiple regression experiment configurations targeting vf_md, including:
  - cd_solo_reg_set.json: CD tower only regression setup.
  - img_solo_reg_set.json: Image tower only regression setup.
  - reg_head_epoch_sweep.json: Baseline regression sweeps at different epochs (50, 75, 100).
  - reg_head_set.json: Various regression setups including baseline and OrthoBridge configurations.
  - single_eye_reg.json: Single-eye regression setup for worst-eye aggregation analysis.

- Added ensemble configurations for OrthoBridge with different inner bridges:
  - ortho_alts_ensemble.json: Ensemble tests with ConcatBridge, PairwiseAdditiveBridge, and GatedAdditiveBridge.
  - ortho_alts_tritower.json: Tritower tests with the same inner bridges.

- Created V2-M specific configurations:
  - baseline_reg_nt50.json: Regression baseline with V2-M backbone.
  - geom_vec_gt.json and geom_vec_unet.json: Geometry vector injection experiments with V2-M.
  - single_l1_bridges.json: Single-eye ensemble experiments with various bridge types.
  - tritower_geom_gt.json: Tritower setup with GT contour-rasterized masks.

- Promoted existing experiments to higher repetitions for robustness.
This commit is contained in:
rpotter6298
2026-06-11 15:08:20 +02:00
parent 32a801a572
commit 280060db82
343 changed files with 8558 additions and 57747 deletions
@@ -0,0 +1,230 @@
[
{
"_note": "Bridge attention sweep — gated × mobilenet_v2 (ImageNet, weakest off-the-shelf). Per-sample sigmoid gates expose how much each tower contributes. Tests the hypothesis 'as image tower strengthens, bridge downweights clinical'.",
"run_name": "experiments/bridge_attention/gated_mobilenet_v2",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "mobilenet_v2", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Bridge attention sweep — gated × resnet50 (ImageNet weights, NOT refuge-pretrained).",
"run_name": "experiments/bridge_attention/gated_resnet50",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "resnet50", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Bridge attention sweep — gated × efficientnet_b0 (ImageNet).",
"run_name": "experiments/bridge_attention/gated_efficientnet_b0",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "efficientnet_b0", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Bridge attention sweep — gated × efficientnet_v2_m (ImageNet, strongest off-the-shelf).",
"run_name": "experiments/bridge_attention/gated_efficientnet_v2_m",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Bridge attention sweep — gated × refugelike (resnet50 + REFUGE pretrain). Pairs with refugelike fundus-domain prior; tests whether REFUGE-pretrained image tower shifts the bridge's attention compared to its ImageNet-only counterpart.",
"run_name": "experiments/bridge_attention/gated_refugelike",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "refugelike", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Bridge attention sweep — gated × refuge_efficientnet_v2_m (V2-M + REFUGE pretrain, headline production backbone).",
"run_name": "experiments/bridge_attention/gated_refuge_efficientnet_v2_m",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Bridge attention sweep — ortho_w0.1 × mobilenet_v2 (ImageNet). Orthogonality penalty pushes streams to encode different info; per-stream variance-explained is the attention readout.",
"run_name": "experiments/bridge_attention/ortho_mobilenet_v2",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "mobilenet_v2", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Bridge attention sweep — ortho_w0.1 × resnet50 (ImageNet).",
"run_name": "experiments/bridge_attention/ortho_resnet50",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "resnet50", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Bridge attention sweep — ortho_w0.1 × efficientnet_b0 (ImageNet).",
"run_name": "experiments/bridge_attention/ortho_efficientnet_b0",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "efficientnet_b0", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Bridge attention sweep — ortho_w0.1 × efficientnet_v2_m (ImageNet).",
"run_name": "experiments/bridge_attention/ortho_efficientnet_v2_m",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Bridge attention sweep — ortho_w0.1 × refugelike (resnet50 + REFUGE pretrain).",
"run_name": "experiments/bridge_attention/ortho_refugelike",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "refugelike", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Bridge attention sweep — ortho_w0.1 × refuge_efficientnet_v2_m (V2-M + REFUGE pretrain, headline production backbone).",
"run_name": "experiments/bridge_attention/ortho_refuge_efficientnet_v2_m",
"reps": 10,
"overrides": { "save_checkpoints": true, "save_predictions": true },
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,15 @@
[
{
"_note": "ConvNeXt-V2-Tiny vs the resnet50/refugelike img backbone. Otherwise identical to experiments/tri_v1/baseline_ensemble — same ensemble_fused base, binary classification, hb eval.",
"run_name": "experiments/convnext/baseline_convnextv2_tiny",
"reps": 10,
"tower_overrides": {
"img": {
"args": {
"backbone": "convnextv2_tiny",
"freeze_ratio": 0.0
}
}
}
}
]
@@ -0,0 +1,46 @@
[
{
"_note": "Hypothesis 1 — ImageNet pretraining is OOD for fundus; freezing low-level filters helps. Keep tiny but freeze 60% of stages (stem + first 2 of 4 stages).",
"run_name": "experiments/convnext/baseline_convnextv2_tiny_freeze60",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "convnextv2_tiny",
"freeze_ratio": 0.6
}
}
}
},
{
"_note": "Hypothesis 2 — model too big for 330 patients; try the smallest variant.",
"run_name": "experiments/convnext/baseline_convnextv2_atto",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "convnextv2_atto",
"freeze_ratio": 0.0
}
}
}
},
{
"_note": "Hypothesis 3 — LR too high for the bigger model from ImageNet init; halve LR with the tiny backbone unfrozen.",
"run_name": "experiments/convnext/baseline_convnextv2_tiny_lr5e5",
"reps": 3,
"overrides": {
"training": { "lr": 5e-5 }
},
"tower_overrides": {
"img": {
"args": {
"backbone": "convnextv2_tiny",
"freeze_ratio": 0.0
}
}
}
}
]
@@ -0,0 +1,29 @@
[
{
"_note": "EfficientNet-B7 (ImageNet-pretrained, torchvision) vs the refugelike resnet50 img backbone. Otherwise identical to experiments/tri_v1/baseline_ensemble.",
"run_name": "experiments/efficientnet/baseline_efficientnet_b7",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "efficientnet_b7",
"freeze_ratio": 0.0
}
}
}
},
{
"_note": "Same architecture, freeze the first 40% of B7 blocks (keep low-level ImageNet filters fixed since fundus is out-of-distribution).",
"run_name": "experiments/efficientnet/baseline_efficientnet_b7_freeze40",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "efficientnet_b7",
"freeze_ratio": 0.4
}
}
}
}
]
@@ -0,0 +1,43 @@
[
{
"_note": "EfficientNetV2-S (ImageNet, torchvision). 20M params, 1280-dim output. Direct comparison to B7 unfrozen (0.9015 test AUC).",
"run_name": "experiments/efficientnet/baseline_efficientnetv2_s",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "efficientnet_v2_s",
"freeze_ratio": 0.0
}
}
}
},
{
"_note": "EfficientNetV2-S + freeze 0.4. Applies the lesson from refugelike_freeze_sweep — anchoring low-level filters from ImageNet pretraining.",
"run_name": "experiments/efficientnet/baseline_efficientnetv2_s_freeze40",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "efficientnet_v2_s",
"freeze_ratio": 0.4
}
}
}
},
{
"_note": "EfficientNetV2-M (53M params). Mid-size variant; tests whether extra capacity helps or overfits on PAPILA.",
"run_name": "experiments/efficientnet/baseline_efficientnetv2_m",
"reps": 3,
"tower_overrides": {
"img": {
"args": {
"backbone": "efficientnet_v2_m",
"freeze_ratio": 0.0
}
}
}
}
]
@@ -0,0 +1,15 @@
[
{
"_note": "REFUGE-pretrained EfficientNetV2-M (whole-image, no UNet/disc crop) vs ImageNet-pretrained V2-M (0.9029) and refugelike resnet50 (0.8958). Tests whether fundus-domain pretraining beats ImageNet for V2-M.",
"run_name": "experiments/efficientnet/refuge_efficientnetv2_m",
"reps": 10,
"tower_overrides": {
"img": {
"args": {
"backbone": "refuge_efficientnet_v2_m",
"freeze_ratio": 0.0
}
}
}
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "10-rep checkpointed run of the production bilateral img+cd ensemble at refuge_efficientnet_v2_m. Per-fold tower and stage_models state_dicts saved under each rep's checkpoints/foldN/ directory. Used for F8 explainability — reconstructing per-tower predictions at the nt (eye) and hb (patient) levels so we can compare img-tower-only, cd-tower-only, eye-fusion, and patient-fusion outputs.",
"run_name": "experiments/explainability/ensemble_v2m_ckpt",
"reps": 10
}
]
@@ -0,0 +1,28 @@
[
{
"_note": "refugelike (resnet50 + REFUGE fundus pretraining), freeze stem only (1/5 blocks). Tests whether even minimal anchoring helps stability.",
"run_name": "experiments/freeze_sweep/refugelike_freeze20",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refugelike", "freeze_ratio": 0.2 } }
}
},
{
"_note": "Freeze stem + layer1 (2/5 blocks). Keeps low-level conv filters fixed, lets layers 2-4 + fc adapt. Bumped to 10 reps to confirm the 0.9105 result vs the 10-rep baseline_ensemble at 0.8958.",
"run_name": "experiments/freeze_sweep/refugelike_freeze40",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refugelike", "freeze_ratio": 0.4 } }
}
},
{
"_note": "Freeze stem + layer1 + layer2 (3/5 blocks). Only the deep semantic layers adapt — most aggressive practical setting before model loses capacity.",
"run_name": "experiments/freeze_sweep/refugelike_freeze60",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refugelike", "freeze_ratio": 0.6 } }
}
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "Single-eye cd-only at refugelike (no img tower). 10 reps. For Figure 2 cd column. Pairs with img_solo_single_refugelike and ensemble_single_refugelike to complete the single-mode tower-ablation cascade.",
"run_name": "experiments/phase2_v4/cd_solo_single",
"reps": 10
}
]
@@ -0,0 +1,37 @@
[
{
"_note": "PAPILA paper backbone replication — VGG16, single-eye img-only, ImageNet-pretrained (no fundus pretraining). For Figure 2 anchor row.",
"run_name": "experiments/phase2_v4/papila_backbones/vgg16",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "vgg16", "freeze_ratio": 0.0 } }
}
},
{
"_note": "DenseNet121 ImageNet-pretrained, no fundus.",
"run_name": "experiments/phase2_v4/papila_backbones/densenet121",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "densenet121", "freeze_ratio": 0.0 } }
}
},
{
"_note": "MobileNetV2 ImageNet-pretrained, no fundus.",
"run_name": "experiments/phase2_v4/papila_backbones/mobilenet_v2",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "mobilenet_v2", "freeze_ratio": 0.0 } }
}
},
{
"_note": "InceptionV3 ImageNet-pretrained, no fundus. (Note: 299x299 native; pipeline uses 224 — note in figure caption.)",
"run_name": "experiments/phase2_v4/papila_backbones/inception_v3",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "inception_v3", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,27 @@
[
{
"_note": "Single-eye img+cd ensemble at refugelike with PairwiseAdditiveBridge at nt (eye-level fusion). For F3 confidence-strip panel expansion.",
"run_name": "experiments/phase3_v4/single_bcd_pairwise",
"reps": 10,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.pairwise_bridge",
"class": "PairwiseAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Single-eye img+cd ensemble at refugelike with GatedAdditiveBridge at nt.",
"run_name": "experiments/phase3_v4/single_bcd_gated",
"reps": 10,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
}
]
@@ -0,0 +1,39 @@
[
{
"_note": "Single-eye + all_losses + Hadamard FusionBridge. Pairs with the in-flight ensemble_single_refugelike (single+BCD+Hadamard) to isolate the BCD-vs-all-losses effect. v3 phase 3 originally showed BCD generalizes better; this re-establishes it in v4.",
"run_name": "experiments/phase3_v4/single_all_losses_hadamard",
"reps": 10,
"overrides": {
"training": { "tower_loss_mode": "all_losses" }
}
},
{
"_note": "Single-eye + BCD + ConcatBridge. Pairs with in-flight baseline (single+BCD+Hadamard) to isolate the bridge effect. Justifies why we use FusionBridge (Hadamard) as default.",
"run_name": "experiments/phase3_v4/single_bcd_concat",
"reps": 10,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.concat_bridge",
"class": "ConcatBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Single-eye + all_losses + ConcatBridge. Fourth cell of the BCD-vs-all-losses × Hadamard-vs-Concat 2x2.",
"run_name": "experiments/phase3_v4/single_all_losses_concat",
"reps": 10,
"overrides": {
"training": { "tower_loss_mode": "all_losses" }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.concat_bridge",
"class": "ConcatBridge",
"args": { "fusion_dim": 256 }
}
}
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "Bilateral cd-only at refugelike. 10 reps. For Figure 4 bilateral cd column. Pairs with phase2_v4/cd_solo_single (single-eye) to show whether the bilateral hb fusion improves a pure-clinical model.",
"run_name": "experiments/phase4_v4/cd_solo_bilateral",
"reps": 10
}
]
@@ -0,0 +1,12 @@
[
{
"_note": "Bilateral img+cd ensemble at refugelike with HyperBridge mode = classic_bridge (Hadamard per-side projection + product) instead of the default embedding_mlp (concat + linear). For Figure 4 inset showing the bilateral-fusion bridge choice doesn't materially change the patient-level result.",
"run_name": "experiments/phase4_v4/ensemble_hb_classic_bridge",
"reps": 10,
"stage_overrides": {
"hb": {
"args": { "hidden_dim": 256, "mode": "classic_bridge" }
}
}
}
]
@@ -0,0 +1,10 @@
[
{
"_note": "Tritower (img+cd+geom) with the geom tower fed GT contour-rasterized masks instead of UNet predictions. Completes the geometry panel by disentangling 'GT signal is what matters' from 'vector form is what matters'. 10 reps at refugelike.",
"run_name": "experiments/phase6_v4/tritower_geom_gt",
"reps": 10,
"tower_overrides": {
"geom": { "args": { "seg_source": "gt" } }
}
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "Geometry-vector injection from UNet-derived segmentation, bumped to 10 reps to round out the refugelike geometry panel alongside ensemble_fused/no_geom (0.8979, n=10), ensemble_fused/geom_gt (0.9121, n=10), tri_v1/baseline_tri (0.8932, n=10), and tri_v1/baseline_solo (0.6833, n=10). Use the existing ensemble_fused_geom_unet.json base config which already wires up the EPC geometry_vectors channel.",
"run_name": "experiments/phase6_v4/ensemble_geom_vec_unet",
"reps": 10
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "Clinical-only floor reference under the new baseline framework. No img backbone change since there is no img tower.",
"run_name": "experiments/refuge_v2m_baseline/cd_solo",
"reps": 3
}
]
@@ -0,0 +1,149 @@
[
{
"_note": "Ortho-wrapped Hadamard at w=0.1 — best ortho weight from prior sweep. Bumped to 10 reps after 3-rep showed +0.009 vs anchor.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_ortho_w0.1",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "ConcatBridge alternative to Hadamard.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_concat",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.concat_bridge",
"class": "ConcatBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "PairwiseAdditiveBridge — for N=2 streams this reduces to ≈ FusionBridge additive=True. Bumped to 10 reps after 3-rep showed +0.017 vs anchor (but with a suspicious val/test gap).",
"run_name": "experiments/refuge_v2m_baseline/ensemble_pairwise",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.pairwise_bridge",
"class": "PairwiseAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "GatedAdditiveBridge — per-sample sigmoid gates over each stream.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_gated",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "Ortho w=0.1 wrapping ConcatBridge inner.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_ortho_concat_w0.1",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.concat_bridge",
"inner_class": "ConcatBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Ortho w=0.1 wrapping PairwiseAdditiveBridge inner.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_ortho_pairwise_w0.1",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.pairwise_bridge",
"inner_class": "PairwiseAdditiveBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Ortho w=0.1 wrapping GatedAdditiveBridge inner.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_ortho_gated_w0.1",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.gated_bridge",
"inner_class": "GatedAdditiveBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Bottleneck (fusion_dim=8) — tests whether the new backbone still survives aggressive compression.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_bottleneck",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": { "args": { "fusion_dim": 8 } }
}
}
]
@@ -0,0 +1,19 @@
[
{
"_note": "Geometry-vector injection (GT contours, EPC) added to img+cd ensemble at refuge V2-M backbone. Replaces refugelike's ensemble_fused/geom_gt (0.9121) at the new backbone. For the geometry panel.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_geom_vec_gt",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
},
{
"_note": "Geometry-vector injection via UNet-derived geometry (not GT). Same architecture; uses the per-fold-finetuned UNet segmenter EPC channel. Tests whether GT vs predicted segmentation matters under the new backbone.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_geom_vec_unet",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,10 @@
[
{
"_note": "Image-only (no cd) at the new refuge_efficientnet_v2_m baseline. 10 reps — definite test, establishes how much cd contributes to the ensemble.",
"run_name": "experiments/refuge_v2m_baseline/img_solo",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "Bilateral img-only with refugelike — missing corner of the img_solo single-vs-bilateral × refugelike-vs-V2M grid. (Bilateral V2-M already exists at 0.8923.)",
"run_name": "experiments/refuge_v2m_baseline/img_solo_bilateral_refugelike",
"reps": 10
}
]
@@ -0,0 +1,16 @@
[
{
"_note": "Single-eye ensemble (img+cd, eval at nt) under the original refugelike backbone. Pairs with tri_v1/baseline_ensemble (bilateral, 0.8958 ± 0.017 at 10 reps) to standardize the v3 single-vs-bilateral comparison.",
"run_name": "experiments/refuge_v2m_baseline/ensemble_single_refugelike",
"reps": 10
},
{
"_note": "Single-eye ensemble under the new refuge V2-M backbone. Pairs with efficientnet/refuge_efficientnetv2_m (bilateral, 0.9132 ± 0.019 at 10 reps).",
"run_name": "experiments/refuge_v2m_baseline/ensemble_single_refuge_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,16 @@
[
{
"_note": "Single-eye img-only (eval at img_fuse) under the original refugelike backbone. Goes with img_solo_bilateral_refugelike below to fill the 2x2 grid.",
"run_name": "experiments/refuge_v2m_baseline/img_solo_single_refugelike",
"reps": 10
},
{
"_note": "Single-eye img-only under the new refuge V2-M backbone. Pairs with refuge_v2m_baseline/img_solo (bilateral, 0.8923 ± 0.018 at 10 reps).",
"run_name": "experiments/refuge_v2m_baseline/img_solo_single_refuge_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,44 @@
[
{
"_note": "Tritower (img + cd + geom) at the new img backbone. 10 reps — definite test, establishes whether the geom tower adds value over img+cd.",
"run_name": "experiments/refuge_v2m_baseline/tritower",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
},
{
"_note": "Tritower + OrthoBridge w=0.1 (best ortho weight from earlier sweep) wrapping Hadamard inner. Bumped to 10 reps after 3-rep showed 0.9059 with tight std — wanted to confirm against plain tritower's 0.9040.",
"run_name": "experiments/refuge_v2m_baseline/tritower_ortho_w0.1",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{
"_note": "Tritower + bottleneck (fusion_dim=8) — tests whether the strong img backbone can survive aggressive bottlenecking.",
"run_name": "experiments/refuge_v2m_baseline/tritower_bottleneck",
"reps": 3,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": { "args": { "fusion_dim": 8 } }
}
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "CD tower only, regression. Ablation vs baseline_reg_nt50 to isolate the contribution of clinical data.",
"run_name": "experiments/reg_head/cd_solo_reg",
"reps": 3
}
]
@@ -0,0 +1,7 @@
[
{
"_note": "Image tower only, regression. Ablation vs baseline_reg_nt50 to isolate the contribution of fundus images.",
"run_name": "experiments/reg_head/img_solo_reg",
"reps": 3
}
]
@@ -0,0 +1,97 @@
[
{
"_note": "baseline_reg at nt=50 (vs default 36). All heads regression on vf_md, label_filter expanded to [0,1,2]. Bumped to 10 reps for final regression-head reporting + 3-bin severity confusion matrix.",
"run_name": "experiments/reg_head/baseline_reg_nt50",
"reps": 10,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"nt": { "epochs": 50 },
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
},
{
"_note": "baseline_reg at nt=75",
"run_name": "experiments/reg_head/baseline_reg_nt75",
"reps": 3,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"nt": { "epochs": 75 },
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
},
{
"_note": "baseline_reg at nt=100",
"run_name": "experiments/reg_head/baseline_reg_nt100",
"reps": 3,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"nt": { "epochs": 100 },
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
}
]
@@ -0,0 +1,116 @@
[
{
"_note": "1) Baseline classification — sanity check that the runner refactor didn't break anything. Should match baseline_ensemble at 0.896.",
"run_name": "experiments/reg_head/baseline_class",
"reps": 3
},
{
"_note": "2) Same architecture as baseline, but all heads (img_aux, cd_aux, nt_head, hb_head) are regression heads targeting vf_md. label_filter expanded to include suspect patients (label=2) since regression handles continuous targets naturally.",
"run_name": "experiments/reg_head/baseline_reg",
"reps": 3,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
},
{
"_note": "3) OrthoBridge (w=0.1) wrapping Hadamard inner + regression heads",
"run_name": "experiments/reg_head/ortho_reg",
"reps": 3,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
},
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
},
{
"_note": "4) PairwiseAdditiveBridge + regression heads",
"run_name": "experiments/reg_head/pairwise_reg",
"reps": 3,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.pairwise_bridge",
"class": "PairwiseAdditiveBridge",
"args": { "fusion_dim": 256 }
},
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
}
]
@@ -0,0 +1,28 @@
[
{
"_note": "Single-eye regression at nt=50, refugelike backbone. Eye-level fusion (no hb), regression heads predicting per-eye vf_md. Pairs with the bilateral baseline_reg_nt50 (mean-of-eyes target, hb fusion) for the worst-eye aggregation analysis: predict per-eye MD at nt, then aggregate to patient-level via min(OD_pred, OS_pred).",
"run_name": "experiments/reg_head/single_eye_reg_nt50",
"reps": 10,
"overrides": {
"label_filter": [0, 1, 2]
},
"stage_overrides": {
"nt": { "epochs": 50 },
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
}
]
@@ -0,0 +1,48 @@
[
{ "_note": "OrthoBridge (w=0.1) wrapping ConcatBridge — img+cd ensemble. Generality test for ortho across alternative inner bridges. 3 reps each.",
"run_name": "experiments/tri_v1/ortho_alts/ensemble_concat_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.concat_bridge",
"inner_class": "ConcatBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho_alts/ensemble_pairwise_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.pairwise_bridge",
"inner_class": "PairwiseAdditiveBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho_alts/ensemble_gated_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.gated_bridge",
"inner_class": "GatedAdditiveBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,48 @@
[
{ "_note": "OrthoBridge (w=0.1) wrapping ConcatBridge — img+cd+geom tritower. Generality test for ortho across alternative inner bridges. 3 reps each.",
"run_name": "experiments/tri_v1/ortho_alts/tritower_concat_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.concat_bridge",
"inner_class": "ConcatBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho_alts/tritower_pairwise_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.pairwise_bridge",
"inner_class": "PairwiseAdditiveBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho_alts/tritower_gated_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.gated_bridge",
"inner_class": "GatedAdditiveBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,64 @@
[
{ "_note": "OrthoBridge wrapping Hadamard FusionBridge, img+cd ensemble. Sweep ortho_weight ∈ {0.01, 0.1, 1.0, 10.0}. 3 reps each.",
"run_name": "experiments/tri_v1/ortho/ensemble_w0.01", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.01,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho/ensemble_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho/ensemble_w1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 1.0,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho/ensemble_w10", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 10.0,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,64 @@
[
{ "_note": "OrthoBridge wrapping Hadamard FusionBridge, img+cd+geom tritower. Sweep ortho_weight ∈ {0.01, 0.1, 1.0, 10.0}. 3 reps each.",
"run_name": "experiments/tri_v1/ortho/tritower_w0.01", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.01,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho/tritower_w0.1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho/tritower_w1", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 1.0,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
},
{ "run_name": "experiments/tri_v1/ortho/tritower_w10", "reps": 3,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 10.0,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,20 @@
[
{
"_note": "Promote ortho_w0.1 ensemble to 10 reps. First 3 will be skipped (results exist).",
"run_name": "experiments/tri_v1/ortho/ensemble_w0.1",
"reps": 10,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,20 @@
[
{
"_note": "Promote ortho_w0.1 tritower to 10 reps. First 3 will be skipped (results exist).",
"run_name": "experiments/tri_v1/ortho/tritower_w0.1",
"reps": 10,
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.ortho_bridge",
"class": "OrthoBridge",
"args": {
"fusion_dim": 256,
"ortho_weight": 0.1,
"inner_module": "v4.classes.bridges.fusion_bridge",
"inner_class": "FusionBridge",
"inner_args": { "fusion_dim": 256 }
}
}
}
}
]
@@ -0,0 +1,36 @@
[
{
"_note": "F6 V2-M: regression baseline_reg_nt50 at refuge V2-M. Same architecture as reg_head/baseline_reg_nt50 but with the V2-M backbone in place of refugelike.",
"run_name": "experiments/v2m_variants/baseline_reg_nt50_v2m",
"reps": 10,
"overrides": {
"label_filter": [0, 1, 2]
},
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": { "epochs": 50 },
"img_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"cd_aux": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"nt_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
},
"hb_head": {
"module": "v4.classes.heads.regression",
"class": "RegressionHead",
"args": { "dropout": 0.3, "target_key": "vf_md", "loss": "mse" }
}
}
}
]
@@ -0,0 +1,10 @@
[
{
"_note": "S1 V2-M: ensemble + GT geometry vector injection at refuge V2-M. Pairs with ensemble_fused/geom_gt (refugelike) for cross-backbone geometry view.",
"run_name": "experiments/v2m_variants/ensemble_geom_vec_gt_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,10 @@
[
{
"_note": "S1 V2-M: ensemble + UNet-derived geometry vector injection at refuge V2-M.",
"run_name": "experiments/v2m_variants/ensemble_geom_vec_unet_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
}
}
]
@@ -0,0 +1,49 @@
[
{
"_note": "F3 V2-M variant: single-eye img+cd ensemble at refuge V2-M with ConcatBridge at nt. Pairs with phase3_v4/single_bcd_concat (refugelike) for the cross-backbone view.",
"run_name": "experiments/v2m_variants/single_bcd_concat_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.concat_bridge",
"class": "ConcatBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "F3 V2-M: single-eye PairwiseAdditiveBridge at refuge V2-M.",
"run_name": "experiments/v2m_variants/single_bcd_pairwise_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.pairwise_bridge",
"class": "PairwiseAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
},
{
"_note": "F3 V2-M: single-eye GatedAdditiveBridge at refuge V2-M.",
"run_name": "experiments/v2m_variants/single_bcd_gated_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } }
},
"stage_overrides": {
"nt": {
"module": "v4.classes.bridges.gated_bridge",
"class": "GatedAdditiveBridge",
"args": { "fusion_dim": 256 }
}
}
}
]
@@ -0,0 +1,11 @@
[
{
"_note": "S1 V2-M: tritower (img+cd+geom) with the geom tower fed GT contour-rasterized masks, at refuge V2-M. Pairs with phase6_v4/tritower_geom_gt (refugelike) and refuge_v2m_baseline/tritower (V2-M, UNet seg).",
"run_name": "experiments/v2m_variants/tritower_geom_gt_v2m",
"reps": 10,
"tower_overrides": {
"img": { "args": { "backbone": "refuge_efficientnet_v2_m", "freeze_ratio": 0.0 } },
"geom": { "args": { "seg_source": "gt" } }
}
}
]