Examples

Real-world examples showing how to integrate ARC with different architectures. All examples are runnable after pip install arc-training.

Pattern

ARC follows one universal pattern: create, train as normal, call arc.step(loss). Works with any PyTorch model.

Minimal Example

minimal.py
import torch
import torch.nn as nn
import torch.nn.functional as F
from arc import ArcV2

model = nn.Linear(10, 5)
optimizer = torch.optim.Adam(model.parameters())
arc = ArcV2.auto(model, optimizer)

for epoch in range(100):
    for batch in range(10):
        x = torch.randn(32, 10)
        y = torch.randint(0, 5, (32,))
        optimizer.zero_grad()
        loss = F.cross_entropy(model(x), y)
        loss.backward()
        optimizer.step()
        arc.step(loss)
    arc.end_epoch(epoch)

Image Classification

cnn_example.py
from arc import ArcV2

class SimpleCNN(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
        self.pool = nn.MaxPool2d(2)
        self.fc = nn.Linear(64 * 8 * 8, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        return self.fc(x.view(x.size(0), -1))

model = SimpleCNN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
arc = ArcV2.auto(model, optimizer)

for epoch in range(50):
    for images, labels in train_loader:
        optimizer.zero_grad()
        loss = F.cross_entropy(model(images), labels)
        loss.backward()
        optimizer.step()
        arc.step(loss)
    arc.end_epoch(epoch)

Object Detection

yolo_example.py
class SimpleYOLO(nn.Module):
    def __init__(self, num_classes=80):
        super().__init__()
        self.backbone = nn.Sequential(
            nn.Conv2d(3, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(),
            nn.MaxPool2d(2),
        )
        self.head = nn.Conv2d(64, num_classes + 5, 1)

    def forward(self, x):
        return self.head(self.backbone(x))

model = SimpleYOLO()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
arc = ArcV2.auto(model, optimizer)

for epoch in range(300):
    for images in train_loader:
        optimizer.zero_grad()
        loss = compute_yolo_loss(model(images))
        loss.backward()
        optimizer.step()
        arc.step(loss)
    arc.end_epoch(epoch)

Transformer / NLP

transformer_example.py
class TextClassifier(nn.Module):
    def __init__(self, vocab=10000, d_model=256, nhead=4):
        super().__init__()
        self.emb = nn.Embedding(vocab, d_model)
        self.encoder = nn.TransformerEncoder(
            nn.TransformerEncoderLayer(d_model, nhead, batch_first=True),
            num_layers=2
        )
        self.fc = nn.Linear(d_model, 2)

    def forward(self, x):
        return self.fc(self.encoder(self.emb(x)).mean(dim=1))

model = TextClassifier()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)
arc = ArcV2.auto(model, optimizer)

for epoch in range(10):
    for tokens, labels in dataloader:
        optimizer.zero_grad()
        loss = F.cross_entropy(model(tokens), labels)
        loss.backward()
        optimizer.step()
        arc.step(loss)
    arc.end_epoch(epoch)

Physics-Informed Neural Network

pinn_example.py
from arc import PINNStabilizer

class HeatPINN(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(2, 64), nn.Tanh(),
            nn.Linear(64, 64), nn.Tanh(),
            nn.Linear(64, 1)
        )

    def forward(self, x):
        return self.net(x)

model = HeatPINN()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
stabilizer = PINNStabilizer(model, n_loss_terms=3)

for epoch in range(5000):
    inputs = torch.rand(100, 2, requires_grad=True)
    u = model(inputs)
    pde_loss = compute_pde_residual(u, inputs)
    bc_loss  = compute_boundary_loss(model)
    ic_loss  = compute_initial_loss(model)
    total = stabilizer.get_stabilized_loss([pde_loss, bc_loss, ic_loss])
    optimizer.zero_grad()
    total.backward()
    stabilizer.stabilize_step()
    optimizer.step()
    stabilizer.update(epoch, total)

Continual Learning

continual_learning.py
arc = ArcV2.auto(model, optimizer)

arc.begin_task("mnist")
for epoch in range(10):
    for x, y in mnist_loader:
        optimizer.zero_grad()
        loss = F.cross_entropy(model(x), y)
        loss.backward()
        optimizer.step()
        arc.step(loss)
    arc.end_epoch(epoch)

arc.consolidate_task(mnist_loader)

arc.begin_task("fashion_mnist")
for epoch in range(10):
    for x, y in fashion_loader:
        optimizer.zero_grad()
        loss = F.cross_entropy(model(x), y) + arc.get_ewc_loss()
        loss.backward()
        optimizer.step()
        arc.step(loss)
    arc.end_epoch(epoch)

Uncertainty Quantification

uncertainty.py
from arc import ConformalPredictor

cp = ConformalPredictor(model, alpha=0.1)
cp.calibrate(calibration_loader)

result = cp.predict(test_input)
print(result.prediction, result.confidence, result.set_members)

Adversarial Defense

adversarial.py
from arc import AdversarialDetector

detector = AdversarialDetector(model)
detector.fit(clean_data_loader)

clean_alert = detector.detect(normal_input)
bad_alert = detector.detect(adversarial_input)

print(clean_alert.is_adversarial)
print(bad_alert.is_adversarial)