Прогнозирование с использованием слоя Keras Timedistributed

Я пытаюсь смоделировать два временных ряда одновременно, используя Keras с LSTM и слой Timedistributed. Данные, которые я рассматриваю, представляют собой регрессионную установку с двумя косинусоидальными волнами с добавленным гауссовским шумом. Однако модель имеет много проблем с прогнозированием из выборки. Это можно ожидать, или я просто получил слишком мало слоев?

В выходных данных ниже синие кружки представляют собой данные обучения, зеленые квадраты представляют собой предсказанные значения для данных обучения, красные квадраты представляют собой данные испытаний, а синие треугольники представляют собой предсказанные значения для данных испытаний. Понятно, что модель накладывается на обучающие данные и не находит основную структуру в данных. Я также пытался использовать регуляризацию, но безуспешно.

# Import models
from keras.wrappers.scikit_learn import KerasClassifier as KC
from keras.layers import Dense, LSTM, TimeDistributed
from keras.models import Sequential
from keras.regularizers import l1
import numpy as np
import matplotlib.pyplot as plt

# Generate some data
t = 100
n = 2
xtrain = np.zeros((n,t,1))
xtest = np.zeros((n,t,1))
ytrain = np.zeros((n,t,1))
ytest = np.zeros((n,t,1))+np.random.normal(0,1,(n,t,1))

change_point = 3.14*2

for i in range(xtrain.shape[0]):
    xtrain[i,:,0] = np.random.uniform(0,change_point,t)
    xtest[i,:,0] = np.random.uniform(change_point,2*change_point,t)

ytrain[0,:,0] = np.cos(xtrain[0,:,0])+np.random.normal(0,0.2,t)
ytrain[1,:,0] = np.cos(xtrain[1,:,0])+np.random.normal(0,0.2,t)
ytest[0,:,0] = np.cos(xtest[0,:,0])+np.random.normal(0,0.2,t)
ytest[1,:,0] = np.cos(xtest[1,:,0])+np.random.normal(0,0.2,t)

m = Sequential()
m.add(LSTM(90,input_shape=(t,1), return_sequences = True))
m.add(LSTM(90, return_sequences = True))
m.add(LSTM(90, return_sequences = True))
#m.add(LSTM(1, return_sequences = True))
m.add(TimeDistributed(Dense(1)))


m.compile(loss = 'mean_squared_error', optimizer='rmsprop')

m.fit(xtrain,ytrain,nb_epoch=400, batch_size=2)
ypred = m.predict(xtest)
ytrain_pred = m.predict(xtrain)

ps = 0
plt.scatter(xtrain[ps,:,0],ytrain[ps,:,0])
plt.scatter(xtest[ps,:,0],ytest[ps,:,0], marker='s', c='r')
plt.scatter(xtrain[ps,:,0],ytrain_pred[ps,:,0],marker = 's',c='g')
plt.scatter(xtest[ps,:,0],ypred[ps,:,0], marker='^', c='b')

Первый сюжетВторой сюжет

0 ответов

Другие вопросы по тегам