CNN-LSTM Timeseries вход для слоя TimeDistributed - PullRequest
2 голосов
/ 13 июля 2020

Я создал CNN-LSTM для прогнозирования выживаемости веб-сессий, мои данные обучения выглядят следующим образом:

print(x_train.shape)
(288, 3, 393) 

с (образцы, временные шаги, функции) и моей моделью:

model = Sequential()
model.add(TimeDistributed(Conv1D(128, 5, activation='relu'), 
                                 input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(TimeDistributed(MaxPooling1D()))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(64, stateful=True, return_sequences=True))
model.add(LSTM(16, stateful=True))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer=Adam(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])

Однако для слоя TimeDistributed требуется минимум 3 измерения, как мне преобразовать данные, чтобы он работал?

Большое спасибо!

1 Ответ

2 голосов
/ 13 июля 2020

ваши данные находятся в формате 3d, и это все, что вам нужно для загрузки conv1d или LSTM. если ваша цель - 2D, не забудьте установить return_sequences = False в вашей последней ячейке LSTM.

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

обратите внимание также на операция объединения, чтобы не иметь отрицательного измерения времени для уменьшения (я использую 'одинаковые' отступы в свертке выше, чтобы избежать этого)

ниже - пример задачи двоичной классификации

n_sample, time_step, n_features = 288, 3, 393
X = np.random.uniform(0,1, (n_sample, time_step, n_features))
y = np.random.randint(0,2, n_sample)

model = Sequential()
model.add(Conv1D(128, 5, padding='same', activation='relu', 
                 input_shape=(time_step, n_features)))
model.add(MaxPooling1D())
model.add(LSTM(64, return_sequences=True))
model.add(LSTM(16, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X,y, epochs=3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...