Examples
Incremental Learning
Sequential updates with new classes and data.
Basic update (more data for existing classes)
from vyntri import Vyntri
from vyntri.data import split
s = split("./initial_data", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
# Add more images for existing classes
result = model.update("./more_data")
print(f"Samples added: {result.n_samples}")
print(f"New classes: {result.new_classes}") # Empty — all classes existedUpdate with new classes
from vyntri import Vyntri
from vyntri.data import split
s = split("./initial_data", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
print(f"Classes: {list(model.classes_)}") # ['cats', 'dogs']
# Add new classes — detected automatically
result = model.update("./new_classes_data")
print(f"New classes: {result.new_classes}") # ['birds']
print(f"Classes now: {result.classes_after}") # ['birds', 'cats', 'dogs']Multiple sequential updates
from vyntri import Vyntri
from vyntri.data import split
s = split("./data_v1", train=0.7, test=0.2, seed=42)
model = Vyntri()
model.fit(train=s.train, val=s.val)
print(f"After v1: {list(model.classes_)}")
model.update("./data_v2")
print(f"After v2: {list(model.classes_)}")
model.update("./data_v3")
print(f"After v3: {list(model.classes_)}")
# Evaluate at any point
result = model.evaluate("./test_data")
print(f"Accuracy: {result.accuracy:.1%}")Sequential == joint (proven)
from vyntri import Vyntri
from vyntri.data import split
# Approach 1: Sequential updates
model = Vyntri(seed=42)
s1 = split("./data_part1", train=0.7, test=0.2, seed=42)
model.fit(train=s1.train, val=s1.val)
model.update("./data_part2")
model.update("./data_part3")
seq_acc = model.evaluate("./test").accuracy
# Approach 2: Joint refit on all data
joint = Vyntri(seed=42)
joint.fit("./all_data")
joint_acc = joint.evaluate("./test").accuracy
print(f"Sequential: {seq_acc:.3f}")
print(f"Joint: {joint_acc:.3f}")
# These match — sufficient statistics produce the same result