Add example of stateful LSTM sequence prediction
This commit is contained in:
parent
d00140862e
commit
e443527d28
97
examples/lstm_stateful_seq.py
Normal file
97
examples/lstm_stateful_seq.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
'''Example script to predict sequence using stateful rnns.
|
||||||
|
At least 10 epochs are required before the generated text
|
||||||
|
starts sounding coherent.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as mpl
|
||||||
|
from keras.models import Sequential
|
||||||
|
from keras.layers.core import Dense
|
||||||
|
from keras.layers.recurrent import LSTM
|
||||||
|
|
||||||
|
|
||||||
|
# since we are using stateful rnn tsteps can be set to 1
|
||||||
|
tsteps = 1
|
||||||
|
batch_size = 25
|
||||||
|
epochs = 25
|
||||||
|
# number of elements ahead that are used to make the prediction
|
||||||
|
lahead = 1
|
||||||
|
|
||||||
|
|
||||||
|
def gen_cosine_amp(amp=100, period=25, x0=0, xn=50000, step=1, k=0.0001):
|
||||||
|
"""
|
||||||
|
Generates an absolute cosine time series with the amplitude exponentially
|
||||||
|
decreasing
|
||||||
|
|
||||||
|
Keyword arguments:
|
||||||
|
amp -- amplitude of the cosine function
|
||||||
|
period -- period of the cosine function
|
||||||
|
x0 -- initial x of the time series
|
||||||
|
xn -- final x of the time series
|
||||||
|
step -- step of the time series discretization
|
||||||
|
k -- exponential rate
|
||||||
|
"""
|
||||||
|
cos = np.zeros(((xn - x0) * step, 1, 1))
|
||||||
|
for i in range(len(cos)):
|
||||||
|
idx = x0 + i * step
|
||||||
|
cos[i, 0, 0] = amp * np.cos(idx / (2 * np.pi * period))
|
||||||
|
cos[i, 0, 0] = cos[i, 0, 0] * np.exp(-k * idx)
|
||||||
|
return cos
|
||||||
|
|
||||||
|
|
||||||
|
print('Creating Data')
|
||||||
|
cos = gen_cosine_amp()
|
||||||
|
print('Input shape:')
|
||||||
|
print(cos.shape)
|
||||||
|
print('Calculating expected predicted_out')
|
||||||
|
expected_out = np.zeros((len(cos), 1))
|
||||||
|
for i in range(len(cos) - lahead):
|
||||||
|
expected_out[i, 0] = np.mean(cos[i + 1:i + lahead + 1])
|
||||||
|
|
||||||
|
print('Output shape')
|
||||||
|
print(expected_out.shape)
|
||||||
|
|
||||||
|
print('Creating Model')
|
||||||
|
model = Sequential()
|
||||||
|
model.add(
|
||||||
|
LSTM(
|
||||||
|
50,
|
||||||
|
batch_input_shape=(
|
||||||
|
batch_size,
|
||||||
|
tsteps,
|
||||||
|
1),
|
||||||
|
return_sequences=True,
|
||||||
|
stateful=True))
|
||||||
|
model.add(
|
||||||
|
LSTM(
|
||||||
|
50,
|
||||||
|
batch_input_shape=(
|
||||||
|
batch_size,
|
||||||
|
tsteps,
|
||||||
|
1),
|
||||||
|
return_sequences=False,
|
||||||
|
stateful=True))
|
||||||
|
model.add(Dense(1))
|
||||||
|
model.compile(loss='rmse', optimizer='rmsprop')
|
||||||
|
|
||||||
|
print('Training')
|
||||||
|
for i in range(epochs):
|
||||||
|
model.fit(
|
||||||
|
cos,
|
||||||
|
expected_out,
|
||||||
|
batch_size=batch_size,
|
||||||
|
verbose=1,
|
||||||
|
nb_epoch=1)
|
||||||
|
model.reset_states()
|
||||||
|
|
||||||
|
print('Predicting')
|
||||||
|
predicted_out = model.predict(cos, batch_size=batch_size)
|
||||||
|
|
||||||
|
print('Ploting Results')
|
||||||
|
mpl.subplot(2, 1, 1)
|
||||||
|
mpl.plot(expected_out)
|
||||||
|
mpl.title('Expected')
|
||||||
|
mpl.subplot(2, 1, 2)
|
||||||
|
mpl.plot(predicted_out)
|
||||||
|
mpl.title('Predicted')
|
||||||
|
mpl.show()
|
Loading…
Reference in New Issue
Block a user