# Sinabs#

Sinabs is a deep learning library for spiking neural networks which is based on PyTorch and focuses on fast training as well as inference on neuromorphic hardware.

`sinabs.to_nir`

and `sinabs.from_nir`

methods allow you to seemlessly navigate between `nir`

and `sinabs`

. Once your model is in sinabs, you can use this model to train or directly deploy your models to Speck/DynapCNN.

## Import a NIR graph to Sinabs#

```
import torch
from sinabs import from_nir
import nir
# Create a NIR graph
affine_weights = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
affine_bias = torch.tensor([1.0, 2.0])
li_tau = torch.tensor([0.9, 0.8])
li_r = torch.tensor([1.0, 1.0])
li_v_leak = torch.tensor([0.0, 0.0])
nir_network = nir.NIRGraph.from_list(
nir.Affine(affine_weights, affine_bias), nir.LI(li_tau, li_r, li_v_leak)
)
# Create Sinabs model from NIR graph.
# You need to define the batch size because Sinabs will use Squeeze
# versions of layers by default.
sinabs_model = from_nir(nir_network, batch_size=10)
print(sinabs_model)
```

## Export a NIR graph from Sinabs#

```
import sinabs.layers as sl
import torch
import torch.nn as nn
from sinabs import from_nir, to_nir
batch_size = 4
# Create Sinabs model
orig_model = nn.Sequential(
torch.nn.Linear(10, 2),
sl.ExpLeakSqueeze(tau_mem=10.0, batch_size=batch_size),
sl.LIFSqueeze(tau_mem=10.0, batch_size=batch_size),
torch.nn.Linear(2, 1),
)
# Convert model to NIR graph with a random input of representative shape
nir_graph = to_nir(orig_model, torch.randn(batch_size, 10))
print(nir_graph)
# Reload sinabs model from NIR
sinabs_model = from_nir(nir_graph, batch_size)
```