LSTM - прогнозирование по скользящему окну данных - PullRequest
1 голос
/ 04 мая 2020

Мои данные тренировок - это скользящее окно ежедневных данных пользователей. это форма (1470, 3, 256, 18):
1470 групп данных 3 дней, каждый день имеет 256 выборок 18 функции каждого.

Мои цели форма (1470,): значение метки для каждого пакета.

Я хочу обучить LSTM для прогнозирования [3 days batch] -> [one target]
256 Дневные образцы дополняются -10 для дней, в которых отсутствовали 256 сэмплов


Я написал следующий код для построения модели:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dropout,Dense,Masking,Flatten
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.callbacks import TensorBoard,ModelCheckpoint
from tensorflow.keras import metrics

def build_model(num_samples, num_features):

  opt = RMSprop(0.001) 

  model = Sequential()
  model.add(Masking(mask_value=-10., input_shape=(num_samples, num_features)))
  model.add(LSTM(32, return_sequences=True, activation='tanh'))
  model.add(Dropout(0.3))
  model.add(LSTM(16, return_sequences=False, activation='tanh'))
  model.add(Dropout(0.3))
  model.add(Dense(16, activation='tanh'))
  model.add(Dense(8, activation='tanh'))
  model.add(Dense(1))
  model.compile(loss='mse', optimizer=opt ,metrics=['mae','mse'])
  return model

model = build_model(256,18)
model.summary()

Model: "sequential_7"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
masking_7 (Masking)          (None, 256, 18)           0         
_________________________________________________________________
lstm_14 (LSTM)               (None, 256, 32)           6528      
_________________________________________________________________
dropout_7 (Dropout)          (None, 256, 32)           0         
_________________________________________________________________
lstm_15 (LSTM)               (None, 16)                3136      
_________________________________________________________________
dropout_8 (Dropout)          (None, 16)                0         
_________________________________________________________________
dense_6 (Dense)              (None, 16)                272       
_________________________________________________________________
dense_7 (Dense)              (None, 8)                 136       
_________________________________________________________________
dense_8 (Dense)              (None, 1)                 9         
=================================================================
Total params: 10,081
Trainable params: 10,081
Non-trainable params: 0
_________________________________________________________________

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

Любая помощь будет признательна

Обновление: Я изменил свои данные так:

train_data.reshape(1470*3, 256, 18)

это верно?

1 Ответ

1 голос
/ 04 мая 2020

Я думаю, что вы ищете TimeDistributed (LSTM (...)) ( source )

day, num_samples, num_features = 3, 256, 18

model = Sequential()
model.add(Masking(mask_value=-10., input_shape=(day, num_samples, num_features)))
model.add(TimeDistributed(LSTM(32, return_sequences=True, activation='tanh')))
model.add(Dropout(0.3))
model.add(TimeDistributed(LSTM(16, return_sequences=False, activation='tanh')))
model.add(Dropout(0.3))
model.add(Dense(16, activation='tanh'))
model.add(Dense(8, activation='tanh'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam' ,metrics=['mae','mse'])

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