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)
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)
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)
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
| Scenario | Recommendation |
|---|---|
| Less than 50 images per class | Use analytic only (fine-tuning will overfit) |
| 50-200 images per class | Try last_layer fine-tuning |
| 200+ images per class | Try last_block or full fine-tuning |
| No GPU available | Use analytic only (fine-tuning is slow on CPU) |