VyntriVyntri
Examples

Fine-Tuning

Gradient fine-tuning with scope options and when to use it.

Fine-tuning is optional. The analytic pipeline works well on small datasets. Fine-tuning helps when you have more data and need extra accuracy.

Fine-tune last layer (default, safe)

finetune_last_layer.py
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)

# Fine-tune only the classification head (backbone frozen)
# Pass the SplitResult so fine_tune has access to validation data for checkpoint selection
model.fine_tune(s, scope="last_layer", epochs=5)

# Model is now in fine-tuned state
print(model.state)  # 'fine_tuned'

# Evaluate
result = model.evaluate(s.test)
print(f"Accuracy: {result.accuracy:.1%}")

Fine-tune last block (more capacity)

finetune_last_block.py
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)

# Unfreeze the last feature extraction block
model.fine_tune(s, scope="last_block", epochs=10, lr=1e-4)

Fine-tune entire backbone (most capacity)

finetune_full.py
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)

# Unfreeze the entire backbone (needs lots of data, GPU recommended)
model.fine_tune(s, scope="full", epochs=10, lr=1e-5)

When to fine-tune

ScenarioRecommendation
Less than 50 images per classUse analytic only (fine-tuning will overfit)
50-200 images per classTry last_layer fine-tuning
200+ images per classTry last_block or full fine-tuning
No GPU availableUse analytic only (fine-tuning is slow on CPU)