Модель Keras RNN производит не мою синусоидальную волну, а ровную линию - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь реализовать RNN с сохранением состояния в Керасе, который будет моделировать синусоидальную волну от 1 до -1 (таким образом, мне не нужно беспокоиться о нормализации).Просто играю с Керасом, чтобы получить дополнительный код, который мне не нужен, но есть там, потому что я пробовал разные вещи.Я думал, что он работает с окном из 30 шагов, но я изменил свой код, чтобы попытаться изменить размеры окон, чтобы увидеть, если это имеет значение для прогноза.После того, как я изменил модель, включив в нее состояние и переменную длину предсказания, я получу только плоскую линию, если не выполню 70+ эпок.

Правильны ли моя модель и формы данных или я что-то пропустил?* Мне пришлось скопировать и вставить это из ячеек Jupyter Notebook, так что я думаю, что получил все это

Это график, который я получил для моего прогноза окна из n = 100 шагов и 70 epocs.

Синяя линия - данные испытаний, оранжевая - прогноз

from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential
from keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
%matplotlib qt

x = np.linspace(0, 10, 1000, endpoint=True)#[np.newaxis]
y = np.sin(x)#[np.newaxis]
plt.plot(y)

#Automated window creation
n=100
r=n
b = list()
c = list()
window_length = len(y)
headdings = list()
window_steps = list(range(1, n+1))
for val in window_steps:
    head_string='x-'+ str(val)
    headdings.append(head_string)
    b.append(y[val-1:-n])#Forward window
    #c.append(y[val:window_length-n])
    n=n-1

test=y[r:]
data = pd.DataFrame(dict(zip(headdings,b)))
data.index += 1
test.shape

y_data=np.array(test)
x_data=np.array(b)
x_data=np.rot90(x_data)
x_data=np.rot90(x_data)
x_data=np.rot90(x_data)
plt.plot(x_data)
plt.plot(y_data)

row = round(0.9 * y_data.shape[0])
print(row)
Y_train=y_data[:row]
X_train=x_data[:row,:]
Y_test=y_data[row:]
X_test=x_data[row:,:]
X_train=X_train.reshape(X_train.shape[0], X_train.shape[1],1)
X_test=X_test.reshape(X_test.shape[0], X_test.shape[1],1)

#Create the model
model = Sequential()
model.add(LSTM(X_train.shape[1], activation='tanh', batch_input_shape=(1,X_train.shape[1],1),return_sequences=True,stateful=True))
model.add(LSTM(X_train.shape[1],stateful=True))
#model.add(Dense(100))
#model.add(Dense(50))
#model.add(Dense(30))
#model.add(Dense(5))
model.add(Dense(1))
model.compile(optimizer='Nadam',
              loss='mse',
              metrics=['mae'])
early_stop = EarlyStopping(monitor='mae', patience=1, verbose=1)

#Train the model
model.fit(X_train, 
          Y_train,epochs=70,shuffle=True,batch_size=1)


row=X_train.shape[1]-1
X_sample=y[-row-1:]
X_samp=X_sample.reshape(1, row+1,1)
X_samp[:]
score = model.evaluate(X_test, Y_test,batch_size=1 )
score

#Prediction
pred = model.predict(X_samp).reshape(1,1)
X_samp=X_samp[:,-row:].reshape(1,row)
X_samp=np.concatenate((X_samp,pred),axis=1)
X_samp=X_samp.reshape(1, row+1,1)
print(pred)
window_steps = list(range(1, row+2))
for val in window_steps:
    pred = model.predict(X_samp)
    X_samp=X_samp[:,-row:].reshape(1,row)
    X_samp=np.concatenate((X_samp,pred),axis=1)
    if val != row+1:
        X_samp=X_samp.reshape(1, row+1,1)
test=y[-row-1:].reshape(row+1,1)
X_samp.reshape(row+1,1)
plt.plot(test)
plt.plot(X_samp.T)
plt.show
...