Основываясь на этом сообщении о потоке стека и этом , я пытаюсь построить модель RNN LSTM для прогнозирования проблемы регрессии.
Мои данные 25 партий из 2720 образцов по 16 функций в каждой, некоторые партии дополняются значениями -10 Я построил следующую модель:
model = Sequential()
opt = Adam(learning_rate=0.0001, clipnorm=1)
num_samples = train_x.shape[1]
num_features = train_x.shape[2]
# Masking -10 rows
model.add(Masking(mask_value=-10., input_shape=(num_samples, num_features)))
model.add(LSTM(32, return_sequences=True, stateful=False activation='tanh'))
model.add(Dropout(0.3))
#this is the last LSTM layer, use return_sequences=False
model.add(LSTM(16, return_sequences=True, stateful=False, activation='tanh'))
model.add(Dropout(0.3))
model.add(Dense(16, activation='tanh'))
model.add(Dense(8, activation='tanh'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='mse', optimizer='adam' ,metrics=[metrics.mean_absolute_error, metrics.mean_squared_error])
Резюме:
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
masking_4 (Masking) (None, 2720, 16) 0
_________________________________________________________________
lstm_8 (LSTM) (None, 2720, 32) 6272
_________________________________________________________________
dropout_8 (Dropout) (None, 2720, 32) 0
_________________________________________________________________
lstm_9 (LSTM) (None, 2720, 16) 3136
_________________________________________________________________
dropout_9 (Dropout) (None, 2720, 16) 0
_________________________________________________________________
dense_12 (Dense) (None, 2720, 16) 272
_________________________________________________________________
dense_13 (Dense) (None, 2720, 8) 136
_________________________________________________________________
dense_14 (Dense) (None, 2720, 1) 9
=================================================================
Total params: 9,825
Trainable params: 9,825
Non-trainable params: 0
_________________________________________________________________
Во время обучения модель не имеет состояния, и при прогнозировании я строю ту же модель, на этот раз модель с сохранением состояния без маскирующего слоя и с размером партии 1:
s_model = Sequential()
...
s_model.add(LSTM(32, return_sequences=True, stateful=True, activation='tanh',batch_input_shape=(1, num_samples, num_features)))
...
s_model.add(LSTM(16, return_sequences=True, stateful=True, activation='tanh'))
...
s_model.summary()
Резюме:
Model: "sequential_23"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_41 (LSTM) (1, 2720, 32) 6272
_________________________________________________________________
dropout_31 (Dropout) (1, 2720, 32) 0
_________________________________________________________________
lstm_42 (LSTM) (1, 2720, 16) 3136
_________________________________________________________________
dropout_32 (Dropout) (1, 2720, 16) 0
_________________________________________________________________
dense_39 (Dense) (1, 2720, 16) 272
_________________________________________________________________
dense_40 (Dense) (1, 2720, 8) 136
_________________________________________________________________
dense_41 (Dense) (1, 2720, 1) 9
=================================================================
Total params: 9,825
Trainable params: 9,825
Non-trainable params: 0
_________________________________________________________________
Я загрузил веса в модель с состоянием и попытался прогнозирование по выборке (фильтрация выборок -10 и сброс после каждой последовательности, например, так:
#loading weights from trained model
s_model.set_weights(model.get_weights())
for sequence in test_x:
for sample in sequence:
#filtering padded samples
if sample[0] is not -10:
score = s_model.predict_on_batch([[[sample]]])
print(score)
print("-----------------------------------------------------")
s_model.reset_states()
Однако мой код не выполняется, и я получаю следующую ошибку:
ValueError: Error when checking input: expected lstm_39_input to have shape (2720, 16) but got array with shape (1, 16)
Любая помощь будет цениться