## Multistep Neural Network Prediction

### Set Up in Open-Loop Mode

Dynamic networks with feedback, such as `narxnet`

and `narnet`

neural networks, can be transformed
between open-loop and closed-loop modes with the functions `openloop`

and `closeloop`

.
Closed-loop networks make multistep predictions. In other words
they continue to predict when external feedback is missing, by using
internal feedback.

Here a neural network is trained to model the magnetic levitation system and simulated in the default open-loop mode.

[X,T] = maglev_dataset; net = narxnet(1:2,1:2,10); [x,xi,ai,t] = preparets(net,X,{},T); net = train(net,x,t,xi,ai); y = net(x,xi,ai); view(net)

### Multistep Closed-Loop Prediction From Initial Conditions

A neural network can also be simulated only in closed-loop form, so that given an external input series and initial conditions, the neural network performs as many predictions as the input series has time steps.

netc = closeloop(net); view(netc)

Here the training data is used to define the inputs `x`

,
and the initial input and layer delay states, `xi`

and `ai`

,
but they can be defined to make multiple predictions for any input
series and initial states.

[x,xi,ai,t] = preparets(netc,X,{},T); yc = netc(x,xi,ai);

### Multistep Closed-Loop Prediction Following Known Sequence

It can also be useful to simulate a trained neural network up the present with all the known values of a time-series in open-loop mode, then switch to closed-loop mode to continue the simulation for as many predictions into the future as are desired.

Just as `openloop`

and `closeloop`

can be used to transform between
open- and closed-loop neural networks, they can convert the state
of open- and closed-loop networks. Here are the full interfaces for
these functions.

[open_net,open_xi,open_ai] = openloop(closed_net,closed_xi,closed_ai); [closed_net,closed_xi,closed_ai] = closeloop(open_net,open_xi,open_ai);

Consider the case where you might have a record of the Maglev’s behavior for 20 time steps, and you want to predict ahead for 20 more time steps.

First, define the first 20 steps of inputs and targets, representing
the 20 time steps where the known output is defined by the targets `t`

.
With the next 20 time steps of the input are defined, use the network
to predict the 20 outputs using each of its predictions feedback to
help the network perform the next prediction.

x1 = x(1:20); t1 = t(1:20); x2 = x(21:40);

The open-loop neural network is then simulated on this data.

[x,xi,ai,t] = preparets(net,x1,{},t1); [y1,xf,af] = net(x,xi,ai);

Now the final input and layer states returned by the network
are converted to closed-loop form along with the network. The final
input states `xf`

and layer states `af`

of
the open-loop network become the initial input states `xi`

and
layer states `ai`

of the closed-loop network.

[netc,xi,ai] = closeloop(net,xf,af);

Typically use `preparets`

to
define initial input and layer states. Since these have already been
obtained from the end of the open-loop simulation, you do not need `preparets`

to
continue with the 20 step predictions of the closed-loop network.

[y2,xf,af] = netc(x2,xi,ai);

Note that you can set `x2`

to different sequences
of inputs to test different scenarios for however many time steps
you would like to make predictions. For example, to predict the magnetic
levitation system’s behavior if 10 random inputs are used:

x2 = num2cell(rand(1,10)); [y2,xf,af] = netc(x2,xi,ai);

### Following Closed-Loop Simulation with Open-Loop Simulation

If after simulating the network in closed-loop form, you can continue the simulation from there in open-loop form. Here the closed-loop state is converted back to open-loop state. (You do not have to convert the network back to open-loop form as you already have the original open-loop network.)

[~,xi,ai] = openloop(netc,xf,af);

Now you can define continuations of the external input and open-loop feedback, and simulate the open-loop network.

x3 = num2cell(rand(2,10)); y3 = net(x3,xi,ai);

In this way, you can switch simulation between open-loop and closed-loop manners. One application for this is making time-series predictions of a sensor, where the last sensor value is usually known, allowing open-loop prediction of the next step. But on some occasions the sensor reading is not available, or known to be erroneous, requiring a closed-loop prediction step. The predictions can alternate between open-loop and closed-loop form, depending on the availability of the last step’s sensor reading.