ValueError: Ошибка при проверке ввода: ожидалось, что input_1 будет иметь форму (168, 5), но получил массив с формой (5808, 5) - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь реализовать гибридный прогнозист LSTM-DNN с несколькими входами, используя код из урока № 23 из Временного ряда Hvass-Labs. По сути, я хочу спрогнозировать цены на электроэнергию на сутки вперед (пока на 24 шага в будущее), используя последовательные и непоследовательные данные. Модель, которую я использую, представляет собой два набора входов, подающих LSTM (для последовательных данных) и Dense для непоследовательных данных, с объединенными их выходами. Это выглядит так:

! https://imgur.com/a/x15FfIy

Обычно, когда я пытаюсь подогнать модель по прошествии одной эпохи, она выдает эту ошибку:

ОБНОВЛЕНИЕ:

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

Изменения, которые я реализовал:

# Chop off x_test_scaled into two parts:
x_test1_scaled = x_test_scaled[:,0:5] # shape is (5808, 5)
x_test2_scaled = x_test_scaled[:,5:12] # shape is (5808, 7)

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)

Я запутался, потому что я действительно назначил генератор для генератора в model.fit_generator, и я не передаю x_test1_scaled, который имеетформа (5808, 5). edit: (not validation_data)

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

Если это поможет, это моя модель:

# first input model
input_1 = Input(shape=((168,5)))
dense_1 = Dense(50)(input_1)

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

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

РЕДАКТИРОВАТЬ: Устранена эта проблема, заменена ошибка сверху.

До сих пор мне удалось все до фактической подгонки модели. Всякий раз, когда эпоха заканчивается, однако, она входит в ошибку:

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays: [array([[[0.4       , 0.44444442, 0.        , ..., 0.1734707 ,
         0.07272629, 0.07110982],
        [0.3904762 , 0.43434343, 0.04347826, ..., 0.1740398 ,
         0.07282589, 0.06936309],
       ...

Я пробовал решения из других сообщений стека обмена того же сообщения об ошибке. Они не увенчались успехом, но я смог в конечном итоге изолировать проблемный массив от массива validation_data. Я просто не знаю, как «преобразовать» его в требуемый массив 2.

Генератор пакетов: я уже включил два набора входов. x_batch_1 и x_batch_2

def batch_generator(batch_size, sequence_length):
    """
    Generator function for creating random batches of training-data.
    """

    # Infinite loop.
    while True:
        # Allocate a new array for the batch of input-signals.
        x_shape = (batch_size, sequence_length, num_x_signals)
        x_batch = np.zeros(shape=x_shape, dtype=np.float16)

        # Allocate a new array for the batch of output-signals.
        y_shape = (batch_size, sequence_length, num_y_signals)
        y_batch = np.zeros(shape=y_shape, dtype=np.float16)

        # Fill the batch with random sequences of data.
        for i in range(batch_size):
            # Get a random start-index.
            # This points somewhere into the training-data.
            idx = np.random.randint(num_train - sequence_length)

            # Copy the sequences of data starting at this index.
            x_batch[i] = x_train_scaled[idx:idx+sequence_length]
            y_batch[i] = y_train_scaled[idx:idx+sequence_length]

        x_batch_1 = x_batch[ :, :, 0:5]
        x_batch_2 = x_batch[ :, :, 5:12]
        yield ([x_batch_1, x_batch_2], y_batch)
batch_size = 32
sequence_length = 24 * 7
generator = batch_generator(batch_size=batch_size,
                            sequence_length=sequence_length)

Набор проверки:

validation_data = np.expand_dims(x_test_scaled, axis=0), np.expand_dims(y_test_scaled, axis=0)

И, наконец, модель подходит:

%%time
model.fit_generator(generator=generator,
                    epochs=10,
                    steps_per_epoch=30,
                    validation_data=validation_data,
                    callbacks=callbacks)
ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays: [array([[[0.4       , 0.44444442, 0.        , ..., 0.1734707 ,
         0.07272629, 0.07110982],
        [0.3904762 , 0.43434343, 0.04347826, ..., 0.1740398 ,
         0.07282589, 0.06936309],
       ...

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

1 Ответ

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

Это потому, что вашей модели нужно 2 набора входных данных, x_batch_1, x_batch_2 в вашем batch_generator. В то время как ваш validation_data имеет только один массив np.expand_dims(x_test_scaled, axis=0)

Вам необходимо сделать validation_data похожим на batch_generator, вероятно [np.expand_dims(x_test1_scaled, axis=0), np.expand_dims(x_test2_scaled, axis=0)], np.expand_dims(y_test_scaled, axis=0).

В случае, если вы все еще не 'Не понимаю, пожалуйста, предоставьте информацию о x_test1_scaled, например, о его форме или о том, как вы его загружаете.

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