GR-Neutro — concept-bottleneck model weights
Weights for neutrophil-morphology classification on GR-Neutro (in-house Gustave Roussy peripheral-blood neutrophil corpus; 4,378 cells, 7 abnormality classes, 10 textbook morphology concepts). Backbone: DinoBloom-B (ViT-B/14, 768-d CLS), last-6 blocks fine-tuned for the end-to-end checkpoints.
Code, training/inference/preprocessing instructions: https://github.com/nabilmouadden/biologically-constrained-classification/tree/release/models-code
Download
hf download nabimu9/gr-neutro-cbm-weights --local-dir weights
End-to-end checkpoints
DinoBloom-B last-6 fine-tuned, seed 42, GR-Neutro 7-class test split.
| File | Architecture | Test W-F1 | Macro-F1 | Subset acc. | Multi-seed mean W-F1 |
|---|---|---|---|---|---|
joint_cbm_dinobloomB_ft_s42.pt |
Joint CBM (classifier ∥ concept adapter + constraint) | 0.912 | 0.861 | 0.865 | 0.886 ± 0.014 |
pure_bottleneck_cbm_dinobloomB_ft_s42.pt |
Pure-bottleneck CBM (class only through concepts, λ=2) | 0.909 | 0.862 | 0.847 | ≈ 0.88 |
backbone_baseline_dinobloomB_ft_s42.pt |
No-concept backbone baseline | 0.907 | 0.865 | 0.868 | 0.890 |
cbm_sequential_dinobloomB_ft_s42.pt |
Sequential CBM | 0.873 | 0.804 | 0.756 | — |
cbm_independent_dinobloomB_ft_s42.pt |
Independent CBM | 0.772 | 0.748 | 0.585 | — |
Per-abnormality F1 (seed 42)
| Class (n) | Joint CBM | Pure-bottleneck | Backbone baseline | Sequential | Independent |
|---|---|---|---|---|---|
| Normal (199) | 0.987 | 0.980 | 0.982 | 0.962 | 0.791 |
| Hypogranulation (108) | 0.903 | 0.910 | 0.897 | 0.888 | 0.824 |
| Hyposegmentation (67) | 0.855 | 0.826 | 0.821 | 0.846 | 0.786 |
| Chromatin (35) | 0.694 | 0.750 | 0.719 | 0.429 | 0.437 |
| Hypersegmentation (19) | 0.895 | 0.919 | 0.919 | 0.919 | 0.872 |
| Döhle (19) | 0.848 | 0.757 | 0.848 | 0.743 | 0.684 |
| Hypergranulation (16) | 0.842 | 0.889 | 0.865 | 0.842 | 0.842 |
Each .pt is a torch.save dict with state_dict, args (incl. mode,
unfreeze_last_n, λ's, seed), class_names, concepts, prior_C, normal_idx.
infer.py reads args["mode"] and rebuilds the architecture.
Head checkpoints — heads/
Concept heads trained on a feature bank, seed 42. Test W-F1:
File (heads/) |
Method | Frozen bank | Fine-tuned bank |
|---|---|---|---|
cem_<bank>_s42_head.pt |
CEM (Concept Embedding Model) | 0.844 | 0.936 |
backbone_mlp_<bank>_s42_head.pt |
backbone-MLP reference | 0.832 | 0.935 |
pcbmh_<bank>_s42_head.pt |
PCBM-h (residual CBM, r=10) | 0.823 | 0.928 |
pure_bottleneck_<bank>_s42_head.pt |
pure-bottleneck head | 0.781 | 0.890 |
<bank> ∈ {frozen, ft_last4}. Each .pt holds state_dict,
constructor_kwargs, class_names, concept_names, train_idx, test_idx,
test_wf1. Rebuild with residual_cbm.py's PCBMh / CEM classes.
Feature banks
| File | Content | Shape |
|---|---|---|
dinobloom_b_frozen_features.npz |
Frozen DinoBloom-B CLS features | features (4378, 768), paths |
dinobloom_b_ft_last4_features.npz |
Fine-tuned (last-4) CLS bank, seed 0 | features (4378, 768), paths |
License
CC BY 4.0. Trained weights only; GR-Neutro raw images are not redistributed.