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()
[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
[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
[ ]:
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
[ ]: