I am working on implementing a cortex model from this paper: Computational model of prefrontal cortex
The architecture from the paper is a little similar to @mstimberg s Brian2 online tutorial project and in this paper it is constructed using neural networks.
Input Layer has the stimulus which flows into the Memory Layer (provides inhibition) which has recurrent connections for sustained activity. The Output Layer detects the target.
The layer connectivity from the paper is defined as:
Units in the input module make excitatory connections on the response module,
both directly and indirectly through the memory module. Lateral inhibition within
each layer produces competition for representations. Activity from the cue stimulus
flows to the memory module, which is responsible for maintaining a trace of the
relevant context in each trial. Units in the memory module have self-excitatory
connections, which allow for the activity generated by the cue to be sustained in
the absence of input. The recurrent connectivity utilized by each unit in this module
is assumed to be a simpler, but formally equivalent analogue of a fully connected
recurrent cell assembly.
My understanding from this and the architecture diagram is that we need to define the following synapses:
- Input â Input
- Input â Memory
- Input â Output
- Memory â Memory
- Memory â Output
- Output â Output
I am using two 5 X 5 matrices as Input and pass them via PoissonGroup
. I have used STDP as a learning rule and this is not given in the paper.
I have the following LIF equations:
# Excitatory
exc_lif_eqs = ''''
dv/dt = -((v - El) - (g_exc * (v - E_exc) / volt) - (g_inh * (v - E_inh) / volt))/taum : volt
dg_exc/dt = -g_exc/taue: volt
dg_inh/dt = -g_inh/taui: volt
'''
# Inhibitory
inh_lif_eqs = '''
dv/dt = -((v - El) - (g_exc * (v - E_exc) / volt) - (g_inh * (v - E_inh) / volt))/taum : volt
dg_inh/dt = -g_inh/taui: volt
dg_exc/dt = -g_exc/taue: volt
# Synapse definitions:
# Input to Memory
Syn_inp_mem = b2.Synapses(inp ,
mem ,
model =
''' w: volt
da_src/dt = -a_src/tau_pre : volt (clock-driven)
da_tgt/dt = -a_tgt/tau_post : volt (clock-driven)
''' ,
on_pre = '''
g_exc += w
a_src += A_pre * mV
w = clip(w + a_tgt , 0 * mV , w_max)
''' ,
on_post = '''
a_tgt += A_post * mV
w = clip(w + a_src , 0 * mV , w_max)
''' ,
method = 'euler' ,
name = 'Syn_inp_mem'
)
# Input to Output
Syn_inp_out = b2.Synapses(inp , out , 'w : volt' , on_pre = 'g_exc += w')
# Input to Input
Syn_inp_inp = b2.Synapses(inp , inp)
# Memory to Memory
Syn_mem_mem = b2.Synapses(mem , mem , 'w: volt' , on_pre = 'g_exc += w')
# Memory to Output
Syn_mem_out = b2.Synapses(mem , out , 'w: volt' , on_pre = 'g_exc += w')
# Output to Output
Syn_out_out = b2.Synapses(out , out , 'w: volt' , on_pre = 'g_inh -= w')
# Set up connections
Syn_inp_inp.connect()
Syn_inp_mem.connect()
Syn_inp_out.connect()
Syn_mem_mem.connect()
Syn_mem_out.connect()
Syn_out_out.connect()
Syn_inp_mem.w = 'rand() * w_max'
From the paper, it is specified that units in memory module have self-excitatory and hence I am updating : g_exc += w
.
The rest of the self connected modules have inhibition. This is the Synapse plot I get
I can only see the Excitatory g_exc
having values while g_inh
inhibitory synapse all are 0
.
Additionally, I get 5 spikes from the Memory layer (5 neurons in Memory Layer) and 2 spikes from the Output layer (2 neurons defined for Output layer and is not shown here) for a single stimulus. I am not sure how I can pick a target as both neurons spike at the same time (i.e.) 0*ms
in the Output layer. I am not sure if my synaptic connections or the equations are correct.
I hope this falls under the modeling category and would greatly appreciate any assistance or advice on modeling the synapses. As the code is lengthy, I am posting a gist link: code
I used the following references for inhibition: Kremer_et_al_2011_barrel_cortex