Table of Contents
< annarchy
http://annarchy.readthedocs.io/en/latest/example/NeuralField.html
Richiede pyqtgraph
Esempio ANNarchy 1
Ogni strato (layer) che compone la rete viene detto population
- popInput (20×20 neuroni)
- popFocus (20×20 neuroni)
Ogni popolazione viene realizzata a partire da un modello di neurone diverso
- inputNeuronModel
- focusNeuroModel
Per iniziare
from ANNarchy import *
In questo esempio si ipotizza che la prima popolazione fornisca in input solo un rumore bianco uniforme alla seconda popolazione
Il modello di neurone per popInput prevederà valore positivo, di questa somma:
inputNeuronModel
baseline = 0.0 r = pos(baseline + Uniform(-0.5, 0.5))
Il modello di neurone per popFocus prevederà la somma pesata dei pesi sinpasi eccitatoriee che provengono dalla popInput e inibitorie che provengono da popFocus stesso
FocusNeuronModel
tau = 0 tau * dr/dt + r = sum(exc) + sum(inh) + Uniform(-0.5, 0.5) : min=0.0, max=1.0
- exc sinapsi eccitatori
- inh sinapsi inibitoria
Utilizzare i due modelli per creare due popolazioni
N = 20 popInput = Population(geometry = (N, N), neuron = inputNeuronModel) popFocus = Population(geometry = (N, N), neuron = FocusNeuronModel)
Connessioni
Come per creare le popolazioni si è usato un modello di neurone, anche per creare le connessioni si deve usare un modello di sinapsi (e poi definire il tipo di connessione 1:1)
projff = Projection(pre=inp, post=focus, target='exc') projff.connect_one_to_one(weights=1.0, delays = 20.0)
Sarebbe stato possibile usare un diverso modello di sinapsi per creare le connessioni, dopo target, ma si è usata la sinapsi predefinita… quale sarebbe quella predefinita?….
projlat = Projection(pre=focus, post=focus, target='inh') projlat.connect_dog(amp_pos=0.2, sigma_pos=0.1, amp_neg=0.1, sigma_neg=0.7)
Compilazione e simulazione
Compilare vuole dire tradurre in C++ le formule
compile() step() simulate(1111.0)
la funzione “step” simula solo per 1 ms.
L'ultima riga simula per 1.1 secondi, ma non produce effetti perché mancano gli input
Gli input
Questo codice fornisce un input che si muove su una circonferenza, grazie ad un semplice loop infinito scritto in python
Contemporaneamente alla generazione di input, viene iterata anche la simulazione stessa usando step. Si noterà che un loop in Python fa pena e sarà necessario compilare…
angle = 0.0 x, y = np.meshgrid(np.linspace(0, 19, 20), np.linspace(0, 19, 20)) while True: angle += 1.0/5000.0 # Compute the center of the bubble cx = 10.0 * ( 1.0 + 0.5 * np.cos(2.0 * np.pi * angle ) ) cy = 10.0 * ( 1.0 + 0.5 * np.sin(2.0 * np.pi * angle ) ) # Clamp the bubble into pop.baseline inp.baseline = (np.exp(-((x-cx)**2 + (y-cy)**2)/8.0)) # Simulate for 1 ms step()