Output Monitoring#
How to Read The Vmem of the Neurons#
Samna provide a type of event called samna.xxx.event.ReadNeuronValue
to help us read the membrane potential of neurons.
Here we give an example on Speck2f.
from torch import nn
from sinabs.layers import IAFSqueeze
from sinabs.backend.dynapcnn import DynapcnnNetwork
from sinabs.backend.dynapcnn.io import calculate_neuron_address, neuron_address_to_cxy
import samna
SNN = nn.Sequential(
nn.Conv2d(1, 2, kernel_size=(1, 1), bias=False),
IAFSqueeze(batch_size=1, min_v_mem=-1.0),
nn.Conv2d(2, 2, kernel_size=(1, 1), bias=False),
IAFSqueeze(batch_size=1, min_v_mem=-1.0),
nn.Conv2d(2, 4, kernel_size=(1, 1), bias=False),
IAFSqueeze(batch_size=1, min_v_mem=-1.0),
)
# deploy the snn to the devkit
dynapcnn = DynapcnnNetwork(snn=SNN, input_shape=(1, 16, 16), dvs_input=False)
dynapcnn.to(device="speck2fmodule")
# create ReadNeuronValue events as input
input_events = []
layers = [0, 1, 2]
x_list = [1, 1, 2]
y_list = [1, 1, 2]
channel = 0
for layer, x, y in zip(layers, x_list, y_list):
address = calculate_neuron_address(x=x, y=y, c=channel, feature_map_size=(2, 16, 16))
ev = samna.speck2f.event.ReadNeuronValue()
ev.address = address
ev.layer = layer
input_events.append(ev)
# send the input to the devkit
output_events = dynapcnn(input_events)
# check the output
for ev in output_events:
address = ev.address
c, x, y = neuron_address_to_cxy(address, feature_map_size=(2, 16, 16))
layer = ev.layer
vmem = ev.neuron_state
print(f"vmem of layer {layer} at channel={c}, x={x}, y={y} is {vmem}!")