Quick StartΒΆ
First define your computation as a nn.Module
and wrap it using
auto_LiRPA.BoundedModule()
. Then, you can call the compute_bounds
function
to obtain certified lower and upper bounds under input perturbations:
from auto_LiRPA import BoundedModule, BoundedTensor, PerturbationLpNorm
# Define computation as a nn.Module.
class MyModel(nn.Module):
def forward(self, x):
# Define your computation here.
model = MyModel()
my_input = load_a_batch_of_data()
# Wrap the model with auto_LiRPA.
model = BoundedModule(model, my_input)
# Define perturbation. Here we add Linf perturbation to input data.
ptb = PerturbationLpNorm(norm=np.inf, eps=0.1)
# Make the input a BoundedTensor with the pre-defined perturbation.
my_input = BoundedTensor(my_input, ptb)
# Regular forward propagation using BoundedTensor works as usual.
prediction = model(my_input)
# Compute LiRPA bounds using the backward mode bound propagation (CROWN).
lb, ub = model.compute_bounds(x=(my_input,), method="backward")
Checkout examples/vision/simple_verification.py for a complete but very basic example.
We also provide a Google Colab Demo including an example of computing verification bounds for a 18-layer ResNet model on CIFAR-10 dataset. Once the ResNet model is defined as usual in Pytorch, obtaining provable output bounds is as easy as obtaining gradients through autodiff. Bounds are efficiently computed on GPUs.