Model Zoo¶
To see all available presets:
from slide2vec import list_models
list_models() # all presets
list_models("tile") # tile-level only
list_models("slide") # slide-level only
Tile-level encoders¶
Preset |
Model |
Output dim |
Spacing (um) |
Notes |
|---|---|---|---|---|
|
384 |
|
Kang et al. (2023) |
|
|
384 |
|
Grisi et al. (2026) |
|
|
512 |
|
Lu et al. (2024) |
|
|
768 |
|
Filiot et al. (2023) |
|
|
768 |
|
Lu et al. (2024) |
|
|
768 |
|
Nechaev et al. (2024) |
|
|
768 / 1536 |
|
Filiot et al. (2024) |
|
|
1024 |
|
Filiot et al. (2024) |
|
|
1024 |
|
Nechaev et al. (2024) |
|
|
1024 |
|
Chen et al. (2024) |
|
|
1024 / 2048 |
|
Xiang et al. (2024) |
|
|
1280 / 2560 |
|
Vorontsov et al. (2024) |
|
|
1280 / 2560 |
|
Zimmermann et al. (2024) |
|
|
1536 |
|
Chen et al. (2024) |
|
|
1536 |
|
Xu et al. (2024) |
|
|
1536 |
|
Saillard et al. (2024) |
|
|
1536 |
|
Saillard et al. (2024) |
|
|
3072 |
|
Karasikov et al. (2025) |
Slide-level encoders¶
Patient-level encoders¶
Patient-level encoders aggregate multiple slide embeddings for the same patient
into a single patient-level embedding. They require a patient_id column in
the input manifest csv (or patient_id keys in each slide dict when using
the Python API).
Preset |
Model |
Tile encoder |
Spacing (um) |
Output dim |
Notes |
|---|---|---|---|---|---|
|
|
|
768 |
Kotp et al. (2026) |
Custom registry-backed encoders¶
If you want to use a model that is not shipped with slide2vec, wrap it in
an encoder class and register it under a new preset name.
Tile encoder example¶
import torch
from torch import Tensor
from slide2vec.encoders import TileEncoder
from slide2vec.encoders import register_encoder, resolve_requested_output_variant
@register_encoder(
"my-tile-model",
output_variants={"default": {"encode_dim": 768}},
default_output_variant="default",
input_size=224,
supported_spacing_um=0.5,
precision="fp16",
source="my-org/my-tile-model",
)
class MyTileModel(TileEncoder):
def __init__(self, *, output_variant: str | None = None):
self._output_variant = resolve_requested_output_variant(output_variant)
self._device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
self._model = self._load_model().eval()
def _load_model(self):
...
def get_transform(self):
...
def encode_tiles(self, batch: Tensor) -> Tensor:
return self._model(batch)
@property
def encode_dim(self) -> int:
return 768
@property
def device(self) -> torch.device:
return self._device
def to(self, device: torch.device | str):
self._device = torch.device(device)
self._model = self._model.to(self._device)
return self
Once the module is imported, the preset is available through the existing API:
from slide2vec import Model
model = Model.from_preset("my-tile-model")
Slide encoder example¶
import torch
from torch import Tensor
from slide2vec.encoders import SlideEncoder
from slide2vec.encoders import register_encoder, resolve_requested_output_variant
@register_encoder(
"my-slide-model",
level="slide",
tile_encoder="my-tile-model",
tile_encoder_output_variant="default",
output_variants={"default": {"encode_dim": 512}},
default_output_variant="default",
supported_spacing_um=0.5,
precision="fp16",
source="my-org/my-slide-model",
)
class MySlideModel(SlideEncoder):
def __init__(self, *, output_variant: str | None = None):
self._output_variant = resolve_requested_output_variant(output_variant)
self._device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
self._model = self._load_model().eval()
def _load_model(self):
...
@property
def encode_dim(self) -> int:
return 512
@property
def device(self) -> torch.device:
return self._device
def to(self, device: torch.device | str):
self._device = torch.device(device)
self._model = self._model.to(self._device)
return self
def encode_slide(
self,
tile_features: Tensor,
coordinates: Tensor | None = None,
*,
tile_size_lv0: int | None = None,
) -> Tensor:
return self._model(tile_features)