Я пытаюсь создать простую сеть LSTM, которая будет - на основе последних 16 временных рамок - обеспечивать некоторый вывод. Скажем, у меня есть набор данных из 112000 строк (измерений) и 7 столбцов (6 функций + класс). Я понимаю, что мне нужно «упаковать» набор данных в пакеты длиной по 16 элементов по X. С 112000 строками это будет означать 112000/16 = 7000 пакетов, следовательно, трехмерный массив с формой (7000, 16, 7). Разделив этот массив на данные для обучения и тестирования, я получаю формы:
xtrain.shape == (5000, 16, 6)
ytrain.shape == (5000, 16)
xtest.shape == (2000, 16, 6)
ytest.shape == (2000, 16)
Моя модель выглядит так:
model.add(keras.layers.LSTM(8, input_shape=(16, 6), stateful=True, batch_size=16, name="input"));
model.add(keras.layers.Dense(5, activation="relu", name="hidden1"));
model.add(keras.layers.Dense(1, activation="sigmoid", name="output"));
model.compile(optimizer="rmsprop", loss="binary_crossentropy", metrics=["accuracy"]);
model.fit(xtrain, ytrain, batch_size=16, epochs=10);
Однако после попытки подобрать модель я получаю эту ошибку:
ValueError: Ошибка при проверке цели: ожидаемый результат будет иметь форму (1,), но получил массив с формой (16,)
Я думаю, что неправильно, так это то, что модель ожидает одного вывода на пакет (поэтому форма ytrain должна быть (5000,)) вместо 16 выводов (по одному на каждую запись в пакете - (5000, 16)).
Если это так, должен ли я вместо такой упаковки данных создавать пакет из 16 элементов для каждого вывода? Поэтому имея
xtrain.shape == (80000, 16, 6)
ytrain.shape == (80000,)
xtest.shape == (32000, 16, 6)
ytest.shape == (32000,)