Как исправить 'Ошибка при проверке ввода: ожидалось, что input_1 имеет 2 измерения, но получил массив с формой (32, 168, 5)' - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь реализовать гибридную модель LSTM-DNN с несколькими входами, в которой выходные данные обоих слоев объединяются. К сожалению, сразу после начала обучения это происходит:

ValueError: Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32, 168, 5)

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

Это моя модель:

# first input model
input_1 = Input(shape=(5, ))
input_1_expand = tf.expand_dims(input_1, axis=-1) 
dense_1 = Dense(units=64, input_shape=(None, 5,))(input_1_expand)

# second input model
input_2 = Input(shape=(7, ))
input_2_expand = tf.expand_dims(input_2, axis=-1)
lstm_1 = LSTM(units=64, return_sequences=True, input_shape=(None, 7,))(input_2_expand)

# merge input models
merge = concatenate([dense_1, lstm_1], axis=1)
output = Dense(num_y_signals, activation='sigmoid')(merge)
model = Model(inputs=[input_1, input_2], outputs=output)
# summarize layers
print(model.summary())

Обучение модели:

%time
model.fit_generator(generator=generator,
                    epochs=10,
                    steps_per_epoch=30,
                    validation_data=validation_data,
                    callbacks=callbacks)

Где генератор - это функция batch_generator, которая выдает

 [x_batch_1, x_batch_2], y_batch
x_batch_1 shape: (32, 168, 5)
x_batch_2 shape: (32, 168, 7)
y_batch shape: (32, 168, 1)

Где 32 - размер пакета, а 168 - длина последовательности

Я также не уверен, как я реализовал tfРасширить и объединить оси. Я только что попробовал комбинацию, которая заставила бы модель скомпилироваться

РЕДАКТИРОВАТЬ: я забыл включить validation_data:

validation_data = ([np.expand_dims(x_test1_scaled, axis=0),
                    np.expand_dims(x_test2_scaled, axis=0)],
                   np.expand_dims(y_test_scaled, axis=0))

Где

expanded x_test1_scaled Shape: (1, 5808, 5)
expanded x_test2_scaled Shape: (1, 5808, 7)
expanded y_test_scaled Shape: (1, 5808, 1)

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Ваша выборка input_1 и input_2 получила 1 измерение, из-за которого обучение input_1 или input_2 только 2 измерения, но у вашего генератора есть 3 измерения для каждого из них.

input_1 = Input(shape=(5, ))

input_2 = Input(shape=(7, ))
0 голосов
/ 19 октября 2019

Вам нужно также указать sequencr length в форме ввода, форма должна быть такой же, как x_batch.shape[1:]

Как это

input_1 = Input(shape=(168, 5, ))
dense_1 = Dense(units=64, input_shape=(None, 5,))(input_1)

input_2 = Input(shape=(168, 7, ))
lstm_1 = LSTM(units=64, return_sequences=True, input_shape=(None, 7,))(input_2)

Я полагаю, вы пытались использовать expand_dims чтобы это исправить, чтобы я не включал это.

...