Понимание ввода и вывода Keras LSTM NN для двоичной классификации

Я пытаюсь создать простую сеть 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,)

person SEnergy    schedule 22.11.2018    source источник


Ответы (1)


Вы близки с последними комментариями к вопросу. Поскольку это проблема двоичной классификации, у вас должен быть 1 выход на каждый вход, поэтому вам нужно избавиться от 16 в ваших ys и заменить его на 1.

Кроме того, вам нужно иметь возможность разделить набор поездов по размеру вашего пакета, поэтому вы можете использовать, например, 5008.

По факту:

ytrain.shape == (5000, 1)

Проходит указанную вами ошибку, но вызывает новую:

ValueError: в сети с отслеживанием состояния вы должны передавать входные данные только с таким количеством выборок, которое можно разделить на размер пакета. Найдено: 5000 образцов

Что решается путем обеспечения того, чтобы:

xtrain.shape == (5008, 16, 6)
ytrain.shape == (5008, 1)
person dataista    schedule 22.11.2018
comment
Итак, учитывая, что у меня 112000 строк данных, и я хочу обучить LSTM как можно большему количеству строк, должен ли я создать 111984 пакетов данных из 16 строк, которые я передаю в LSTM? поэтому имея (111984, 16, 6) в качестве входных данных и (111984, 1) в качестве выходных ... Я хочу обучить LSTM для класса в каждой строке, но этому классу требуется информация о последних 16 временных рамках, поэтому для 16-го ( и первая) строка мне нужна информация о 0-15 строках, для 17-й мне нужна информация об 1-16 строках и т.д., поэтому 112000-16 = 11984 пакетов данных длиной 16 элементов? - person SEnergy; 23.11.2018
comment
Я не уверен, что слежу за тобой. У вас есть n образцы поездов. n должно делиться на размер пакета, но вы можете уместить n сэмплы, и Keras позаботится о разделении пакета. В свою очередь, каждый образец поезда представляет собой последовательность функций. Каждый элемент последовательности можно интерпретировать как временной шаг. И у вас есть f функции для описания этого временного шага. Кроме того, для каждого образца поезда (состоящего из последовательности функций) у вас есть один уникальный y. Это схема двоичной классификации последовательности. - person dataista; 23.11.2018
comment
Предположим, у меня есть n образцов поездов (строк), где каждый образец имеет 3 функции f (столбцы). Характеристики f_n0 и f_n1 являются входными, а f_n2 - выходными. Этот вывод f_n2, однако, должен быть основан только на последних 16 строках (временных рамках), ничего до этого временного кадра. Предположим, 1 временной интервал = 1 секунда: NN пытается предсказать результат на основе того, что произошло за последние 16 секунд. Предполагая, что у меня есть 112000 образцов поездов (n = 112000) с 7 функциями (f = 7), а LSTM работает с трехмерным массивом, будет результирующий массив в форме (n-16, 16, f) или, скорее, ( п / 16, 16, е)? - person SEnergy; 23.11.2018