Как (я думаю) я понимаю в Keras, слои LSTM ожидают, что входные данные будут иметь 3-мерные размеры: (batch_size, timesteps, input_dim)
.
Однако я действительно изо всех сил пытаюсь понять, что эти значения на самом деле соответствуют, когда это касается моих данных. Я надеюсь, что если кто-то сможет объяснить, как я мог бы go ввести следующие ложные данные (со структурой, аналогичной моему фактическому набору данных) в слой LSTM, я мог бы тогда понять, как я могу добиться этого с моим реальным набором данных.
Таким образом, примером данных являются последовательности категориальных данных, закодированных с использованием кодирования одним горячим вектором. Например, первые 3 выборки выглядят так:
[ [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0] ]
[ [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0] ]
[ [0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1] ]
т.е. последовательности имеют длину 5 с 4 категориальными вариантами, которые могут находиться в позиции в последовательности. Скажем также, у меня есть 3000 последовательностей. Это проблема двоичной классификации.
Поэтому я считаю, что это сделает форму моего набора данных (3000, 5, 4)
?
Модель, которую я хочу использовать, выглядит следующим образом:
model = keras.Sequential([
keras.layers.LSTM(units=3, batch_input_shape=(???)),
keras.layers.Dense(128, activation='tanh'),
keras.layers.Dense(64, activation='tanh'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20)
Это пока игнорирует любое разделение обучения / тестирования, поэтому просто предположим, что я тренируюсь со всем набором данных. Часть, с которой я борюсь, это input_shape
.
Я хочу, чтобы каждый элемент в последовательности был временным шагом. Я перепробовал много разных форм и получил много разных ошибок. Я предполагаю, что мне действительно нужно изменить x_train
вместо того, чтобы просто настроить input_shape
. Проблема в том, что я понятия не имею, какой должна быть форма.
Мне кажется, я понимаю теорию, лежащую в основе LSTM, это просто практичность требований к размерности, которые я изо всех сил пытаюсь обдумать.
Любая помощь или совет будут высоко оценены. Спасибо.
РЕДАКТИРОВАТЬ - Как предложено @scign. Вот пример ошибки, которую я получаю, используя следующий код для набора фиктивных данных:
x_train = [[0, 0, 0, 1], [0, 0, 1, 0], [
1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0]], [[0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]
y_train = [1, 0, 1]
model = keras.Sequential([
keras.layers.LSTM(units=3, batch_input_shape=(1, 5, 4)),
keras.layers.Dense(128, activation='tanh'),
keras.layers.Dense(64, activation='tanh'),
keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20)
Ошибка - ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (5, 4)