Circles Example#

[ ]:
# You dont need this, this is for my convinience
import sys
import os
notebook_dir = os.path.dirname(os.getcwd())
sys.path.append(notebook_dir)
[2]:
import numpy as np
import matplotlib.pyplot as plt
from nervos.utils import Module, Parameters, plot_spike_train
from nervos.dataloader import CirclesLoader
[3]:
class Circles_SNN(Module):
    def __init__(self, parameters, identifier=None):
        super().__init__(parameters, identifier)
        self.dataloader: CirclesLoader = CirclesLoader(parameters, (6, 6), (0.04, 0.04))
        self.X_train, self.Y_train = self.dataloader.dataloader(preprocess=True)
        self.X_test, self.Y_test = self.dataloader.dataloader(preprocess=True,train=False)
        self.get_spikeplots = True

    def predict(self, X, model_location):
        spike_probs = self.dataloader.encode_coordinates(X)
        spike_train = self.dataloader.generate_poisson_spikes(
            spike_probs, self.parameters.training_duration
        )
        synapses, neuron_label_map = self.load_model(model_location)
        return self.get_prediction(spike_train, synapses, neuron_label_map)
[4]:
p = Parameters()
p.from_url('https://pastebin.com/raw/qYRUSFeR')
s2 =  Circles_SNN(p,"circles")
s2.initialise_layers(np.array([12,18]))
[5]:
y2 = s2.train()
Epoch 1/3
1000/1000 [========================================]
Testing...
Test set accuracy: 0.995
Time elapsed since training start: 5.819s
Epoch 2/3
1000/1000 [========================================]
Testing...
Test set accuracy: 0.995
Time elapsed since training start: 11.756s
Epoch 3/3
1000/1000 [========================================]
Testing...
Test set accuracy: 0.99
Time elapsed since training start: 17.761s
Training complete!
[6]:
s2.dataloader.plot_rf()
../_images/notebooks_circles_6_0.png
[7]:
colors = ['#%06X' % np.random.randint(0, 0xFFFFFF) for _ in range(18)]
def get_pp(train_idx):
    for j in range(18):
        duration = 200
        potentials:dict = s2.layerpotentials[0][train_idx][0][j]
        actual_potentials =[potentials.get(i,-100) for i in range(1,duration+1)]
        yield actual_potentials

plt.figure(figsize=(10,7))

train_idx = 168
print(f"Output: {s2.Y_train[train_idx]}")
for idx,pot in enumerate(get_pp(train_idx)):
    plt.plot(list(range(1,200+1)),pot,label=f"Neuron {idx+1} ({s2.learned_neuron_label_map[idx]})",color=colors[idx])

plt.plot([0,200],[-55,-55],'k--',label="spike threshold")
plt.legend(loc='upper right', bbox_to_anchor=(1.25, 1))
plt.show()
Output: 0
../_images/notebooks_circles_7_1.png
[9]:
im = 168
ip_layer = s2.spikeplots[0][im][0].T
op_layer = s2.spikeplots[0][im][1].T
print(s2.Y_train[im])
plot_spike_train(ip_layer.T,(-0.5,12.5))
plot_spike_train(op_layer.T,(-0.5,18.5))
0
../_images/notebooks_circles_8_1.png
../_images/notebooks_circles_8_2.png
[ ]:
def accuracy(s2):
    spike_trains,labels = CirclesLoader(p,(6,6),(0.04,0.04)).dataloader(train=False,preprocess=True,seed=1496,size=5000)
    t = 0
    c = 0
    preds = []
    print('Calculating Accuracy')
    for st,label in zip(spike_trains,labels):
        pred = s2.get_prediction(st)
        preds.append(pred)
        if pred == label:
            c+=1
        t+=1
        print(f"\rTested {t} points",end='')
    print()
    print(c/t)
    return labels,preds

y_true,y_pred = accuracy(s2)
Calculating Accuracy
Tested 5000 images
0.994
[ ]: