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
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