Buonomano and Merzenich method of temporal discrimination of stimuli (BuoMerz)

class nmcog.spinnaker.discriminate.BuonomanoMerzenich.BuoMerz(intervals)

SpiNNaker (sPyNNaker) implementation of Temporal Information Processing.

Architecture:

  • Stimulus is sent to a network representing Douglas and Martin’s (1989) cortical IV and III layers.
  • Keeping with experimental observations the excitatory:inhibitory element is approximately 4:1.
  • The constituent excitatory and inhibitory elements are randomly connected (Buonomano & Merzenich, 1997).
  • The elements are based on Integrate-and-fire current units (Buonomano & Merzenich, 1995).

The connection is based on Buonomano & Merzenich 1997 (Fig 3, p135)

Populations excitatory (III) excitatory (IV) inhibitory (III) inhibitory (IV)
excitatory (III) 18/200 = 0.09
12/200 = 0.06
excitatory (IV) 18/120 = 0.15 15/120 = 0.125 12/120 = 0.1 10/120 = 0.083
inhibitory (III) 8/50 = 0.16
6/50 = 0.12
inhibitory (IV)
6/30 = 0.2
4/30 = 0.133
Input
15/100 = 0.15
10/100 = 0.1

Note:

  • The numerator correspond to the number of units (elements) within the recieving population.
  • The denominator is the convergence number of presynaptic inputs for each unit.
  • The decimal fraction are the probability values for the FixedProbabilityConnector function.

Comments on connection with output layer:

The excitatory (III) population connects to the output layer (1995) such that it proxies adaptation. The output layer populations recieves signal only at the end of the stimulus, i.e. during second pulse.

Due to limitations with SpNNaker8 here the connection is implemented such that it is made from the start of the simulation. However, only responses from the populations in the output layer at the end of the stimulus is returned.

References:

  • Buonomano, D. V., & Merzenich, M. M. (1995). Temporal information transformed into a spatial code by a neural network with realistic properties. Science: 1028-1030. DOI: 10.1126/science.7863330
  • Buonomano, D. V., & Merzenich, M. M. (1997). Temporal Information Processing: A Computational Role for Paired-Pulse Facilitation and Slow Inhibition. In J. W. Donahoe & V. Packard Dorsel (Eds.), Neural-Networks Models of Cognition (pp. 129-139). Netherlands, Amsterdam: Elsevier Science B. V.
get_results()

Gets the recorded Neo objects. The only exception is for the output layer. Because of the reasons given above, for the output layer rather than a Neo object its SpikeTrain are returned. They are the responses at the end of the stimulus. To help visualizing them along with SpikeTrain from other layers a padding is also returned.

Returns data as a dictionary such that

Key Value
“popIn” Neo object for input layer; contains SpikeTrain and Analogsignal
“ex4” Neo object for excitatory population LayerIV; contains SpikeTrain and Analogsignal
“inh4” Neo object for inhibitory population LayerIV; contains SpikeTrain and Analogsignal
“ex3” Neo object for excitatory population LayerIII; contains SpikeTrain and Analogsignal
“inh3” Neo object for inhibitory population LayerIII; contains SpikeTrain and Analogsignal
“out” Dictionary for output layer with populations under the keys “out”+stimuli, say “out80”
“origin” float type representing start of the runtime
“end” float type representing end of the runtime

Note:

Each population in the output layer (value of “out”) is also a dictionary with keys “spiketrains” and “placeholder_axes”.

  • The value for “placeholder_axes” is a list containing two lists.

    • The first represent t-axis from zero to start of second pulse of the stimuli.
    • The second is an array of zeros whose size is the same as the first.
  • The value for “spiketrains” is the SpikeTrain for all the populations

plot_all_layers(*intv)

Visualize spikes for populations in all layers; starting from below: input, excitatory in LayerIV, inhibitory in LayerIV, excitatory in LayerIII, inhibitory in LayerIII and lastly a population in the output layer at the top. y-axis are labelled with respective population and x-axis is the time in milliseconds.

plot_output_layer_timeseries()

Visualize spikes from each population in the output layer as a time-series. y-axis represent each unit in a population and x-axis is time in milliseconds.

plot_output_layer_timeseries_vertical()

Visualize spikes from each population in the output layer as a time-series. But unlike plot_output_layer_timeseries() this one plots one-above-eachother. Left y-axis represent units in a population and right y-axis the respective population.

plot_output_layer_vertical()

Visualize spikes from each population in the output layer as one-above-eachother. Left y-axis represent the population and right y-axis the stimulus.

setup_inputchannel(all_intervals)

Given a stimulus, i.e. interval values this function creates an input channel for it.

The input channel is such that

               ___|-interval/stimulus-|___
              |   |                   |   |
origin________|   |___________________|   |________end
     |---t0---|-T-|                   |-T-|---t0---|
     |------------------runtime--------------------|

Note that the above dual-pulse train represented in self.input_channel is used to create a spiking version using the private function __gen_input_src().

In addition to the self.input_channel this function also sets the attributes: self.stim_origin, self.stim_end, and self.runtime.

Note:

  • Interval value or the inter-pulse interval is the temporal information carried by the stimulus.
  • The interval value represents the stimulus; if it is a list of values it is a list of stimuli.

It should be pointed out that

  • Regardless of one or more stimulus it is here repesented in a list for the sake of not breaking previous code.
  • So this is a practical choice and does not contradict the above mentioned assumptions.