nengolib.solvers.Temporal¶

class
nengolib.solvers.
Temporal
(synapse=Default, solver=Default)[source]¶ Solves for connection weights by accounting for the neural dynamics.
This allows the optimization procedure to potentially harness any correlations in spiketiming between neurons, and/or the adaptative dynamics of more detailed neuron models, given the dynamics of the desired function with respect to the evaluation points. This works by explicitly simulating the neurons given the stimulus, and then learning to decode the desired function in the timedomain.
To use this method, pass it to the
solver
parameter for anengo.Connection
. Thepre
object on this connection should be anengo.Ensemble
that uses some dynamic neuron model.Parameters:  synapse :
nengo.synapses.Synapse
, optional The
nengo.synapses.Synapse
model used to filter the presynaptic activities of the neurons before being passed to the underlying solver. A value ofNone
will bypass any filtering. Defaults to anengo.Lowpass
filter with a timeconstant of 5 ms. solver :
nengo.solvers.Solver
, optional The underlying
nengo.solvers.Solver
used to solve the problemAD = Y
, whereA
are the (potentially filtered) neural activities (in response to the evaluation points, over time),D
are the Nengo decoders, andY
are the corresponding targets given by thefunction
supplied to the connection. Defaults tonengo.solvers.LstsqL2
.
See also
Notes
Requires
nengo>=2.5.0
(specifically, PR #1313).If the neuron model for the presynaptic population includes some internal state that varies over time (which it should, otherwise there is little point in using this solver), then the order of the given evaluation points will matter. You will likely want to supply them as an array, rather than as a distribution. Likewise, you may want to filter your desired output, and specify the function as an array on the connection (see example below).
The effect of the solver’s regularization has a very different interpretation in this context (due to the filtered spiking error having its own statistics), and so you may also wish to instantiate the solver yourself with some value other than the default regularization.
Examples
Below we use the temporal solver to learn a filtered communicationchannel (the identity function) using 100 lowthreshold spiking (LTS) Izhikevich neurons. The training and test data are sampled independently from the same bandlimited whitenoise process.
>>> from nengolib import Temporal, Network >>> import nengo >>> neuron_type = nengo.Izhikevich(coupling=0.25) >>> tau = 0.005 >>> process = nengo.processes.WhiteSignal(period=5, high=5, y0=0, rms=0.3) >>> eval_points = process.run_steps(5000) >>> with Network() as model: >>> stim = nengo.Node(output=process) >>> x = nengo.Ensemble(100, 1, neuron_type=neuron_type) >>> out = nengo.Node(size_in=1) >>> nengo.Connection(stim, x, synapse=None) >>> nengo.Connection(x, out, synapse=None, >>> eval_points=eval_points, >>> function=nengo.Lowpass(tau).filt(eval_points), >>> solver=Temporal(synapse=tau)) >>> p_actual = nengo.Probe(out, synapse=tau) >>> p_ideal = nengo.Probe(stim, synapse=tau) >>> with nengo.Simulator(model) as sim: >>> sim.run(5)
>>> import matplotlib.pyplot as plt >>> plt.plot(sim.trange(), sim.data[p_actual], label="Actual") >>> plt.plot(sim.trange(), sim.data[p_ideal], label="Ideal") >>> plt.xlabel("Time (s)") >>> plt.legend() >>> plt.show()
Attributes:  solver
 synapse
 weights
A parameter where the value is a boolean.
Methods
__call__
(A, Y[, __hack__])Call the solver. mul_encoders
(Y, E[, copy])Helper function that projects signal Y
onto encodersE
. synapse :