Examples
Inspection & Debugging
Model info, classes, metadata, state, and timing inspection.
Quick model info
from vyntri import Vyntri
from vyntri.data import split
s = split("./my_dataset", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
# repr — compact one-line summary
print(repr(model))
# Vyntri(state='fitted', backbone='mobilenet_v3_small', classes=3, projection=FKProjection)
# summary — full details
print(model.summary())
# Shows: backbone, features, projection, shrinkage, classifier, validation accuracy, timingsWhat classes does the model know?
from vyntri import Vyntri
from vyntri.data import split
s = split("./my_dataset", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
print(model.classes_) # ['cats', 'dogs', 'birds']
print(model.class_to_idx_) # {'cats': 0, 'dogs': 1, 'birds': 2}Feature dimensions
from vyntri import Vyntri
from vyntri.data import split
s = split("./my_dataset", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
print(model.feature_dim_) # 576 (MobileNetV3), 512 (ResNet18), 2048 (ResNet50), 1280 (EfficientNet-B0), 768 (ConvNeXt-Tiny)Validation accuracy
from vyntri import Vyntri
from vyntri.data import split
s = split("./my_dataset", train=0.7, val=0.1, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
print(model.validation_accuracy_) # 0.92 (None if no val set was provided)Fit metadata and timings
from vyntri import Vyntri
from vyntri.data import split
s = split("./my_dataset", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
# Timing breakdown
timings = model.metadata_["timings"]
print(f"Feature extraction: {timings['feature_extraction_s']:.2f}s")
print(f"Projection: {timings['projection_s']:.2f}s")
print(f"Adaptation: {timings['adaptation_s']:.2f}s")
print(f"Total: {timings['total_s']:.2f}s")
# If auto backbone was used
if "selection" in model.metadata_:
sel = model.metadata_["selection"]
print(f"Selected backbone: {sel['selected']}")Config vs fitted_config
from vyntri import Vyntri
from vyntri.data import split
s = split("./my_dataset", train=0.7, val=0.1, test=0.2, seed=42)
model = Vyntri(backbone="auto")
model.fit(train=s.train, val=s.val)
# Current config (mutable)
print(model.config.backbone) # Could be "auto"
# Fitted config (what actually produced this model)
print(model.fitted_config.backbone) # e.g. "resnet18" (what was selected)
# Changing config after fit doesn't affect the current model
model.config.backbone = "resnet50"
print(model.fitted_config.backbone) # Still "resnet18"Model state
from vyntri import Vyntri
from vyntri.data import split
model = Vyntri()
print(model.state) # 'new'
s = split("./my_dataset", train=0.7, test=0.2, seed=42)
model.fit(train=s.train, val=s.val)
print(model.state) # 'fitted'
model.fine_tune(s, scope="last_layer", epochs=3)
print(model.state) # 'fine_tuned'