Generate rate-based spike trains from normalised float numberΒΆ

We start by importing all relevant libraries.

[4]:

import torch


In practice, the inputs for Spiking Neural Networks are binary values where a 1 at a given time step corresponds to a spike at the corresponding time step.

Below is a simple method that converts an image to a stream of spikes. You will see that the longer the time window we use to convert a static image to spikes, the more accurate the data representation is, as evident from the L2 distance measure.

[5]:

def get_spike_train(time_win, input_image):
input_image = torch.rand(1, 64, 64)
# randomize a tensor accordingly with #time_win per pixel
random_tensor = torch.rand(time_win, 1, 64, 64)
# generating 1 if random number is lower than the pixel value of the input_image
converted_spike_train =  (random_tensor < input_image).float()
# imag_original, is of 64*64 from input_image
img_original = input_image[0]
# img_converted, is the counted spikes over the time_win divided by the time_win
img_converted = converted_spike_train.sum(0)[0]/time_win
# the L2 distance between these two images
dist = torch.dist(img_original, img_converted, 2).item()
print("L2 distance between original image and converted spike trains: ", dist)
return converted_spike_train

# Define a random image
input_image = torch.rand(1, 64, 64)

# Longer time_win results in more precise conversion
time_win_list = [10, 100, 1000]
for time_win in time_win_list:
get_spike_train(time_win, input_image)


L2 distance between original image and converted spike trains:  8.164995193481445
L2 distance between original image and converted spike trains:  2.593313694000244
L2 distance between original image and converted spike trains:  0.8180820941925049

[ ]: