, которые возвращают результат на каждом временном шаге, который используется вторым слоем, где он возвращает результат только в конце

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

Вот фиктивная серия, с которой я работаю:

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
import keras as K
import tensorflow as tf

d = pd.DataFrame(data = {"x": np.linspace(0, 100, 1000)})
d['l1_x'] = d.x.shift(1)
d['l2_x'] = d.x.shift(2)
d.fillna(0, inplace = True)
d["y"] = np.sin(.1*d.x*np.sin(d.l1_x))*np.sin(d.l2_x)
plt.plot(d.x, d.y)

Во-первых, я установлю LSTM без плотных слоев, предшествующих ему. Это требует, чтобы я изменил данные:

X = d[["x", "l1_x", "l2_x"]].values.reshape(len(d), 3,1)
y = d.y.values

Это верно?

Учебники показывают, что один временной ряд должен иметь 1 в первом измерении, за которым следует количество временных шагов (1000), а затем число ковариат (3). Но когда я делаю это, модель не компилируется.

Здесь я собираю и обучаю модель:

model = K.Sequential()
model.add(K.layers.LSTM(10, input_shape=(X.shape[1], X.shape[2]), batch_size = 1, stateful=True))
model.add(K.layers.Dense(1))
callbacks = [K.callbacks.EarlyStopping(monitor='loss', min_delta=0, patience=5, verbose=1, mode='auto', baseline=None, restore_best_weights=True)]
model.compile(loss='mean_squared_error', optimizer='rmsprop')

model.fit(X, y, epochs=50, batch_size=1, verbose=1, shuffle=False, callbacks = callbacks)
model.reset_states()

yhat = model.predict(X, 1)
plt.clf()
plt.plot(d.x, d.y)
plt.plot(d.x, yhat)

Почему я не могу заставить модель переодеться? Это потому, что я изменил свои данные неправильно? Когда я использую больше узлов в LSTM, на самом деле это не слишком излишне.

(Мне также непонятно, что значит быть «состоящим из состояний». Нейронные сети - это просто нелинейные модели. К каким параметрам относятся «состояния» и зачем их сбрасывать?)

Как мне вставить плотные слои между входом и LSTM? Наконец, я хотел бы добавить несколько плотных слоев, чтобы в основном сделать базовое расширениеx прежде чем он попадет в LSTM. Но LSTM хочет трехмерный массив, а плотный слой выплевывает матрицу. Что мне здесь делать? Это не работает:

model = K.Sequential()
model.add(K.layers.Dense(10, activation = "relu", input_dim = 3))
model.add(K.layers.LSTM(3, input_shape=(10, X.shape[2]), batch_size = 1, stateful=True))
model.add(K.layers.Dense(1))

ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=2

Ответы на вопрос(1)

Ваш ответ на вопрос