Прогноз временных рядов LSTM прерывистого генератора в тензорном потоке - PullRequest
1 голос
/ 07 мая 2019

Я строю модель прогнозирования временных рядов LSTM (в TF v = 1.13.1, Keras v = 2.2.4), которая принимает в качестве входного сигнала периодически колеблющийся сигнал во временной области. Время между каждым колебанием распределено экспоненциально (beta=5), колебания имеют нормально распределенную длину (mean length=2sec, variance=1sec), и частота каждого колебания также нормально распределена (mean frequency=22hz, variance=3hz) .

Я прочитал почти все замечательные посты Stackoverflow Даниэля Меллера на тему LSTM в Керасе / TF. Я также экспериментировал с различным количеством временных шагов для моей модели, с LSTM с состоянием и без состояния, с различными функциями потерь (mean absolute error против mean squared error) и с разной шириной / глубиной сети. Модель почти всегда фиксирует, что что-то колеблется, но не может воссоздать свою прерывистую сигнатуру и синусоидальную форму во время шага последовательного прогнозирования.

Минимально воспроизводимый пример:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# Import Data
data = np.loadtxt('./my_data.csv')

# Reshape data into batches of 500 timesteps - 1 dim per timestep
# For now, we do not split into testing/training sets
# Assume all data is for training

data_pre = data.reshape(-1, 500, 1)[:,:-1,:] # Shift input data backward by 1
data_post = data.reshape(-1, 500, 1)[:,1:,:] # Shift input data forward by 1

# Build LSTM Model for Training:

# Allow flexible number of timesteps per input (shape=(None,1))
inputs = tf.keras.layers.Input(shape=(None,1))

lstm_1 = tf.keras.layers.CuDNNLSTM(units=512, return_sequences=True)(inputs)
lstm_2 = tf.keras.layers.CuDNNLSTM(units=256, return_sequences=True)(lstm_1)

# Activate dense layer with linear activation func for regression
outputs = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=1, activation='linear'))(lstm_2)

lstm_model = tf.keras.Model(inputs=inputs, outputs=outputs)
lstm_model.compile('adam', loss='mae', metrics=['mae','mse'])
lstm_model.fit(x=data_pre, y = data_post, epochs=100, batch_size=16, shuffle=False) # I have trained up to 500 epochs and while the loss decreases there is no increase in prediction performance.

# Build Stateful LSTM Model for Sample-by-Sample Prediction

# Assume 1 timestep per input of dim=1
inputs = tf.keras.layers.Inputs(shape=(1,1,1))
lstm_1 = tf.keras.layers.CuDNNLSTM(units=512, return_sequences=True, stateful=True)(inputs)
lstm_2 = tf.keras.layers.CuDNNLSTM(units=256, return_sequences=True, stateful=True)(lstm_1)

outputs = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(units=1, activation='linear'))

prediction_model = tf.keras.Model(inputs=inputs, outputs=outputs)

# Copy weights from trained, non-stateful model:
prediction_model.set_weights(lstm_model.get_weights())

#Reset network state

prediction_model.reset_states()

#Initialize model internal state with a single sample from the input data shifted by 1 unit backwards

seed = prediction_model.predict(data_pre[0][0][None, None, :])

# Predict 20secs of data

output_array = np.zeros((10000,1,1)) # Allocate Memory

for i in range(0,10000):
    temp = prediction_model.predict(seed) # Iteratively predict next sample value
    output_array[i] = temp
    seed = temp

Графики необработанных данных:

https://i.imgur.com/sm8hynW.png

enter image description here

Модель вывода

enter image description here

1 Ответ

0 голосов
/ 07 мая 2019

Задумывались ли вы о подаче нескольких входов через каждый слой?Например:
Предположим, у вас есть переменная x, которую вы вводите через вашу модель.Изменение формы данных будет выглядеть примерно так:

import numpy as np
look_back = 5 ## This is the number of points to include in each iteration
x = np.arange(0,100)
new_array = []
for num in range(0, len(x)-look_back):
   new_array.append(x[num:num+look_back])
new_array = np.array(new_array)

print (np.array(x).shape) ## old array = (100,)
print (new_array.shape) ## new array = (95,5)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...