reservoirpy.nodes.IPReservoir#
- class reservoirpy.nodes.IPReservoir(
- units: int | None = None,
- sr: float | None = None,
- lr: float | ~numpy.ndarray = 1.0,
- mu: float = 0.0,
- sigma: float = 1.0,
- learning_rate: float = 0.0005,
- epochs: int = 1,
- input_scaling: float | ~typing.Sequence = 1.0,
- input_connectivity: float = 0.1,
- rc_connectivity: float = 0.1,
- Win: ~numpy.ndarray | ~scipy.sparse._base.sparray | ~typing.Callable = _bernoulli(),
- W: ~numpy.ndarray | ~scipy.sparse._base.sparray | ~typing.Callable = _uniform(),
- bias: ~numpy.ndarray | ~scipy.sparse._base.sparray | ~typing.Callable = _bernoulli(),
- activation: ~typing.Literal['tanh',
- 'sigmoid'] = 'tanh',
- input_dim: int | None = None,
- dtype: type = <class 'numpy.float64'>,
- seed: int | ~numpy.random._generator.Generator | None = None,
- name=None,
Pool of neurons with random recurrent connexions, tuned using Intrinsic Plasticity.
Intrinsic Plasticity is applied as described in [1] and [2].
Reservoir neurons states, gathered in a vector \(\mathbf{x}\), follow the update rule below:
\[\mathbf{r}[t+1] = (1 - \mathrm{lr}) * \mathbf{r}[t] + \mathrm{lr} * (\mathbf{W}_{in} \cdot \mathbf{u}[t+1] + \mathbf{W} \cdot \mathbf{x}[t] + \mathbf{b}_{in})\]\[\mathbf{x}[t+1] = f(\mathbf{a}*\mathbf{r}[t+1]+\mathbf{b})\]Parameters \(\mathbf{a}\) and \(\mathbf{b}\) are updated following two different rules:
1. Neuron activation is tanh:
In that case, output distribution should be a Gaussian distribution of parameters (\(\mu\), \(\sigma\)). The learning rule to obtain this output distribution is described in [2].
2. Neuron activation is sigmoid:
In that case, output distribution should be an exponential distribution of parameter \(\mu = \frac{1}{\lambda}\). The learning rule to obtain this output distribution is described in [1] and [2].
- where:
\(\mathbf{x}\) is the output activation vector of the reservoir;
\(\mathbf{r}\) is the internal activation vector of the reservoir;
\(\mathbf{u}\) is the input timeseries;
\(f\) and \(g\) are activation functions.
- Parameters:
units (int, optional) – Number of reservoir units. If None, the number of units will be inferred from the
Wmatrix shape.sr (float, optional) – Spectral radius of recurrent weight matrix.
lr (float or array-like of shape (units,), default to 1.0) – Neurons leak rate. Must be in \([0, 1]\).
mu (float, default to 0.0) – Mean of the target distribution.
sigma (float, default to 1.0) – Variance of the target distribution.
learning_rate (float, default to 5e-4) – Learning rate.
epochs (int, default to 1) – Number of training iterations.
input_scaling (float or array-like of shape (features,), default to 1.0.) – Input gain. An array of the same dimension as the inputs can be used to set up different input scaling for each feature.
input_connectivity (float, default to 0.1) – Connectivity of input neurons, i.e. ratio of input neurons connected to reservoir neurons. Must be in \(]0, 1]\).
rc_connectivity (float, default to 0.1) – Connectivity of recurrent weight matrix, i.e. ratio of reservoir neurons connected to other reservoir neurons, including themselves. Must be in \(]0, 1]\).
Win (callable or array-like of shape (units, features), default to
bernoulli()) – Input weights matrix or initializer. If a callable (like a function) is used, then this function should accept any keywords parameters and at least two parameters that will be used to define the shape of the returned weight matrix.W (callable or array-like of shape (units, units), default to
uniform()) – Recurrent weights matrix or initializer. If a callable (like a function) is used, then this function should accept any keywords parameters and at least two parameters that will be used to define the shape of the returned weight matrix.bias (callable or array-like of shape (units, 1), default to
bernoulli()) – Bias weights vector or initializer. If a callable (like a function) is used, then this function should accept any keywords parameters and at least two parameters that will be used to define the shape of the returned weight matrix.activation ({"tanh", "sigmoid"}, default to "tanh") – Reservoir units activation function.
input_dim (int, optional) – Input dimension. Can be inferred at first call.
dtype (Numpy dtype, default to np.float64) – Numerical type for node parameters.
seed (int or
numpy.random.Generator, optional) – A random state seed, for noise generation.name (str, optional) – Node name.
References
Example
>>> from reservoirpy.nodes import IPReservoir >>> reservoir = IPReservoir( ... 100, mu=0.0, sigma=0.1, sr=0.95, activation="tanh", epochs=10)
We can fit the intrinsic plasticity parameters to reach a normal distribution of the reservoir activations. Using the
narma()timeseries:>>> from reservoirpy.datasets import narma >>> x = narma(1000) >>> _ = reservoir.fit(x, warmup=100) >>> states = reservoir.run(x)
Methods
__init__([units, sr, lr, mu, sigma, ...])exp_gradients(y, a, mu)KL loss gradients of neurons with sigmoid activation (~ Exponential(lambda=1/mu)).
fit(x[, y, warmup])Offline fitting method of a Node.
gaussian_gradients(y, a, mu, sigma)KL loss gradients of neurons with tanh activation (~ Normal(mu, sigma)).
initialize(x[, y])Define input and output dimensions, and instantiate variables.
partial_fit(x)predict([x, iters, workers])Alias for
run()reset()Reset all Node state
run([x, iters, workers])Run the Node on a sequence of data.
step([x])Call the Node function on a single step of data and update the state of the Node.
Attributes
True if the Node has been initialized
Expected dimension of the Node input.
Optional name of the Node.
Expected dimension of the Node input.
Recurrent weights matrix (\(\mathbf{W}\)).
Input weights matrix (\(\mathbf{W}_{in}\)).
Bias vector (\(\mathbf{bias}\)).
Gain of reservoir activation (\(\mathbf{a}\)).
Bias of reservoir activation (\(\mathbf{b}\)).
Leaking rate (1.0 by default) (\(\mathrm{lr}\)).
Spectral radius of W.
Mean of the target distribution (0.0 by default) (\(\mu\)).
Variance of the target distribution (1.0 by default) (\(\sigma\)).
Learning rate (5e-4 by default).
Number of epochs for training (1 by default).
Input scaling (float or array) (1.0 by default).
Connectivity (or density) of W (0.1 by default).
Connectivity (or density) of Win (0.1 by default).
Activation of the reservoir units (tanh by default) (\(f\)).
Number of neuronal units in the reservoir.
A random state generator.
Current state of the Node.
- activation: Literal['tanh', 'sigmoid']#
Activation of the reservoir units (tanh by default) (\(f\)).
- exp_gradients(y, a, mu)[source]#
KL loss gradients of neurons with sigmoid activation (~ Exponential(lambda=1/mu)).
- fit( ) IPReservoir[source]#
Offline fitting method of a Node.
- Parameters:
x (list or array-like of shape ([series, ] timesteps, input_dim), optional) – Input sequences dataset.
y (list or array-like of shape ([series], timesteps, output_dim), optional) – Teacher signals dataset. If None, the method will try to fit the Node in an unsupervised way, if possible.
warmup (int, default to 0) – Number of timesteps to consider as warmup and discard at the beginning of each timeseries before training.
- Returns:
Node trained offline.
- Return type:
- gaussian_gradients(y, a, mu, sigma)[source]#
KL loss gradients of neurons with tanh activation (~ Normal(mu, sigma)).
- initialize(
- x: array(t, d) | array(s, t, d) | ~typing.Sequence[array(t, d)] | array(d),
- y: None = None,
Define input and output dimensions, and instantiate variables.
Only called once, before fitting or running the node.
- Parameters:
x (array of shape (input_dim,) or (timestep, input_dim)) – Input data to the node.
y (None) – Training data to the node. As it is not a trainable node,
yis expected to beNone.
- predict(
- x: array(t, d) | array(s, t, d) | ~typing.Sequence[array(t, d)] | None = None,
- iters: int | None = None,
- workers=1,
Alias for
run()Run the Node on a sequence of data. Can update the state of the Node several times.
- Parameters:
x (array-like of shape ([n_inputs,] timesteps, input_dim) or list of) – arrays of shape (timesteps, input_dim), optional A sequence of data of shape (timesteps, features).
iters (int, optional) – If
xisNone, a dimensionless timeseries of lengthitersis used instead.workers (int, default to 1) – Number of workers used for parallelization. If set to -1, all available workers (threads or processes) are used.
- Returns:
A sequence of output vectors.
- Return type:
array of shape ([n_inputs,] timesteps, output_dim) or list of arrays
- reset() dict[str, ndarray][source]#
Reset all Node state
- Returns:
dict[str, np.array]
- Return type:
previous state of the Node.
- run(
- x: array(t, d) | array(s, t, d) | ~typing.Sequence[array(t, d)] | None = None,
- iters: int | None = None,
- workers=1,
Run the Node on a sequence of data. Can update the state of the Node several times.
- Parameters:
x (array-like of shape ([n_inputs,] timesteps, input_dim) or list of arrays of shape (timesteps, input_dim), optional) – A timeseries, array of shape (timesteps, features), or a sequence of timeseries. Input of the Node.
iters (int, optional) – If
xisNone, a dimensionless timeseries of lengthitersis used instead.workers (int, default to 1) – Number of workers used for parallelization. If set to -1, all available workers (threads or processes) are used.
- Returns:
A sequence of output vectors.
- Return type:
array of shape ([n_inputs,] timesteps, output_dim) or list of arrays
- step(x: array(d) | None = None)[source]#
Call the Node function on a single step of data and update the state of the Node.
- Parameters:
x (array of shape (input_dim,), optional) – One single step of input data. If None, an empty array is used instead and the Node is assumed to have an input_dim of 0
- Returns:
An output vector.
- Return type:
array of shape (output_dim,)